[Lombok]

배세훈·2021년 12월 9일
0

lombok

목록 보기
1/2

@Getter/@Setter

필드에 @Getter나 @Setter를 붙인다면 lombok이 해당 필드에 대한 기본 getter / setter를 생성해줍니다.

순수 자바 코드

public class LombokTest{
	
    private String test;
    
    public String getTest(){
    	return test;
    }
    
    public void setTest(String test){
    	this.test = test;
    }
    
}

롬복코드

public class LombokTest{
	@Getter
    @Setter
    private String test;
}

@Getter / @Setter 에서의 접근 제한자 설정

  • 생성되는 getter / setter에 명시적으로 AccessLevel을 명시해주지 않으면 접근 제한자는 public이 됩니다.

  • 허용되는 access level들은 PUBLIC, PROTECTED, PACKAGE, PRIVATE가 있습니다.

순수 자바 코드

public class LombokTest{
	private String test1;
    private String test2;
    
    public LombokTest(){}
    
    public String getTest1(){
    	return this.test1;
    }
    
    private String getTest2(){
    	return this.test2;
    }
}

롬복 코드

public class LombokTest{
	
    @Getter
    private String test1;
    
    @Getter(AccessLevel.PRIVATE)
    private String test2;
}

클래스의 @Getter, @Setter

  • 클래스에 @Getter, @Setter를 붙인다면 전체 필드에 @Getter와 @Setter 애노테이션이 적용됩니다.

  • 만약 특정 필드에서 @Getter, @Setter의 생성을 막고 싶다면 AccessLevel.None을 사용할 수 있습니다.
    AccessLevel.None으로 값을 설정하면 해당 필드는 lombok이 메소드를 생성하지 않습니다.

순수 자바 코드

public class LombokTest{
	private String test1;
    private String test2;
    public static String test3;
    
    public LombokTest(){}
    
    public String getTest1(){
    	return this.test1;
    }
}

롬복 코드

@Getter
public class LombokTest{
	private String test1;
    
    @Getter(AccessLevel.NONE)
    private String test2;
    
    public static String test3;
}
  • static 필드, AccessLevel.None을 적용한 필드 모두 getter가 생성되지 않습니다.

  • enum에도 @Getter를 사용할 수 있습니다. 하지만 setter는 사용할 수 없습니다.

@NoArgsConstructor

  • 파라미터가 없는 생성자를 생성합니다.

순수 자바 코드

public class LombokTest{
	private String test1;
    
    public LombokTest(String test1){
    	this.test1 = test1;
    }
    
    public LombokTest(){}
}

lombok 코드

@NoArgsConstructor
public class LombokTest{
	private String test1;
    
    public LombokTest(String test1){
    	this.test1 = test1;
    }
}

@NoArgsContructor를 사용할 때 주의점

  1. 필드들이 final로 생성되어 있는 경우에는 필드를 초기화 할 수 없기 때문에 생성자를 만들 수 없고 에러가 발생하게 됩니다.

이 때는 @NoArgsConstructor(force=true) 옵션을 이용해서 final 필드를 0, false, null 등으로 초기화를 강제로 시켜서 생성자를 만들 수 있습니다.

  1. @NonNull 같이 필드에 제약조건이 설정되어 있는 경우, 생성자 내 null-check 로직이 생성되지 않습니다. 후에 초기화를 진행하기 전까지 null-check 로직이 발생하지 않는 점을 염두하고 코드를 개발해야 합니다.

@RequiredArgsConstructor

  • 추가 작업을 필요로 하는 필드에 대한 생성자를 생성하는 애노테이션입니다.

  • 초기화되지 않은 모든 final 필드, @NonNull로 마크되있는 모든 필드들에 대한 생성자를 자동으로 생성해줍니다.

  • @NonNull로 마크되있는 필드들은 null-check가 추가적으로 생성되며 @NonNull이 마크되어 있지만 파라미터에서 null 값이 들어온다면 생성자에서 NullPointerException이 발생합니다.

  • 파라미터의 순서는 클래스에 있는 필드 순서에 맞춰서 생성됩니다.

순수 자바 코드

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

롬복 코드

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

@AllArgsConstructor

  • 클래스에 존재하는 모든 필드에 대한 생성자를 자동으로 생성해줍니다.
  • 만약 필드 중에서 @NonNull 애노테이션이 마크되어 있다면 생성자 내에서 null-check 로직을 자동적으로 생성해줍니다.

순수 자바 코드

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

롬복 코드

@AllArgsConstructor
public class LombokTest{
	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 LombokTest{
	private String test1;
    private final String test2;
    @NonNull
    private String test3;
    
    private LombokTest(String test2, @NonNull String test3){
    	if(test3 == null){
        	throw new NullPointerException("test3 is nonNull");
        }else{
        	this.test2 = test2;
            this.test3 = test3;
        }
    }
    
    public static LombokTest of(String test2, @NonNull String test3){
    	return new LombokTest(test2, test3);
    }
}

롬복 코드

@RequiredArgsConstructor(staticName="of")
public class LombokTest{

	private String test1;
    private final String test2;
    
    @NonNull
    private String test3;
}

생성자 관련 애노테이션을 사용할 때 주의사항

  1. static 필드들은 스킵됩니다.

  2. 파라미터의 순서는 클래스에 있는 필드 순서에 맞추서 생성하기 때문에 매우 주의해야 합니다.
    -> 만약 클래스 필드의 순서를 바꾸었을 때 롬복이 자동적으로 생성자 파라미터 순서를 바꾸어 주기 때문에 주의하지 않으면 버그가 발생할 수 있다.

  3. AccessLevel을 꼭 설정해주어야 합니다.

profile
성장형 인간

0개의 댓글