Web/Spring, SpringBoot

isDuplicate 속성을 가진 DTO가 isDuplicate, duplicate 응답하는 에러

조용우 2025. 4. 2. 21:29

✅ 상황 요약

다음 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 프로퍼티 이름이 중복될 수 있다는 점 기억하기