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();
*/
}
Comments