[Spring] lombok 어노테이션

접근자/설정자, 생성자 자동 생성, Builder

Posted by Wonyong Jang on June 23, 2020 · 5 mins read

생성자 자동생성

Lombok을 사용하면 생성자도 자동으로 생성이 가능하다. @NoArgsConstructor은 파라미터가 없는 기본생성자를 생성해주고, @AllArgsConstructor 는 모든 필드 값을 파라미터로 받는 생성자를 만들어준다.
마지막으로, @RequiredArgsConstructor는 final이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 만들어준다.

@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
public class User {
  private Long id;
  
  @NonNull private String username; 
  @NonNull private String password;

  private int[] scores;
}
User user1 = new User();        // NoArgsConstructor
User user2 = new User("dale", "1234"); // RequiredArgsConstructor
User user3 = new User(1L, "dale", "1234", null); // AllArgsConstructor 

@NoArgsConstructor 사용시 주의사항

초기값이 필요한 final필드가 있는 경우( @RequiredArgsConstructor를 이용하여 DI 하기 위한 필드 ) 에러가 발생하게 된다. 해결방법은 아래와 같다.

final 대신 @NonNull 사용하거나 final 을 사용한 필드를 초기화 해준다!

@RequiredArgsConstructor 의존성 주입

초기화되지 않은 final 필드나, @NonNull이 붙은 필드에대해 생성자를 생성해 준다. 주로 의존성 주입(Dependency Injection) 편의성을 위해서 사용되곤 한다.

@NonNull로 마크되어있는 필드는 Null 체크가 추가적으로 진행되며, null 값이 들어오는 경우 생성자에서 NullPointerException이 발생한다.

스프링 4.3부터는 클래스 안에 생성자가 오직 한개만 존재하고, 그 생성자의 파라미터 타입이 빈으로 등록되어 있다면 @Autowired 어노테이션 없이 자동으로 의존성 주입이 된다.

@Service
public class SampleService {

    private SampleRepository sampleRepository; // @Autowired 없이 자동 주입된다! 
    public SampleService(SampleRepository sampleRepository) {
        this.sampleRepository = sampleRepository;
    }
}

아래와 같이 @RequriedArgsConstructor 이용하여 의존성 주입이 가능하다.

@Service
@RequiredArgsConstructor 
public class SampleService {

    private final SampleRepository sampleRepository; // 자동 주입된다!
}

@RequriedArgsConstructor를 사용이유

의존성을 주입해야 하는 Service 객체가 여러개일 경우, 어노테이션도 여러개 써야하므로 중복을 피하고 유지보수를 높히기 위해서이다. 또한, 아래와같이 A서비스와 B서비스를 필드로 의존성 주입받는 경우 필드 주입 순환 참조시 문제가 될수 있다.

필드 주입의 경우 에러도 발생하지 않기 때문에 문제의 원인을 찾기 힘들지만, 생성자로 의존성을 주입하는 경우 에러가 발생하여 문제를 확인 할 수 있다.

// AService > BService
AService aService = new AService(BService);

//BService > AService
BService bService = new BService(AService);


ToString 메소드 자동 생성

toString() 메소드를 직접 작성하기 보다는 @ToString 어노테이션을 이용하면 자동으로 생성해 준다.
아래와 같이 exclue 속성을 이용하면 특정 필드를 toString() 결과에서 제외시킬 수 있다.

@ToString(exclude = "password")
public class User {
  private Long id;
  private String username;
  private String password;
  private int[] scores;
}



Builder Pattern

lombok은 빌더 패턴을 @Builder 어노테이션으로 사용할수 있도록 제공해 준다.

@Builder
public User(Long id, String name, String email, String picutre, Role role) {
        this.id = id;
        this.name = name;
        this.email = email;
        this.picture = picutre;
        this.role = role;
    }

Referrence

https://www.daleseo.com/lombok-popular-annotations/