๐[Spring] @NoArgsConstructor
์ ๋ฌด์์ผ๊น์?
๐ Intro.
- โ๏ธ
@NoArgsConstructor
๋ Lombok์์ ์ ๊ณตํ๋ ์ด๋ ธํ ์ด์ ์ผ๋ก, ํ๋ผ๋ฏธํฐ๊ฐ ์๋ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์์ฑํด์ค๋๋ค.
โ 1๏ธโฃ ์ฃผ์ ํน์ง.
1. ๊ธฐ๋ณธ ์์ฑ์ ์ถ๊ฐ.
- โ๏ธ
@NoArgsConstructor
๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋์ค์ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๋ช ์์ ์ผ๋ก ์์ฑํ์ง ์์๋ ๋จ. - โ๏ธ ์๋ ์์ฑ๋ ๊ธฐ๋ณธ ์์ฑ์๋ ํ๋ ์ด๊ธฐํ ๋ก์ง์ด ์๋ ๊ธฐ๋ณธ์ ์ธ ์์ฑ์์.
2. ์ฃผ๋ก ๊ฐ์ฒด ์์ฑ์ ์ฌ์ฉ.
- โ๏ธ JPA, Jackson ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ฐ์ฒด๋ฅผ ์ธ์คํด์คํํ ๋ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ํ์ํจ.
3. final ํ๋์ ํธํ ๊ฐ๋ฅ.
- โ๏ธ ๊ธฐ๋ณธ์ ์ผ๋ก
final
ํ๋๊ฐ ์์ผ๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํจ. - โ๏ธ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด
@NoArgsConstructor(force = true)
๋ฅผ ์ฌ์ฉํ ์ ์์.
โ 2๏ธโฃ ์ฌ์ฉ ์์ .
1. ๊ธฐ๋ณธ ์ฌ์ฉ.
import lombok.NoArgsConstructor;
@NoArgsConstructor
public class MyClass {
private String name;
private int age;
}
- โ๏ธ ์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์์ฑํจ.
public MyClass() { }
2. JPA์์์ ์ฌ์ฉ.
- โ๏ธ JPA์์๋ ์ํฐํฐ ํด๋์ค์ ๊ธฐ๋ณธ์์ฑ์๊ฐ ํ์ํจ.
- โ๏ธ
@NoArgsConstructor
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐํธํ๊ฒ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์ถ๊ฐํ ์ ์์.
```java
import jakarta.persistence.Entity;
import lombok.NoArgsConstructor;
- โ๏ธ
@Entity
@NoArgsConstructor
public class User {
private Long id;
private String username;
}
- โ๏ธ JPA๋ ์ํฐํฐ ํด๋์ค๋ฅผ ๋ฆฌํ๋ ์
์ ํตํด ์ธ์คํด์คํํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ํ์์.
### 3. force ์์ฑ ์ฌ์ฉ (final ํ๋์ ํจ๊ป)
- โ๏ธ ๊ธฐ๋ณธ ์์ฑ์๋ `final` ํ๋ ์ด๊ธฐํ๋ฅผ ๊ฐ์ ํ์ง ์์.
- โ๏ธ ํ์ง๋ง `@NoArgsConstructor(force = true)`๋ฅผ ์ฌ์ฉํ๋ฉด `final` ํ๋๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ธฐํ๋๋๋ก ์ฒ๋ฆฌํ ์ ์์.
```java
import lombok.NoArgsConstructor;
@NoArgsConstructor(force = true)
public class MyClass {
private final String name; // ๊ธฐ๋ณธ๊ฐ: null
private final int age; // ๊ธฐ๋ณธ๊ฐ: 0
}
- โ๏ธ ์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์์ฑ์๋ฅผ ์์ฑํจ.
public MyClass() { this.name = null; this.age = 0; }
- โ๏ธ
force = true
๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ํตํดfinal
ํ๋๋ ์ด๊ธฐํ๊ฐ ๊ฐ๋ฅํด์ง๋ฏ๋ก ํน์ ์ํฉ์์ ์ ์ฉํจ.
โ 3๏ธโฃ Spring๊ณผ ํจ๊ป ์ฌ์ฉ.
Spring์์ ๊ฐ์ฒด ์์ฑ ์ ํ์ฉ.
๐ Spring์์ JSON ์์ฒญ ๋ณธ๋ฌธ์ ์ฒ๋ฆฌํ๊ฑฐ๋ JPA ์ํฐํฐ๋ฅผ ๊ด๋ฆฌํ ๋ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ํ์ํจ.
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
public class UserDTO {
private String username;
private String email;
}
- โ๏ธ JSON ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Jackson ๋ฑ)๊ฐ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์ฌ์ฉํ์ฌ DTO ๊ฐ์ฒด๋ฅผ ์ธ์คํด์คํ ํจ.
- โ๏ธ
@NoArgsConstructor
๋ฃฐ ์ฌ์ฉํ์ฌ ๊ฐํธํ๊ฒ ์ด๋ฅผ ์ง์ํ ์ ์์.
โ 4๏ธโฃ ์ฅ์ .
1. ์ฝ๋ ๊ฐ๊ฒฐํ.
- โ๏ธ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ฏ๋ก ์๋์ผ๋ก ์์ฑํ ํ์๊ฐ ์์.
2. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธํ์ฑ.
- โ๏ธ JPA, Jackson ๋ฑ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฝ๊ฒ ํธํ๋จ.
3. ํน์ ์ํฉ ์ง์.
- โ๏ธ
force - true
๋ฅผ ํตํดfinal
ํ๋๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ธฐํํ ์ ์์.
โ 5๏ธโฃ ์ฃผ์์ .
1. force = true
์ฌ์ฉ ์ ์ด๊ธฐํ ์ฃผ์.
- โ๏ธ
final
ํ๋๊ฐ ๊ธฐ๋ณธ๊ฐ(null ๋๋ 0)์ผ๋ก ์ด๊ธฐํ๋๊ธฐ ๋๋ฌธ์ ์๋์น ์์ ๋์์ ์ ๋ฐํ ์ ์์.2. JPA์ ํจ๊ป ์ฌ์ฉํ ๋ ์ ๊ทผ ์ ํ์.
- โ๏ธ JPA์์๋ ๊ธฐ๋ณธ ์์ฑ์๊ฐ
protected
์ด์์ด์ด์ผ ํ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ๋ ๊ฒ์ด ์ข์@NoArgsConstructor(access = AccessLevel.PROTECTED)
๐ ์ ๋ฆฌ.
- โ๏ธ
@NoArgsConstructor
๋ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์์ฑํด์ฃผ๋ Lombok ์ด๋ ธํ ์ด์ ์ผ๋ก, JPA์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํธํ์ฑ์ ๋์ด๊ณ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๊ฐ์ ํ๋ ๋ฐ ์ ์ฉํจ.- โ๏ธ ์ถ๊ฐ๋ก
force
์ต์ ์ ํตํดfinal
ํ๋๋ ์ด๊ธฐํํ ์ ์์.
- โ๏ธ ์ถ๊ฐ๋ก