[JAVA] 자주 사용하는 Lombok 어노테이션
- @Data (사용 지양)
- @ToString, @EqualsAndHashCode, @Getter/@Setter, @RequiredArgsConstructor 을 한번에 생성해준다.
- 해당 메소드를 자동으로 생성해준다는 것이지, 유효성 검사를 한다던가, 예외처리를 해준다는 개념은 아니다.
- 주의할 점
- 무분별하게 @Getter,@Setter를 사용하게 되고 @RequiredArgsConstructor 등을 포함하기 때문에 사용하지 않는 것이 좋다.
- 권장하는 방법
- @Data를 사용하는 것 보다 @Getter,@Setter 등 필요한 어노테이션을 각각 선언하는 것을 권장한다.
- @EqualsAndHashCode
- Equals와 HashCode 메소드를 자동으로 생성해준다.
- equals : 두 객체의 내용이 같은지, 동등성을 비교
- hashCode : 두 객체가 같은 객체인지. 동일성을 비교
- 속성
- callSuper = false : 자신 클래스의 필드값만 적용
- callSuper = true : 자신 클래스 뿐만아니라, 부모클래스 필드값도 체크
- of : 메소드를 만들 때 포함할 변수 설정
- exclude : 메소드를 만들 때 제외할 변수 설정
- 주의할 점
- 상속 받은 클래스가 있다면, callSuper = true 명시가 필요
- 권장하는 방법
- @EqualsAndHashCode(of={“변수명”}) 형태로 동등성 비교에 필요한 필드를 명시하는게 좋다.
- @Getter/ Setter
- getter와 setter를 생성한다.
- 클래스와 필드에서 모두 사용가능하다.
- 속성
- AccessLevel : 접근제한자를 설정해줄 수 있다.
- 접근제한자는 public.protected,package,private이 있다.
- 주의할 점
- setter 같은 경우 해당 클래스가 무결성(변경하면 안되는)을 보장해야 하는 경우 사용을 지양해야 된다.
- @NoArgsConstructor
- 파라미터가 없는 기본 생성자를 생성한다.
- 속성
- access : AccessLevel을 이용하여 접근 제한자를 설정해줄 수 있다.
- 주의할 점
- 기본 생성자를 public으로 열어두면 안전성이 심각하게 저하된다.
- static 변수들은 스킵된다.
- 필드들이 final로 생성되어 있는 경우에는 필드를 초기화 할 수 없기 때문에 생성자를 만들 수 없고 에러가 발생하게된다.
- 권장하는 방법
- @NoArgsConstructor(access = AccessLevel.PROTECTED) 를 사용하여 객체 생성 시 안전성을 보장해주는 것을 권장한다.
- @RequiredArgsConstructor / @AllArgsConstructor
- AllArgsConstructor : 모든 변수를 파라미터로 받는 생성자를 생성한다.
- RequiredArgsConstructor : final 혹은 @NonNull 인 변수만 파라미터로 받는 생성자를 생성한다.
- 속성
- access : AccessLevel을 이용하여 접근 제한자를 설정해줄 수 있다.
- staticName : 생성자 관련 어노테이션은 모두 사용할 수 있다. 생성자를 private으로 생성하고, private 생성자를 감싸고 있는 static factory 메소드를 추가할 수 있다.
- 주의할 점
- 같은 타입의 변수들 중 변수의 위치가 변하게 되면 생성자의 위치도 바뀌지만 입력에는 둘다 같은 타입이라 오류가 발생하지 않는다. 인지못할 수도 있다.
- Builder
- 빌더 패턴을 사용할 수 있도록 코드를 생성한다.
- 주의할 점
- @Builder도 private으로 만들긴 하지만 @AllArgsConstructor를 내포한다. 해당 클래스의 다른 메소드에서 이렇게 자동으로 생성된 생성자를 사용하거나 할 때 문제 소지가 있다.
- 권장하는 방법
- @Builder를 Class 보다는 직접만든 생성자 혹은 static 객체 생성 메소드에 붙이는 것을 권장한다.
- private생성자를 구현하여 @Builder를 지정한다. @Builder를 Class에 적용시키면 생성자의 접근레벨이 default이기 때문에, 동일 패키지 내에서 해당 생성자로 호출할 수 있는 문제가 있기 때문이다.