# Lombok

## Lombok 이란

Project Lombok은 클래스 자동화 라이브러리이다. 반복적으로 사용하는 코드들을 최소화시켜 가독성과 효율성을 올려준다.

{% embed url="<https://projectlombok.org/>" %}

## Lombok 의존성 추가

1. Spring Boot Add Starters에서 추가
2. Maven Central Repository에서 추가

### Spring Boot Add Starters

프로젝트 우클릭 → Spring → Add Staters에서 lombok을 검색하여 추가한다.

<div align="left"><figure><img src="https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_TNZwLuHV9ipYLbvRq%2Fuploads%2Faaho1Sc0lwOwhsnADsxz%2Fimage.png?alt=media&#x26;token=60f36ba5-21c7-44de-9ce4-8369b5dd4997" alt=""><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_TNZwLuHV9ipYLbvRq%2Fuploads%2FzKG8oNLgDJoDq7iheTPz%2Fimage.png?alt=media&#x26;token=04d37d17-845a-4063-88db-6a6a6d533e7f" alt=""><figcaption></figcaption></figure></div>

다음을 눌러 pom.xml을 선택하고 Finish를 눌러 추가를 마무리한다.

<div align="left"><figure><img src="https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M_TNZwLuHV9ipYLbvRq%2Fuploads%2FaVeEqmfUqm1Jw33BVcox%2Fimage.png?alt=media&#x26;token=53758c71-db78-4db0-9992-df3ee0a779c6" alt=""><figcaption></figcaption></figure></div>

### Maven Central Repository

maven central repository에서 `lombok`을 검색한다.

![](https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_TNZwLuHV9ipYLbvRq%2F-McO8FqHsf_rEj1SwqBq%2F-McO9xb9u8ZEKcxmJNYO%2Fimage.png?alt=media\&token=880432ba-bbf2-4d72-a944-2018f3c2f8ab)

최신 버전을 찾아 pom.xml에 추가한다. 최신 버전은 검색 시점마다 다를 수 있다.

![](https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_TNZwLuHV9ipYLbvRq%2F-McO8FqHsf_rEj1SwqBq%2F-McOA-2iyY2YliRE7lgD%2Fimage.png?alt=media\&token=61cd15dc-b044-4727-a95e-c086dcdfb064)

## STS에 Lombok 설치

프로젝트에만 추가하면 import나 annotation 등은 사용할 수 있지만 실제로 에디터에서 인지하지 못하기 때문에 오류가 발생한다. 따라서 STS와 같은 Eclipse에도 적용을 시켜야 완벽하게 사용할 수 있다.

이클립스를 종료한다.

maven으로 다운로드한 lombok jar파일의 위치를 찾는다.

* \[Window] → \[Preferences] 선택
* 검색창에 "maven" 입력 후 \[Maven] → \[User Settings] 선택
* Local Repository 란에 있는 저장소 위치 확인
* 저장소 내에서 /org/projectlombok/lombok 폴더로 이동하여 jar 파일 탐색

탐색한 jar 파일을 실행한다(더블클릭하거나 CMD에서 실행)

```
CMD에서 실행은 다음과 같이 한다.
$ java -jar "파일전체경로"
```

실행한 화면에서 \[Specify location] 버튼을 눌러 STS 위치를 설정한 뒤 \[Install/Update]를 누른다

![](https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_TNZwLuHV9ipYLbvRq%2F-McO8FqHsf_rEj1SwqBq%2F-McOA2GHwDB-WvdPKni9%2Fimage.png?alt=media\&token=6416be35-de8a-4c12-ad14-f092047fb0bb)

{% hint style="info" %}

### Windows 사용 시

STS 설치 폴더로 이동하여 **STS.exe** 파일을 선택한다. (Eclipse의 경우 **eclipse.exe**)

### Mac OS 사용 시

설치파일을 관리자 권한으로 실행한다. 추가 비밀번호 입력이 필요하다.

```bash
$ sudo java -jar "lombok jar 파일명"
```

**/Applications/SpringTools4.app/Contents/Eclipse/Eclipse.ini** 파일을 선택한다.
{% endhint %}

설치 완료 화면이 나오면 이클립스를 시작 또는 재시작한다.

![](https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_TNZwLuHV9ipYLbvRq%2F-McO8FqHsf_rEj1SwqBq%2F-McOA3SYf7WLRYJXupFJ%2Fimage.png?alt=media\&token=d1978837-2d97-4464-85a2-75ce6c5f55d7)

{% hint style="info" %}

### :star:<mark style="color:red;">주의사항</mark>

Eclipse 경로에 한글이 있을 경우 설치 후 이클립스가 실행되지 않는다. 이 경우 이클립스를 다른 곳으로 이동하여 다시 설치한다.&#x20;

* PC명이 한글인 경우
* 바탕 화면, 내 문서 등에 이클립스를 설치한 경우
  {% endhint %}

## Lombok 기능 사용

적용이 완료되었다면 기능을 만들어 테스트를 수행해본다.

### 샘플 클래스 생성

> com.hakademy.spring09.entity.PersonDto

```java
@Getter
@Setter
@NoArgsConstructor
@ToString
public class PersonDto {
    private String name;
    private int age;
}
```

Lombok은 멤버 필드만 존재한다면 나머지 구성 요소들을 Annotation으로 만들도록 지원해준다. 사용된 옵션들은 다음과 같다.

### **Getter**

@Getter를 추가하면 해당하는 영역에 존재하는 필드에 Getter 메소드가 생성된다. 필드마다 사용할 수도 있고, 클래스에 사용할 수도 있다.

### **Setter**

@Setter를 추가하면 해당하는 영역에 존재하는 필드에 Setter 메소드가 생성된다. 필드마다 사용할 수도 있고, 클래스에 사용할 수도 있다.

### **NoArgsConstructor**

클래스에 사용할 수 있으며, 기본 생성자를 만들어준다.

### **AllArgsConstructor**

클래스에 사용할 수 있으며, 모든 필드를 매개변수로 가지는 생성자를 만들어준다.

### **ToString**

객체를 출력했을 때 나오는 toString() 메소드를 필드 값 출력 형태로 재정의한다. exclude 옵션을 사용하여 원하지 않는 항목은 출력되지 않도록 설정할 수 있다.

### **Data**

@Getter, @Setter, @ToString 등은 거의 모든 클래스에 존재하므로 이를 압축하여 @Data라고 부를 수 있다. 따라서 위의 PersonDto는 다음과 같이 만들 수 있다.

```java
@Data
@NoArgsConstructor
public class PersonDto {
    private String name;
    private int age;
}
```

### **Builder**

빌더 패턴을 사용할 수 있도록 빌더 클래스를 지원하는 Annotation이다. @Builder는 다음과 같은 형태의 객체 생성을 지원한다.

```java
PersonDto personDto = PersonDto.builder().build();
```

객체에 데이터를 설정하면서 생성하고 싶은 경우 변수명과 동일한 메소드를 builder가 지원한다.

```java
PersonDto personDto = PersonDto.builder.name("test").age(20).build();
```

한 줄 형태로 작성이 될 수 있기 때문에 코드가 더 간결해지는 효과가 발생한다.

{% hint style="info" %} <mark style="color:red;">`@AllArgsConstructor`</mark>를 작성하면 기본 생성자가 사라지므로 기본 생성자가 필요하다면 <mark style="color:red;">`@NoArgsConstructor`</mark>와 같이 작성해야 한다.

```java
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class PersonDto {
    private String name;
    private int age;
}
```

{% endhint %}
