[JPA] @Builder 패턴 사용
쇼핑몰 기능 중 커뮤니티 기능에서 글쓰는 기능을 만드는 중 들었던 생각을 정리함.
쇼핑몰을 만들면서 postForm이라는 곳에 MultipartFile과 String을 form 태그로 전송하여 이를 새로운 Post Entity에 받아 데이터베이스에 저장하려고 한다.
글을 관리하는 Post 엔티티와 업로드한 파일을 관리하는 UploadFile은 1:1 매핑 관계로, 글을 작성하는 @PostMapping에서 새로운 객체를 생성할 때 UploadFile과 Contents를 넣어주면 된다.
사실 근데 생각을 해보니 넣어줘야할 컬럼이 생각보다 많았다.

글을 작성한다면 글을 누가 썼는지, 업로드된 파일이 있는지, 언제 썼는지에 대해 기본적으로 들어가야 할 컬럼은 consumer_id, UploadFile, contents, postDate 였다.
이 컬럼들을 일일히 set을 하여 일일히 넣고 있었는데 Lombok 기능을 검색하다가 @Bulider라는 기능을 알게 되었다.
사실 생성 메소드를 적으라면 그럴 수는 있지만 예를 들어보면
private setPost(Consumer consumer, UploadFile uploadFile, LocalDateTime postDate, String contents) {
this.consumer = consumer;
this.uploadFile = uploadFile;
this.postDate = postDate;
this.contents = contents;
}
이런 생성 메소드를 적을 수 있는데 들어가는 파라메터가 많을 수록 헷갈리고.. 그리고 타입이 달라서 헷갈려서 순서를 바꿔서 넣다가 오류가 날 가능성도 클 거 같다. 만약 유지보수 하면서 필드가 추가되면 계속해서 매개변수를 추가해야하는데 번거롭기도 하고...
Lombok에서는 Getter/Setter만 제공하는 줄 알았는데 @Bulider라는 기능을 제공해서 참신했다.
참고한 사이트는 아래와 같다.
https://projectlombok.org/features/Builder
@Builder
projectlombok.org
Overview를 살펴보면
@Bulider는 자동적으로 클래스에서 필요한 부분을 생성해준다.
(@Builder lets you automatically produce the code required to have your class be instantiable with code such as:)
Person.builder()
.name("Adam Savage")
.city("San Francisco")
.job("Mythbusters")
.job("Unchained Reaction")
.build();
어노테이션을 엔티티 위에 붙여주면 bulider()를 사용할 수 있는데 필드 이름 처럼 setter를 할 수 있는 기능이 생기고 setName(); setCity(); setJob(); 할 필요 없이 한번에 새로운 객체를 만들어준다는 장점이 있다.
이를 사용하여 @PostMapping에서 새로운 객체를 만들어서 DB에 넣으려고 할 때 사용하였다.
기존에 있던 코드는 New Post()를 한 후 set[필드 이름]을 계속 했는데 바꾼 코드는 다음과 같다.
@PostMapping()
public String newPost(필요한 파라메터 ... ) {
// 파일, form 태그 기타 등등
Post newPost = Post.builder()
.contents(post.getContents())
.uploadFile(uploadFile)
.postDate(LocalDateTime.now())
.build();
consumerService.postNew(newPost);
return "redirect:/"
}
이렇게 해서 데이터가 잘 저장되는지 한 번 실행해보겠다.
(04.15 실행)
이렇게 하고 실행했더니 컴파일 과정에서 오류가 났다.
메시지 이유는 아규먼트 리스트가 길이가 다르다는데... 잘 읽어보니까 consumer, long, list 이런 아규먼트가 추가되어야 하는데 지금 아무것도 설정된게 없어서 그런거 같다.
아마 @Builder를 설정할 때 클래스 위에 추가했는데 같이 추가해야하는 어노테이션이 빠져서 그런거 같다.
일단 검색해서 보니까 인텔리제이에 있는 속성을 변경하면 된다고 하긴 하는데 그 전에 @NoargsConstructor랑 @AllArgsConstructor를 추가해서 Constructor를 잡을 수 있도록 설정해본다.
일단은 오류없이 잘 돌아가긴 했는데 잘 모르겠다.
다시 테스트 해보는 걸로...