웹 개발
Lombok + Jackson 사용 시 boolean 필드 네이밍 주의(isIsActive...!?)
ultramancode
2023. 2. 15. 01:34
1. 문제 상황
현재 프로젝트에서 boolean타입인데 네이밍을 isActive로 하는 바람에 스웨거에서 반환하는 json에 담기지가 않아서 원인을 찾는데 엄청 고생을 했다.. 따라서 해당 내용을 정리하고자 한다.
- Lombok(@Getter) 규칙:
boolean 필드는 “is + 파스칼케이스” 를 붙여 접근자 메서드를 만든다.
→ 필드가 이미 is 로 시작하면 “is + is…”. - Jackson(직렬화/역직렬화)은 자바빈 규약 을 그대로 따르므로 isActive() 를 찾지만, 코드에는 isIsActive() 만 존재 ⇒ 속성 누락.
@Data
public class UserDto {
private boolean isActive; // 필드 앞에 이미 is가 붙어 있다
}
// 기대 get 메소드
isActive()
// 실제 get 메소드(Lombok이 생성)
isIsActive()
// 결과
// Postman 응답
// 활성화 상태가 JSON에 안 보인다
{ }
2. JavaBeans 명명 규칙 vs. Lombok 규칙
케이스 | 필드 | Lombok 생성 메소드 | JavaBeans 기대 | 호환성 |
A | boolean active | isActive() | isActive() | ✔ |
B | Boolean active | getActive() | getActive() | ✔ |
C | boolean isActive | isIsActive() | isActive() | ❌ |
D | Boolean isActive | getIsActive() | getIsActive() | ✔ (래퍼 클래스) |
3. 대표적 해결 전략 2가지
3-1. “is” 접두사를 빼고 primitive boolean 사용
@Getter
@Setter
public class UserDto {
private boolean active; // field: active
}
// 결과: isActive()
- 가장 간단·안전.
- API 응답(JSON)에서 "active": true 로 내려가며 직관성이 살짝 떨어질 수 있음.
3-2. Wrapper 타입(Boolean) + is 접두사 유지
@Getter
@Setter
public class UserDto {
private Boolean isActive; // Wrapper 타입
}
// 결과: getIsActive() / setIsActive()
- Lombok은 primitive가 아닌 경우 getIsActive() / setIsActive() 를 만든다.
- JavaBeans·Jackson과 일치해 JSON 속성 isActive 가 정상 출력.
- 단, nullable해진다. NPE 방어 필요.