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
[생성 패턴] 빌더 패턴(Builder pattern) 이해 및 예제
빌더 패턴은 복잡한 객체를 생성하는 방법을 정의하는 클래스와 표현하는 방법을 정의하는 클래스를 별도로 분리하여, 서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를 제공하는 패턴
readystory.tistory.com
https://tech-people.github.io/2020/01/08/java-design-pattern-creational/
디자인패턴 1부 - 생성패턴
작성자 : 플랫폼 개발실 R&D팀 김솔잎 디자인 패턴디자인 패턴은 주로 객체지향 프로그래밍 언어로 소프트웨어 개발할 때에, 특정 상황에서 자주 나타나는 문제를 해결하기 위해 수많은 개발자
tech-people.github.io
https://velog.io/@hero6027/Builder-Pattern%EB%B9%8C%EB%8D%94-%ED%8C%A8%ED%84%B4-by-Effective-Java
Builder Pattern(빌더 패턴 by Effective Java)
최근에 포스팅했던 GoF의 빌더 패턴과는 관점이 다른 접근방법이다. GoF의 빌더패턴은 오브젝트의 생성과 조립 과정을 분리하는 과정에 중점을 두었다면,이펙티브 자바의 빌더 패턴은 생성자(Cons
velog.io
'✍🏻study > 🚘oodp' 카테고리의 다른 글
이터레이터 패턴이란❓ (2) | 2022.09.13 |
---|---|
브릿지 패턴이란❓ (0) | 2022.08.29 |
DI가 뭔데? (0) | 2022.03.11 |