
안녕하세요!
이번엔 전 포스팅에서 언급했었던 Lombok에서 제공하는 주요 어노테이션인 @Data, @Getter, @Setter, @NoArgsConstructor, @AllArgsConstructor 등에 대해 자세히 알아보겠습니다.
Lombok은 자바 언어를 위한 라이브러리로 반복적이고 수기로 작성하기 귀찮거나 힘든 코드를 줄이기 위해 위에서 언급한 어노테이션들을 제공합니다. 여러 어노테이션 중에서 @Data, @Getter, @Setter, @NoArgsConstructor, @AllArgsConstructor 등의 어노테이션은 주로 데이터 모델링에서 사용되며 코드의 가독성을 향상시킬 수 있습니다.
@Data 어노테이션은 모든 필드에 대한 Getter 메서드 생성하고 모든 필드에 대한 Setter 메서드 생성하며 equals(), hashCode(), toString() 메서드 자동 생성 해주는 작업을 자동으로 처리해주는 편리한 어노테이션입니다.
간단한 데이터 클래스에서 반복적으로 작성해야 하는 코드를 크게 줄여주는 것이 특징입니다.
@Data 어노테이션을 이전 포스팅에서 작성했던 comment 테이블을 예시로 보여드리겠습니다.
@Data
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id")
private Long userId;
@Column(name = "vote_id")
private Long voteId;
@Column(name = "content")
private String content;
@Column(name = "likes")
private int like = 0;
@Column(name = "time")
private String time;
}
@Data 어노테이션을 사용했을때
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id")
private Long userId;
@Column(name = "vote_id")
private Long voteId;
@Column(name = "content")
private String content;
@Column(name = "likes")
private int like = 0;
@Column(name = "time")
private String time;
//생성자
public Comment() {
}
public Comment(Long id, Long userId, Long voteId, String content, int like, String time) {
this.id = id;
this.userId = userId;
this.voteId = voteId;
this.content = content;
this.like = like;
this.time = time;
}
//게터 함수
public Long getId() {
return id;
}
public Long getUserId() {
return userId;
}
public Long getVoteId() {
return voteId;
}
public String getContent() {
return content;
}
public int getLike() {
return like;
}
public String getTime() {
return time;
}
//세터 함수
public void setId(Long id) {
this.id = id;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public void setVoteId(Long voteId) {
this.voteId = voteId;
}
public void setContent(String content) {
this.content = content;
}
public void setLike(int like) {
this.like = like;
}
public void setTime(String time) {
this.time = time;
}
}
@Data 어노테이션을 사용하지 않았을때
위 두 코드는 보기엔 두 번째 코드보다 첫 번째가 기능이 훨씬 부족해 보이겠지만 두 번째와 동일한 효과를 지니고 있습니다.
@Data 어노테이션을 생성하지 않는다면 생성자, Getter, Setter, equals, hashCode, toString, equals, hashCode, toString 등의 메서드도 직접 작성해야 함 등을 직접 작성해야 한다는 귀찮음이 있을 수 있습니다. 하지만 @Data 어노테이션을 사용한다면 굳이 생성자, Getter, Setter, equals, hashCode, toString, equals, hashCode, toString 등의 메서드들을 직접 작성하지 않아도 그 내용을 포함한다는 것입니다.
정리를 해보자면 Getter, Setter, toString, equals, hashCode 메서드, Parameter가 있는 생성자, 기본 생성자 등을 @Data 어노테이션이 포함하고있습니다.
이렇게 @Data를 사용함으로써 일반적으로 필요한 메서드들이 자동으로 생성되기 때문에 코드의 양이 상당하게 줄어들게 되며 가독성을 높힐 수 있습니다.
Getter는 게터 함수, Setter는 세터 함수라 부르기도 합니다. @Getter 어노테이션은 해당 클래스의 모든 필드에 대한 Getter 메서드를 생성합니다.
Getter와 반대로 @Setter 어노테이션은 모든 필드에 대한 Setter(세터) 메서드를 생성합니다. 이를 통하여 캡슐화를 유지하면서 필요한 필드에 접근할 수 있습니다.
이전에 작성한 comment 엔티티 클래스를 예시로 보여드리겠습니다.
@Getter
@Setter
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id")
private Long userId;
@Column(name = "vote_id")
private Long voteId;
@Column(name = "content")
private String content;
@Column(name = "likes")
private int like = 0;
@Column(name = "time")
private String time;
}
@Getter, @Setter 어노테이션을 사용했을때
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id")
private Long userId;
@Column(name = "vote_id")
private Long voteId;
@Column(name = "content")
private String content;
@Column(name = "likes")
private int like = 0;
@Column(name = "time")
private String time;
//게터 함수
public Long getId() {
return id;
}
public Long getUserId() {
return userId;
}
public Long getVoteId() {
return voteId;
}
public String getContent() {
return content;
}
public int getLike() {
return like;
}
public String getTime() {
return time;
}
//세터 함수
public void setId(Long id) {
this.id = id;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public void setVoteId(Long voteId) {
this.voteId = voteId;
}
public void setContent(String content) {
this.content = content;
}
public void setLike(int like) {
this.like = like;
}
public void setTime(String time) {
this.time = time;
}
}
@Getter, @Setter 어노테이션을 사용하지 않았을때
위 두 코드도 @Data 어노테이션과 마찬가지로 둘다 동일한 효과를 가지고 있습니다.
이렇게 @Getter와 @Setter를 사용하면 기존엔 길게 작성하고 보기 힘들었던 코드를 간략하게 작성할 수 있습니다.
@NoArgsConstructor 어노테이션은 파라미터가 없는 기본 생성자를 생성합니다. 주로 JPA에서 엔티티 클래스를 작성할 때 기본 생성자가 필요한 경우에 사용됩니다. 즉 @NoArgsConstructor 어노테이션은 파라미터가 없는 기본 생성자를 생성합니다.
@NoArgsConstructor
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id")
private Long userId;
@Column(name = "vote_id")
private Long voteId;
@Column(name = "content")
private String content;
@Column(name = "likes")
private int like = 0;
@Column(name = "time")
private String time;
//생성자
public Comment() {
}
}
@NoArgsConstructor 어노테이션을 사용했을때
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id")
private Long userId;
@Column(name = "vote_id")
private Long voteId;
@Column(name = "content")
private String content;
@Column(name = "likes")
private int like = 0;
@Column(name = "time")
private String time;
//생성자
public Comment() {
}
//게터, 세터 함수
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public Long getVoteId() {
return voteId;
}
public void setVoteId(Long voteId) {
this.voteId = voteId;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getLike() {
return like;
}
public void setLike(int like) {
this.like = like;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
}
@NoArgsConstructor 어노테이션을 사용하지 않았을때
위 두 코드는 @NoArgsConstructor 어노테이션의 예시 입니다. @NoArgsConstructor 어노테이션을 사용한 경우 기본 생성자가 자동으로 생성되어 위 코드의 public Comment() {} 부분을 Lombok이 자동으로 처리합니다. 이렇게 하면 기본 생성자를 명시적으로 작성할 필요 없이 간편하게 사용할 수 있습니다. Lombok은 코드의 중복을 줄여주고 더 간편하게 코드를 작성할 수 있도록 도와주는 유용한 라이브러리입니다. 위 두 코드도 동일하게 같은 효과를 가지고 있습니다.
@AllArgsConstructor 어노테이션은 모든 필드를 인자로 받는 생성자를 생성합니다. 이를 통하여 객체를 간편하게 초기화할 수 있습니다.
@AllArgsConstructor
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id")
private Long userId;
@Column(name = "vote_id")
private Long voteId;
@Column(name = "content")
private String content;
@Column(name = "likes")
private int like = 0;
@Column(name = "time")
private String time;
//생성자
public Comment(Long id, Long userId, Long voteId, String content, int like, String time) {
this.id = id;
this.userId = userId;
this.voteId = voteId;
this.content = content;
this.like = like;
this.time = time;
}
}
@AllArgsConstructor 어노테이션을 사용했을때
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id")
private Long userId;
@Column(name = "vote_id")
private Long voteId;
@Column(name = "content")
private String content;
@Column(name = "likes")
private int like = 0;
@Column(name = "time")
private String time;
//빈 생성자(해당 어노테이션을 사용하지않음)
public Comment() {
}
//생성자
public Comment(Long id, Long userId, Long voteId, String content, int like, String time) {
this.id = id;
this.userId = userId;
this.voteId = voteId;
this.content = content;
this.like = like;
this.time = time;
}
}
@AllArgsConstructor 어노테이션을 사용하지 않았을때
@AllArgsConstructor 어노테이션을 사용한 경우는 모든 필드를 인자로 받는 생성자가 자동으로 생성되게 됩니다. 이렇게 하면 생성자를 일일이 작성할 필요 없이 간편하게 모든 필드를 초기화하는 생성자를 사용할 수 있게 되는데요, Lombok을 사용하면 이처럼 반복되는 코드를 간편하게 생성할 수 있어 개발 생산성을 높일 수 있는 것이 특징입니다.
@AllArgsConstructor 어노테이션을 사용하지 않은 경우는 기본 생성자를 만들어주고 필요에 따라 다른 생성자들을 직접 작성해야 하는 귀찮음이 생길 수 있습니다. 이처럼 Lombok을 사용하지 않을 때는 반복적으로 작성해야 하는 코드가 늘어날 수 있다는 것이 특징입니다.
이와같이 Lombok을 사용하면 반복적인 작업을 줄이고 코드의 가독성을 높일 수 있으며 간단한 데이터 모델링에서 특히 효과적으로 사용됩니다.
이외에도 자주 쓰이는 @ToString 어노테이션과 @Builder 어노테이션 등이 있습니다.
@ToString 어노테이션은 toString() 메서드를 자동으로 생성해줍니다. 이를 통해 객체의 내용을 쉽게 확인할 수 있는 것이 특징입니다.
@Builder 어노테이션은 빌더 패턴을 쉽게 적용할 수 있도록 해주는 것이 특징입니다. 이는 객체 생성 시 가독성과 유연성을 높일 수 있는 패턴입니다.
이번에는 Lombok을 사용하면 프로젝트의 코드 양을 획기적으로 줄일 수 있는 방법을 알아 보았습니다. 불필요한 생성자, Getter, Setter 작성에 시간을 낭비하지 않고 코드 가독성을 높이며 유지보수성을 향상시킬 수 있는 것이 바로 이번에 알아봤던 Lombok에서 제공하는 어노테이션들입니다.
이번 내용은 여기까지입니다.
감사합니다!
사진 출처 : 구글 이미지