## 54. IoC 컨테이너 적용하기
- IoC 컨테이너의 구동 원리와 구현
- 리스너 객체를 IoC 컨테이너로 관리하기
ApplicationContext.java
ApplicationContext.java
=>
=>
ApplicationContext.java
=>
ApplicationContext.java
=>
ApplicationContext.java
=>
ApplicationContext.java
=>
=>
ApplicationContext.java
ㄴ 패키지 멤버 클래스가 아닌 경우 객체 생성 대상에서 제외하도록 함
=>
AppConfig.java
ㄴ 해당 코드 잠시 제거해두기
ApplicationContext.java
ㄴ 생성자를 호출할 때 넘겨 줄 아규먼트 args 를 준비하도록 함
ApplicationContext.java
ㄴ 준비한 아규먼트를 가지고 생성자를 통해 객체를 생성하도록 함
ApplicationContext.java
ㄴ 생성된 객체를 컨테이너에 저장하도록 함
ApplicationContext.java
ㄴ 어떤 객체가 생성되는지 확인하기 위해 위에 있는 출력문 아래쪽으로 이동시킨 후 수정하기
=>
ApplicationContext.java
=>
ApplicationContext.java
=>
ApplicationContext.java
ㄴ 아규먼트를 담을 컬렉션을 준비함
ApplicationContext.java
ㄴ 파라미터 타입에 해당하는 객체를 컨테이너에서 찾도록 함
ApplicationContext.java
ㄴ getBean 메서드를 복사하여 붙여넣은 후 제네릭 타입으로 수정
ㄴ Class<T> 타입의 인자를 받으며, 여기서 T는 클래스의 타입 파라미터를 나타냄
ㄴ 메서드 시그니처는 T 타입의 객체를 반환함
=>
=>
ApplicationContext.java
ㄴ 주어진 타입에 해당하는 빈을 beanContainer에서 찾아서 반환하는 역할을 하도록 하는 getBean 메서드 완성
=>
ApplicationContext.java
ㄴ 주어진 타입에 해당하는 빈을 beanContainer에서 찾았다면 "찾았다!" 라는 문구와 해당 obj 값을 출력하여 확인하도록 함
ApplicationContext.java
ㄴ 출력값 확인
ApplicationContext.java
ㄴ 출력 확인했으므로 출력문들은 모두 제거
ApplicationContext.java
ApplicationContext.java
ㄴ 생성된 객체 목록을 확인하기 위해 해당 문구 출력 추가
=>
ApplicationContext.java
ㄴ 출력 값 확인
ApplicationContext.java
=>
ㄴ 출력 값 확인
ApplicationContext.java
ㄴ @Component 라는 이름의 애노테이션을 만들어서 사용할 것을 선언
=>
ㄴ Bean.java 애노테이션 파일을 복사하여 Component 라는 이름의 애노테이션을 생성
=>
Component.java
ㄴ 클래스에 붙일 수 있도록 @Target 에 TYPE 으로 설정해줌
ApplicationContext.java
ㄴ @Component 애노테이션이 붙지 않았다면 객체 생성 대상에서 제외하도록 함
=>
MySQLBoardDao.java
ㄴ @Component 애노테이션 추가
MySQLItemDao.java
ㄴ @Component 애노테이션 추가
=>
MySQLMemberDao.java
ㄴ value 값을 memberDao
ㄴ value 는 생략
ApplicationContext.java
ㄴ 생성된 객체를 컨테이너에 저장할 때 @Component 애노테이션이 붙은 애노테이션
ㄴ compAnno.value().length() > 0 조건을 사용하여 @Component 애노테이션에 설정된 이름이 있으면 그 이름으로 객체를 저장하고, 설정된 이름이 없으면 클래스의 간단한 이름(getSimpleName())으로 객체를 저장하도록 함
=>
ㄴ MySQLMemberDao 는 @Component 에 value 값을 memberDao 라고 정해줬기 때문에 위와 같이 출력됨을 확인
MySQLMemberDao.java
ㄴ value 값 다시 제거
AppConfig.java
ㄴ "bitcamp.report.handler" 를 다시 추가
=>
MemberAddListener.java
MemberDeleteListener.java
MemberDetailListener.java
MemberListListener.java
MemberUpdateListener.java
DispatcherListener.java
ㄴ 해당 코드 제거
DispatcherListener.java
ㄴ ApplicationContext 를 저장하도록 필드에 추가
DispatcherListener.java
ㄴ 해당 코드 삭제
=>
DispatcherListener.java
ㄴ Map 대신 ApplicationContext 를 이용하도록 함
=>
LoginListener.java
ㄴ LoginListener 에도 @Component 애노테이션 추가
=>
MemberAddListener.java
ㄴ @Component 애노테이션의 value 값을 "/member/add" 를 추가
MemberDeleteListener.java
ㄴ @Component 애노테이션의 value 값을 "/member/Delete" 를 추가
MemberDetailListener.java
ㄴ @Component 애노테이션의 value 값을 "/member/Detail" 를 추가
MemberListListener.java
ㄴ @Component 애노테이션의 value 값을 "/member/list" 를 추가
MemberUpdateListener.java
ㄴ @Component 애노테이션의 value 값을 "/member/update" 를 추가
ServerApp.java
ㄴ member/add -> /member/add 이런식으로 모두 변경해주기
ServerApp.java
ㄴ member -> /member 형태로 모두 변경
ServerApp.java
ㄴ login -> /auth/login 형태로 변경
LoginListetner.java
ㄴ @Component 애노테이션의 value 값을 "/auth/login" 를 추가
ServerApp.java
ㄴ ApplicationContext 를 이용하도록 필드에 선언
ㄴ DispatcherListener 는 생성자 안에서 객체 생성하도록 함
ServerApp.java
ㄴ facadeListener -> iocContainer 로 변경
ㄴ "SqlSessionFactory" -> SqlSessionFactory.class 로 변경
=>
ㄴ 여기까지는 잘 출력됨
=>
ㄴ 0번은 존재하지 않으므로 "해당 번호의 직원이 없습니다!" 라는 문구만 출력되어야 함
=>
MemberDeleteListener.java
ㄴ 오류 해결
MemberDao.xml
ㄴ desc -> asc 로 변경
=>
ServerApp.java
ㄴ 메뉴 경로에 ?category=1 과 ?category=2 와 같이 category 도 추가하도록 함
Menu.java
ㄴ 테스트
Menu.java
Menu.java
=>
Menu.java
ㄴ main 에서 테스트 했던 if 문 그대로 가져와서 System.out.println -> prompt.setAttribute 로 변경해주기
Menu.java
ㄴ 테스트가 끝난 main 은 제거해줌
Menu.java
BoardListListener.java
=>
BoardListListener.java
ㄴ BoardListListener 의 생성자에서 category 를 설정할 필요 없으므로 제거
BoardListListener.java
ㄴ category 를 생성자가 아니라 prompt 를 통해 받도록 함
BoardListListener.java
ㄴ @Component 애노테이션을 추가
ㄴ value 값은 "/board/list" 로 설정
BoardAddListener.java
ㄴ BoardListListener 와 비슷한 방법으로 위와 같이 수정
BoardDeleteListener.java
ㄴ BoardListListener 와 비슷한 방법으로 위와 같이 수정
BoardDetailListener.java
ㄴ BoardListListener 와 비슷한 방법으로 위와 같이 수정
BoardUpdateListener.java
ㄴ BoardListListener 와 비슷한 방법으로 위와 같이 수정