[Spring Boot] Lombok - annotation 정리

이창윤·2022년 7월 18일
0

Lombok이란?

getter, setter, toString 등의 반복 메소드 작성 코드를 줄여주는 JAVA 라이브러리
Annotation을 기반으로 반복 코드를 컴파일 과정에서 생성해주는 방식으로 동작

장점:

  • Annotation 기반의 코드 자동생성을 통한 생산성 향상
  • 반복 코드 제거를 통해 가독성 및 유지보수성 향상

단점:

  • @ToString으로 자동 생성되는 toString() 메소드는 순환참조(무한재귀호출) 문제로 인해 StackOverflow가 발생할 수 있어서 예외처리가 필요

Article.java 기존 코드

public class Article {
	private Long id;
    private String title;
    private String content;
    private String hashtag;
    
    public Long getId(){
    	return id;
    }
    
    public void setId() {
    	this.id = id;
    }
    ......
}

@Getter, @Setter

필드에 대한 getter, setter 메소드를 자동으로 생성해준다.
id에 @Getter과 @Setter을 선언하면 getId()와 setId()를 추가한다.

클래스에 적용시키면 모든 변수에 적용이 가능하기 때문에 Getter메소드는 모든 변수들에 대해 생성하고 Setter메소드는 필요한 변수에 대해서만 생성하고싶다 ->

Articles.java 변경된 코드

@Getter
public class Article {
	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
    
    @Setter private String title;
    @Setter private String content;
    @Setter private String hashtag;
    ...
}

@ToString

클래스 이름과 각 필드에 대한 값을 ,로 구분해서 출력해주는 toString 메소드를 자동으로 생성해준다.

Articles.java 변경된 코드

@Getter
@ToString
public class Article {
	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
    
    @Setter private String title;
    @Setter private String content;
    @Setter private String hashtag;
    ...
    @OneToMany(mappedBy = "article", cascade = CascadeType.ALL)
    private final Set<ArticleComment> articleComments = new LinkedHashSet<>();
}

위 코드에서 게시글(Article)과 댓글(ArticleComment)의 1:N 연관관계를 선언했다.
이 때 ArticleComment에도 @ToString이 선언되어있다면.. Article의 toString()이 호출되면서 연관관계가 정의된 ArticleComment로 넘어가고 ArticleComment의 toString()이 호출되면서 다시 Article이 참조되는 무한참조에 걸리고 Stack Overflow가 발생한다.

해결방법:

@ToString.Exclude
@OneToMany(mappedBy = "article", cascade = CascadeType.ALL)
    private final Set<ArticleComment> articleComments = new LinkedHashSet<>();

해당 문제가 발생하는 필드를 toString() 메소드에서 제외시키는 @ToString.Exclude를 추가하면 된다.

@ArgsConstructor

◻ @AllArgsConstructor

클래스의 모든 필드에 대한 생성자를 자동으로 생성해준다.

◻ @NoArgsConstructor

매개변수가 없는 생성자를 자동으로 생성해준다.
== public Article() {}

◻ @RequiredArgsConstructor

초기화되지 않은 모든 final필드, @NonNull 필드에 대한 생성자를 자동으로 생성해준다.

@EqualsAndHashCode

두 객체의 내용이 같은지 동등성을 비교하는 equals 메소드와 두 객체가 같은 객체인지 동일성을 비교하는 hashcode 메소드를 자동으로 생성해준다.
다른 annotation과 달리 override된 메소드가 코드에 추가되고 마음대로 수정할 수 있다.

@Data

@Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode를 한꺼번에 설정해준다!!

0개의 댓글