Spring

[Spring] Lombok(@Builder 와 @Accessors)의 편리한 기능

KEMON 2020. 7. 9. 02:38
728x90

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를 생성할 수 있다.

728x90