๐[Spring] ์์กด์ฑ(Dependency).
Java ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์กด์ฑ(Dependency) ์ด๋ ํ ํด๋์ค ๋๋ ๋ชจ๋์ด ๋ค๋ฅธ ํด๋์ค ๋๋ ๋ชจ๋์ ๊ธฐ๋ฅ์ ํ์๋ก ํ๊ฑฐ๋, ๊ทธ ์กด์ฌ์ ๋ฐ๋ผ ๋์ํ๋ ๊ด๊ณ๋ฅผ ์๋ฏธํฉ๋๋ค.
๊ฐ๋จํ ๋งํด, ์์กด์ฑ์ ์ด๋ค ํด๋์ค๊ฐ ๋ค๋ฅธ ํด๋์ค์ ์์กดํ์ฌ ํด๋น ํด๋์ค์ ๋ฉ์๋๋ ๊ธฐ๋ฅ์ ํธ์ถํ๊ณ ์ฌ์ฉํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
์์กด์ฑ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ์ํ๋ ๊ด๊ณ๋ก, ํน์ ๊ฐ์ฒด๋ฅผ ํ์๋ก ํ ๋ ๋ฐ์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์๋น์ค ํด๋์ค๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ๊ธฐ ์ํด ๋ฆฌํฌ์งํ ๋ฆฌ ํด๋์ค์ ์์กดํ๊ฑฐ๋, ์ปจํธ๋กค๋ฌ๊ฐ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๊ธฐ ์ํด ์๋น์ค ํด๋์ค์ ์์กดํ๋ ๊ฒฝ์ฐ๊ฐ ํด๋น๋ฉ๋๋ค.
1๏ธโฃ ์์กด์ฑ์ ์์
๊ฐ๋จํ ์์กด์ฑ ์
public class UserService {
private UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User getUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
}
-
UserService
ํด๋์ค๋UserRepository
ํด๋์ค์ ์์กดํฉ๋๋ค. -
UserService
๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ธฐ ์ํดUserRepository
์ ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค. - ๋ง์ฝ
UserRepository
๊ฐ ์์ผ๋ฉดUserService
๋ ์ ์์ ์ผ๋ก ์๋ํ ์ ์์ต๋๋ค. - ๋ฐ๋ผ์, ์ด ๋ ํด๋์ค ๊ฐ์๋ ์์กด์ฑ์ด ์กด์ฌํฉ๋๋ค.
2๏ธโฃ ์์กด์ฑ ๊ด๋ฆฌ์ ์ค์์ฑ.
์์กด์ฑ(Dependency)์ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ์ํ์ง๋ง, ์์กด์ฑ์ ๊ด๋ฆฌํ์ง ์์ผ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ฒฐํฉ๋๊ฐ ๋์์ง๊ณ , ๋ณ๊ฒฝ์ ์ทจ์ฝํด์ง๋ฉฐ, ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์์กด์ฑ์ ์ ์ ํ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์์กด์ฑ ๊ด๋ฆฌ์ ์ข์ ๋ฐฉ๋ฒ์ผ๋ก๋ ์์กด์ฑ ์ฃผ์ (Dependency Injection, DI) ์ด ์์ต๋๋ค.
3๏ธโฃ ์์กด์ฑ ์ฃผ์ (Dependency Injection, DI)
- ์์กด์ฑ ์ฃผ์ (Dependency Injection, DI)์ ๊ฐ์ฒด ๊ฐ์ ์์กด์ฑ์ ์ธ๋ถ์์ ์ฃผ์ ํด์ฃผ๋ ๋์์ธ ํจํด์ผ๋ก, ์์กด์ฑ ์ฃผ์ ์ ํตํด ํด๋์ค๋ ์์ ์ด ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ์ง ์๊ณ , ์ธ๋ถ์์ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ๋ฐ์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
- ์ด๋ฅผ ํตํด ํด๋์ค ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ , ์ ์ฐ์ฑ๊ณผ ํ ์คํธ ๊ฐ๋ฅ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
์์กด์ฑ ์ฃผ์ ์์(Spring Framework)
- Spring Framework์์ ์์กด์ฑ ์ฃผ์ ์ ๋งค์ฐ ํํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
- Spring์ ๊ฐ์ฒด ๊ฐ์ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ณ , ํ์ํ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์ฃผ์ ํด ์ค๋๋ค.
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User getUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
}
-
@Autowired
- Spring์ด
UserRepository
์ ๊ตฌํ์ฒด๋ฅผ ์๋์ผ๋ก ์ฃผ์ ํด์ค๋๋ค. - ๊ฐ๋ฐ์๋
UserService
๊ฐUserRepository
์ ์์กดํ๋ค๋ ์ฌ์ค๋ง ๋ช ์ํ๋ฉด ๋๊ณ ,UserRepository
๊ฐ์ฒด์ ์์ฑ์ ์ง์ ์ ์ผ๋ก ๊ด๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค.
- Spring์ด
4๏ธโฃ ์์กด์ฑ์ ์ข ๋ฅ.
1. ๊ฐํ ์์กด์ฑ (Tight Coupling)
- ํด๋์ค A๊ฐ ํด๋์ค B์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ์์กดํ ๋ ๋ฐ์ํฉ๋๋ค.
- ์ด ๊ฒฝ์ฐ ํด๋์ค B๊ฐ ๋ณ๊ฒฝ๋๋ฉด ํด๋์ค A๋ ์์ ์ด ํ์ํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด,
new
ํค์๋๋ฅผ ์ฌ์ฉํด ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ๊ฐํ ์์กด์ฑ์ด ๋ฐ์ํฉ๋๋ค.
2. ์ฝํ ์์กด์ฑ(Loose Coupling)
- ํด๋์ค A๊ฐ ํด๋์ค B์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ด ์๋, ์ธํฐํ์ด์ค๋ ์ถ์ ํด๋์ค์ ์์กดํ ๋ ๋ฐ์ํฉ๋๋ค.
- ์ด๋ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ์ด ํด๋์ค ๊ฐ์ ๋ณ๊ฒฝ์ ๋ ์ ์ฐํ๊ฒ ๋์ฒํ ์ ์๊ฒ ํฉ๋๋ค.
- ์์กด์ฑ ์ฃผ์ ์ ํตํด ์ฝํ ์์กด์ฑ์ ์คํํ ์ ์์ต๋๋ค.
5๏ธโฃ ์์กด์ฑ ๊ด๋ฆฌ์ ์ด์ .
1. ์ ์ง๋ณด์์ฑ ํฅ์.
- ์์กด์ฑ์ด ์ ์ ํ ๊ด๋ฆฌ๋๋ฉด, ์ฝ๋๊ฐ ๋ ๋ชจ๋ํ๋๊ณ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ ๋ ์์ ํด์ผ ํ ๋ถ๋ถ์ด ์ค์ด๋ญ๋๋ค.
- ์๋ฅผ ๋ค์ด, ํน์ ํด๋์ค์ ๊ตฌํ์ ๋ณ๊ฒฝํ๋๋ผ๋ ์์กด์ฑ ์ฃผ์ ์ ํตํด ์ธํฐํ์ด์ค๋ง ์ ์งํ๋ฉด ๋ค๋ฅธ ํด๋์ค์๋ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
2. ํ ์คํธ ๊ฐ๋ฅ์ฑ.
- ์์กด์ฑ์ ์ธ๋ถ์์ ์ฃผ์ ๋ฐ์ผ๋ฉด, ํ ์คํธ ์์ Mock ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ์ฌ ์ฝ๊ฒ ๋จ์ ํ ์คํธ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
- ์ด๋ฅผ ํตํด ๋ ์์ ๋จ์ ํ ์คํธ๊ฐ ๊ฐ๋ฅํด์ง๊ณ , ํ ์คํธ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์ํ๋ ์ ์์ต๋๋ค.
3. ์ฌ์ฌ์ฉ์ฑ ํฅ์.
- ํด๋์ค๊ฐ ๋ค๋ฅธ ํด๋์ค์ ๊ฐํ๊ฒ ์์กดํ์ง ์์ผ๋ฉด, ํด๋น ํด๋์ค๋ฅผ ๋ค๋ฅธ ๊ณณ์์๋ ์ฌ์ฌ์ฉํ๊ธฐ ์ฝ์ต๋๋ค.
- ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๊ณ , ์์กด์ฑ ์ฃผ์ ์ ํตํด ๋ค์ํ ๊ตฌํ์ฒด๋ฅผ ์ฃผ์ ๋ฐ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
6๏ธโฃ ๊ฒฐ๋ก .
Java ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์
์์ ์์กด์ฑ์ ํด๋์ค ๊ฐ์ ๊ด๊ณ๋ฅผ ์๋ฏธํ๋ฉฐ, ์ด๋ฅผ ์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์์กด์ฑ ์ฃผ์
์ ์ฌ์ฉํ๋ฉด ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์ ์ฐ์ฑ์ ๋์ผ ์ ์์ผ๋ฉฐ, ์ฝ๋์ ์ ์ง๋ณด์์ฑ๊ณผ ํ
์คํธ ๊ฐ๋ฅ์ฑ์ ํฌ๊ฒ ํฅ์ ์ํฌ ์ ์์ต๋๋ค.
Spring๊ณผ ๊ฐ์ ํ๋ ์์ํฌ์์๋ ์ด๋ฌํ ์์กด์ฑ ๊ด๋ฆฌ์ ์ฃผ์
์ ๋งค์ฐ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ง์ํ๊ณ ์์ต๋๋ค.