Home > Spring > ๐Ÿƒ[Spring] ์˜์กด์„ฑ(Dependency).

๐Ÿƒ[Spring] ์˜์กด์„ฑ(Dependency).
Spring Framework

๐Ÿƒ[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 ๊ฐ์ฒด์˜ ์ƒ์„ฑ์„ ์ง์ ‘์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

4๏ธโƒฃ ์˜์กด์„ฑ์˜ ์ข…๋ฅ˜.

1. ๊ฐ•ํ•œ ์˜์กด์„ฑ (Tight Coupling)

  • ํด๋ž˜์Šค A๊ฐ€ ํด๋ž˜์Šค B์˜ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์— ์˜์กดํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ฒฝ์šฐ ํด๋ž˜์Šค B๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํด๋ž˜์Šค A๋„ ์ˆ˜์ •์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๊ฐ•ํ•œ ์˜์กด์„ฑ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

2. ์•ฝํ•œ ์˜์กด์„ฑ(Loose Coupling)

  • ํด๋ž˜์Šค A๊ฐ€ ํด๋ž˜์Šค B์˜ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ด ์•„๋‹Œ, ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์ถ”์ƒ ํด๋ž˜์Šค์— ์˜์กดํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Š” ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”์–ด ํด๋ž˜์Šค ๊ฐ„์˜ ๋ณ€๊ฒฝ์— ๋” ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ์•ฝํ•œ ์˜์กด์„ฑ์„ ์‹คํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5๏ธโƒฃ ์˜์กด์„ฑ ๊ด€๋ฆฌ์˜ ์ด์ .

1. ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ.

  • ์˜์กด์„ฑ์ด ์ ์ ˆํžˆ ๊ด€๋ฆฌ๋˜๋ฉด, ์ฝ”๋“œ๊ฐ€ ๋” ๋ชจ๋“ˆํ™”๋˜๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•  ๋•Œ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ํด๋ž˜์Šค์˜ ๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์œ ์ง€ํ•˜๋ฉด ๋‹ค๋ฅธ ํด๋ž˜์Šค์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2. ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ.

  • ์˜์กด์„ฑ์„ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›์œผ๋ฉด, ํ…Œ์ŠคํŠธ ์‹œ์— Mock ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•˜์—ฌ ์‰ฝ๊ฒŒ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ๋” ์ž‘์€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง€๊ณ , ํ…Œ์ŠคํŠธ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์žฌ์‚ฌ์šฉ์„ฑ ํ–ฅ์ƒ.

  • ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ๊ฐ•ํ•˜๊ฒŒ ์˜์กดํ•˜์ง€ ์•Š์œผ๋ฉด, ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

6๏ธโƒฃ ๊ฒฐ๋ก .

Java ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์˜์กด์„ฑ์€ ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์ด๋ฅผ ์ž˜ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
์˜์กด์„ฑ ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์œ ์—ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Spring๊ณผ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ์™€ ์ฃผ์ž…์„ ๋งค์šฐ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.