📝오늘 공부한 것
- 실전 프로젝트 - '행동대장' 닉네임 중복 기능 구현
📌
✔ 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;
}
'TIL(Today I Learned)' 카테고리의 다른 글
TIL-230814(항해99 실전 프로젝트-행동대장(10)) (0) | 2023.08.14 |
---|---|
TIL-230812(항해99 실전 프로젝트-행동대장(9)) (0) | 2023.08.12 |
TIL-230810(객체지향 프로그래밍, 대용량 트래픽 처리) (0) | 2023.08.10 |
TIL-230809(항해99 실전 프로젝트-행동대장(7)) (0) | 2023.08.09 |
TIL-230808(HTTP, HTTPS) (0) | 2023.08.08 |