https://github.com/beginner0107/bank/commit/dae1a571b4082f3db78e81c2dc1a6e5baac60c62
1. 동일한 유저가 있는지 검사하고
중복된 유저면 에러 `CustomApiException`를 던진다.
2. 패스워드 인코딩을 하여(dto에서)
3. JoinRespDto로 응답한다
- Rest API에서 에러를 처리할 때
@RestControllerAdvice
public class CustomExceptionHandler {
private final Logger log = LoggerFactory.getLogger(getClass());
@ExceptionHandler(CustomApiException.class)
public ResponseEntity<?> apiException(CustomApiException e) {
log.error(e.getMessage());
return new ResponseEntity<>(new ResponseDto<>(-1, e.getMessage(), null), HttpStatus.BAD_REQUEST);
}
}
- @RestControllerAdvice : 어노테이션을 활용한다
- @ExceptionHandler에 커스텀한 Exception을 등록해주면
- 현재 내가 만든 CustomApiException이 던져졌을 때 여기서 에러를 제어한다.
- Json형태로 ResponseEntity를 반환한다.
CustomApiException
public class CustomApiException extends RuntimeException{
public CustomApiException(String message) {
super(message);
}
}
- 현재 회원 관련 서비스를 담당하는 UserService
@RequiredArgsConstructor
@Service
public class UserService {
private final Logger log = LoggerFactory.getLogger(getClass());
private final UserRepository userRepository;
private final BCryptPasswordEncoder passwordEncoder;
// 서비스는 DTO를 요청받고, DTO로 응답한다.
@Transactional // 트랜잭션이 메서드 시작할 때, 시작되고, 종료될 때 함께 종료
public JoinRespDto 회원가입(JoinReqDto joinReqDto) {
// 1. 동일 유저네임 존재 검사
Optional<User> userOP = userRepository.findByUsername(joinReqDto.getUsername());
if (userOP.isPresent()) {
// 유저네임 중복되었다는 뜻
throw new CustomApiException("동일한 username이 존재합니다.");
}
// 2. 패스워드 인코딩
User userPS = userRepository.save(joinReqDto.toEntity(passwordEncoder));
// 3. dto 응답
return new JoinRespDto(userPS);
}
@Getter
@Setter
public static class JoinRespDto {
private Long id;
private String username;
private String fullname;
public JoinRespDto(User user) {
this.id = user.getId();
this.username = user.getUsername();
this.fullname = user.getFullname();
}
}
@Getter
@Setter
public static class JoinReqDto {
// 유효성 검사
private String username;
private String password;
private String email;
private String fullname;
public User toEntity(BCryptPasswordEncoder passwordEncoder) {
return User.builder()
.username(username)
.password(passwordEncoder.encode(password))
.email(email)
.fullname(fullname)
.role(UserEnum.CUSTOMER)
.build();
}
}
}
- 중복인 회원의 이름이 발견되면 throw new CustomApiException을 던지는 것을 볼 수 있다.
'CS지식들 > 공부공부' 카테고리의 다른 글
비트연산자 (0) | 2023.11.05 |
---|---|
도커로 개발환경 세팅하기 (0) | 2023.04.07 |
인증(Authentication) 관련 Exception을 제어하는 기능 구현 (0) | 2023.03.09 |
Spring Security filterChain (0) | 2023.03.06 |
동시성 문제 (3) (0) | 2022.12.19 |