## 68. Spring IoC 컨테이너를 이용하여 페이지 컨트롤러를 관리하기
- Spring IoC 컨테이너를 이용하여 객체를 자동 생성하는 방법
- 의존 객체를 자동으로 주입하는 방법
- Spring IoC 컨테이너에 들어 있는 객체를 꺼내 사용하는 방법
ㄴ spring-context 라이브러리 검색
=>
ㄴ spring-context 라이브러리 추가하는 Gradle 용 코드를 [Copy to clipboard] 선택하여 복사
=>
build.gradle (:app-server)
=>
ㄴ 코끼리 선택하여 빌드해주기
=>
ㄴ Project 선택
=>
ㄴ springframework 관련 라이브러리가 추가됨을 확인
=>
ㄴ Spring Framework 선택
=>
ㄴ 6.0.11 버전 > Reference Doc. 선택
=>
=>
ㄴ Core Technologies 선택
=>
ㄴ Introduction to the Spring IoC Container and Beans 선택
=>
ㄴ Container Overview 선택
=>
ㄴ org.springframework.context 선택
=>
ㄴ ApplicationContext 선택
=>
ㄴ AnnotationConfigApplicationContext 선택
=>
ㄴ 해당 클래스 확인 후 사용해보기
=>
DispatcherServlet.java
ㄴ AnnotationConfigApplicationContext 선언
=>
DispatcherServlet.java
ㄴ AnnotationConfigApplicationContext 객체 생성하기
ㄴ bitcamp.report 위치에 config 라는 이름의 새로운 패키지 생성
=>
ㄴ app-54-server 에 있는 AppConfig.java 복사해서 생성한 config 패키지에 붙여넣기
=>
config/AppConfig.java
ㄴ 해당 import 제거
=>
config/AppConfig.java
ㄴ springframework 라이브러리에 있는 Bean, ComponentScan 을 새로 import 해주기
=>
config/AppConfig.java
ㄴ handler -> controller 로 변경
=>
listener/ContextLoaderListener.java
ㄴ @WebListener 주석 처리 해주기
DispatcherServlet.java
ㄴ 해당 코드 제거
=>
DispatcherServlet.java
ㄴ 해당 코드 제거
=>
config/AppConfig.java
ㄴ AppConfig 의 sqlSessionFactory() 가 호출될 때 해당 출력문을 출력해보도록 함
=>
config/AppConfig.java
=>
config/AppConfig.java
ㄴ AppConfig 가 실행되면 해당 출력문을 출력해보도록 함
DispatcherServlet.java
ㄴ AppConfig.class 추가
=>
ㄴ loadOnStartup 을 1로 설정해주기
=>
DispatcherServlet.java
ㄴ DispatcherServlet 의 init()이 호출되면 해당 문구 출력되도록 함
=>
ㄴ App 실행 시 출력되는 해당 문구들 확인하여 어떤 메서드가 언제 호출되는지 확인
dao/MySQLBoardDao.java
ㄴ @Component 애노테이션 추가
=>
dao/MySQLBoardDao.java
ㄴ MySQLBoardDao() 가 호출될 경우 해당 문구 출력되도록 함
listener/ContextLoaderListener.java
ㄴ 해당 코드 제거
=>
listener/ContextLoaderListener.java
ㄴ 해당 코드 제거
=>
ㄴ 추가한 "MySQLBoardDao() 호출됨!" 문구가 출력됨을 확인
config/AppConfig.java
ㄴ @Bean 애노테이션 주석 처리 해주기
=>
ㄴ 스프링 IoC 컨테이너에서 해당하는 빈을 찾을 수 없어 발생하는 오류
=>
config/AppConfig.java
ㄴ 주석 다시 풀어주기
=>
dao/MySQLMemberDao.java
ㄴ @Component 애노테이션 추가하여 Spring 프레임워크에서 컴포넌트 스캔을 통해 해당 클래스를 스프링 빈으로 등록함
=>
dao/MySQLMemberDao.java
ㄴ MySQLMemberDao() 가 호출될 경우 해당 문구가 출력되도록 함
=>
ㄴ MySQLMemberDao() 가 호출되어 해당 문구가 출력됨을 확인
util/NcpConfig.java
ㄴ util 패키지에 위치한 NcpConfig.java 파일을 config 패키지로 이동 시킴
=>
config/NcpConfig.java
ㄴ @Component 애노테이션 추가하여 Spring 프레임워크에서 컴포넌트 스캔을 통해 해당 클래스를 스프링 빈으로 등록함
=>
config/NcpConfig.java
=>
=>
config/NcpConfig.java
ㄴ NcpConfig() 가 호출되면 해당 문구를 출력하도록 함
=>
config/NcpConfig.java
ㄴ @Component 애노테이션 제거
DispatcherServlet.java
ㄴ AnnotationConfigApplicationContext 에 NcpConfig.class 를 넘겨주도록 함
ㄴ 스프링 애플리케이션 컨텍스트를 설정하기 위해 Java 기반의 설정 클래스를 사용하는 데 사용
=>
ㄴ 설정한 해당 문구 출력됨
=>
ㄴ bitcamp.report 패키지 위치에 service 라는 이름의 새로운 패키지 생성
=>
ㄴ util 패키지에 있는 NcpObjectStorageService.java 파일을 생성한 service 패키지로 이동 시키기
=>
service/NcpObjectStorageService.java
ㄴ @Component 애노테이션은 스프링 프레임워크에서 컴포넌트 스캔(Component Scanning)을 통해 빈(Bean)으로 등록할 클래스를 표시하기 위해 사용함
=>
service/NcpObjectStorageService.java
ㄴ NcpObjectStorageService() 가 호출됨을 표시하도록 해당 출력문 추가
=>
config/AppConfig.java
ㄴ @ComponentScan 애노테이션의 basePackages 에 "bitcamp.report.service" 설정 추가해주기
ㄴ 컴포넌트 스캔은 스프링이 자동으로 클래스를 찾아서 빈으로 등록하는 방법 중 하나임
=>
ㄴ App 실행 시 NcpObjectStoraggeService() 호출됨을 확인
BoardAddController.java
ㄴ 스프링 빈으로 등록하고 "/board/add"라는 이름으로 식별되도록 함
BoardDeleteController.java
ㄴ 스프링 빈으로 등록하고 "/board/delete"라는 이름으로 식별되도록 함
BoardDetailController.java
ㄴ 스프링 빈으로 등록하고 "/board/detail"라는 이름으로 식별되도록 함
BoardFileDeleteController.java
ㄴ 스프링 빈으로 등록하고 "/board/fileDelete"라는 이름으로 식별되도록 함
BoardListController.java
ㄴ 스프링 빈으로 등록하고 "/board/list"라는 이름으로 식별되도록 함
BoardUpdateController.java
ㄴ 스프링 빈으로 등록하고 "/board/update"라는 이름으로 식별되도록 함
HomeController.java
ㄴ 스프링 빈으로 등록하고 "/"라는 이름으로 식별되도록 함
LoginController.java
ㄴ 스프링 빈으로 등록하고 "/auth/login"라는 이름으로 식별되도록 함
LogoutController.java
ㄴ 스프링 빈으로 등록하고 "/auth/logout"라는 이름으로 식별되도록 함
MemberAddController.java
ㄴ 스프링 빈으로 등록하고 "/member/add"라는 이름으로 식별되도록 함
MemberDeleteController.java
ㄴ 스프링 빈으로 등록하고 "/member/delete"라는 이름으로 식별되도록 함
MemberDetailController.java
ㄴ 스프링 빈으로 등록하고 "/member/detail"라는 이름으로 식별되도록 함
MemberListController.java
ㄴ 스프링 빈으로 등록하고 "/member/list"라는 이름으로 식별되도록 함
MemberUpdateController.java
ㄴ 스프링 빈으로 등록하고 "/member/update"라는 이름으로 식별되도록 함
=>
App 재실행
=>
DispatcherServlet.java
ㄴ Map 객체 생성 코드 제거
=>
DispatcherServlet.java
=>
DispatcherServlet.java
=>
DispatcherServlet.java
ㄴ 스프링 컨테이너에서 pageControllerPath에 해당하는 빈을 검색하여 pageController 라는 변수에 저장
=>
DispatcherServlet.java
ㄴ 해당 코드 제거
=>
App 실행
=>
=>
DispatcherServlet.java
ㄴ 데이터베이스와 관련된 객체를 웹 애플리케이션 전체에서 공유하기 위해 SqlSessionFactory를 서블릿 컨텍스트에 저장하도록 함
ㄴ 해당 설정을 통해 여러 페이지 컨트롤러나 서비스 클래스에서 동일한 SqlSessionFactory를 사용할 수 있으며, 설정을 중복으로 할 필요가 없어짐
=>
ㄴ 정상적으로 실행됨을 확인