네이밍 컨벤션에 따라 boolean 필드명을 is~로 정의하였다.
public class Club {
...
private String clubName;
private boolean isDeleted=false; // default값은 false
private boolean isAgreeToProvideInfo=false;
...
}
DTO에 isAgreeToProvideInfo 필드도 넣어 프론트에 반환해줘야해서,
정적 팩토리 메서드의 매개변수로 넘어온 Club club에서 getter를 사용해 필드값을 추출하려고 했다.
public class GetClubByHashTagResponse {
private boolean agreedToProvideInfo;
private Long clubId;
private String imageUrl;
private String clubName;
private String introduction;
public static GetClubByHashTagResponse from(Club club) {
return GetClubByHashTagResponse.builder()
//다른 필드값과 달리 get~이 아닌 is~이다.
.agreedToProvideInfo(club.isAgreeToProvideInfo())
.clubId(club.getId())
.imageUrl(club.getImageUrl())
.clubName(club.getName())
.introduction(club.getIntroduction())
.build();
}
알아보니
lombok에서 get함수를 자동 생성해줄때, boolean 타입의 필드들은 getter를 is 로 만들어준다고 한다.
따라서,
club.getIsAgreeToProvideInfo() 가 아니라
club.isAgreeToProvideInfo()로 필드에 저장된 값을 가져와야한다.
처음에 DTO의 필드값을 isAgreeToProvideInfo로 정의했다.

근데 스웨거를 확인해보니, 반환되는 JSON에 isAgreeToProvideInfo가 아니라,
agreeToProvideInfo로 표시되어 나가는 것을 확인했다.

✅ 왜 이러는 것일까?
스프링에서는 Jackson 라이브러리를 사용하여 Json객체로 변환한다.
Jackson은 getter메서드 이름을 기준으로 필드를 직렬화한다.
이때, boolean필드의 경우 isAgreeToProvideInfo라는 getter가 있으므로 is를 제거한 뒤에 부분을 key값으로 보내준다.
만약 내가 원하는 형식으로 필드값을 구성하여 보내주고 싶은 경우
@JsonProperty 어노테이션을 사용하면 된다
public class GetClubInfoResponse{
@JsonProperty("isAgreeToProvideInfo") // 이런식으로 Json의 키값을 임의로 지정
private boolean agreedToProvideInfo;
private Long clubId;
private String imageUrl;
private String clubName;
private String introduction;
public static GetClubByHashTagResponse from(Club club) {
return GetClubByHashTagResponse.builder()
.agreedToProvideInfo(club.isAgreeToProvideInfo())
.clubId(club.getId())
.imageUrl(club.getImageUrl())
.clubName(club.getName())
.introduction(club.getIntroduction())
.build();
}
}
그러면 이런식으로 내가 지정한 키값으로 나간다.

하지만 뒤늦게 발견한 문제점...
스웨거 화면을 보면, aggreeToProvideInfo와 isAgreeToProvideInfo를 모두 확인할 수 있다...
두개 다 반환되는 이유는 dto를 json으로 직렬화 할때, 내가 @JsonProperty로 지정한 필드와 getter를 통해 찾은 필드값을 모두 반환해주기 때문이다.
찾아보니, Wrapper, getter 애노테이션 적용안하고 따로 정의해주기 등등이 있었지만
하나의 필드값을 위해 더 귀찮은 작업들을 해야한다는게
배보다 배꼽이 더 큰 느낌이들었다..
boolean값들에 대한 네이밍 컨벤션을 다시 고민해보는 것도 고려해야겠다..