1. @Builder
Lombok에서 @AllArgsConstructor, @NoArgsConstructor @Data를 활용해서 생성자를 편리하게 사용할 수 있다.
하지만
생성자를 만들 때 필드가 많을 시 단점이 존재!
예를 들어
아래와 같은 User Class가 있다고 하자.
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String account;
private String password;
private String status;
private String email;
private String phoneNumber;
private LocalDateTime registeredAt;
private LocalDateTime unregisteredAt;
}
아래와 같이 create Test 코드를 작성한다고 가정하면
@Test
public void create(){
String account = "Test01";
String password = "Test01";
String status = "REGISTERED";
String email = "TEST01@gmail.com";
String phoneNumber = "010-1111-2222";
LocalDateTime registeredAt = LocalDateTime.now();
LocalDateTime unregisteredAt = LocalDateTime.now();
//@AllArgsConstructor
User u = new User(account,password,status,email,phoneNumber,registeredAt,unregisteredAt);
}
@Data, @NoArgsConstructor, @AllArgsConstructor를 이용해서 위와같이 User 객체를 생성 할 수 있다.
하지만 단점은
@AllArgsConstructor의 경우 모든 필드를 차례로 담아야한다.
- 일부의 필드만 파라미터로 넣고 객체를 생성하려고 한다면 해당 Method를 만들어 줘야하는 불편함이 생긴다.
- 필드를 나중에 수정한다면 해당 위치에 모든 객체 생성자를 수정해줘야하는 불편함이 생긴다.
이러한 단점을 보완하기위해 @Builder를 사용한다!
먼저, User Class에 @Builder를 추가한다
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User {
private String account;
private String password;
private String status;
private String email;
private String phoneNumber;
private LocalDateTime registeredAt;
private LocalDateTime unregisteredAt;
}
아래와 같이 Test 코드에서 객체를 생성 할 수 있다.
@Test
public void create(){
String account = "Test01";
String password = "Test01";
String status = "REGISTERED";
String email = "TEST01@gmail.com";
String phoneNumber = "010-1111-2222";
LocalDateTime registeredAt = LocalDateTime.now();
LocalDateTime unregisteredAt = LocalDateTime.now();
//@Builder
User user = User.builder()
.password(password)
.account(account)
.build();
}
사용 문법 : 객체명.builder().필드명(필드값).build();
@Builder의 장점
1) 필드의 순서에 상관없이 객체를 생성할 수 있다.
(위의 예제를 보면 account , password 순으로 필드가 정의되어있지만 builder()에서는 password, account순으로 객체를 생성한다.)
2) 원하는 필드만 파라미터로 객체를 생성할 수 있다.
(위의 예제를 보면 password, account만 파라미터로 가지고 객체를 생성한다.)
2.@Accessors(chain=true)
@Setter를 이용해서 객체를 생성할 때에는 아래와 같이 여러 줄로 setMethod를 생성해야하는 단점이 있다.
@Test
public void create(){
String account = "Test01";
String password = "Test01";
String status = "REGISTERED";
String email = "TEST01@gmail.com";
String phoneNumber = "010-1111-2222";
LocalDateTime registeredAt = LocalDateTime.now();
LocalDateTime unregisteredAt = LocalDateTime.now();
User user = new User(); //@NoArgsConstructor
user.setAccount(account); //@Setter
user.setPassword(password);
user.setStatus(status);
user.setEmail(email);
user.setPhoneNumber(phoneNumber);
user.setRegisteredAt(registeredAt);
user.setUnregisteredAt(unregisteredAt);
}
이러한 단점을 보완하기위해 @Accessors(chain=true)를 사용한다.
먼저, User Class에 @Accessors(chain=true)를 추가한다.
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Accessors(chain=true)
public class User {
private String account;
private String password;
private String status;
private String email;
private String phoneNumber;
private LocalDateTime registeredAt;
private LocalDateTime unregisteredAt;
}
아래와 같이 Test코드에서 Setter를 이용할 수 있다.
@Test
public void create(){
String account = "Test01";
String password = "Test01";
String status = "REGISTERED";
String email = "TEST01@gmail.com";
String phoneNumber = "010-1111-2222";
LocalDateTime registeredAt = LocalDateTime.now();
LocalDateTime unregisteredAt = LocalDateTime.now();
User user = new User() //chaining
.setAccount(account)
.setPassword(password);
}
@Accessors(chain=true)의 장점
1) 일일이 setMethod를 여러 줄로 생성할 필요 없이 Chain형태로 이어서 원하는 setMethod를 생성할 수 있다.
'Spring' 카테고리의 다른 글
[Spring] Socket통신과 Http통신의 초간단 설명 (0) | 2020.07.04 |
---|---|
[Spring] WebApplicationInitializer (0) | 2020.06.14 |
[Spring] 예제로 보는 Aspect Oriented Programming with Spring (0) | 2020.06.07 |
[Spring] 예제로 보는 Resources (0) | 2020.05.29 |
[Spring] 예제로 보는 Environment Abstraction (0) | 2020.05.27 |