new AnnotationConfigApplicationContext(AppConfig.class)
AppConfig.class
: Spring IoC 컨테이너의 설정을 수행하는 클래스
⇒ @ComponentScan("패키지명")
→ 해당 패키지에 존재하는 클래스 중에서 Spring 프레임웍에서 지정한 애노테이션이 붙은 경우, 객체를 생성하고 애노테이션을 처리한다.
⇒ @Bean("객체명")
→ 메서드를 호출하여 리턴된 값을 컨테이너에 보관한다.
애노테이션의 의미와 효과를 이해 → 적절하게 사용 → IoC 컨테이너를 통제
@RestController
: JSON, XML을 응답하는 페이지 컨트롤러에 붙인다.
@Controller
: HTML을 응답하는 페이지 컨트롤러에 붙인다.
@Service
: 비즈니스 로직 및 트랜잭션을 제어하는 클래스에 붙인다.
@Repository
: DAO 역할을 수행하는 클래스에 붙인다.
페이지 컨트롤러를 다루는 방법
-com.bitcamp.board.controller.BoardController 클래스 변경
com.bitcamp.board.listener.ContextLoaderListener 클래스 변경
ContextLoaderListener class
// 웹애플리케이션이 시작되었을 때 공유할 자원을 준비시키거나 해제하는 일을 한다.
//
@MultipartConfig(maxFileSize = 1024 * 1024 * 10)
@WebListener
public class ContextLoaderListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("공유 자원을 준비 중!!");
try {
// 웹 기능이 포함된 스프링 IoC 컨테이너 준비
AnnotationConfigWebApplicationContext iocContainer =
new AnnotationConfigWebApplicationContext();
iocContainer.register(AppConfig.class);
iocContainer.refresh(); // 자바 config 클래스(AppConfig)에 설정된 대로 객체를 생성한다.
ServletContext ctx = sce.getServletContext();
// 자바 코드로 서블릿 객체를 직접 생성하여 서버에 등록하기
DispatcherServlet servlet = new DispatcherServlet(iocContainer);
Dynamic config = ctx.addServlet("DispatcherServlet", servlet);
config.addMapping("/service/*");
config.setMultipartConfig(new MultipartConfigElement(
this.getClass().getAnnotation(MultipartConfig.class)));
config.setLoadOnStartup(1); // 웹 애플리케이션을 시작할 때 프론트 컨트롤러를 자동 생성.
// 필터 등록
CharacterEncodingFilter filter = new CharacterEncodingFilter("UTF-8");
FilterRegistration.Dynamic filterConfig = ctx.addFilter("CharacterEncodingFilter", filter);
filterConfig.addMappingForServletNames(
EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE),
false,
"DispatcherServlet");
AdminCheckFilter adminFilter = new AdminCheckFilter();
FilterRegistration.Dynamic adminFilterConfig = ctx.addFilter("AdminCheckFilter", adminFilter);
adminFilterConfig.addMappingForUrlPatterns(
EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE),
false,
"/service/member/*");
LoginCheckFilter loginFilter = new LoginCheckFilter();
FilterRegistration.Dynamic loginFilterConfig = ctx.addFilter("LoginCheckFilter", loginFilter);
loginFilterConfig.addMappingForUrlPatterns(
EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE),
false,
"/service/*");
} catch (Exception e) {
e.printStackTrace();
}
}
}