Spring Lombok @Annotation(어노테이션)

1. Lombok library @Annotation

1.1. Lombok

Lombok(롬복)은 MIT 라이선스로 배포되는 오픈소스 라이브러리로서 annotation 주석으로 VO(Value Object), DTO(Data Transfort Object), Entity Class 등을 만들때 Getter/Setter 및 toString()을 자동화 시켜줍니다.

1
2
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.

Lombok 공식 사이트

Lombok 사용방법

Lombok을 사용하기 위해서는 해당 라이브러리를 다운을 받아야합니다. IntellJ같은 경우는 플러그인을 설치하여 Lombok을 다운받으면 되고 Gradle or Maven Dependency를 추가해주어야합니다.
모든 설치가 완료되면

IntellJ Configuration

IntelliJ의 File > Settings > Build, Execution, Deployment > Compiler > Annotation Processors를 선택 한 후 "Enable annotation processing"을 체크
해당 설정을 해주는 이유는 Lombok을 작업중에도 동작시키기 위해서는 해당과 같은 설정을 해주셔야 Lombok이 정상적으로 동작하게 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# gradle
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}

# maven
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

1.2. @Getter, @Setter

Lombok에서 가장 많이 사용되는 어노테이션인 @Getter와 @Setter에 대해서 설명드리겠습니다.
기존에 스프링에서는 필드를 선언하면 명시적으로 선언을 매번해주어야하였지만, Lombok을 사용하면 필드를 선언하면 Getter(),Setter() 메소드를 자동으로 생성해줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private int item;
private int user;

// Lombok 사용시 필요없는 코드
public int getItem() {
return item;
}

public void setItem(int item) {
this.item = item;
}

public int getUser() {
return user;
}

public void setUser(int user) {
this.user = user;
}

필드 레벨이 아닌 클래스 레벨에 @Getter 또는 @Setter를 선언해줄 경우, 모든 필드에 접근자와 설정자가 자동으로 생성됩니다.

1.3. NoArgsConstructor

@NoArgsConstructor 어노테이션은 파라미터가 없는 기본 생성자를 생성해줍니다.

1.4. @AllArgsConstructor

@AllArgsConstructor 어노테이션은 모든 필드 값을 파라미터로 받는 생성자를 만들어줍니다.

1.5. @RequiredArgsConstructor

@RequiredArgsConstructor 어노테이션은 final이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 만들어줍니다.

1.6. @Data

Class Level에서 @Data 어노테이션을 붙여주면, 모든 필드를 대상으로 접근자와 설정자가 자동으로 생성됩니다. 그리고, final 또는 @NonNull 필드 값을 파라미터로 받는 생성자가 만들어지며, toStirng, equals, hashCode 메소드가 자동으로 생성되게 됩니다. 개인적으로는 @Data를 무분별하게 사용하면 나중에 유지보수측면에서 시간이 많이 소요되고 불필요한 소스양이 늘어날 것으로 생각하며 결론적으로 @Data는 지양하고 무분별한 Setter 남용을 하지 않도록 해야할 것입니다.

1.7. @Builder

@Builder Annotation은 모델 객체를 생성할 때 Builder를 자동으로 추가해 주는 Annotation입니다. 해당 Annotation을 사용하면 Builder Pattern을 적용할 수 있습니다.

Builder Annotation 미적용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class User {
private String name;
private int age;
public static UserBuilder builder() {
return new UserBuilder();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

//Builder Class
public class UserBuilder {
private String name;
private int age;

public User build() {
User user = new User();
user.setName(this.name);
user.setAge(this.age);
return user;
}

public UserBuilder name(String name) {
this.name = name;
return this;
}

public UserBuilder age(int age) {
this.age = age;
return this;
}
}

Builder Annotation 적용

1
2
3
4
5
6
@Data
@Builder
public class User {
private String name;
private int age;
}

Builder pattern 사용

1
2
3
4
5
6
7
8
public class Test {
@Test public void builderTest() {
User user = User.builder()
.name("KGH")
.age(100)
.build();
}
}

References

https://projectlombok.org/features/