๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์Šคํ”„๋ง Spring/๐Ÿงถ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ Spring

@Autowired ๋ž€ .... ?

by Meteora_ 2021. 6. 22.
728x90

@Autowired์— ๋Œ€ํ•œ ๋ถ„์„์ด๋ผ๊ธฐ์—๋Š” ์–•์€ ์ง€์‹์„ ๊ฐ€์ง€๊ณ  @Autowired์–ด๋…ธํ…Œ์ด์…˜์— ๊ด€ํ•ด์„œ ํฌ์ŠคํŒ…์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. Autowired๋ž€?
    @Autowired์–ด๋…ธํ…Œ์ด์…˜์€ ์ด๋ฆ„์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ€์—ฌํ•˜๋ฉด ๊ฐ ์ƒํ™ฉ์˜ ํƒ€์ž…์— ๋งž๋Š” IoC์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ์กด์žฌํ•˜๋Š” Bean์„ ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•ด์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๋Š”๊ฒƒ์ด ์—ญ์‹œ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  1. Autowired์˜ ํŽธ๋ฆฌํ•จ
    @Autowired ์‚ฌ์šฉ์ „@Service public class BookService { private BookRepository bookRepository; public BookService(BookRepository bookRepository){ this.bookRepository = bookRepository; }

}

์šฐ์„  BookService Class๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. BookService Class๋Š” ์ƒ์„ฑ์ž๋กœ BookRepository๋ฅผ ์ „๋‹ฌ๋ฐ›๊ณ  ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ์›๋ž˜์˜ ๊ฒฝ์šฐ๋ผ๋ฉด BookService์— BookRepository๋ฅผ ์ฃผ์ž…ํ•˜๊ธฐ ์œ„ํ•ด์„œ XMLํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด Bean์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

@Configuration
public class ApplicationConfig {
@Bean
public BookRepository bookRepository(){
return new BookRepository();
}

@Bean public BookService bookService(){ return new BookService(bookRepository()); }

}

๋˜๋Š” ์œ„์ฒ˜๋Ÿผ XML ์„ค์ • ํŒŒ์ผ์„ ๋Œ€์‹ ํ•˜๋Š” Java Class์— Bean์„ค์ •์„ ๋งŒ๋“ค์–ด์ฃผ์–ด ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. @Autowired ์‚ฌ์šฉ

@Service
public class BookService {
private BookRepository bookRepository;

@Autowired public BookService(BookRepository bookRepository){ this.bookRepository = bookRepository; }

}

ํ•˜์ง€๋งŒ @Autowired์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์œ„์™€ ๊ฐ™์ด ๊ฐ์ฒด์˜ ์˜์กด์„ฑ์„ ๊ฐ€์ง€๋Š” ๋ถ€๋ถ„์— ๊ฐ„๋‹จํžˆ @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ์˜์กด์„ฑ ์ฃผ์ž…์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. @Repository

public class BookRepository { ... }

