본문으로 바로가기

[Java] 소스 다이어트! Lombok 어노테이션

category 3. 웹개발/3_1_1 JAVA 2018. 5. 14. 18:24
반응형

[Java] 소스 다이어트! Lombok 어노테이션





안녕하세요. 갓대희 입니다. 이번 포스팅은 [ Lombok ] 입니다. :) 



▶ Lombok 이란?


롬복(Lombok)은 자바에서 Model(DTO, VO, Domain) Object 를 만들때, 멤버필드(프로퍼티)에 대한 Getter/Setter, ToString과 멤버필드에 주입하는 생성자를 만드는 코드 등 불필요하게 반복적으로 만드는 코드를 어노테이션을 통해 줄여 주는 라이브러리, 프로젝트 입니다.

사실 반복되는 Getter, Setter, toString 등을 자동으로 해주는 것만으로도 고마운 것 같다.


▶ License : MIT License


MIT 라이선스(MIT LICENSE)는 미국 매사추세츠 공과대학교(MIT)에서 해당 대학의 소프트웨어 공학도들을 돕기 위해 개발한 라이선스다. MIT 라이선스를 따르는 소프트웨어를 개조한 제품을 반드시 오픈 소스로 배포해야 한다는 규정이 없으며 GNU 일반 공중 라이선스의 엄격함을 피하려는 사용자들에게 인기가 있다. 이 라이선스를 따르는 대표적 소프트웨어로 X 윈도 시스템이 있다.



▶ Lombok 다운로드


Lombok.jar 직접 다운로드 http://projectlombok.org/download.html



▶ Maven을 사용하는 경우

 - pom.xml에 다음과 같이 추가 (Dependency 추가)


<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

<version>1.16.20</version>

</dependency>



▶ Gradle을 사용하는 경우 =>

 - build.gradle에 Dependency 추가


provided 'org.projectlombok:lombok:1.16.20'



▶ Lombok 설치 & 사용하기

 - 롬복을 사용하려면 라이브러리만 다운받아서는 안되고 설치를 해야 한다.


1. 다음 방법들 중 선택

   - 콘솔창에서 ‘java –jar lombok.jar’ 실행

   - 직접 다운로드 하여 폴더 이동 후 실행

   - Maven 또는 Gradle로 다운 받은 library 실행

   

2. 이클립스 재부팅한다.


3. 어노테이션 & 사용 예


@Data : 다음 어노테이션을 모두 한번에 처리 한다.

  - @ToString

  - @EqualsAndHashCode

  - @Getter(모든 필드)

  - @Setter(모든 필드-final로 성언되지 않은)

  - @RequiredArgsConstructor


[

@ToString : 모든 필드를 출력하는 toString() 메소드 생성

@EqualsAndHashCode : hascode 와 equals 메소드를 생성

@Getter / @Setter : getter, setter를 생성하지 않도록 지원

@NoArgsConstructor, @RequriedArgsConstructor and @AllArgsConstructor : 

- 인자 없는 생성자 생성, 필수 인자만 있는 생성자 생성, 모든 인자를 가진 생성자 생성

]



3.1 @Data


[ Lombok 적용 전 ]


// 생성자와 Getter, Setter가 있음.

// VO에 변수가 추가될 때 마다 Getter, Setter도 추가해줘야함

// ToString 도 마찬 가지로 추가해 줘야 한다.


  1. public class ExampleVO {
  2.     private final String name;
  3.     private int age;
  4.     public SimpleVO(String name) {
  5.         this.name = name;
  6.     }
  7.     public String getName() {
  8.         return name;
  9.     }
  10.     public int getAge() {
  11.         return age;
  12.     }
  13.     public void setAge(int age) {
  14.         this.age = age;
  15.     }

  16.     @Override
  17.     public String toString() {
  18.         return "name=" + name + ", age=" + age;
  19.     }
  20. }




[ @Data적용 후 ]


  1. public @Data class ExampleVO {
  2.     private final String name;
  3.     private int age;
  4. }




3.2 @Builder


다수의 필드를 가지는 복잡한 클래스의 경우, 생성자 대신에 빌더를 사용하는 경우가 많다.

빌더 패턴을 직접 작성해보면 코딩량이 의외로 상당함을 깨닫게 되는데 이 때, 

@Builder 어노테이션을 사용하면 자동으로 해당 클래스에 빌더를 추가해주기 때문에 매우 편리하다.


[ 선언 예제 ]


  1. @Builder
  2. public class User {
  3.     private Long id;
  4.     private String username;
  5.     @Singular
  6.     private List<Integer> score;
  7. }



[ 사용 예제 ]


컬렉션으로 된 필드에는 @Singular 어노테이션을 선언해주면 모든 원소를 한 번에 넘기지 않고 원소를 하나씩 추가할 수 있습니다.


  1. User user = User.builder()
  2.   .id(1004)
  3.     private int age;
  4.   .username("god")
  5.   .score(70)
  6.   .score(80)
  7.   .build();
  8. // User(id = 1, username = god, scores=[70,80])



3.3 @NonNull


@NonNull 어노테이션을 변수에 붙이면 자동으로 null 체크를 해준다.

해당 변수가 null로 넘어온 경우, NullPointerException 예외가 발생함.


[ 선언 예제 ]


  1. @NonNull @Setter
  2. private String id;



[ 사용 예제 ]


사용예

obj.setId(null); // NullPointerException 발생



3.4 이외 어노테이션은 추후 작성


@Cleanup : 자동 리소스 관리 : close() 메소드를 귀찮음 없게 안전하게 호출

@Value : 불변 클래스를 쉽게 생성

@SneakyThrows : Exception 발생시 체크된 Throable로 감싸서 전달

@Synchronized : 메소드에서 동기화 Lock을 설정

@Getter(lazy=true) : 동기화를 이용하여 최초 1회만 getter가 호출

@Log : 종류별 로그를 사용할 수 있도록 한다. (@Log, @Slf4j, @CommonLog 등)

등등.





* Lombok Annotation 참고자료

- 공식 홈페이지 : https://projectlombok.org/index.html

- Reference Doc : https://projectlombok.org/features/index.html

- 플러그인 안내 : https://plugins.jetbrains.com/androidstudio/plugin/6317-lombok-plugin

- 튜토리얼      : http://jnb.ociweb.com/jnb/jnbJan2010.html

반응형

댓글을 달아 주세요

  1. lsm92 2018.05.16 08:42

    아 역쉬 갓ㅠㅠㅠ. 이글을 보고 저의 개발실력이 더 늘은 것 같습니다 ㅠ3ㅠ