일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 어노테이션
- 트랜잭션
- list
- @Bean
- 의존성주입
- 객체
- spring
- 자바
- 이클립스
- 스프링
- 리액트
- 스프링 컨테이너
- DI
- 깃허브
- springboot
- 인터페이스
- 상속
- react
- JVM
- @transactional
- 영속성 컨텍스트
- mysql
- Spring 개발환경 설정
- 자동주입
- merge
- 빈
- java
- Spring legacy Project
- github
- pom.xml
- Today
- Total
DEVLOG
[Java] 빌더 패턴이란? 본문
회사 프로젝트 진행 중, JPA 엔티티 객체 생성 시 new 연산자가 아닌 @Builder 어노테이션을 사용해 생성하는 것을 보고 빌더 패턴에 대해 공부해보려한다.
우선 빌더 패턴과 자주 비교되는 패턴들을 보며 빌더 패턴을 왜 사용해야 하는지 알아보자.
점증적 생성자 패턴 VS 자바빈즈 패턴 VS 빌더 패턴
1) 점증적 생성자 패턴
// 점증적 생성자 패턴
public class Person{
private String name;
private int age;
private String gender;
public Person(String name){
this.name = name;
}
public Person(String name, int age){
this.name = name;
this.age = age;
}
public Person(String name, int age, String gender){
this.name = name;
this.age = age;
this.gender = gender;
}
}
// 객체 생성
Person hyebin = new Person("hyebin", 27, "female"); // 순서와 타입이 보장되어야 하는 불편함
점증적 생성자 패턴은 객체 생성 시 개발자가 해당 객체의 매개변수 순서와 타입을 정확히 맞춰서 입력해야 하는 불편함이 있다. 또한, 매개변수가 늘어날수록 가독성이 굉장히 떨어질 것이다.
2) 자바빈즈 패턴
자바빈즈 패턴은 점증적 생성자 패턴의 단점 중 가독성을 보완할 수 있다.
public class Person{
private String name;
private int age;
private String gender;
public Person(){
}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public void setGender(String gender){
this.gender = gender;
}
}
// 객체 생성
Person hyebin = new Person();
Person.setName("hyebin");
Person.setAge(27);
Person.setGender("female");
다만 이러한 자바빈즈 패턴에도 치명적인 단점이 존재하는데, 이는 객체 일관성이 깨진다는 것이다.
완전한 객체란 필수 매개변수가 모두 설정된 객체를 뜻한다. 그런데 만약 필수 매개변수가 모두 설정되지 않은, 즉 객체가 완전히 생성되지 않은 상태에서 객체 생성 코드를 작성한다면 어떻게 될까? 작성할 때나 컴파일 타임에는 이러한 문제를 알 수 없어 디버깅이 어려워지고, 런타임 오류를 발생시킬 것이다. 이외에도 set 메소드 노출로 인한 불변성 문제가 발생할 수 있다.
3) 빌더 패턴
빌더패턴의 주요 장점은 다음과 같다.
- 가독성 : 데이터 리딩이 힘든 점증적 생성자 패턴 대신 빌더 패턴을 통해 .age(27) 처럼 어떤 데이터가 어떤 컬럼에 들어가는지 한눈에 파악 가능하다.
- 데이터의 순서에 상관없이 객체 생성 가능
- 객체일관성 보장 : 한 번에 객체를 생성하여 객체일관성이 깨지지 않는다.
- 검증 : build() 함수가 null인지 체크해준다.
아래와 같이 롬복이 지원하는 @Builder 어노테이션으로 빌더패턴을 쉽게 만들 수 있다. (생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함할 수 있다.)
@Builder
public class Person {
private final String name;
private final int age;
private final String gender;
}
Person person = Person.builder() // 빌더클래스 생성자
.name("hyebin")
.age(27)
.gender("female")
.build();
'Java' 카테고리의 다른 글
[Java] String / StringBuffer / StringBuilder (0) | 2022.08.10 |
---|---|
[Java] JRE와 JDK (0) | 2022.08.10 |
[Java] Compiler vs Interpreter (0) | 2022.08.10 |
[Java] 형변환 (0) | 2022.08.04 |
[Java] 유니코드 인코딩 (0) | 2022.08.04 |