
📚 개요
자바를 공부하다보니 클래스를 인스턴스로 만들 때 new 가 아닌 build 라는 방식을 사용하여 생성하는 것을 목격하곤 알아보게되었다.
🎬 Get Started
일반적으로 인스턴스를 생성하는 방법은 4가지가 자주 쓰인다고 한다.
1. 생성자 방식
2. 점층적 생성자 방식
3. 자바 빈 방식
4. 빌더 방식 ( lombok )
이렇게 가지가 자주 쓰인다고 한다.
근데 GoF 디자인 패턴의 빌더 패턴과 자바 빌더 패턴은 같은 의미지만 구현 방식이 다르니 참고하길!
생성자 방식
장점 : 매우 쉽고 직관적이다.
단점 : 매개변수가 많아지면 어떤 값이 어떤 파라미터에 들어가는 지 알아보기 힘들다.
요약 : 쉽고 빠르지만 가독성이 너무 별로다.
점층적 생성자 방식
장점 : 그나마 가독성이 좋다.
단점 : 놓치는 인자가 있을 수 있고 클래스를 정의하는 코드가 굉장히 길어질 수 있다. 유지보수도 매우 힘들다.
자바 빈 방식
장점 : 점층적 생성자 방식을 이어받지만 생성자를 많이 구현 할 필요가없다.
단점 : 일관성이 깨질 수 있다. setter를 무조건 만들어야하기때문에 불변객체를 만들 수 없다. 메소드를 너무 많이 사용한다.
*일관성이 깨진다 : 여러 컴포넌트에서 사용했을 때 한 컴포넌트에서 변경이 이뤄졌지만 다른 컴포넌트에서는 변경되었다는 사실을 알 수 없어 값의 일관성이 깨지는 것을 의미
빌더 패턴 ( lombok 라이브러리 이용 )
장점 : 가독성이 좋다. 불변 객체를 만들 수 있다.
단점 : 성능이 떨어질 수 있다. 객체 생성이 매우 잦거나 매개변수가 매우 많으면 성능 저하가 생기거나 가독성이 오히려 떨어질 수도 있다.
예제쓰
// 생성자 방식
public class UserDto {
private String loginId;
private String password;
private int role;
}
// 점층적 생성자 방식
public class UserDto {
public UserDto() {};
public UserDto(String loginId) {
this.loginId = loginId;
};
public UserDto(String loginId, String password) {
this.loginId = loginId;
this.password = password;
};
public UserDto(String loginId, String password, int role) {
this.loginId = loginId;
this.password = password;
this.role = role
};
private String loginId;
private String password;
private int role;
}
// 자바 빈즈 방식
public class UserDto {
private String id;
private String password;
private Integer role;
public void setId(String id) {
this.id = id;
}
public void setPassword(String password) {
this.password = password;
}
public void setRole(Integer role) {
this.role = role;
}
}
// 빌더 방식
public class UserDto {
private String loginId;
private String password;
private int role;
@Builder
public UserDto(String loginId, String password, int role) {
this.loginId = loginId;
this.password = password;
this.role = role;
}
}
위와 같은 클래스를 service class에서 인스턴스화 해서 사용한다.
아래는 UserService에서 사용한 예시이다.
// 생성자 방식
UserDto newUser = new UserDto(user.getLoginId(), user.getPassword(), user.getRole());
// 점층적 생성자 방식
UserDto newUser = new UserDto(user.getLoginId());
UserDto newUser = new UserDto(user.getLoginId(), user.getPassword());
UserDto newUser = new UserDto(user.getLoginId(), user.getPassword(), user.getRole());
세가지 중 경우에 따라 하나를 쓰면 된다.
// 자바 빈즈 방식
UserDto newUser = new UserDto();
newUser.setLoginId(user.getLoginId());
newUser.setPassword(user.getPassword());
newUser.setRole(user.getRole());
// 빌드 패턴
UserDto newUser = user.builder()
.loginId(user.getLoginId())
.password(user.getPassword())
.role(user.getRole())
.build();
return newUser;
각자의 장단점이 있으니 잘 골라서 써보자
참고로 성능은 생성자 방식, 편리성과 가독성을 고려하면 빌드 패턴을 사용하는 것이 좋다고 한다.
builder 방식은 객체 생성이 매우 많은 환경에선 별로 안좋다고 하니 여러 방법을 알아두는게 무조건적으로 좋긴하겠다.
고럼 이만!
🔗 출처
내용 :
https://johngrib.github.io/wiki/pattern/builder/#%EC%9E%90%EB%B0%94%EB%B9%88-%ED%8C%A8%ED%84%B4
https://catsbi.oopy.io/344dbe7b-9774-48fc-9c95-b554e9c1c4bc
https://kangworld.tistory.com/246
https://bbaktaeho-95.tistory.com/72
https://sudo-minz.tistory.com/133
https://pamyferret.tistory.com/67
'B4 Junior' 카테고리의 다른 글
🎨 JAVA Design Pattern - Builder Pattern (0) | 2023.04.14 |
---|---|
🧾 ES5 와 ES6 의 차이 (0) | 2023.04.07 |
📺 Centos7 설치, 초기 세팅 및 jdk 17 설치 (4) | 2023.04.07 |
⚙️ CentOS7 GUI 에서 CLI 로 (0) | 2023.04.07 |
📚 JAVA 기본 개념 - 변수 (0) | 2023.04.05 |
백엔드는 못말려
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!