Spring과 JPA에 대해서 공부는 해보았지만, Spring으로 프로젝트를 진행하는 것은 처음이다. 그래서 이전에 spring을 진행한 팀원의 코드를 자주 참고하는데, 그 친구가 Builder annotation을 사용해서 뭔지 공부해보려 한다.
Builder annotation에 앞서 Builder패턴이 무엇인지 살펴보자!!
Builder 패턴이란❓
빌더 패턴은 생성 패턴 중 하나이다. 또, 생성 패턴은 "인스턴스"를 만드는 절차를 "추상화"하는 패턴이다.
생성 패턴을 이용하면, 무엇이 생성되고, 어떻게 결합하는지에 대한 부분을 가려준다.
GoF의 빌더패턴
그중에서 빌더 패턴은 복잡한 객체를 생성하는 방법을 정의하는 클래스와 표현하는 방법을 정의하는 클래스를 별도로 "분리"하여, 서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를 제공하는 패턴이다.
이펙티브 자바의 빌더 패턴
생성자(Constructor)가 많을 경우 또는 오브젝트 생성 후 변경 불가능한 불변 오브젝트가 필요한 경우, 불변 오브젝트를 생성하여 오브젝트의 일관성(Consistency),변경 불가능(immutable)을 실현하여 코드의 가독성과 불변성,일관성을 유지하도록 하는것에 중점을 둔다.
나에게 다가오는 말은 "생성자가 많은 경우 빌더 패턴을 쓴다"이다,,!!
public class Review {
private Member member;
private String title;
private String content;
private String tip;
private double star;
private int likeCount;
public Review (Member member, String title, String content) {
this.member = member;
this.title = title;
this.content = content;
}
public Review (Member member, String title, String content, String tip) {
this.member = member;
this.title = title;
this.content = content;
this.tip = tip;
}
public Review (Member member, String title, String content, String tip, double star, int likeCount) {
this.member = member;
this.title = title;
this.content = content;
this.tip = tip;
this.star = star;
this.likeCount = likeCount;
}
}
위와 같은 생성자 패턴은 객체의 일관성과 불편성은 유지되지만(setter로 변경할 수 없고, 새로운 값의 객체를 생성할 때는 생성자로만 생성이 가능하다.) 멤버 변수가 하나만 늘어나도 코드의 작업량이 많아지고 가독성이 좋지않다,,,
public class Review {
private Member member;
private String title;
private String content;
private String tip;
private double star;
private int likeCount;
public Review () {
}
public void setMember (Member member) {
this.member = member;
}
public void setTitle (String title) {
this.title = title;
}
public void setContent (String content) {
this.content = content;
}
public void setTip (String tip) {
this.tip = tip;
}
public void setStar (double star) {
this.star = star;
}
public void setLikeCount (int likeCount) {
this.likeCount = likeCount;
}
}
위 코드 처럼 default constructor를 사용하고, setter로 값들을 지정한다면 코드 작업량도 줄고, 가독성(값을 넣을때, 어떤 값을 넣고, 어떤 값을 넣지 않는지 setter 명을 통해서 확인 할 수 있기때문에)도 좋아지겠지만, 객체의 일관성과 불변성이 깨진다.
이 문제들을 해결하기 위해 빌더 패턴이 나왔다!!
빌더 패턴은 이 두개의 문제점은 없애고, 장점을 결합한 패턴이다!!
public class Review {
private final Member;
private final String title;
private final String content;
public static class Builder {
private final Member member;
private final String title;
private final String content;
private String tip;
private double star;
private int likeCount
// 필수 맴버변수
public static Builder(Member member,String title, String content) {
this.member = member;
this.title = title;
this.content = content;
}
public Builder tip(String tip) {
this.tip = tip;
return this;
}
public Builder height(double star) {
this.star = star;
return this;
}
public Builder height(int likeCount) {
this.likeCount = likeCount;
return this;
}
public Review build() {
return new Review(this);
}
}
private Review(Builder builder){
this.member = builder.member;
this.title = builder.title;
this.content = builder.content;
}
}
클래스마다 이것을 다 작성하려면 시간이 꽤 걸릴 것이다. 그래서 @Builder를 사용하면, 이것들을 자동으로 만들어준다!!
Builder패턴이 필요한 경우는 @Builder 어노테이션을 사용하자!!
Reference
https://readystory.tistory.com/121
https://tech-people.github.io/2020/01/08/java-design-pattern-creational/
https://velog.io/@hero6027/Builder-Pattern%EB%B9%8C%EB%8D%94-%ED%8C%A8%ED%84%B4-by-Effective-Java
'✍🏻study > 🚘oodp' 카테고리의 다른 글
이터레이터 패턴이란❓ (2) | 2022.09.13 |
---|---|
브릿지 패턴이란❓ (0) | 2022.08.29 |
DI가 뭔데? (0) | 2022.03.11 |