์˜์กด์„ฑ ์ฃผ์ž… ํƒ€์ผ“์ด ๋˜๋Š” Class ์—ญ์‹œ ๋‹น์—ฐํžˆ Bean์œผ๋กœ ๋“ฑ๋ก์ด ๋˜๊ธฐ์œ„ํ•œ @Repository์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ€์—ฌ๋˜์–ด ์žˆ๋Š”๊ฒƒ์„ ์ฃผ๋ชฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 3. @Autowired Setter์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ setter ๋ฉ”์†Œ๋“œ์—์„œ๋„ @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ€์—ฌํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๊ทธ๋ฆผ์€ ์‹ค์ œ @Autowired ์–ด๋…ธํ…Œ์ด์…˜ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. @Target์„ ๋ณด๋ฉด CONSTRUCTOR, METHOD, PARAMETER, FIELD, ANNOTATION_TYPE๋“ฑ์— ๋ถ€์—ฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ๊ฒƒ์ด ๋ณด์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์„œ @Autowired ์–ด๋…ธํ…Œ์ด์…˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” required() ๋ฉ”์†Œ๋“œ์— ์ฃผ๋ชฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์œ ๋Š” ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ๋ณด์•˜๋˜ BookService Class์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์•„๋‹Œ Setter๋ฉ”์†Œ๋“œ์— @Autowired์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ€์—ฌํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด METHOD์—๋„ ๋ถ€์—ฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ–ˆ์œผ๋‹ˆ ๋‹น์—ฐํ•˜๊ฒ ์ฃ ? ์ค‘์š”ํ•œ ์‚ฌํ•ญ์€ ์ง€๊ธˆ๋ถ€ํ„ฐ ์ž…๋‹ˆ๋‹ค. public class BookRepository { ... } BookRepository Class์˜ Bean๋“ฑ๋ก ์–ด๋…ธํ…Œ์ด์…˜์„ ์ œ๊ฑฐ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ด?, ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋„ค์š”? ์•„๊นŒ์ „์— ์˜์กด์„ฑ ์ฃผ์ž…์ด ๋˜๋Š” ํด๋ž˜์Šค๋„ Bean์œผ๋กœ ๋“ฑ๋ก์ด ๋˜์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ–ˆ์œผ๋‹ˆ, ๋‹น์—ฐํ•˜์ง€ ์•Š๋ƒ๊ตฌ์š”? ๋‹ค์‹œ ํ•œ๋ฒˆ ์ƒ๊ฐํ•ด๋ณด์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. setter๋กœ ์ฃผ์ž…๋˜๋Š” ์˜์กด์„ฑ์˜ ๊ฒฝ์šฐ์—๋Š” ์ƒ์„ฑ์ž ์ฒ˜๋Ÿผ ํ•„์ˆ˜์ ์œผ๋กœ ์˜์กด์„ฑ ์ฃผ์ž…์ด ๋˜์–ด์•ผํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค, ํ•„์š”์— ์˜ํ•ด์„œ ์ฃผ์ž…์ด ๋˜๋Š”๊ฒƒ์ด์ง€์š”. ๊ทธ๋Ÿฌ๋ฉด ์™œ ๋นจ๊ฐ„์ค„์ด ๊ทธ์–ด์ง€๋ฉฐ ์ปดํŒŒ์ผ์— ์‹คํŒจํ•˜๊ฒŒ ๋ ๊นŒ์š”? ์•„๊นŒ์ „์— ์‚ดํŽด๋ณด์•˜๋˜ @Autowired์–ด๋…ธํ…Œ์ด์…˜ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋ณด์•˜๋˜ required() ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Default๊ฐ’์ด True ๋˜์–ด์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . required๊ฐ€ true์ธ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ์˜์กด์„ฑ์€ "๊ผญ ํ•„์š”ํ•œ ๋Œ€์ƒ์ด๋ฏ€๋กœ ์ฃผ์ž…์„ ๋ฐ˜๋“œ์‹œ ๋ฐ›์•„์•ผ ํ•œ๋‹ค"๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด required๋ฅผ false๋กœ ์„ค์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Bean์— ๋“ฑ๋ก์ด ๋˜์–ด์žˆ์ง€ ์•Š์Œ์—๋„ bookRepository๋ฅผ Autowiredํ•œ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 4. @Autowired์˜ ์ƒ๋žต ์ƒ์„ฑ์ž์—์„œ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›๋Š” ๊ฒฝ์šฐ์—๋Š” @Autowired์–ด๋…ธํ…Œ์ด์…˜์„ ์ƒ๋žตํ•˜๋”๋ผ๋„ ์ž๋™์œผ๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ์š”? ์›๋ฆฌ๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ๋ฐ›๋„๋ก ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š”, ํ•ด๋‹น ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ์—๋Š” ๋ฐ˜๋“œ์‹œ ๊ทธ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@Service
public class BookService {
private BookRepository bookRepository;

public BookService(BookRepository bookRepository){ this.bookRepository = bookRepository; }

}

