JaeWon's Devlog
article thumbnail
Published 2022. 7. 6. 16:53
[Java] Lombok 정리 BackEnd/Java
반응형

Java 언어를 사용해 개발을 하다 보면 DTO, VO 개발을 하다 보면 Lombok(롬복) 이란 라이브러리를 사용하여 개발을 하곤 한다.(물론 아직까지도 안 쓰는 회사도 있기도 하겠지만....)

이번 글에서는 자주 사용하는 Lombok 이란 라이브러리에 대해서 정리해보고자 한다.


1. 1. Lombok 이란?

-  Java 의 라이브러리로 반복되는 메소드를 Annotation(어노테이션) 기반으로 코드를 자동으로 완성해주는 라이브러리이다.

- Lombok 을 이용하면 Getter, Setter, ToString 등과 같은 다양한 코드를 자동 완성시킬 수 있다.

- Lombok 을 이용해서 작성한 코드는 컴파일 과정에서 Annotation 을 이용해서 코드를 생성하고 이런 결과물이 .class 에 담기게 된다.

- 생산성을 향상해 많은 개발자들이 선호하지만, 팀 프로젝트에 도입하는 경우에는 호불호가 갈릴 수 있기 때문에 주의해야 한다.(무분별한 @Data 사용을 통한 에러 발생, 속도 저하가 발생할 수 있다)

 

2. 2. Lombok 의 장점 / 단점

2.1. 2-1. 장점

- 어노테이션 기반의 코드 자동 생성을 통한 생산성 향상

- 반복되는 코드 다이어트를 통한 가독성 및 유지보수성 향상

- Getter, Setter 이외에 Builder(빌더) 패턴이나 로그 생성 등 다양하게 활용 가능

2.2. 2-2. 단점

- 만약 Intelli J에서 개발 시에는 모든 팀원이 Lombok 플러그인을 설치하여야만 한다.(최근에는 Intelli j 기본 플러그인으로 제공)

- 무분별한 어노테이션을 사용하면, 순환 참조 또는 무한 재귀 호출로 인해 StackOverFlow 가 발생할 수 있다.

2.3. 2-3. Lombok 의 필요성

- 기존의 VO 를 만들 때는 아래와 같이 개발하였다.

<java />
// AS-IS public class Member { private Long id; private String memberId; private String memberPw; private String memberName; private String memberPhone; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getMemberId() { return memberId; } public void setMemberId(String memberId) { this.memberId = memberId; } public String getMemberPw() { return memberPw; } public void setMemberPw(String memberPw) { this.memberPw = memberPw; } public String getMemberName() { return memberName; } public void setMemberName(String memberName) { this.memberName = memberName; } public String getMemberPhone() { return memberPhone; } public void setMemberPhone(String memberPhone) { this.memberPhone = memberPhone; } }

- 이렇게 긴 코드를 Lombok 을 사용하여 줄일 수 있다.

<java />
// TO-BE @Getter @Setter public class Member { private Long id; private String memberId; private String memberPw; private String memberName; private String memberPhone; }

 

3. 3. Lombok 사용법

3.1. 3-1. @Getter, @Setter

- Lombok에서 가장 자주 활용하는 Annotation(어노테이션)이다.

- 필드에 대한 getter, setter 메소드를 자동으로 생성해주는 어노테이션이다.

- 클래스 이름 위에 적용시키면 모든 변수들에 적용이 되고, 변수 이름 위에 적용시키면 해당 변수들에게만 적용이 된다.

- 자동으로 생성되는 getter 와 setter 의 경우 기본은 public 이며, AccessLevel 을 명시한 경우에는 public. protected, package, private 등으로 생성할 수 있다.

- 이름이 같고 매개변수의 수가 같은 메소드가 이미 존재한다면 메소드가 생성되지 않는다.
  예를 들어, getMemberName(String str)가 존재한다면 getter를 통한 getMemberName() 메소드는 기술적으로 가능하더라도 생성되지 않는다.(생성되지는 않지만, 이에 대한 경고 메시지를 알려준다.)

<java />
// 클래스 전체 @Getter @Setter public class Member { private Long id; private String memberId; private String memberPw; private String memberName; private String memberPhone; }

- 컴파일 시 Member.class 는 아래 이미지와 같고, get/set 메소드를 생성한 것을 확인할 수 있다.

<java />
// 필드 @Getter public class Member { private Long id; private String memberId; @Getter(AccessLevel.PROTECTED) private String memberPw; @Setter private String memberName; @Setter private String memberPhone; }

- @Setter 어노테이션을 필드에 선언하면 해당 필드에만 선언이 된다.

- @Getter 어노테이션에 AccessLevel 을 선언하면 해당 레벨에 맞게 메소드를 생성해준다.

3.2. 3-2. @ToString

- 클래스 이름 위에 적용하며, 클래스의 변수들을 기반으로 ToString 메소드를 자동으로 완성시켜 준다.

- 출력을 원하지 않는 변수에 대해서는 @ToString.Exclude 어노테이션을 붙여주면 제외된다.

