문제인식

컨트롤러에서 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 에 대해서 좀 더 공부해봐야겠다.
'Practice > Java' 카테고리의 다른 글
| 스프링) 의존성 주입 (0) | 2023.02.16 |
|---|---|
| 스프링) JPA 페이징 처리 개념 및 활용방법. (0) | 2023.02.15 |
| 스프링)시큐리티 (0) | 2022.12.30 |
| 스프링) @Transactional 정리 (0) | 2022.12.19 |
| 스프링 코드 분석) 메모장 만들기 프로그램 (2) | 2022.12.08 |