getter, setter, toString 등의 반복 메소드 작성 코드를 줄여주는 JAVA 라이브러리
Annotation을 기반으로 반복 코드를 컴파일 과정에서 생성해주는 방식으로 동작
장점:
단점:
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 메소드를 자동으로 생성해준다.
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 메소드를 자동으로 생성해준다.
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를 추가하면 된다.
클래스의 모든 필드에 대한 생성자를 자동으로 생성해준다.
매개변수가 없는 생성자를 자동으로 생성해준다.
== public Article() {}
초기화되지 않은 모든 final필드, @NonNull 필드에 대한 생성자를 자동으로 생성해준다.
두 객체의 내용이 같은지 동등성을 비교하는 equals 메소드와 두 객체가 같은 객체인지 동일성을 비교하는 hashcode 메소드를 자동으로 생성해준다.
다른 annotation과 달리 override된 메소드가 코드에 추가되고 마음대로 수정할 수 있다.
@Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode를 한꺼번에 설정해준다!!