๐[Spring] @RequireArgsConstructor
์ ๋ฌด์์ผ๊น์?
๐ Intro.
- โ๏ธ
@RequireArgsConstructor
๋ Lombok์์ ์ ๊ณตํ๋ ์ด๋ ธํ ์ด์ ์ผ๋ก, ํด๋์ค์final
๋ก ์ ์ธ๋ ํ๋๋@NonNull
๋ก ์ง์ ๋ ํ๋์ ๋ํด ํ์ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์์ฑํจ.
โ 1๏ธโฃ ์ฃผ์ ํน์ง.
1. final
ํ๋๋ง ํฌํจ.
- โ๏ธ
final
๋ก ์ ์ธ๋ ํ๋๊ฐ ๋์์ด ๋จ. - โ๏ธ
final
์ด ์๋ ํ๋๋ ์์ฑ์์ ํฌํจ๋์ง ์์.
2. @NonNull
ํ๋ ํฌํจ.
- โ๏ธ
@NonNull
์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํ๋๋ ํฌํจ๋จ. - โ๏ธ
@NonNull
์ด ๋ถ์ ํ๋๋ ์์ฑ์์์ null ์ฒดํฌ๋ฅผ ์๋์ผ๋ก ์ถ๊ฐํจ.
3. ์ฃผ๋ก ์์กด์ฑ ์ฃผ์ ์ ์ฌ์ฉ.
- โ๏ธ Spring์์ ์์ฑ์ ๊ธฐ๋ฐ ์์กด์ฑ ์ฃผ์ (Constructor-based Dependency Injection)์ ์์ฃผ ์ฌ์ฉ๋จ.
โ 2๏ธโฃ ์์ฑ์ ์๋ ์์ฑ ์์ .
1. ๊ธฐ๋ณธ ์ฌ์ฉ.
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class MyService {
private final MyRepository myRepository;
private final String name; // ์์ฑ์ ํฌํจ.
private int age; // ์์ฑ์ ํฌํจ๋์ง ์์.
}
- โ๏ธ ์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์์ฑํจ:
public MyService(MyRepository myRepository, String name) { this.myRepository = myRepository; this.name = name; }
2. @NonNull
ํ๋ ์ฌ์ฉ.
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class MyService {
@NonNull
private final MyRepository myRepository; // @NonNull null ์ฒดํฌ ์ถ๊ฐ.
private final String name; // ์์ฑ์์ ํฌํจ.
private int age; // ์์ฑ์์ ํฌํจ๋์ง ์์.
}
- โ๏ธ ์์ฑ๋ ์์ฑ์๋
@NonNull
ํ๋์ ๋ํด null ์ฒดํฌ๋ฅผ ํฌํจํจ.public MyService(MyRepository myRepository, String name) { if (myRepository == null) { throw new NullPointerException("myRepository is marked @NonNull but is null"); } this.myRepository = myRepository; this.name = name; }
3. Spring๊ณผ ํจ๊ป ์ฌ์ฉ.
๐ Spring์์๋ @RequiredArgsConstructor
๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฑ์ ์ฃผ์
์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์์.
- โ๏ธ ์ผ๋ฐ์ ์ธ ์์ฑ์ ์ฃผ์
@Service public class MyService { private final MyRepository myRepository; public MyService(MyRepository myRepository) { this.myRepository = myRepository; } }
- โ๏ธ
@RequiredArgsConstructor
์ฌ์ฉ@Service @RequiredArgsConstructor public class MyService { private final MyRepository myRepository; }
- โ๏ธ Spring์ด ์๋์ผ๋ก MyRepository๋ฅผ ์ฃผ์ ํจ.
- โ๏ธ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๊ณ , ์์กด์ฑ ์ฃผ์ ์ ๋ ๊ฐ๋ ์ฑ์ด ์ข์์ง.
โ 3๏ธโฃ ์ฅ์ .
1. ์ฝ๋ ๊ฐ๊ฒฐํ.
- โ๏ธ ํ์ ์์ฑ์๋ฅผ ์ง์ ์์ฑํ ํ์๊ฐ ์์ด์ง.
2. ๋ถ๋ณ ๊ฐ์ฒด ์์ฑ์ ์ ํฉ.
- โ๏ธ
final
ํ๋๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ํ๋๋ฅผ ๋ถ๋ณ์ผ๋ก ์ ์งํ ์ ์์.
3. Spring๊ณผ์ ํธํ์ฑ.
- โ๏ธ ์์ฑ์ ๊ธฐ๋ฐ ์์กด์ฑ ์ฃผ์ ์์ ํ์ฉ๋๊ฐ ๋์.
โ 4๏ธโฃ ์ฃผ์์ .
1. final
ํ๋๋ง ํฌํจ.
- โ๏ธ ์์ฑ์์ ํฌํจ๋์ง ์๋ ํ๋(
final
์ด ์๋ ํ๋)์ ๊ฐ์ ์ค์ ํ๋ ค๋ฉดSetter
๋๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผ ํจ.
2. @NonNull
๋ก null ์ฒดํฌ ํ์.
- โ๏ธ
@NonNull
ํ๋๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด null ๊ฐ์ด ๋ค์ด๊ฐ๋ ์์ธ๊ฐ ๋ฐ์ํ์ง ์์.
๐ ์ ๋ฆฌ.
- โ๏ธ
@RequiredArgsConstructor
๋ ์์ฑ์ ์ฃผ์ ์ ๊ฐ๊ฒฐํ๊ฒ ํ๊ณ , ๋ถ๋ณ์ฑ์ ์ ์งํ๋ฉด์ ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ์์ฑํ ์ ์๋๋ก ๋์์ค. - โ๏ธ Spring๊ณผ Lombok์ ํจ๊ป ์ฌ์ฉํ ๋ ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ Lombok ์ด๋ ธํ ์ด์ ์ค ํ๋์.