[TIL] 20210831

열심히 사는 루피 🥰·2021년 9월 1일
0

데브코스 백엔드 TIL

목록 보기
18/20

8월의 마지막 TIL


1. SpringMVC

1. Dispatch Servlet

  • 하나의 서블렛(front controller)이 모든 요청을 받아서 다른 컨트롤러를 호출시키는 형태
  • 개발자는 컨트롤러를 작성하고, 스프링 Dispatch Servlet이 작성한 컨트롤러를 호출함.
  • Dispatcher Servlet은 단하나의 서블릿이 된다.
  • 어떤 컨트롤러를 처리할지, 예외 어떻게 처리할 지 결정하게 된다.

2. 스프링 MVC 요청 처리과정

  1. 사용자 요청이 들어온다.
  2. Dispatcher Servlet이 요청에 맞는 컨트롤러를 찾아 요청을 위임
  3. 해당 컨트롤러는 서비스를 호출하여, 화면에 전달할 모델을 만든다.
  4. 컨트롤러는 만든 모델과 뷰를 Dispatcher Servlet에 전달한다.
  5. Dispatcher Servlet은 받은 모델과 뷰로 그에 적합한 컨텐츠를 제작
  6. 제작한 컨텐츠를 HTTP 응답으로 사용자에게 보낸다

구현방법-----
1. 웹 application initializer 할때 Dispatcher Servlet을 등록하여 사용

3. 핸들러매핑과 ViewResolver

  • 핸들러 매핑
    Handler Mapping: 요청의 URL 기준으로 어떤 핸들러에게 위임할지 결정

  • 핸들러 호출 시 파라미터 매핑
    Handler adapter: 핸들러의 메서드 파라미터에 맞는 정보로 변환해준다.
    ① Dispatcher Servlet이 모든 HTTP서블릿 리퀘스트 오브젝트를 받고
    ② 어댑터로 변환해서 적절한 파라미터를 핸들러에게 전달.

  • ViewResolver
    뷰는 어떻게 처리되는가

  1. Dispatcher Servlet이 컨트롤러에 GET요청 위임
  2. 컨트롤러가 뷰(뷰이름) - 모델을 반환
  3. ViewResolver에서 name에 해당하는 view를 찾아 반환
    • InternalResource ViewResolver : 최하단의 ViewResolver, JSP를 처리

  • 전체적인 스프링 MVC 흐름
  1. 요청이 오면 Dispatcher Servlet이 받는다
  2. 핸들러 매핑에 의해 핸들러(컨트롤러) 선택
  3. 핸들러 어댑터가 핸들러에 맞게 파라미터 변환
  4. 핸들러가 파라미터 받아 서비스 수행, 결과로 모델과 뷰네임 생성.
  5. view name이 Dispatcher Servlet에 전달된다.
  6. Dispatcher Servlet이 ViewResolver에 뷰네임, 모델을 전달
    • ViewResolver가 특정한 View를 찾아줌(JSP 등등)

4번을 제외한 과정을 스프링부트가 대신 해준다.

2. SpringMVC 실습

JSP 거의 쓰지 않는다..! 백엔드 공부할때 JSP에 너무 시간을 쏟지 않기

1.dispatcherServlet 만들고 설정

@EnableWebMvc : 스프링 mvc가 필요한 빈들이 자동으로 등록됨


    @EnableWebMvc
    @Configuration
    @ComponentScan(basePackages = "org.prgrms.kdt.customer")
    @EnableTransactionManagement
    static class AppConfig implements WebMvcConfigurer {
        @Override
        public void configureViewResolvers(ViewResolverRegistry registry) {
            registry.jsp(); //리퀘스트.jsp 로 연결!
        }
}
@Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
        applicationContext.register(AppConfig.class);
        var dispatcherServlet= new DispatcherServlet(applicationContext);

   
        logger.info("Starting Server...");
        ServletRegistration.Dynamic servletRegistration = servletContext.addServlet("test", dispatcherServlet);
        servletRegistration.addMapping("/*");
        servletRegistration.setLoadOnStartup(1);
    }

2. jsp 파일 설정하기

<c:forEach var="i" begin="1" end="10" step="1">${i}<br></c:forEach>


<c:forEach var="customer" items="${customers}">${customer.customerId}<br></c:forEach>


 <table class="table">
        <thead>
        <tr>
            <th scope="col">ID</th>
            <th scope="col">Name</th>
            <th scope="col">Email</th>
            <th scope="col">CreatedAt</th>
            <th scope="col">LastLoginAt</th>
        </tr>
        </thead>
        <tbody>
    <c:forEach var="customer" items="${customers}">${customer.customerId}
        <tr>
            <th scope="row">${customer.customerId}</th>
            <td>${customer.name}</td>
            <td>${customer.email}</td>
            <td>${customer.createdAt}</td>
            <td>${customer.lastLoginAt}</td>
        </tr>
    </c:forEach>
        </tbody>
    </table>

3. 정적리소스 처리

톰캣의 web.xml에 있는디폴트 서블릿을 통해 리소스를 가져오게 된다.

 static class AppConfig implements WebMvcConfigurer {
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //   ' /resources/** ' 에 관한 리소스에 대한 요청이 오면 
            registry.addResourceHandler("/resources/**")
            
                    .addResourceLocations("/resources/");
                     //   ' /resources/ ' 의 위치에서 리소스를 찾는다.
                    .setCachePeriod(60) //캐시설정
                    .resourceChain(true) //리소스 체인 걸기
                    .addResolver(new EncodedResourceResolver());//gzip으로 압축된 리소스 먼저 찾음
        }
 }
  • 요청부분 예시
<img src="<c:url value="/resources/bg.jpg"/>" class="img-fluid">

4. Thymeleaf 활용

자바 템플릿 엔진이다. HTML로 작성된 파일을 파싱해서 뷰를 제공.
1. 타임 리프추가

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
java

2.사용하기 전에

  1. 문법
profile
반가워_! 세상아!

0개의 댓글