Spring ํ๋ ์์ํฌ๋ 3๊ฐ์ง ํต์ฌ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ์ง์ํ๊ณ ์๋๋ฐ, ๊ทธ ์ค ํ๋๊ฐ
์์กด์ฑ ์ฃผ์ (Dependency Injection, DI)
์ด๋ค.
DI๋, ์ธ๋ถ์์ ๋ ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ๊ฒฐ์ ํด์ฃผ๋ ๋์์ธ ํจํด์ผ๋ก, ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ ์ธ๋ถ์์ ์์ฑํ ํ ์ฃผ์ ์์ผ์ฃผ๋ ๋ฐฉ์์ด๋ค.
์์ฌ์ง์์ ๋ณด๋ ๊ฒ ์ฒ๋ผ ์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ์ A๊ฐ์ฒด๊ฐ B์ C๊ฐ์ฒด๋ฅผ New ์์ฑ์๋ฅผ ํตํด์ ์ง์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ด๊ณ ,
๋๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ธ๋ถ์์ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ setter()๋ฅผ ํตํด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋๋ฒ์งธ ๋ฐฉ์์ด ์์กด์ฑ ์ฃผ์
์ ์์์ธ๋ฐ, A๊ฐ์ฒด์์ B,C๊ฐ์ฒด๋ฅผ ์ฌ์ฉ(์์กด)ํ ๋ A๊ฐ์ฒด์์ ์ง์ ์์ฑ ํ๋ ๊ฒ์ด ์๋๋ผ ์ธ๋ถ(IOC์ปจํ
์ด๋)
์์ ์์ฑ๋ B, C๊ฐ์ฒด๋ฅผ ์กฐ๋ฆฝ(์ฃผ์
)์์ผ setter ํน์ ์์ฑ์๋ฅผ ํตํด ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
์คํ๋ง์์๋ ๊ฐ์ฒด๋ฅผ Bean
์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ํ๋ก์ ํธ๊ฐ ์คํ๋ ๋ ์ฌ์ฉ์๊ฐ Bean์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฐ์ฒด๋ค์ ์์ฑ๊ณผ ์๋ฉธ์ ๊ด๋ จ๋ ์์
์ ์๋์ ์ผ๋ก ์ํํด์ฃผ๋๋ฐ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ๊ณณ์ ์คํ๋ง์์๋ Bean ์ปจํ
์ด๋
๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด Store ๊ฐ์ฒด๊ฐ Pencil ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๊ฒฝ์ฐ์ ์ฐ๋ฆฌ๋ Store๊ฐ์ฒด๊ฐ Pencil ๊ฐ์ฒด์ ์์กด์ฑ์ด ์๋ค๊ณ ํํํ๋ค.
public class Pencil {
}
public class Store{
private Pencil pencil;
public Store() {
this.pencil = new Pencil();
}
}
ํ์ง๋ง ์์ ๊ฐ์ ์์ ํด๋์ค๋ ํฌ๊ฒ 2๊ฐ์ง ๋ฌธ์ ์ ์ ๊ฐ์ง๊ณ ์๋ค.
๐ ๋ ํด๋์ค๊ฐ ๊ฐํ๊ฒ ๊ฒฐํฉ๋์ด ์๋ค.
Store ํด๋์ค๋ ํ์ฌ Pencil ํด๋์ค์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋์ด ์๋ ๋ฌธ์ ์ ์ ๊ฐ์ง๊ณ ์๋ค. ๋ ํด๋์ค๊ฐ ๊ฐํ๊ฒ ๊ฒฐํฉ๋์ด ์์ด์ ๋ง์ฝ Store์์ Pencil์ด ์๋ Food์ ๊ฐ์ ๋ค๋ฅธ ์ํ์ ํ๋งคํ๊ณ ์ ํ๋ค๋ฉด Store ํด๋์ค์ ์์ฑ์์ ๋ณ๊ฒฝ์ด ํ์ํ๋ค. ์ฆ, ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ค. ๊ฐ๊ฐ์ ๋ค๋ฅธ ์ํ๋ค์ ํ๋งคํ๊ธฐ ์ํด ์์ฑ์๋ง ๋ค๋ฅด๊ณ ๋๋จธ์ง๋ ์ค๋ณต๋๋ Store ํด๋์ค๋ค์ด ํ์๋๋ ๊ฒ์ ์ข์ง ๋ชปํ๋ค. ์ด์ ๋ํ ํด๊ฒฐ์ฑ ์ผ๋ก ์์์ ๋ ์ฌ๋ฆด ์ ์์ง๋ง, ์์์ ์ ์ฝ์ด ๋ง๊ณ ํ์ฑ์ด ๋จ์ด์ง๋ฏ๋ก ํผํ๋ ๊ฒ์ด ์ข๋ค.
๐ ๊ฐ์ฒด๋ค ๊ฐ์ ๊ด๊ณ๊ฐ ์๋๋ผ ํด๋์ค ๊ฐ์ ๊ด๊ณ๊ฐ ๋งบ์ด์ง๊ณ ์๋ค.
๋ํ ์์ Store์ Pencil๋ ๊ฐ์ฒด๋ค ๊ฐ์ ๊ด๊ณ๊ฐ ์๋๋ผ ํด๋์ค๋ค ๊ฐ์ ๊ด๊ณ๊ฐ ๋งบ์ด์ ธ ์๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค. ์ฌ๋ฐ๋ฅธ ๊ฐ์ฒด์งํฅ์ ์ค๊ณ๋ผ๋ฉด ๊ฐ์ฒด๋ค ๊ฐ์ ๊ด๊ณ๊ฐ ๋งบ์ด์ ธ์ผ ํ์ง๋ง ํ์ฌ๋ Store ํด๋์ค์ Pencil ํด๋์ค๊ฐ ๊ด๊ณ๋ฅผ ๋งบ๊ณ ์๋ค. ๊ฐ์ฒด๋ค ๊ฐ์ ๊ด๊ณ๊ฐ ๋งบ์ด์ก๋ค๋ฉด ๋ค๋ฅธ ๊ฐ์ฒด์ ๊ตฌ์ฒด ํด๋์ค(Pencil์ธ์ง Food์ธ์ง ๋ฑ)๋ฅผ ์ ํ ์์ง ๋ชปํ๋๋ผ๋, ์ธํฐํ์ด์ค์ ํ์
(Product)์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
๐ ์์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ฐ์ ๋คํ์ฑ
์ด ํ์ํ๋ค. Pencil, Food ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ์ ํ์ ํ๋๋ก ํํํ๊ธฐ ์ํด์๋ Product๋ผ๋ Interface๊ฐ ํ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ Pencil์์ Product ์ธํฐํ์ด์ค๋ฅผ ์ฐ์ ๊ตฌํํด์ผํ๋ค.
public interface Product{
}
public class Pencil implements Product{
}
๐ ๋ค์์ Store์ Pencil์ด ๊ฐํ๊ฒ ๊ฒฐํฉ๋์ด ์๋ ๋ถ๋ถ์ ์ ๊ฑฐํด์ฃผ์ด์ผ ํ๋ค. ์ด๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด ์ธ๋ถ์์ ์ํ์ ์ฃผ์
(Injection)
๋ฐ์์ผ ํ๋ค.
public class Store{
private Product product;
public Store(Product product) {
this.product = product;
}
}
๐ ์ฌ๊ธฐ์ Spring์ด DI ์ปจํ
์ด๋๋ฅผ ํ์๋ก ํ๋ ์ด์ ๋ฅผ ์ ์ ์๋๋ฐ, ์ฐ์ Store์์ Product ๊ฐ์ฒด๋ฅผ ์ฃผ์
ํ๊ธฐ ์ํด์๋ ์ ํ๋ฆฌ์ผ์ด์
์คํ ์์ ์ ํ์ํ ๊ฐ์ฒด(๋น)
๋ฅผ ์์ฑํด์ผํ๋ฉฐ, ์์กด์ฑ์ด ์๋ ๋ ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํด ํ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ฃผ์
์์ผ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด Pencil์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ๊ฐ์ฒด๋ฅผ Store๋ก ์ฃผ์
์์ผ์ฃผ๋ ์ญํ ์ ์ํด DI ์ปจํ
์ด๋๊ฐ ํ์ํ๊ฒ ๋ ๊ฒ์ด๋ค.
public class BeanFactory{
public void store() {
//Bean์ ์์ฑ
Product pencil = new Pencil();
//์์กด์ฑ ์ฃผ์
Store store = new Store(pencil);
}
}
๐ ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ๊ฐ๋
์ ์ ์ด์ ์ญ์ (Inversion of Control, IoC)
๋ผ๊ณ ๋ถ๋ฆฌ๊ธฐ๋ ํ๋ค. ์ด๋ ํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ง์ ๋ํ ์ฑ
์์ด BeanFactory
์ ๊ฐ์ ํด๋์ค์๊ฒ ๋์ด๊ฐ๊ณ , ์์ ์ ์๋์ ์ผ๋ก ์ฃผ์
๋ฐ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค. (์ค์ Spring์์๋ BeanFactory๋ฅผ ํ์ฅํ Application Context๋ฅผ ์ฌ์ฉํ๋ค.)
@Autowired
๋ ์์กด์ฑ ์ฃผ์ ์ ํ ๋ ์ฌ์ฉํ๋ Annotation์ผ๋ก ์์ฑ์๋ ์ธํฐ ๋ฑ์ ์ฌ์ฉํ์ฌ ์์กด์ฑ ์ฃผ์ ์ ํ๋ ค๊ณ ํ ๋, ํด๋น ๋น์ ์ฐพ์์ ์ฃผ์ ํด์ค๋ค. ๋ํ, ์์กด ๊ฐ์ฒด(Bean)๊ฐ 2๊ฐ ์ด์์ด๋ฉด ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ๋ค. @Autowired๋ฅผ ํตํด ์์กด์ฑ ์ฃผ์ ์ ๊ตฌํํ ์ ์๋๋ฐ,4๊ฐ์ง ๋ฐฉ๋ฒ
์ผ๋ก ๊ตฌํํ ์ ์๋ค.
๐ ์์ฑ์ ์ฃผ์ ์ ์์ฑ์๋ฅผ ํตํด ์์กด ๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
@Service
public class UserServiceImpl implements UserService{
private UserRepository userRepository;
private MemberService memberService;
@Autowired
public UserServiceImpl(UserRepository userRepository, MemberService memberService) {
this.userRepository = userRepository;
this.memberService = memberService;
}
}
๐ ์์ฑ์ ์ฃผ์
์ ์์ฑ์์ ํธ์ถ ์์ ์ 1ํ ํธ์ถ๋๋ ๊ฒ์ด ๋ณด์ฅ
๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฃผ์
๋ฐ์ ๊ฐ์ฒด๊ฐ ๋ณํ์ง ์๊ฑฐ๋, ๋ฐ๋์ ๊ฐ์ฒด์ ์ฃผ์
์ด ํ์ํ ๊ฒฝ์ฐ์ ๊ฐ์ ํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ค. ๋ํ Spring ํ๋ ์์ํฌ์์๋ ์์ฑ์ ์ฃผ์
์ ์ ๊ทน ์ง์ํ๊ณ ์๊ธฐ ๋๋ฌธ์, ์์ฑ์๊ฐ 1๊ฐ๋ง ์์ ๊ฒฝ์ฐ์ @Autowired๋ฅผ ์๋ตํด๋ ์ฃผ์
์ด ๊ฐ๋ฅํ๋๋ก ํธ์์ฑ์ ์ ๊ณตํ๊ณ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์ ์ฝ๋๋ ์๋์ ๋์ผํ ์ฝ๋๊ฐ ๋๋ค.
@Service
public class UserServiceImpl implements UserService{
private UserRepository userRepository;
private MemberService memberService;
public UserServiceImpl(UserRepository userRepository, MemberService memberService) {
this.userRepository = userRepository;
this.memberService = memberService;
}
}
๐ ์์ ์์ฃผ์ ์ ํ๋ ๊ฐ์ ๋ณ๊ฒฝํ๋ Setter๋ฅผ ํตํด์ ์์กด ๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค. Setter ์ฃผ์ ์ ์์ฑ์ ์ฃผ์ ๊ณผ ๋ค๋ฅด๊ฒ ์ฃผ์ ๋ฐ๋ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค. (์ค์ ๋ก ๋ณ๊ฒฝ์ด ํ์ํ ๊ฒฝ์ฐ๋ ๊ทนํ ๋๋ฌผ๋ค.) @Autowired๋ก ์ฃผ์ ํ ๋์์ด ์๋ ๊ฒฝ์ฐ์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ์๋ ์์ ์์๋ XXX ๋น์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด๋ค. ์ฃผ์ ํ ๋์์ด ์์ด๋ ๋์ํ๋๋ก ํ๋ ค๋ฉด @Autowired(required = false)๋ฅผ ํตํด ์ค์ ํ ์ ์๋ค.
@Service
public class UserServiceImpl implements UserService{
private UserRepository userRepository;
private MemberService memberService;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Autowired
public void setMemberService(MemberService memberSerive) {
this.memberService = memberService;
}
}
๐ ํ๋์ฃผ์ ์ ํ๋์ ๋ฐ๋ก ์์กด ๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค. IntelliJ์์ ํ๋ ์ธ์ ์ ์ ์ฌ์ฉํ๋ฉด Field Injection is not recommended์ด๋ผ๋ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ๊ฐ ๋ฐ์ํ๋ค.
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserRepository userRepository;
@Autowired
private MemberService memberService;
}
๐ ํ๋ ์ฃผ์
์ ์ด์ฉํ๋ฉด ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ ธ์ ๊ณผ๊ฑฐ์ ์๋นํ ๋ง์ด ์ด์ฉ๋์๋ ์ฃผ์
๋ฐฉ๋ฒ์ด๋ค. ํ์ง๋ง ํ๋ ์ฃผ์
์ ์ธ๋ถ์์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๋จ์
์ด ์กด์ฌํ๋๋ฐ, ์ ์ฐจ ํ
์คํธ ์ฝ๋์ ์ค์์ฑ์ด ๋ถ๊ฐ๋จ์ ๋ฐ๋ผ ํ๋์ ๊ฐ์ฒด๋ฅผ ์์ ํ ์ ์๋ ํ๋ ์ฃผ์
์ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์๊ฒ ๋์๋ค. ๋ํ ํ๋ ์ฃผ์
์ ๋ฐ๋์ DI ํ๋ ์์ํฌ๊ฐ ์กด์ฌ
ํด์ผ ํ๋ฏ๋ก ๋ฐ๋์ ์ฌ์ฉ์ ์ง์ํด์ผ ํ๋ค. ๊ทธ๋ ๊ธฐ์ ์ ํ์ด์ผ์ด์
์ ์ค์ ์ฝ๋์ ๋ฌด๊ดํ ํ
์คํธ ์ฝ๋๋ ์ค์ ์ ์ํด ๋ถ๊ฐํผํ ๊ฒฝ์ฐ์๋ง ์ด์ฉํ๋๋ก ํด์ผํ๋ค.
๐ ์ผ๋ฐ ๋ฉ์๋๋ฅผ ํตํด ์์กด ๊ด๊ณ๋ฅผ ์ฃผ์
ํ๋ ๋ฐฉ๋ฒ์ด๋ค. ํ๋ฒ์ ์ฌ๋ฌ ํ๋๋ฅผ ์ฃผ์
๋ฐ์ ์ ์์ง๋ง, ๊ฑฐ์ ์ฌ์ฉํ ํ์๊ฐ ์๋ ์ฃผ์
๋ฐฉ๋ฒ์ด๋ค.
๐ ์ค์ ๋ก ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด, ์์กด ๊ด๊ณ ์ฃผ์
์ ๋ณ๊ฒฝ์ด ํ์ํ ์ํฉ์ ๊ฑฐ์ ์๋ค.
ํ์ง๋ง ์์ ์ ์ฃผ์
์ด๋ ์ผ๋ฐ ๋ฉ์๋ ์ฃผ์
์ ์ด์ฉํ๋ฉด ๋ถํ์ํ๊ฒ ์์ ์ ๊ฐ๋ฅ์ฑ์ ์ด์ด๋๊ฒ ๋๋ฉฐ, ์ด๋ OOP์ 5๊ฐ์ง ๊ฐ๋ฐ ์์น ์ค OCP(Open-Closed Principle, ๊ฐ๋ฐฉ-ํ์์๋ฒ์น)๋ฅผ ์๋ฐํ๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์์ฑ์ ์ฃผ์
์ ํตํด ๋ณ๊ฒฝ์ ๊ฐ๋ฅ์ฑ์ ๋ฐฐ์ ํ๊ณ ๋ถ๋ณ์ฑ์ ๋ณด์ฅํ๋ ๊ฒ์ด ์ข๋ค.
๐ ์ค์ ์ฝ๋๊ฐ ํ๋ ์ฃผ์ ์ผ๋ก ์์ฑ๋ ๊ฒฝ์ฐ์๋ ์์ํ ์๋ฐ ์ฝ๋๋ก ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค. ์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ ์ค์ ์ฝ๋๊ฐ ์กด์ฌํ๋ค๊ณ ํ์.
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserRepository userRepository;
@Autowired
private MemberService memberService;
@Override
public void register(String name){
userRepositoryadd(name);
}
}
๐ ์์ ์ฝ๋์ ๋ํ ์์ ์๋ฐ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
public class UserServiceTest{
@Test
public void addTest(){
UserService userService = new UserServiceImpl();
userService.register("MinKyu");
}
}
๐ ์์ ๊ฐ์ด ์์ฑํ ์์ ์๋ฐ ํ ์คํธ ์ฝ๋๋ Spring๊ณผ ๊ฐ์ DI ํ๋ ์์ํฌ ์์์ ๋์ํ์ง ์์ผ๋ฏ๋ก ์์กด๊ด๊ณ ์ฃผ์ ์ด ๋์ง ์์ ๊ฒ์ด๊ณ , userRepository๊ฐ null์ด ๋์ด userRepository์ add ํธ์ถ ์ NullPointExeption๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Setter๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉ๊ฐ๋ฅํ ์ฑ๊ธํค ํจํด ๊ธฐ๋ฐ์ ๋น์ด ๋ณ๊ฒฝ๋ ์ ์๋ ์น๋ช ์ ์ธ ๋จ์ ์ ๊ฐ๊ฒ๋๋ค.
๋ํ ๋ฐ๋๋ก ํ ์คํธ ์ฝ๋์์๋ @Autowired๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์คํ๋ง ๋น์ ์ฌ๋ฆฌ๋ฉด ๋จ์ ํ ์คํธ๊ฐ ์๋๋ฉฐ ์ปดํฌ๋ํธ๋ค์ ๋ฑ๋กํ๊ณ ์ด๊ธฐํํ๋ ์๊ฐ์ด ์ปค์ ธ ํ ์คํธ ๋น์ฉ์ด ์ฆ๊ฐํ๊ฒ ๋๋ค.
๋ฐ๋ฉด์ ์์ฑ์ ์ฃผ์
์ ์ฌ์ฉํ๋ ค๋ฉด ์ปดํ์ผ ์์ ์ ๊ฐ์ฒด๋ฅผ ์ฃผ์
๋ฐ์ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑ
ํ ์ ์์ผ๋ฉฐ, ์ฃผ์
ํ๋ ๊ฐ์ฒด๊ฐ ๋๋ฝ๋ ๊ฒฝ์ฐ ์ปดํ์ผ ์์ ์ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌ
ํ ์ ์๋ค. ์ฌ์ง์ด ์ฐ๋ฆฌ๊ฐ ํ
์คํธ๋ฅผ ์ํด ๋ง๋ Test๊ฐ์ฒด๋ฅผ ์์ฑ์๋ก ๋ฃ์ด ํธ๋ฆฌํจ์ ์ป์ ์๋ ์๋ค.
๐ ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ํ๋ ๊ฐ์ฒด์ final ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ปดํ์ผ ์์ ์ ๋๋ฝ๋ ์์กด์ฑ์ ํ์ธํ ์ ์๋ค. ๋ฐ๋ฉด์ ์์ฑ์ ์ฃผ์ ์ ์ ์ธํ ๋ค๋ฅธ ์ฃผ์ ๋ฐฉ๋ฒ๋ค์ ๊ฐ์ฒด์ ์์ฑ(์์ฑ์ ํธ์ถ) ์ดํ์ ํธ์ถ๋๋ฏ๋ก final ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ํ, final ํค์๋๋ฅผ ๋ถ์์ผ๋ก์จ Lombok๊ณผ ๊ฒฐํฉ๋์ด ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์๋ค. Spring๊ณผ ๊ฐ์ DI ํ๋ ์์ํฌ๋ Lombok๊ณผ ํ์์ ์ธ ๊ถํฉ์ ๋ณด์ฌ์ฃผ๋๋ฐ, ์์์ ์์ฑํ๋ ์์ฑ์ ์ฃผ์ ์ฝ๋๋ฅผ Lombok๊ณผ ๊ฒฐํฉ์ํค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ฐํธํ๊ฒ ์์ฑํ ์ ์๋ค. ์ด๋ฌํ ์ฝ๋๊ฐ ๊ฐ๋ฅํ ์ด์ ๋ Spring์์๋ ์์ฑ์๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ @Autowired๋ฅผ ์๋ตํ ์ ์๋๋ก ๋์์ฃผ๊ณ ์์ผ๋ฉฐ, ํด๋น ์์ฑ์๋ฅผ Lombok์ผ๋ก ๊ตฌํํ์๊ธฐ ๋๋ฌธ์ด๋ค.
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService{
private final UserRepository userRepository;
private final MemberService memberService;
@Override
public void register(String name){
userRepository.add(name);
}
}