@Autowired์ ๋ํ ๋ถ์์ด๋ผ๊ธฐ์๋ ์์ ์ง์์ ๊ฐ์ง๊ณ @Autowired์ด๋ ธํ ์ด์ ์ ๊ดํด์ ํฌ์คํ ์ ํด๋ณด๊ฒ ์ต๋๋ค.
- Autowired๋?
@Autowired์ด๋ ธํ ์ด์ ์ ์ด๋ฆ์ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด ์ด ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌํ๋ฉด ๊ฐ ์ํฉ์ ํ์ ์ ๋ง๋ IoC์ปจํ ์ด๋ ์์ ์กด์ฌํ๋ Bean์ ์๋์ผ๋ก ์ฃผ์ ํด์ฃผ๊ฒ ๋ฉ๋๋ค. ์์ ๋ฅผ ํตํด ์์๋ณด๋๊ฒ์ด ์ญ์ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
- 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์์ ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
'์คํ๋ง Spring > ๐งถ ์คํ๋ง ํ๋ ์์ํฌ Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ajax์ @ResponseBody (0) | 2021.06.22 |
---|---|
service์ serviceImpl์ ๋ํด์... (0) | 2021.06.22 |
๋ง์ด๋ฐํฐ์ค(Mybatis)๋ฅผ ์ด์ฉํ insert, delete, update, select (0) | 2021.06.22 |
์คํ๋ง ๊ธฐ๋ณธ๊ตฌ์กฐ / ์๋์๋ฆฌ (0) | 2021.06.22 |
Spring MVC ํ๋ก์ ํธ์ ๊ธฐ๋ณธ๊ตฌ์กฐ (0) | 2021.04.27 |
๋๊ธ