배경
현재 제가 작성한 회원가입 ReuqestDto 값입니다.
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class UserCreateRequestDto {
@NotBlank(message = "아이디는 필수로 입력해야 됩니다.")
private String username;
@NotBlank(message = "비밀번호는 필수로 입력해야 됩니다.")
private String password;
private String phoneNumber;
private String email;
private String nickname;
private Address address;
private String userImage;
@NotNull(message = "좌표는 필수로 입력해야 됩니다.")
private Coordinate coordinate;
좌표(Coordinate) 정보를 필수적으로 입력을 해줘야하는 상태입니다.
회원가입을 진행할 때, 위도와 경도값을 받고 그 받은 값을 Coordinate 객체에 저장을 한 후 Service에 보내는데,
이러한 과정에서 위도값 또는 경도값이 비어있는 경우, 예외처리를 어떻게 할 것인가에 대한 고민입니다.
문제 상황
위 작성했던 코드를 컨트롤러 테스트를 하겠습니다.
정상적으로 예외가 발생하며 작성했던 메세지가 출력됩니다.
그런데, 여기서 접한 문제는 위도값 또는 경도값이 비어있을 경우 예외 처리에 대한 문제입니다.
정확한 실험을 위해 Postman을 이용하겠습니다.
회원가입 성공
정상적으로 회원가입이 되었을 때 Body값 입니다.
회원가입 실패
lat값이 빠져있을 때, 예외 메세지가 발생하지 않습니다.
원인 분석
lat값 또는 lng값이 들어있기만 하면, Coordinate값이 null이 아니기 때문에 Controller 단에서 예외가 발생하지 않고,
서비스에서 Coordinate의 lat값과 lng값을 이용할 때 예외가 발생하는 모습입니다.
lat값과 lng값을 이용하여 Point 객체를 생성하고 그 생성된 Point 객체를 User Entity에 저장하는 과정에서,
lat값과 lng값 중 하나가 존재하지 않기 때문에 문제가 발생합니다.
해결 방법
Service단에서 예외 처리를 하자.
Lat값과 Lng값을 검증하는 메서드를 추가했습니다.
private void validateLatAndLng(final Coordinate coordinate) {
if (coordinate.getLat() == null || coordinate.getLng() == null) {
throw new MarketAppException(NOT_FOUND_COORDINATE, NOT_FOUND_COORDINATE.getMessage());
}
}
정상적으로 작동함을 확인할 수 있습니다.
Service단으로 예외처리를 한 이유는,
Lat값과 Lng값을 제대로 작성했는지에 대한 깊은 테스트가 필요했기 때문입니다.
Lat값과 Lng값을 0, 0 이런 식으로 작성하는 경우 ControllerTest 하나로 해결하기에는 무리가 있다고 판단했습니다.
따라서 Service에서 값이 들어있는지에 대한 유무와 제대로 된 좌표값을 입력했는지에 대한 테스트를 더 추가하기 위해서는 Service에서 테스트하는 것이 맞다고 생각합니다.
테스트 성공
과정에서 깨달은 점
Controller와 Service에 대한 테스트 범위를 고민하게 되었고, 이러한 과정을 통해 Controller와 Service에 대한 명확한 범위를 생각하여 테스트를 작성할 수 있었습니다.
'Spring' 카테고리의 다른 글
WebScoket 실시간 매칭 시스템 - 동시성 문제 발생과 해결 과정 (0) | 2024.06.25 |
---|---|
Scale-out 상황, 채팅 서비스 Redis 도입 (0) | 2024.06.20 |
테스트 코드 - Presentation Layer (0) | 2023.11.12 |
CSRF(Cross-Site Request Forgery)란? (1) | 2023.10.19 |
LocalStorage, Cookie JWT토큰은 어디에 보관할까? (0) | 2023.10.17 |