์œ„์™€ ๊ฐ™์ด ์ƒ์„ฑ์ž์— BookRepository๋ฅผ ์ฃผ์ž…๋ฐ›๋Š” ๊ฒฝ์šฐ์—๋Š” @Autowired๊ฐ€ ์—†๋”๋ผ๋„ ์ž๋™์œผ๋กœ ์ฃผ์ž…์„ ๋ฐ›๊ฒŒ ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ํ™•์ธํ•  ์ˆ˜์žˆ๋ƒ๊ตฌ์š”? BookRepository์˜ Bean์œผ๋กœ ๋“ฑ๋ก๋˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ•œ๋ฒˆ ์ œ๊ฑฐํ•ด๋ณด์„ธ์š”. ๋‹ค์‹œ BookService Class๋กœ ๋Œ์•„์™€๋ณด๋ฉด, @Autowired์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ€์—ฌ๋˜์–ด ์žˆ์ง€ ์•Š์Œ์—๋„ Autowiredํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. 5. ๋‹คํ˜•์„ฑ @Autowired @Autowired ๋Œ€์ƒ์ด ๋˜๋Š” ๊ฐ์ฒด๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์—ญ์‹œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ์  ๊ฐ„๋‹จํžˆ BookRepository Interface๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•œ 2๊ฐœ์˜ ํด๋ž˜์Šค(MyBookRepository, SecondBookRepository)๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. @Repository public class MyBookRepository implements BookRepository { } , @Repository public class SecondBookRepository implements BookRepository { } ๋‹น์—ฐํžˆ ๊ฐ๊ฐ์˜ Class๋“ค์€ Bean์œผ๋กœ ๋“ฑ๋ก๋˜๊ธฐ ์œ„ํ•œ Annotation์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” @Autowired์— ์˜ํ•ด ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์ฃผ์ž…๋ ๊นŒ์š”? BookService Class๋ฅผ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ์—๋Š” ์œ„์™€ ๊ฐ™์ด "ํ•œ๊ฐœ ์ด์ƒ์˜ BookRepository Type ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค."๋ผ๋Š” ์˜ค๋ฅ˜๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉฐ ์ปดํŒŒ์ผ์— ์‹คํŒจํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์–ด์ฐŒ๋ณด๋ฉด ๋‹น์—ฐํ•ฉ๋‹ˆ๋‹ค ์ฃฝ์Œ์˜ ๋‹ค์ด์•„๋ชฌ๋“œ์™€ ๋น„์Šทํ•œ ์ƒํ™ฉ์ด ์•„๋‹๊นŒ์š”? ํ•ด๊ฒฐ๋ฒ• 1. @Primary ์ฒซ๋ฒˆ์งธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ @Primary ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. @Autowired์— ๋Œ€์ƒ์ด ๋˜๋Š” ํด๋ž˜์Šค๋“ค ์ค‘ ์ฃผ์ž…์ด ๋˜๊ธธ ์›ํ•˜๋Š” ํด๋ž˜์Šค์— ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ€์—ฌํ•˜๋ฉด Spring์ด ์ž๋™์œผ๋กœ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 2. @Qualifier @Service public class BookService{ โ€‹ @Autowired @Qualifier("myBookRepository") private BookRepository bookRepository; โ€‹ public void printBookRepository(){ System.out.println(bookRepository.getClass()); } } ๋˜๋Š” @Autowired์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ฃผ์ž…ํ•˜๋Š” ๊ณณ์—์„œ @Qualifier("bean id")๋ฅผ ์ด์šฉํ•ด ์–ด๋–ค Bean์ด ์ฃผ์ž…๋ ์ง€๋ฅผ ๋ช…์‹œํ•จ์œผ๋กœ์จ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 3. ๋ชจ๋“  ๋นˆ์„ ์ฃผ์ž…๋ฐ›๊ธฐ @Service public class BookService{ โ€‹ @Autowired private List<BookRepository> bookRepository; โ€‹ public void printBookRepository(){ this.bookRepository.forEach(System.out::println); } } ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ชจ๋“  ํƒ€์ž…์˜ Bean์„ ์ฃผ์ž…๋ฐ›๋„๋ก ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. @Autowired๋กœ ์ฃผ์ž…๋ฐ›๋Š” ๊ฐ์ฒด์˜ ํ˜•์„ List๋กœ ๋ฐ›๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ํ•ด๋‹น ํƒ€์ž…์„ ๊ฐ€์ง€๋Š” IoC์ปจํ…Œ์ด๋„ˆ์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  Bean์ด List์•ˆ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€