1. @Autowired

<aside> πŸ’‘ @Autowired μ–΄λ…Έν…Œμ΄μ…˜μ€ Type을 ν†΅ν•œ DIλ₯Ό ν•  λ•Œ μ‚¬μš©ν•œλ‹€. μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ μ•Œμ•„μ„œ ν•΄λ‹Ή νƒ€μž…μ˜ Bean을 μ°Ύμ•„μ„œ μ£Όμž…ν•΄μ€€λ‹€.

</aside>

μ•„λž˜ μ½”λ“œλŠ” ν…ŒμŠ€νŠΈμ— κ³΅ν†΅μ μœΌλ‘œ μ‚¬μš© ν•  BookDTO, BookDAO, BookDAOImpl ν΄λž˜μŠ€μ΄λ‹€.

  1. BookDTO

    @Data
    @AllArgsConstructor
    public class BookDTO {
    
        private int sequence;        //λ„μ„œλ²ˆν˜Έ
        private int isbn;            //isbn
        private String title;        //제λͺ©
        private String author;       //μ €μž
        private String publisher;    //μΆœνŒμ‚¬
        private Date createdDate;    //좜판일
    
    }
    
  2. BookDAO

    public interface BookDAO {
    
        /* λ„μ„œ λͺ©λ‘ 전체 쑰회 */
        List<BookDTO> selectBookList();
    
        /* λ„μ„œ 번호둜 λ„μ„œ 쑰회 */
        BookDTO selectOneBook(int sequence);
    }
    
  3. BookDAOImpl

    /* @Repository : @Component의 μ„ΈλΆ„ν™” μ–΄λ…Έν…Œμ΄μ…˜μ˜ ν•œ μ’…λ₯˜λ‘œ DAO νƒ€μž…μ˜ 객체에 μ‚¬μš©ν•œλ‹€. */
    @Repository("bookDAO")
    public class BookDAOImpl implements BookDAO {
    
        private Map<Integer, BookDTO> bookList;
    
        public BookDAOImpl() {
            bookList = new HashMap<>();
            bookList.put(1, new BookDTO(1, 123456, "μžλ°”μ˜ 정석", "남ꢁ성", "λ„μš°μΆœνŒ", new Date()));
            bookList.put(2, 
    					new BookDTO(2, 654321, "칭찬은 κ³ λž˜λ„ μΆ€μΆ”κ²Œ ν•œλ‹€", "고래", "고래좜판", new Date()));
        }
    
        @Override
        public List<BookDTO> selectBookList() {
            return new ArrayList<>(bookList.values());
        }
    
        @Override
        public BookDTO selectOneBook(int sequence) {
            return bookList.get(sequence);
        }
    }
    

1-1. ν•„λ“œ(field) μ£Όμž…

/* @Service : @Component의 μ„ΈλΆ„ν™” μ–΄λ…Έν…Œμ΄μ…˜μ˜ ν•œ μ’…λ₯˜λ‘œ Service κ³„μΈ΅μ—μ„œ μ‚¬μš©ν•œλ‹€. */
@Service("bookServiceField")
public class BookService {

    /* BookDAO νƒ€μž…μ˜ 빈 객체λ₯Ό 이 ν”„λ‘œνΌν‹°μ— μžλ™μœΌλ‘œ μ£Όμž…ν•΄μ€€λ‹€. */
    @Autowired
    private BookDAO bookDAO;

		/* λ„μ„œ λͺ©λ‘ 전체 쑰회 */
    public List<BookDTO> selectAllBooks(){

        return bookDAO.selectBookList();
    }

		/* λ„μ„œ 번호둜 λ„μ„œ 쑰회 */
    public BookDTO searchBookBySequence(int sequence) {

        return bookDAO.selectOneBook(sequence);
    }
}

private BookDAO bookDAO = new BookDAOImpl(); 와 같이 ν•„λ“œλ₯Ό μ„ μ–Έν•œλ‹€λ©΄ BookService ν΄λž˜μŠ€λŠ” BookDAOImpl 클래슀의 변경에 μ§μ ‘μ μœΌλ‘œ 영ν–₯을 λ°›λŠ” κ°•ν•œ 결합을 κ°€μ§€κ²Œ λœλ‹€. κ°μ²΄κ°„μ˜ 결합을 λŠμŠ¨ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄ new BookDAOImpl() 와 같은 μ§μ ‘μ μœΌλ‘œ 객체λ₯Ό μƒμ„±ν•˜λŠ” μƒμ„±μž ꡬ문을 μ œκ±°ν•˜κ³  ν•„λ“œμ— @Autowired μ–΄λ…Έν…Œμ΄μ…˜μ„ μž‘μ„±ν•  수 μžˆλ‹€. 그러면 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” BookService 빈 객체 생성 μ‹œ BookDAO νƒ€μž…μ˜ 빈 객체λ₯Ό μ°Ύμ•„ μ˜μ‘΄μ„±μ„ μ£Όμž…ν•΄μ€€λ‹€.

μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλ₯Ό μƒμ„±ν•˜μ—¬ @Repository, @Service λ“±μ˜ μ–΄λ…Έν…Œμ΄μ…˜μ΄ μž‘μ„± 된 ν΄λž˜μŠ€κ°€ 빈 μŠ€μΊλ‹μ„ 톡해 잘 등둝 λ˜μ—ˆλŠ”μ§€, λ˜ν•œ 객체의 의쑴 관계에 따라 @Autowired μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 μ˜μ‘΄μ„± μ£Όμž…μ΄ λ˜μ—ˆλŠ”μ§€λ₯Ό ν…ŒμŠ€νŠΈν•œλ‹€.

/* AnnotationConfigApplicationContext μƒμ„±μžμ— basePackages λ¬Έμžμ—΄μ„ μ „λ‹¬ν•˜λ©° ApplicationContext μƒμ„±ν•œλ‹€. */
ApplicationContext context = new AnnotationConfigApplicationContext("com.ohgiraffers.section01");

BookService bookService = context.getBean("bookServiceField", BookService.class);

/* 전체 λ„μ„œ λͺ©λ‘ 쑰회 ν›„ 좜λ ₯ 확인 */
bookService.selectAllBooks().forEach(System.out::println);

/* λ„μ„œλ²ˆν˜Έλ‘œ 검색 ν›„ 좜λ ₯ 확인*/
System.out.println(bookService.searchBookBySequence(1));
System.out.println(bookService.searchBookBySequence(2));

1-2. μƒμ„±μž(constructor) μ£Όμž…

/* @Service : @Component의 μ„ΈλΆ„ν™” μ–΄λ…Έν…Œμ΄μ…˜μ˜ ν•œ μ’…λ₯˜λ‘œ Service κ³„μΈ΅μ—μ„œ μ‚¬μš©ν•œλ‹€. */
@Service("bookServiceConstructor")
public class BookService {

    private final BookDAO bookDAO;

		/* BookDAO νƒ€μž…μ˜ 빈 객체λ₯Ό μƒμ„±μžμ— μžλ™μœΌλ‘œ μ£Όμž…ν•΄μ€€λ‹€. */
    @Autowired
    public BookService(BookDAO bookDAO) {
        this.bookDAO = bookDAO;
    }

    public List<BookDTO> selectAllBooks(){

        return bookDAO.selectBookList();
    }

    public BookDTO searchBookBySequence(int sequence) {

        return bookDAO.selectOneBook(sequence);
    }

}

μƒμ„±μžμ—λ„ @Autowired μ–΄λ…Έν…Œμ΄μ…˜μ„ μž‘μ„±ν•  수 μžˆλ‹€. 그러면 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” BookService 빈 객체 생성 μ‹œ BookDAO νƒ€μž…μ˜ 빈 객체λ₯Ό μ°Ύμ•„ μ˜μ‘΄μ„±μ„ μ£Όμž…ν•΄μ€€λ‹€.

Spring 4.3 버전 μ΄ν›„λ‘œλŠ” μƒμ„±μžκ°€ ν•œ 개 뿐이라면 @Autowired μ–΄λ…Έν…Œμ΄μ…˜μ„ μƒλž΅ν•΄λ„ μžλ™μœΌλ‘œ μƒμ„±μž μ£Όμž…μ΄ λ™μž‘ν•œλ‹€. 단, μƒμ„±μžκ°€ 1개 이상일 κ²½μš°μ—λŠ” λͺ…μ‹œμ μœΌλ‘œ μž‘μ„±μ„ ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. μœ„μ˜ μ½”λ“œμ— κΈ°λ³Έ μƒμ„±μžλ₯Ό μΆ”κ°€λ‘œ μž‘μ„±ν•˜κ³  λ§€κ°œλ³€μˆ˜ μƒμ„±μžμ— @Autowired μ–΄λ…Έν…Œμ΄μ…˜μ„ μƒλž΅ν•˜κ²Œ 되면 μƒμ„±μž μ£Όμž…μ΄ λ™μž‘ν•˜μ§€ μ•Šμ•„ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

μƒμ„±μž μ£Όμž…μ˜ μž₯점