인프런 커뮤니티 질문&답변
퀴즈
회원 가입 시 화면 입력 데이터를 엔티티 객체 대신 별도의 Form 객체로 받는 주된 이유는 무엇일까요?
데이터베이스 성능을 최적화하기 위해서
화면 종속적인 데이터나 유효성 검증 로직을 분리하기 위해서
JPA 영속성 컨텍스트와 직접적인 관계를 맺기 위해서
코드의 자동 생성 기능을 활용하기 위해서
답변 1
1
안녕하세요 마뇽님!
.
우선, 스프링에서 빌더 패턴으로 멤버를 생성하는 방법은 아래와 같습니다.
모든 멤버변수를 파라미터로 받는 생성자 위에 @Builder 애노테이션을 붙인 뒤,
builderTest()안에 있는 코드처럼 생성하는 방식입니다.
(기본 생성자가 필요합니다! @NoArgsConstructor를 Member클래스 위에 붙여주세요. 예제의 편의를 위해 모든 값을 String으로 대체하였습니다)
.
package inflearn.test;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.junit.Test;
public class BuilderTest {
@Test
public void builderTest() {
Member member = new Member().builder()
.id("codesweaver")
.password("1234")
.email("test@gmail.com")
.birth("1886-01-01")
.nameKor("홍길동")
.nameEng("John Doe")
.phone("000-0000-0000")
.gender("male")
.build();
System.out.println(member.toString());
}
@ToString
@NoArgsConstructor
static class Member {
private String id;
private String password;
private String email;
private String birth;
private String nameKor;
private String nameEng;
private String phone;
private String gender;
@Builder
public Member(String id, String password, String email, String birth, String nameKor, String nameEng, String phone, String gender) {
this.id = id;
this.password = password;
this.email = email;
this.birth = birth;
this.nameKor = nameKor;
this.nameEng = nameEng;
this.phone = phone;
this.gender = gender;
}
}
}
.
아니면 Builder 패턴을 DTO에 적용하고 Member는 이 DTO를 이용해서 생성하도록 하는 방법이 있을 수 있습니다.
@Test
public void builderTest() {
MemberDto memberDto = new MemberDto().builder()
.id("codesweaver")
.password("1234")
.email("test@gmail.com")
.birth("1886-01-01")
.nameKor("홍길동")
.nameEng("John Doe")
.phone("000-0000-0000")
.gender("male")
.build();
Member member = new Member(memberDto);
}
static class Member {
public Member(MemberDto dto) {
// ... code here ...
}
}
.
메서드를 호출 할 떄 파라미터가 너무 많이 필요한것은 좋은 방법이라고 보기는 어렵습니다.
또, 객체의 값을 설정할때 member.name = name; 식으로 직접적인 필드값 주입보다는
member.setName(name); 처럼 수정자(setter)를 이용하여 설정하는 방법을 권합니다.
객체 내부에서 값을 할당하는 경우가 아니라면 외부에서 필드에 직접 접근하는 일은 피해주세요.
.
### 정리
1. 메서드 호출 시 파라미터 수를 줄이세요. (DTO이용)
2. 객체의 값 설정시 수정자(setter)를 이용하세요.
.
### 추가
빌더 패턴이 어떤식으로 작동하는지 설명한 글 링크를 남깁니다. 포트폴리오 준비중이시라면
여러가지 디자인 패턴을 적용하는것보다 왜 그 패턴을 사용해야 했는지를 설명할 수 있는게 더 중요한 문제가 됩니다.
[Java] 빌더 패턴(Builder Pattern) :: Gyun's 개발일지 (tistory.com)
.
감사합니다.





