spring boot lombok

Val

  • 변수를 선언할 때 타입을 명시적으로 선언하지 않고, 표현식에서 타입을 추론함
  • 변수에 final 키워드가 자동으로 적용

val 주의사항

  • val은 메소드 파라미터와 클래스 변수로는 사용할 수 없다.
  • 버전과 IDE에 따라 특정 타입이 적용되지 않을 수 있다.

Var

  • val과 다르게 final 키워드가 적용되지 않은 점을 제외하고는 같음
  • final 키워드가 적용되지 않아서 변수에 추가적인 할당이 가능함
  • 처음 초기화 표현식에만 타입 추론기능이 작동하고 추가적인 할당에 따른 타입 추론기능은 동작하지 않음
var x = "YeongSu";
x = 123;  //error
// 처음 표현식에서 java.lang.String으로 타입이 추론됨

var 주의사항

  • 특정 표현식이나 타입을 추론하지 못 한다.
  • java 10부터 var 기능을 기본적으로 제공하기 때문에 lombok에서 제공하는 var을 사용할 필요가 없다.

@NonNull

  • null-check 로직을 자동으로 생성해주는 어노테이션
  • 생성자, 메소드 특정 파라미터에 @NonNull이 달려있으면 lombok은 자동으로 해당 파라미터에 null-check 코드를 메소드나 생성자의 최상단에 생성
  • 필드에 적용된 @NonNull 애노테이션은 lombok이 생성한 메소드나 생성자에만 효과가 있음
순수 자바 코드

public class Test {

  @NonNull
  private String test;
  
  public Test(){}
  
  @NonNull
  public String getTest(){
    return this.test;
  }
  
  public void setTest(@NonNull String test) {
    if(test == null) {
      throw new NullPointerException("test is null");
    } else {
      this.test = test;
    }
  }
}
lombok 적용

@Getter
@Setter
public class Test {
  @NonNull
  private String test;
}

@ToString

  • 객체.toString() 메서드를 대체하는 어노테이션으로 callSuper값을 true로 할 경우 상속받은 클래스의 정보까지 출력됨
  • exclude를 통해 제외하고자 하는 변수를 선택할 수 있음

@Getter/ @Setter

  • 필드에 @Getter, @Setter를 붙이면 lombok이 해당 필드에 대한 기본 getter/setter를 생성
  • whdfbsms

    @Getter/ @Setter 접근제한자 설정

  • AccessLevel에는 PUBLIC, PROTECTED, PACKAGE, PRIVATE 가 있음
  • AccessLevel을 명시해주지 않으면 접근제한자는 PUBLIC
  • enum에도 @Getter 사용 가능(@Setter 는 사용 불가)

@NoArgsConstructor / @RequiredArgsConstructor / @AllArgsConstructor

  • 생성자를 자동으로 생성해주는 어노테이션

@NoArgsConstructor

  • 파라미터가 없는 생성자를 생성
순수 자바 코드
public class Test {
	private String test;
	
	public Test(String test) {
		this.test = test;
	}
	
	public Test() {}
}
lombok 적용

@NoArgsConstructor
public class Test {
	private String test;
	
	public Test(String test) {
		this.test = test;
	}
}

@NoArgsContructor 주의사항

  • 필드에서 final로 생성되어 있는 경우에는 필드를 초기화 할 수 없기 때문에 생성자를 만들 수 없고 에러가 발생한다.
  • 이 때는 @NoArgsConstructor(force = true) 옵션을 이용해서 final 필드를 0, false, null 등으로 초기화를 강제로 시켜서 생성자를 만들 수 있다.
  • @NonNull 같이 필드에 제약조건이 설정되어 있는 경우, 생성자내 null-check 로직이 생성되지 않는다.

@RequiredArgsConstructor

  • 추가 작업을 필요로 하는 필드에 대한 생성자를 생성하는 어노테이션
  • 초기화 되지 않은 모든 final필드, @NonNull이 적용된 모든 필드에 대한 생성자를 자동으로 생성
  • @NonNull이 적용된 필드들은 null-check가 추가적으로 생성되며, @NonNull이 적용되었지만, 파라미터에서 null값이 들어온다면 생성자에서 NullPointerException 발생
순수 자바 코드

public class Test {
	private String test1;
	private final String test2;
	@NonNull
	private String test3;
	
	public Test(String test2, @NonNull String test3) {
		if(test3 == null) {
			throw new NullPointerException("test3 is null");
		} else {
			this.test2 = test2;
			this.test3 = test3;
		}
	}
}

lombok 적용

@RequiredArgsConstructor
public class Test {
	private String test1;
	private final String test2;
	
	@NonNull
	private String test3;
}

@AllArgsConstructor

  • 클래스에 존재하는 모든 필드에 대한 생성자를 자동으로 생성하는 어노테이션
  • 필드중에서 @NonNull 어노테이션이 적용되어 있다면 생성자 내에서 null-check 로직을 자동적으로 생성
순수 자바 코드

public class Test {
	private String test1;
	private String test2;
	@NonNull
	private String test3;
	
	public Test(String test1, String test2, @NonNull String test3) {
		if(test3 == null) {
			throw new NullPointerException("test3 is null");
		} else {
			this.test1 = test1;
			this.test2 = test2;
			this.test3 = test3;
		}
	}
}

lombok 적용

@AllArgsConstructor
public class Test {
	private String test1;
	private String test2;
	@NonNull
	private String test3;
	
}

staticName 옵션을 이용한 static factory 메서드 생성

  • 위의 세 생성자 관련 어노테이션은 static factory를 만들 수 있는 옵션이 있음
  • staticName 이라는 옵션을 사용하여 생성자를 private로 생성하고, private 생성자를 감싸고 있는 static factory 메서드를 추가할 수 있음
  • ex) @RequiredArgsConstructor(staticName = “of”)
순수 자바 코드

public class Test {
	private String test1;
	private final String test2;
	@NonNull
	private String test3;
	
	public Test(String test2, @NonNull String test3) {
		if(test3 == null) {
			throw new NullPointerException("test3 is null");
		} else {
			this.test2 = test2;
			this.test3 = test3;
		}
	}
	
	public static Test of(String test2, @NonNull String test3) {
		return new Test(test2, test3);
	}
}

// private 생성자가 생성되고, private 생성자를 감싸는 static factory 메서드가 생성됨
lombok 적용

@RequiredArgsConstructor(staticName = "of")
public class Test {
	private String test1;
	private String test2;
	@NonNull
	private String test3;
	
}

생성자 관련 어노테이션 주의사항

  • static 필드들은 스킵된다.
  • 파라미터 순서는 클래스에 있는 필드 순서에 맞춰서 생성된다.
  • AccessLevel을 꼭 설정해준다.

@Builder

  • 생성자 대신 빌더를 사용할 수 있는 어노테이션
  • @Singular 어노테이션을 collection 타입에 선언하게 되면 파라미터를 하나씩 추가할 수 있음
@Builder
public class User {

      private Long id;
      private String name;
      private String password;

      @Singular
      private List<String> list;

      @Singular
      private Map<String, String> maps;

    /* Example
        User user = User.builder().id(0)
                                  .name("test")
                                  .password("1234")
                                  .list("test1")
                                  .list("test2")
                                  .maps("abc","abc")
                                  .maps("def","def")
                                  .build();
    */
}

Categories:

Updated:

Comments