[ 살펴보기 ] Lombok - Basics
![[ 살펴보기 ] Lombok - Basics](https://cdn.hashnode.com/res/hashnode/image/upload/v1732676025017/7e955e37-dd16-4ae9-9b0b-0e1596423c1a.jpeg)
Java에서 특정 객체를 위한 class를 생성할 때 encapsulation을 위해 class fields는 private 접근 제한자로 설정하고 public 접근 제한을 가진 getter, setter method를 통해 특정 field를 조회하거나 조작하는 것이 일반적이다.
예를 들어 User class를 통해 객체를 생성하기 위해서 다음과 같이 각 field에 대한 getter와 setter를 추가해준다.
package com.test;
public class User {
private String name;
private int age;
private String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public String getEmail() {
return this.email;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setEmail(String email) {
this.email = email;
}
}
Class의 field가 별로 없다면 크게 문제가 없지만 fields가 많은 class와 위의 과정을 project 전체에 반복해서 해야 한다면 getter, setter 추가로 인한 피로도가 커진다.
이러한 반복적인 getter, setter의 작업을 대신해주는 library가 lombok이다. 해당 포스트를 통해 lombok 사용법을 살펴보자.
테스트를 위한 build tool은 gradle을 사용하고 IDE는 IntelliJ community를 사용한다. 우선 project root build.gradle file에 lombok dependencies를 추가해준다.
build.gradle
...
dependencies {
implementation 'org.projectlombok:lombok:1.18.30'
annotationProcessor 'org.projectlombok:lombok:1.18.30'
}
사용하는 Java version에 따라 추가하는 lombok version도 달라질 수 있으므로 하므로 주의하자. ( Reference - Lombok Changelog ) 그리고 IntelliJ IDE는 추가로 lombok plugin을 설치해야 한다. Setting → Plugins → Marketplace에서 lombok plugin을 설치하고 IDE를 다시 시작한다.
Getter
@Getter annotation을 통해 class의 각 field에 대한 getter method를 자동으로 추가할 수 있다. 다음 예제를 살펴보자.
User.java
package me.james;
import lombok.Getter;
@Getter
public class User {
private String name;
private int age;
private String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
}
Main.java
package me.james;
public class Main {
public static void main(String[] args) {
User user = new User("test name", 20, "test email");
System.out.println(user.getEmail());
}
}
위의 예제와 같이 User class에 별도의 getter method를 추가하지 않았음에도 user 객체를 통해 getEmail를 사용할 수 있다. 즉, Class에 @Getter annotation을 사용하면 다음과 같이 각 field에 자동으로 getter method를 추가해준다.
@Getter
public class User {
private String name;
private int age;
private String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
}
위의 코드는 아래 코드와 같다.
public class User {
private String name;
private int age;
private String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public String getEmail() {
return this.email;
}
}
Setter
@Setter annotation을 통해 class의 각 field에 대한 setter method를 자동으로 추가할 수 있다. 다음 예제를 살펴보자.
User.java
package me.james;
import lombok.Setter;
@Setter
public class User {
private String name;
private int age;
private String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
}
Main.java
package me.james;
public class Main {
public static void main(String[] args) {
User user = new User("test name", 20, "test email");
user.setEmail("new email");
}
}
위의 예제와 같이 User class에 별도의 setter method를 추가하지 않았음에도 user 객체를 통해 setEmail을 통해 객체의 email value를 수정할 수 있다. 즉, Class에 @Setter annotation을 사용하면 다음과 같이 각 field에 자동으로 setter method를 추가해준다.
@Setter
public class User {
private String name;
private int age;
private String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
}
위의 코드는 아래 코드와 같다.
public class User {
private String name;
private int age;
private String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setEmail(String email) {
this.email = email;
}
}
다음과 같이 @Getter annotation과 @Setter annotation을 함께 사용하면 class fields의 getter 함수와 setter함수를 모두 자동으로 생성해준다.
User.java
package me.james;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class User {
private String name;
private int age;
private String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
}
Main.java
package me.james;
public class Main {
public static void main(String[] args) {
User user = new User("test name", 20, "test email");
user.setEmail("new email");
System.out.println(user.getEmail());
}
}
@Getter, @Setter를 통해 생성된 getter, setter method는 default로 public 접근 제한을 가진다. 만약 생성되는 getter, setter method의 접근 제한을 변경하고 싶다면 @Getter, @Setter annotation에 AccessLevel을 설정해 변경할 수 있다.
User.java
package me.james;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
@Setter(AccessLevel.PROTECTED)
public class User {
private String name;
private int age;
private String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
}
위의 코드는 아래 코드와 같다.
public class User {
private String name;
private int age;
private String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
protected void setName(String name) {
this.name = name;
}
protected void setAge(int age) {
this.age = age;
}
protected void setEmail(String email) {
this.email = email;
}
}
@Getter, @Setter annotation은 class뿐만 아니라 field level에서도 적용이 가능하다. 예를 들어 다음 예제는 email field만 자동으로 getter, setter method를 생성한다.
User.java
package me.james;
import lombok.Getter;
import lombok.Setter;
public class User {
private String name;
private int age;
@Getter
@Setter
private String email;
public User() {
}
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
}
위의 예제와 같이 특정 field에 @Getter, @Setter annotation을 설정함으로서 class에 적용된 @Getter, @Setter와는 다른 접근 제한을 설정할 수도 있다. 아래 예제는 email field의 getter와 setter는 protected 접근 제한을 가지고 나머지 field의 getter와 setter는 public 접근 제한을 가진다.
User.java
package me.james;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class User {
private String name;
private int age;
@Getter(AccessLevel.PROTECTED)
@Setter(AccessLevel.PROTECTED)
private String email;
public User() {
}
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
}
만약 다음과 같이 특정 field에 대한 getter, setter method를 직접 설정하면 lombok이 생성한 getter, setter가 아닌 직접 설정한 getter, setter method가 사용된다.
package me.james;
import lombok.*;
@NoArgsConstructor()
@AllArgsConstructor
@Getter
@Setter
public class User {
private String name;
private int age;
private String email;
public String getEmail() {
return this.email + "**";
}
public void setEmail(String email) {
this.email = "my fixed email";
}
}
Constructor annotations
Class field의 getter와 setter method를 위한 annotation뿐만 아니라 constructor 관련 annotation을 통해 class의 constructor 역시 자동으로 생성할 수 있다. 사용할 수 있는 annotation은 다음과 같다.
NoArgsConstructor : parameter를 갖지 않는 constructor를 생성한다.
package me.james; import lombok.NoArgsConstructor; @NoArgsConstructor public class User { private String name; private int age; private String email; }위의 코드는 아래의 코드와 같다.
public class User { private String name; private int age; private String email; public User() { } }AllArgsConstructor : class에 선언된 모든 field를 parameter로 전달 받는 constructor를 생성한다.
package me.james; import lombok.AllArgsConstructor; @AllArgsConstructor public class User { private String name; private int age; private String email; }위의 코드는 아래의 코드와 같다.
public class User { private String name; private int age; private String email; public User(String name, int age, String email) { this.name = name; this.age = age; this.email = email; } }RequiredArgsConstructor : final field나
@NonNulldecorator가 사용된 field를 parameter로 전달 받는 constructor를 생성한다.@RequiredArgsConstructor public class User { private String name; private int age; private final String email; }위의 코드는 다음 코드와 같다.
public class User { private String name; private int age; private final String email; public User(String email) { this.email = email; } }
Constructor annotation으로 생성된 constructor는 default로 public 접근 제한을 가지며 다음과 같이 AccessLevel을 통해 생성되는 constructor의 접근 제한자를 설정할 수 있다.
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class User {
private String name;
private int age;
private String email;
}
![[ 살펴보기 ] RDB - Relationships](https://cdn.hashnode.com/res/hashnode/image/upload/v1739711556668/48dc9e84-a621-42aa-9c9f-5fc5c436f0ec.jpeg)
![[ 살펴보기 ] MySQL - Data types](https://cdn.hashnode.com/res/hashnode/image/upload/v1739593589113/530f8704-4d27-42c9-a451-bb5c63150b99.jpeg)
![[ 살펴보기 ] TypeORM - Transactions, Migration](https://cdn.hashnode.com/res/hashnode/image/upload/v1739106042581/980b8133-61d4-406a-a026-65be9c28eace.jpeg)
![[ 살펴보기 ] TypeORM - Relations](https://cdn.hashnode.com/res/hashnode/image/upload/v1738666874402/b688bd0b-b6bb-4f43-87d8-c1b46b59f1b7.jpeg)
![[ 살펴보기 ] TypeORM - Basics](https://cdn.hashnode.com/res/hashnode/image/upload/v1738666803591/bef5df17-7dc7-4123-ae55-004d5042df39.jpeg)