본문 바로가기

TIL(Today I Learned)

TIL-230811(항해99 실전 프로젝트-행동대장(8))

📝오늘 공부한 것

  • 실전 프로젝트 - '행동대장' 닉네임 중복 기능 구현

 

📌

✔ UserService 닉네임 중복확인 로직

    //닉네임 중복확인
    @Transactional(readOnly = true)
    public userResponseDto nicknameCheck(NicknameCheckRequestDto requestDto) {
        String nickname = requestDto.getNickname();
        if (checkNickname(nickname)) {
            return new userResponseDto("이미 존재하는 닉네임입니다.");
        } else {
            return new userResponseDto("사용 가능한 닉네임입니다.");
        }
    }

 

⛔문제점

[에러메시지]

WARN 44020 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `com.sparta.actionboss.domain.auth.dto.NicknameCheckRequestDto` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)]

 

-> JSON데이터를 파싱할 때 에러가 났다. 요청된 JSON 데이터를 NicknameCheckRequestDto 클래스의 인스턴스로 변환할 수 없다고 한다.

 

 - 요청된 JSON 데이터의 형식이 클래스의 필드와 일치하지 않는 경우

 - 클래스에 기본 생성자가 없거나, 생성자와 요청 데이터의 구조가 일치하지 않는 경우

 - 클래스의 필드 중 하나가 복잡한 데이터 타입인데, 해당 타입에 대한 직렬화/역직렬화 방법이 정의되지 않은 경우

에 발생할 수 있다고 한다.

 

 

💯해결

nicknameCheck메서드에서는 NicknameCheckRequestDto를 사용하고 있다. 이 클래스는 nickname이라는 값만 필요하므로, 인자가 없는 기본생성자가 필요하다. 따라서 처음에 작성하였던 String 타입의 nickname인자가 있는 생성자가 아닌, 인자가 없는 기본 생성자가 사용된다.

@NoArgsConstructor 애노테이션을 이용해 기본 생성자를 사용하여 데이터를 전달하고 처리하게 한다. 즉, NicknameCheckRequestDto 객체를 nicknameCheck 메서드에 인자로 전달해줄 수 있다.

 

@NoArgsConstructor

매개변수가 없는 기본 생성자를 생성해준다.

 

 

 원래코드

@Getter
public class NicknameCheckRequestDto {
    private String nickname;

    public NicknameCheckRequestDto(String nickname){
        this.nickname = nickname;
    }
}

 수정된 코드

@Getter
@NoArgsConstructor
public class NicknameCheckRequestDto {
    private String nickname;
}