2022.10.12

Jimin·2022년 10월 12일
0

비트캠프

목록 보기
55/60
post-thumbnail

Spring IoC 컨테이너 준비 과정

new AnnotationConfigApplicationContext(AppConfig.class)
AppConfig.class : Spring IoC 컨테이너의 설정을 수행하는 클래스

  1. AppConfig(자바 config) 객체 생성
  2. 클래스나 메서드, 필드에 붙은 애노테이션 처리

@ComponentScan("패키지명")
→ 해당 패키지에 존재하는 클래스 중에서 Spring 프레임웍에서 지정한 애노테이션이 붙은 경우, 객체를 생성하고 애노테이션을 처리한다.

@Bean("객체명")
→ 메서드를 호출하여 리턴된 값을 컨테이너에 보관한다.

개발자의 일

애노테이션의 의미와 효과를 이해 → 적절하게 사용 → IoC 컨테이너를 통제


080. 스프링 webMVC의
DispatcherServlet과 IoC 컨테이너


@Component, @Controller 등

@RestController : JSON, XML을 응답하는 페이지 컨트롤러에 붙인다.
@Controller : HTML을 응답하는 페이지 컨트롤러에 붙인다.
@Service : 비즈니스 로직 및 트랜잭션을 제어하는 클래스에 붙인다.
@Repository : DAO 역할을 수행하는 클래스에 붙인다.


081. CRUD를 수행하는 페이지 컨트롤러를 하나로 합치기

페이지 컨트롤러를 다루는 방법

1단계 - 게시판 CRUD 페이지 컨트롤러들을 하나로 합친다.

  • com.bitcamp.board.controller.BoardController 클래스 생성
    • 기존의 게시글 관련 페이지 컨트롤러의 메서드를 가져온다.
    • 기존의 페이지 컨트롤러를 삭제한다.

CRUD: 등록, 조회, 변경, 삭제

Create

Read

Update

Delete

2단계 - 로그인, 로그아웃 관련 페이지 컨트롤러를 하나로 합친다.

  • com.bitcamp.board.controller.AuthController 클래스 생성
    • 기존의 로그인, 로그아웃 관련 페이지 컨트롤러의 메서드를 가져온다.
    • 기존의 페이지 컨트롤러를 삭제한다.

3단계 - 회원 CRUD 페이지 컨트롤러들을 하나로 합친다.

  • com.bitcamp.board.controller.MemberController 클래스 생성
    • 기존의 회원 관련 페이지 컨트롤러의 메서드를 가져온다.
    • 기존의 페이지 컨트롤러를 삭제한다.

4단계 - 리팩토링

-com.bitcamp.board.controller.BoardController 클래스 변경

  • saveAttachedFiles()
  • checkOwner()

5단계 - POST 요청 파라미터 값의 문자셋 지정을 필터로 이관한다.

  • com.bitcamp.board.filter.CharaterEncodingFilter 클래스 생성
  • com.bitcamp.board.controller.XxxController 클래스 변경
    • 요청 파라미터 값의 문자 집합 설정 코드를 제거한다.

6단계 - @RequestMapping 애노테이션 사용법을 연습한다.

  • com.bitcamp.board.controller.AuthController 클래스 변경
    • @PostMapping, @GetMapping 대신 @RequestMapping 애노테이션을 사용한다.

082. Spring WebMVC 프레임워크 사용법

1단계 - @RequestMapping 애노테이션으로 요청 URL 합성하는 방법

  • com.bitcamp.board.controller.XxxController 클래스 변경

2단계 - 스프링에서 제공하는 CharacterEncodingFilter로 교체한다.

  • com.bitcamp.board.listener.ContextLoaderListener 클래스 변경

    • LoginCheckFilter, AdminCheckFilter도 자바 코드로 등록한다.
  • 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();
        }
    }
}
profile
https://github.com/Dingadung

0개의 댓글