✅ 상황 요약
다음 DTO 선언:
@Getter
@AllArgsConstructor
public class EmailDuplicateCheckResponse {
@JsonProperty("isDuplicate")
private boolean isDuplicate;
}
그런데 JSON 응답은 이렇게 두 개의 필드를 포함:
{
"isDuplicate": false,
"duplicate": false
}
❗ 문제의 원인
@Getter를 사용하면 Lombok이 isDuplicate()라는 getter 메서드를 생성:
public boolean isDuplicate() {
return this.isDuplicate;
}
그런데 Jackson은 boolean 타입일 때 isX() 메서드로부터 자동으로 속성 이름을 추론합니다.
즉, isDuplicate() 메서드를 보고 duplicate이라는 필드도 있다고 착각해서 JSON에 포함시켜 버린다.
그래서 실제 JSON에는:
- @JsonProperty("isDuplicate") → isDuplicate
- isDuplicate() → duplicate (자동 추론)
이렇게 두 개가 동시에 노출된다.
🛠 해결 방법
✅ 방법 1: @JsonIgnore로 Lombok의 getter 숨기기
@Getter
@AllArgsConstructor
public class EmailDuplicateCheckResponse {
@JsonIgnore
public boolean isDuplicate() {
return isDuplicate;
}
@JsonProperty("isDuplicate")
private boolean isDuplicate;
}
하지만 이건 Lombok의 장점을 버리는 방식이라 비추.
✅ 방법 2: 필드 이름을 duplicate으로 바꾸고 @JsonProperty만으로 제어
@Getter
@AllArgsConstructor
public class EmailDuplicateCheckResponse {
@JsonProperty("isDuplicate")
private boolean duplicate;
}
이렇게 하면 내부 필드는 duplicate이고, 외부 JSON에는 "isDuplicate"로만 나가게 됩니다.
✅ 방법 3: getter 메서드를 명시적으로 정의해서 Jackson에게 딱 알려주기
@AllArgsConstructor
public class EmailDuplicateCheckResponse {
private boolean isDuplicate;
@JsonProperty("isDuplicate")
public boolean isDuplicate() {
return isDuplicate;
}
}
다른 코드를 건들지 않는 가장 깔끔하면서 명확한 방식.
🎯 결론
Lombok + boolean 필드 + Jackson 조합에서 생기는 이슈고요,
is 접두어를 가진 필드는 JSON 프로퍼티 이름이 중복될 수 있다는 점 기억하기
'Web > Spring, SpringBoot' 카테고리의 다른 글
테스트에서 Entity vs DTO 이용 (0) | 2025.04.02 |
---|---|
Spring @ModelAttribute 매핑 오류 해결 방법 (Setter, Enum 변환) (0) | 2025.03.20 |
Spring Data JPA에서 커스텀 Repository 구현체 인식 및 작동 방식 (0) | 2025.03.20 |
스프링 부트 테스트 시 JPA Auditing 에러 (0) | 2025.03.12 |
Mockito를 이용한 테스트 vs. SpringBootTest의 차이점 (0) | 2025.03.05 |