- 상위 클래스에 대해서도 ToString 을 적용시키고자 한다면, 상위 클래스에 @ToString(callSuper = true)를 적용시킨다.

- includeFieldNames 를 설정하면 각 필드의 이름과 함께 값을 확인할 수 있다.(Default = true)

<java />
@ToString public class Member { private Long Id; private String memberId; @ToString.Exclude private String memberPw; private String memberName; private String memberPhone; }

3.3. 3-3. @AllArgsConstructor

- 모든 변수를 사용하는 생성자를 자동완성시켜준다.

<java />
@AllArgsConstructor public class Member { private Long Id; private String memberId; private String memberPw; private String memberName; private String memberPhone; /* AllArgsConstructor를 통해 아래의 생성자를 자동 생성할 수 있다. public Member(Long id, String memberId, String memberPw, String memberName, String memberPhone) { this.id = id; this.memberId = memberId; this.memberPw = memberPw; this.memberName = memberName; this.memberPhone = memberPhone; } */ }

3.4. 3-4. @NoArgsConstructor

- 매개변수가 없는 기본 생성자를 자동완성시켜준다.

<java />
@NoArgsConstructor public class Member { private Long id; private String memberId; private String memberPw; private String memberName; private String memberPhone; /* NoArgsConstructor를 통해 아래의 생성자를 자동 생성할 수 있다. public Member () { } */ }

3.5. 3-5.RequiredArgsConstructor

- 특정 변수(초기화되지 않은 모든 final 필드, @NonNull 필드)만을 활용하는 생성자를 자동완성시켜준다.

- @NonNull 필드의 경우 null check 구몬 또한 생성해준다.

<java />
@RequiredArgsConstructor public class Member { @NonNull private Long id; private String memberId; private String memberPw; private String memberName; private String memberPhone; /* RequiredArgsConstructor를 통해 아래의 생성자를 자동 생성할 수 있다. public Member (Long id, String memberId) { this.id = id; this.memberId = memberId; } */ }

3.6. 3-6. @NonNull

- 메소드나 생성자의 매개변수에 사용하면 lombok이 null check를 해준다.

<java />
@AllArgsConstructor public class Member { @NonNull private Long Id; private String memberId; private String memberPw; private String memberName; private String memberPhone; }

3.7. 3-7. @EqualsAndHashCode

- 클래스에 대한 equals 메소드와 hashCode 메소드를 자동으로 생성해준다.

- 서로 다른 두 객체에서 특정 변수의 이름이 똑같은 경우에 같은 객체로 판단을 하고 싶다면 아래와 같이 가능하다.

<java />
@RequiredArgsConstructor @EqualsAndHashCode(of = {"memberName", "memberPhone"}) public class Member { private Long id; private String memberId; private String memberPw; @NonNull private String memberName; @NonNull private String memberPhone; }

- Member 라는 클래스 위에 @EqualsAndHashCode 어노테이션을 선언하여, MemberName 과 MemberPhone 의 값이 동일하다면 같은 객체로 인식하도록 도와준다.

<java />
@RestController @RequestMapping(value = "/member") @Slf4j public class MemberController { @GetMapping(value = "/test") private void test(){ Member member1 = new Member("개발자", "01011112222"); Member member2 = new Member("개발자", "01011112222"); Member member3 = new Member("개발자", "01088887777"); // MemberName 과 MemberPhone 이 같기 때문에 true가 나옴 log.info("결과 : " + member1.equals(member2)); // MemberName 과 MemberPhone 이 다르기 때문에 false가 나옴 log.info("결과 : " + member1.equals(member3)); } }

3.8. 3-8. @Data

- 해당 어노테이션은 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor 를 자동 완성시켜준다.

- callSuper, includeFieldName, exclude 와 같은 파라미터와는 같이 사용될 수 없어, 필요시에는 개별 어노테이션으로 따로 명시가 필요하다.

- 실무에서는 해당 어노테이션을 무분별하게 사용하다 보면 프로그램이 무거워지고 객체의 안정성을 해치기 때문에 사용을 지양한다.

 

3.9. 3-9. @Builder

- 클래스의 객체의 생성에 Builder 패턴을 적용시켜 준다.

- 모든 변수들에 대해 build 하기를 원한다면 클래스 위에 @Builder 어노테이션을 추가하고, 특정 변수만을 build 하기를 원한다면 생성자를 작성하고 그 위에 @Builder 어노테이션을 추가한다.

<java />
@Builder public class Member { private int Id; private final String MemberId; private String MemberPw; private String MemberName; private String MemberPhone; }
<java />
@RestController @RequestMapping(value = "/member") @Slf4j public class MemberController { @GetMapping(value = "/test") private void test(){ Member member = Member.builder() .memberId("test") .memberPw("1234") .memberName("개발자") .memberPhone("01011112222") .build(); } }

참고

- https://mangkyu.tistory.com/78

- https://www.korecmblog.com/lombok/

반응형
profile

JaeWon's Devlog

@Wonol

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!