허원철의 개발 블로그

Lombok - 간략 정리 본문

java

Lombok - 간략 정리

허원철 2017. 6. 1. 12:26
이번 글은 lombok에 대한 간단한 예제 글입니다.


lombok이 뭔가요..? 왜 쓰나요..?

- 흔히 Java에서 VO, DTO, Domain, Persistence, ... 같은 객체를 만들다 보면 getter/setter, toString, hashCode, equals, constructor, ... 등등 이 늘어나게 되고 비즈니스 로직이 아님에도 불구하고 코드가 길어지는 현상이 발생합니다. 이 때 "이 코드를 어떻게 줄이지?" 라는 고민을 하게 되는데, lombok을 이용하여 쉽고 빠르게 해결할 수 있습니다.


어떤 것들이 있나요??

- lombok은 어노테이션기반으로 되어 있으며, class나 field에 추가해줄 수 있습니다.

1) @Getter/@Setter
 - getter/setter를 만들어 줍니다.

2) @ToString
 - {className}(field1=value, field2=value, ... ) 형태의 toString()을 만들어 줍니다.

3) @EqualsAndHashCode
 - equals(동등성)과 hashCode(동일성)을 만들어 줍니다.

4) @NoArgsConstructor
 - 매개변수가 없는 기본생성자를 만들어 줍니다.

5) @AllArgsConstructor
 - 해당 클래스에 모든 필드가 매개변수에 들어간 생성자를 만들어 줍니다.

6) @Data
 - @Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode, @lombok.Value를 만들어 줍니다.

※ 간단하게 쓴다면 @Data만 쓰는 것 만으로도 충분합니다.

7) @Builder
 - 해당 클래스를 빌더 패턴으로 만들 수 있게 해줍니다.

8) @Slf4j
 - 로그 변수를 만들어 줍니다.

...


어떻게 사용할 수 있나요..?

- IDE마다 초기 셋팅방법이 다릅니다. 

1) Eclipse (STS)

① http://projectlombok.org/download.html
② [Window OS] 경우, cmd 접속하여 다운받은 lombok.jar를 실행

1
java -jar {설치 경로}/lombok.jar
cs

③ Specify location... 버튼 클릭 후, 사용하는 eclipse 선택
 


2) Intellij

① File -> Setting
② Plugins -> Browse repositories 버튼 클릭
③ lombok 검색 후, 설치
④ restart
 

 

 

어떻게 활용 할 수 있을까?
 
- Person 클래스를 만들어 예시를 들어보도록 하겠습니다.
 
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Person {
 
    private String firstName;
 
    private String lastName;
 
    private String address;
 
    private String city;
 
    private LocalDate dateOfBirth;
 
}
cs
 
1) @Getter/@Setter

 - class에 어노테이션을 써주면 private로 선언한 모든 field에 getter/setter가 만들어집니다.
 - 불필요한 getter/setter가 있는 경우, 해당 필드에 getter/setter를 다시 써주고 AccessLevel 옵션을 변경 해줍니다.
  
1
2
3
4
5
6
7
8
9
@Getter
@Setter
public class Person {
 
    @Getter(AccessLevel.PRIVATE)
    private String firstName;
    
    // ...
}
cs
 

 

2) @EqualsAndHashCode

- Set으로 중복제거할 때, 유용하게 사용할 수 있습니다.
- of는 해당 field들 중 식별의 대상이 될 필드명을 나열해줍니다.
- exclude는 of와 반대로 식별의 대상에서 제외될 필드명을 나열해줍니다. 
 
1
2
3
4
5
@EqualsAndHashCode(of = {"firstName""lastName""dateOfBirth"})
//@EqualsAndHashCode(exclude = {"address", "city"})
public class Person {
    // ...
}
cs

- 테스트를 위해 임의의 데이터를 넣어둔 Person 객체를 준비합니다.
 
1
2
3
4
5
6
7
8
9
public static Person getDefaultPerson() {
    Person person = new Person();
    person.setFirstName("won chul");
    person.setLastName("heo");
    person.setAddress("South Korea");
    person.setCity("Seoul");
    person.setDateOfBirth(LocalDate.of(199278));
    return person;
}
cs
 
① 테스트 1

- 단순히 객체가 동등하고 동일한 객체인지 판별해봅니다.
 
1
2
3
4
5
6
7
8
9
@Test
public void test_equalAndHashCode() throws Exception {
    Person person = new Person();
    person.setFirstName("won chul");
    person.setLastName("heo");
    person.setDateOfBirth(LocalDate.of(199278));
 
    Assert.assertEquals(person, Person.getDefaultPerson());
}
cs
 
② 테스트 2

- 같은 객체를 Set에 넣으면 중복제거가 되어 size가 1이 되는지 확인해봅니다.
 
1
2
3
4
5
6
7
8
9
10
@Test
public void test_hashSet() throws Exception {
    Set<Person> personSet = new HashSet<>();
    personSet.add(Person.getDefaultPerson());
    personSet.add(Person.getDefaultPerson());
    personSet.add(Person.getDefaultPerson());
    personSet.add(Person.getDefaultPerson());
 
    Assert.assertEquals(personSet.size(), 1);
}
cs
 
3) @NoArgsConstructor
4) @AllArgsConstructor

- @NoArgsContructor는 이미 위 테스트과정에서 사용을 하였습니다. 기본 생성자는 위에서 어디에도 만들지 않았고, @NoArgsContrucrtor를 이용하여 만들어냈습니다. 
 
1
2
3
4
5
6
@NoArgsConstructor
@AllArgsConstructor
public class Person {
 
    // ...
}
cs
 


5) @Builder

- XXXXBuilder가 class에 만들어 지면서 XXXX.builder()로 손쉽게 빌더패턴을 구현할 수 있습니다.

 
1
2
3
4
5
6
7
public static Person of(String firstName, String lastName, LocalDate localDate) {
    return Person.builder()
            .firstName(firstName)
            .lastName(lastName)
            .dateOfBirth(localDate)
            .build();
}
cs

 

6) @Slf4j


- 해당 클래스에 log라는 변수가 생깁니다.

 


- slf4j는 log인터페이스이기 때문에 slf4j와 log처리에 활용할 라이브러리를 추가해줘야 합니다.

 

1
2
3
4
5
6
7
dependencies {
    compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
    compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
    compile group: 'org.projectlombok', name: 'lombok', version: '1.16.16'
 
    testCompile group: 'junit', name: 'junit', version: '4.12'
}
cs


 

참고


- Lombok

- https://projectlombok.org/


'java' 카테고리의 다른 글

Google - Guava  (423) 2017.04.06
Thread Pool 이해하기  (401) 2017.04.01
Java - Garbage First(G1) Garbage Collection  (417) 2017.03.12
Java - JVM Architecture  (429) 2017.03.08
Java - Compare GC  (406) 2017.03.07
Comments