개인 프로젝트

생성자 말고 Lombok / @Builder 활용하기

쿠키오빠 2025. 5. 27. 17:14
반응형

개인 프로젝트로 블로그를 만들고 있다.

 

테스트 클래스를 통한 검증을 해보았다.


최초, PostCreate의 생성자를 이용하여 문자열을 보낸다.

@Test
@DisplayName("/posts 요청 시 문자 출력한다.")
void test() throws Exception{

    PostCreate request = new PostCreate("제목입니다.", "내용입니다.");

    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writeValueAsString(request);

    System.out.println(json);

    mockMvc.perform(post("/post")
                            .contentType(MediaType.APPLICATION_JSON)
                            .content(json)
            )
            .andExpect(status().isOk()) // 기대값
            .andExpect(content().string("{}"))
            .andDo(print()); // 테스트의 대한 요청 서머리 확인
}

 

<PostCreate>

@Setter
@Getter
@ToString 
public class PostCreate {

    @NotBlank (message = "타이틀을 입력해 주세요") 
    private String title; // NotBlank는 null도 걸러줌.

    @NotBlank (message = "콘텐츠를 입력해 주세요")
    private String content;
    
    public PostCreate(String title, String content){
        this.title = title;
        this.content = content;
    }

}

 

 

위와 같이 테스트가 성공하고 JSON 형식으로 )title : 제목입니다  / content : 내용입니다) 잘 출력된다.


 만약 여기서, 누군가 content와 title의 위치를 바꾼다면?

아래와 같이 매개변수의 위치를 바꿔 보았다.

@Setter
@Getter
@ToString
public class PostCreate {

    @NotBlank (message = "타이틀을 입력해 주세요")
    private String title; // NotBlank는 null도 걸러줌.

    @NotBlank (message = "콘텐츠를 입력해 주세요")
    private String content;

    public PostCreate(String content, String title){
        this.title = title;
        this.content = content;
    }

}

 

이후 테스트를 돌려보니 제목이 들어 가야 할 title에 "내용입니다." 내용이 들어갈 content에 "제목입니다". 가 출력되었다.

 

즉, 데이터가 반대로 출력된 것

 

직접 실무를 해보진 않았지만, 이와 같은 상황이 생긴다면 오류를 찾아내는데 오랜 시간이 걸릴 것이다.

 


 

문제를 해결할 수 있는 방법으로는 @Builder 사용하는 것이다.

 

@Setter
@Getter
@ToString
public class PostCreate {

    @NotBlank (message = "타이틀을 입력해 주세요")
    private String title; // NotBlank는 null도 걸러줌.

    @NotBlank (message = "콘텐츠를 입력해 주세요")
    private String content;

    @Builder
    public PostCreate(String content, String title){
        this.title = title;
        this.content = content;
    }

}

 

이와 같이 Lombok에서 제공하는 Builder 어노테이션을 생성자에 달아주고,

 

@Test
@DisplayName("/posts 요청 시 문자 출력한다.")
void test() throws Exception{

    PostCreate request = PostCreate.builder()
            .title("제목입니다.")
            .content("내용입니다.")
            .build();

    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writeValueAsString(request);

    System.out.println(json);

    mockMvc.perform(post("/post")
                            .contentType(MediaType.APPLICATION_JSON)
                            .content(json)
            )
            .andExpect(status().isOk()) // 기대값
            .andExpect(content().string("{}"))
            .andDo(print()); // 테스트의 대한 요청 서머리 확인
}

PostCreat의 객체 생성이 아닌, builder 메소드를 통해 title과 content를 설정해준다.

 

이런식으로 하면 생성자의 매개변수의 위치가 변경되더라도, 값을 지정해 놓았으므로 데이터의 불변성이 유지된다.

 


 

Builder의 장점으로는 가독성(값 생성에 대한 유연함)과, 객체의 불변성, 그리고 깔끔함...? 등등 이라고 생각한다.

 

앞으로 자주 사용해보자.

반응형