Practice/Java

스프링) 빌더 패턴

밍미a 2023. 1. 17. 02:12
728x90

문제인식

컨트롤러에서 postRequestDto 를 받아와서 엔티티인 Post에 postRequestDto 객체를 바로 넘겨주면 결합도가 높아져서 최소한의 데이터를 넘겨주도록 해야겠다는 생각이 들었다. 

따라서 postRequestDto의 데이터 값을을 꺼내서 변수에 지정해 준 뒤 

이런 식으로 Post에 하나하나 넣어주었는데 

데이터베이스의 데이터가 바르게 들어가지 않고 뒤섞여 들어가는 문제가 발생하였다.


Try

뒤섞여 들어갔다는 것은 생성을 할 때 문제가 생겼다는 뜻이니까 생성자를 만들어주었던 Post 객체에 가서 살펴보았더니

생성자를 

이렇게 만들었는데 순서가 바뀌어서 레파지토리에 뒤섞여서 저장되었다. 

다시 바르게 입력하여 저장하면 바르게 잘 들어가지만, 생성자에 들어가야 할 데이터들이 많을 경우 분명히 헷갈릴 것 같은데 어떻게 하는지에 대해 궁금해졌다.

 


문제해결

검색을 하던 도중 "빌더 패턴"이라는 것을 발견하여 공부한 뒤 적용해보았다.

빌더패턴 적용하는 방법. 

@Getter
@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Post extends Timestamped{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long postNum;

    @Column(nullable = false)
    private String postTitle;

    @Column(nullable = false)
    private String postContents;

    @Column(nullable = false)
    private String userName;



    @Column
    private Long likeCount;

    public void modifyLikeCount(Long likeCount) {
        this.likeCount = likeCount;
    }


    @OneToMany(mappedBy = "post", fetch = FetchType.LAZY)
    List<Comment> commentList = new ArrayList<>();



    public Post(PostRequestDto requestDto,String userName){
        this.postTitle = requestDto.getPostTitle();
        this.postContents = requestDto.getPostContents();
        this.userName = userName;
    }

    public Post(String postTitle,String userName,String postContents){
        this.postTitle = postTitle;
        this.postContents = postContents;
        this.userName = userName;
    }


    //댓글 붙이기.
    public void addComment(Comment comment){
        this.commentList.add(comment);

    }


    public void postUpdate(PostRequestDto requestDto) {
        this.postTitle = requestDto.getPostTitle();
        this.postContents = requestDto.getPostContents();
    }

1.빌더패턴을 활용해서 데이터를 넣어 줄 클래스에 @Builder 어노테이션을 붙여준다.

2. 생성자 어노테이션인 AllArgsConstructor 를 붙여준다.

3. 필더패턴을 사용할 곳에 다음과 같이 빌더패턴을 활용해서 데이터를 넣어준다.

 

 

빌더패턴을 사용하는 이유 :

1. 필요한 데이터만 설정할 수 있다.

2. 유연성을 확보할 수 있다.

3. 가독성을 높일 수 있다.

4. 변경 가능성을  최소화 할 수 있다.

 

[Java] 빌더 패턴(Builder Pattern)을 사용해야 하는 이유 - MangKyu's Diary (tistory.com)


느낀점

 

빌더패턴을 활용하면 데이터를 생성할 때 헷갈리지 않고 좋은것 같다.

하지만 빌더패턴을 사용하는데 왜 생성자 어노테이션인 @AllArgsConstructor 를 붙여주는지 모르겠다. 

AllArgsConstructor 를 붙여주지 않으면 

" Lombok @Builder needs a proper constructor for this class " 

라는 에러가 떠서 일단 붙여주기는 했지만, 나중에 @AllArgsConstructor 에 대해서 좀 더 공부해봐야겠다.