์ฐ์ํ ํ ํฌ์ฝ์ค 2์ฃผ ์ฐจ ํ๋ฆฌ์ฝ์ค ๋ฏธ์ ์ ํ๋ฉด์ JDK17์ ํน์ง์ ์ด๋ฆด ์ ์๋ ๋ ์ฝ๋ (record)์ ๋ํด ์ ํด๋ณผ ์ ์์์ต๋๋ค.
์ฌ์ฉํ๋ฉด์ ๋๋ ์ ์, ๊ธฐ์กด์ ์์ฑํ๋ DTO๋ฅผ ์ฝ๊ฒ ๋์ฒดํ ์ ์๊ฒ ๋ค๋ ์๊ฐ์ด์์ต๋๋ค.
(DTO๊ฐ ๋ฌด์์ธ์ง๋ฅผ ๋ณด์๋ ค๋ฉด ์ด ๊ธ์ ์ฐธ๊ณ ํด์ฃผ์ธ์!)
๊ธฐ์กด์ DTO
๋จผ์ , ๊ธฐ์กด์ ์ฌ์ฉํ๋ DTO ์ฝ๋์ ์์๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
public class CarResponse {
private final String name;
private final int position;
private CarResponse(final String name, final int position) {
this.name = name;
this.position = position;
}
public static CarResponse of(final String name, final int position) {
return new CarResponse(name, position);
}
public String getName() {
return name;
}
public int getPosition() {
return position;
}
}
- final ํ๋๋ฅผ ์ ์ํฉ๋๋ค.
- ์์ฑ์๋ฅผ ์ ์ํฉ๋๋ค.
- (์ปค์คํ ์ด์ง๋ง) ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ ์ํฉ๋๋ค.
- ๊ฐ ํ๋์ ๋ํ getter ๋ฉ์๋๊ฐ ์์ต๋๋ค.
๋ ์ฝ๋ ๋์ ํ
public record CarResponse(String name, int position) {
public static CarResponse of(final String name, final int position) {
return new CarResponse(name, position);
}
}
// ํ๋ ์ฌ์ฉ ์์
// DTO: carResponse.getName()
// ๋ ์ฝ๋: carResponse.name()
- ํ๋ ์ ์๋ฅผ ํด๋์ค ์ด๋ฆ ์์ ์ ์ธํฉ๋๋ค.
- ์ปค์คํ ํ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋ ์ด์ธ์ ๋ชจ๋ ์ฝ๋๊ฐ ํ์ ์์ด์ง๋๋ค.
์ด๋ ๋ฏ DTO๋ฅผ ์ ์ํ๋ ๋ฐ ์์ด ๋ ์ฝ๋๋ ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค. ์ด๋ค ์ฅ๋จ์ ๋ค์ด ์๋์ง, ํน์ง์ ๋ฌด์์ธ์ง ์์๋ด ์๋ค!
๋ ์ฝ๋์ ์ฅ์ & ํน์ง
1. ์ฝ๋ ์์ฑ๋ ์ถ์
๊ฐ์ฅ ์๋ฟ๋ ์ ์ ๋๋ค. ๊ธฐ์กด์ DTO๋ฅผ ์ ์ํ๊ธฐ ์ํด ์์ฑํด์ผ ํ๋ ์ฝ๋ ์์ฑ๋์ด ํ๊ธฐ์ ์ผ๋ก ์ค์ด๋ค์์์ ๋ณผ ์ ์์ต๋๋ค.
2. ๋ชฉ์ ์ ๋ช ํํ ์ ๋ฌํจ
๊ธฐ์กด DTO ์ฝ๋๋ ์ผ๋ฐ์ ์ธ ํด๋์ค ํ์ผ์ ์์ฑํ ๋ค, final ์์ฑ์ ๋ถ์ด๊ณ setter๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋ฑ์ ์์ ์ ํด์ผ๋ง ์ด๊ฒ์ด ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ฉฐ DTO์ ๋ชฉ์ (๋ฐ์ดํฐ ์ ๋ฌ)์ ์ํํ๋ค๊ณ ์๋ ค์ค ์ ์์์ง๋ง, ๋ ์ฝ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ณ์์ ๋ณด์ฅํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์์ ์ ํ์ง ์์๋ ๋ถ๋ณ ๊ฐ์ฒด์์ ๋ํ๋ผ ์ ์์ผ๋ฉฐ ๊ทธ๋ ๊ธฐ์ ๋ฐ์ดํฐ ์ ๋ฌ์๋ ํ์ฉ๋ ์ ์์์ ๋ณด์ฅํฉ๋๋ค.
3. getter, toString, hashCode, equals ์ง์
๊ธฐ๋ณธ์ ์ธ getter, toString, hashCode, equals ๋ฉ์๋๊ฐ ๋ด์ฅ๋์ด ์์ต๋๋ค. ๋ฌผ๋ก toString, hashCode, equals๋ฅผ ์ฌ์ ์ํ ์ ์๊ธด ํฉ๋๋ค.
4. ์ธํฐํ์ด์ค ๊ตฌํ ์ง์
์ผ๋ฐ์ ์ธ ํด๋์ค์ฒ๋ผ ํน์ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๊ฐ ๋ ์ ์์ต๋๋ค.
5. ์ฝคํฉํธ ์์ฑ์ (compact constructor) ์ง์
์์ฑ ์ ํน์ ์กฐ๊ฑด์ ๊ฑธ๊ฒ ํ ์๋ ์์ต๋๋ค.
public record HelloWorld(String message) {
public HelloWorld {
java.util.Objects.requireNonNull(message); // message์ null์ด ๋ค์ด๊ฐ ์ NPE๊ฐ ๋ฐ์ํฉ๋๋ค.
}
}
์ด ์ธ์๋ ์ค์ฒฉ ๋ ์ฝ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด๋๊ฑฐ๋ (์๋ฌต์ ์ผ๋ก static์ ๋๋ค.), ์ ๋ค๋ฆญ ๋ ์ฝ๋๋ฅผ ๋ง๋ค์ด๋ ์๋ ์์ต๋๋ค.
๋ ์ฝ๋์ ๋จ์ & ์ ์ฝ์ฌํญ
1. ์ธ์คํด์ค ํ๋ ์์ฑ ๋ถ๊ฐ
๋ ์ฝ๋์์๋ ์ธ์คํด์ค ํ๋ ์์ฑ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ํ๋๋ฅผ ์์ฑํ๋ ค๋ฉด ์ ์ ํ๋๋ง ๊ฐ๋ฅํฉ๋๋ค.
2. ์์ฑ์ ์ ๊ทผ์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ
๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์์ ์ฌ์ฉํ์ง ์๊ณ ์ ์ ํฉํ ๋ฆฌ๋ง์ผ๋ก DTO๋ฅผ ๋ง๋ค์ด์์๋๋ฐ, ์ด ์ ์ด ์ด์ง ์์ฝ์ต๋๋ค.
3. ์์ ๋ถ๊ฐ๋ฅ
๋ค๋ฅธ ๊ฐ์ฒด๋ก๋ถํฐ ์์๋ฐ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ฌ์ฉ ํ๊ธฐ
๋งค์ฐ ํ๊ธฐ์ ์ผ๋ก ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๋ค์ ์์ ์ฃผ๊ณ , ๋ถ๋ณ์ ๋ณด์ฅํด์ ์ ์ฉํ๊ฒ ์ฐ๊ณ ์์ต๋๋ค.
๋น๋จ DTO ๋ฟ ์๋๋ผ, ๋ถ๋ณ์ฑ์ ๋ณด์ฅํ๋ค๋ ์ ์์ VO (Value Object)๋ก๋ ํ์ฉ๋ ์ ์์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ญ๋๋ค.
๋ง์ฝ ์์ ๋จ์ , ์ ์ฝ์ฌํญ์ด ์์ด๋ ๊ด์ฐฎ์ผ๋ฉด์ & JDK16 ์ด์์ ์๋ฐ๋ก ์คํํ๋ค๋ฉด ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ๋ค๊ณ ๋๊ผ์ต๋๋ค ๐
ํ๋ฆฐ ์ ์ด ์๋ค๋ฉด ๋ฐ๋ก ์์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค!
์ฐธ๊ณ ๋ฌธ์