Spring에 대한 기초와 원리에 대한 개념이 부족한것 같아 시작한 Spring 포스팅이 어느덧 30개 가량이 넘어가고 있습니다. Spring에 대한 포스팅을 계속 하면서 이제는 프로젝트를 다시 한번 건드려보자는 생각이 들어 시작하려는 도중 아주 좋은 라이브러리를 발견하여 소개하려고 합니다. 바로 Lombok
이란 것입니다.
Lombok
1. 왜 쓰죠?
새로운 라이브러리를 보았을때에는 항상 왜 사용하는지를 파악하는 것이 우선인것 같습니다. 당연시 여기는 것들이 가끔은 당연하지 않은 경우가 있습니다.. 왜 쓸까를 한번 생각해 보시죠.
Lombok 이전의 코드
우리는 프로젝트를 진행하면서 DB와 데이터를 주고받기 위해 DTO, VO
Class들을 작성하여 데이터를 손쉽게 다루게 됩니다. 그런데 항상 반복되는 코드들이 눈에보입니다.
xxxxxxxxxx
public class Student {
private String id;
private String name;
public Student(){}
public Student(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return Objects.equals(id, student.id) &&
Objects.equals(name, student.name);
}
public int hashCode() {
return Objects.hash(id, name);
}
}
벌써 손이 귀찮음을 느끼고 있습니다.. 물론 근래의 IDE들은 이러한 코드들을 자동으로 완성시켜주는 기능들을 가지고 있습니다. 그럼 왜? 쓸까요?
먼저 Lombok
을 이용해 위의 코드를 작성해보겠습니다.
Lombok을 사용한 후
xxxxxxxxxx
public class Student {
private String id;
private String name;
public Student(){}
public Student(String id, String name) {
this.id = id;
this.name = name;
}
}
그 많던 코드들이 획기적으로 줄어든 것을 볼 수 있습니다. 무엇보다도 이 DTO를 보다 더 명시적으로 볼 수 있다는 것입니다. 또한 기존 각각의 변수명을 바꾸어 줄경우, 앞서 작성했던 대량의 코드들을 각각 수정을 해주어야 했지만 지금은 그럴 필요가 없게 되었습니다.
장점
위의 장점을 간추려보면 다음과 같습니다.
1. 코드작성이 쉽고 필요한 코드가 적다.
2. 코드가 명시적이다.
3. 수정이 간편하다.
2. 그래서 뭔가요?
Lombok
은 DTO, VO
등에서 반복적으로 사용되는 코드를 @
을 통해 작성이 쉽고, 수정이 간편하게 도와주는 라이브러리 입니다.
동작 원리
lombok annotation이 부여된 java source를 컴파일할 때 annotation processor로 등록된 lombokprocessor가 어노테이션을 확인하고 그에 맞는 메소드를 자동으로 생성하여 bytecode로 변환이 된다고 합니다.
3. Lombok의 Annotation(@)
@Getter, @Setter
- getter, setter 메소드를 자동으로 생성해줍니다.
- AccessLevel이라는 값을 가지고 있어, 이것을 통해 접근제한자를 설정해줄 수 있습니다. 기본값은 PUBLIC 입니다.
클래스에 @Getter,@Setter을 줄 경우에는 모든 필드에 대해 생성이 됩니다. 하지만 필드에 부여되는 경우에는 그 필드에 대해서만 getter, setter 생성이 됩니다.
@ToString
- toString() 메소드를 자동으로 생성해줍니다.
- exclude라는 값을 가지고 있어, 제외할 필드를 지정할 수 있습니다.
@EqualsAndHashCode
- equals() 와hashCode()를 자동으로 생성해줍니다.
@AllArgsConstructor
- 모든 인스턴스 변수를 포함하는 생성자를 생성해줍니다.
- 마찬가지로 AccessLevel이란 것을 포함하고 있어 접근제한자를 지정해줄수 있습니다.
@NonNull (Required Filed (필수 필드 설정하기))
https://alexandersirotin.com/2018/03/28/marking-field-as-required-when-using-lombok-builder/
4. Project 설정방법(Intellij 기준)
4.1 의존성 설정
우선 lombok dependency를 추가합니다.
4.2 Plugin 설치
Lombok은 Java에서 자체적으로 제공하는 기능을 이용하는 것이 아니기 때문에(JDK 7까지의 기준) 이 어노테이션을 컴파일하기 위한 별도의 플러그인을 설치해야 합니다. 위의 그림대로 따라서 설치하시면 될 것 같습니다. 설치한 후 IDE를 Restart 합니다.
4.3 Compiler 설정
이제 Compiler에게 Annotation proecessing을 설정을 해주면 끝입니다.
5. Lombok의 사용시 주의할점
Lombok이 편리하기도 하지만, 완벽한것은 아니기에 개발자가 주의하여 사용해야 합니다. 아래는 그런 문제들을 잘 정리해놓은 블로그입니다. 꼭 참고하시길 바라겠습니다.
'FrameWork > Spring' 카테고리의 다른 글
Spring - classpath란? Intellij에서 classpath 추가하기 (0) | 2019.05.04 |
---|---|
Spring - IoC 컨테이너의 기능 - 7 (Resource 추상화 - ResourceLoader) (0) | 2019.05.03 |
Spring - IoC 컨테이너의 기능 - 6 (DataBinding 추상화, Converter, Formatter 란?) (0) | 2019.04.16 |
Spring - IoC 컨테이너의 기능 - 5 (객체의 값 검증 Validation, Errors) (2) | 2019.04.14 |
Spring - IoC 컨테이너의 기능 - 4 (ApplicationEventPublisher 란?) (4) | 2019.04.13 |