-
Builder 패턴개발/java 2021. 12. 14. 03:39
객체에 여러 값을 주입하는 방법에는 여러방식이 있습니다.
1.생성자 주입 (Constroctor)
2.수정자 주입 (Setter)
1.생성자 주입을 사용할 경우 만약 객체 내 인자가 많아 여러 케이스가 필요 할 경우 해당 케이스별로 생성자를 만들어 줘야 합니다.
또한 인자의 순서가 중요하므로 순서를 바꿀 경우 적용 코드에서 인식을 하지 못합니다.
2.수정자 주입을 사용할 경우 생성 시점전에 빈 생성자를 호출 하고 인자를 주입하는 방식이므로 언제 어디서나 변경이 가능합니다
즉 불변 클래스가 아니게 됩니다.
=> 그러므로 빌더 패턴이 생겨나게 되었으며 이를 구현 하면 문제점들을 해결할 수 있습니다.
1번의 문제처럼
생성자를 인자 수에 따라 구현하지 않아도 됩니다.
인자의 순서에 영향을 받지 않습니다.
2번의 문제처럼
불변 클래스 이므로 객체 생성을 제외하고 변경이 불가능합니다.
예제로 보겠습니다.
Food를 빌더패턴으로 구현해보았다. 사용 방법  이런 빌더 패턴의 경우 lombok에서 애노테이션(@Builder) 으로 제공되어 개발자가 직접 구현을 하지 않아도 됩니다.
@Builder를 주요 특징을 잠깐 살펴보자면
@AllArgsConstructor(access = AccessLevel.PACKAGE)를 자동 생성하며 이는 모델이 패키지 내에서만 사용이 가능하다는 말입니다.
@Builder.Default 를 지원하여 디폴트 값을 설정할 수 있습니다.
cf)
만약 개발 시 mybatis 연동하여 db을 가져오려 하는데 해당 resultType 모델이 @Builer 애노테이션이 걸려 있을 경우
index 1 out of bounds for length 이런식으로 오류가 발생하는데 이는 해당 모델이 패키지로만 걸려 있기 때문에 인식을 못해서 발생하는 문제입니다.
그러므로 일반적으로는 @Builder 패턴을 구현할 때는 @AllArgsConstructor 과 @NoArgsConstructor 를 함께 사용 하면 됩니다.
근데 .. 음 솔직히 말해서 Req와 Res를 분리해서 구현하고 그 중 Req만 빌더를 쓰는게 맞습니다.
여담)
저의 경우 레거시가 많아서 기존에 @Setter , @Getter로 구현된 부분이 많아 객체를 사용하는 모든 부분을 확인할 수 없어서(하기싫어서..) 구현을 하였습니다.
참조) https://hyuntaeknote.tistory.com/5
Model 클래스에는 Setter가 꼭 필요한가?
개요 Model(DTO, VO 등) Object를 사용하면서 private 접근 제한자로 멤버 변수를 선언하고 접근자(getter)와 설정자(setter)를 통해서 객체의 멤버에 접근하는 것이 습관이 되어가던 찰나, "VO 나 DTO를 변경
hyuntaeknote.tistory.com
lombok 기능정리 (2) - @Getter/@Setter , @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
@Getter/@Setter 필드에 @Getter나 @Setter를 붙인다면, lombok이 해당 필드에 대한 기본 getter/setter를 생성해줍니다. 기본적인 getter란 단순히 필드를 리턴하는 것을 말하며, 필드 이름이 foo라면 메소드 이..
dingue.tistory.com
'개발 > java' 카테고리의 다른 글
Iterate는 멀까 (0) 2021.12.18 enum 활용법 (0) 2021.12.15 메모리와 스택과 힙 (0) 2021.12.14 일급 컬렉션 (0) 2021.12.12 enum (0) 2021.12.12