아무거나

[spring] 스프링 MVC 기초 본문

Java & Kotlin/Spring

[spring] 스프링 MVC 기초

전봉근 2019. 12. 25. 23:51
반응형

[spring] 스프링 MVC 기초

 

* 스프링 MVC 전체적인동작

  - client에서 요청이 들어오면 무조건 먼저 받는곳은 DispatcherServlet이다. DispatcherServlet에서 ( HandlerMapping, View(JSP), ViewResolver, HandlerAdapter, Controller 로 작업을 보낸다 )

    실제로 공수가 많이 들어가는 부분은 controller, view쯤이 될 것이다.

 

    ex) [client] -> [DispatcherServlet(HandlerMapping, View(JSP), ViewResolver, HandlerAdapter)] <-(modelandview)-> [Controller]

 

1. 프로젝트 생성

New -> Spring Legacy Project -> spring MVC Project 선택 -> 패키지명:com.javalec.spring_ex_pjt 설정 후 finish

* com.javalec.spring_ex_pjt은 꼭 2개 이상으로하자 그래야 spring_ex_pjt가 context명이된다.

 

- /src/main/webapp은 webroot로 보면된다. /src/main/webapp/views (클라이언트에게 보여줄 view(jsp)페이지들이 모여있는곳)

- /src/main/WEB-INF/web.xml은 servlet매핑이 기본적으로 설정되어있다.  

- /src/main/spring/appServlet/servlet-context.xml 여기는 bean이라던가 spring관련된 내용들을 설정하는곳이다.

  기본적으로 보면 아래 소스처럼 내용이있것을 확인하자.

<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<beans:property name="prefix" value="/WEB-INF/views/" />

<beans:property name="suffix" value=".jsp" />

</beans:bean>

 

* 위 태그는 /WEB-INF/views/ (prefix) + 뷰이름 + .jsp(suffix) 로 경로를 설정할 수 있다.

 

- src/main/java 에 controller를 생성하자.

  

## 정리

- 뷰(.jsp)

- 컨트롤러 : Dispatcher에서 전달된 요청을 처리

- servlet-context.xml : 스프링 컨테이너 설정 파일

- web.xml : DispatcherServlet 서블릿 매핑 및 스프링 설정 파일 위치 정의

- DispatcherServlet : 클라이언트의 요청을 최초로 받아 컨트롤러에 전달

 

 

2. resources 폴더( webapp/resources )

   [web.xml]

    ....

    <!-- Processes application requests -->
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

 

** 위의 servlet-mapping태그의 하위태그인 url-pattern에 정의된 " / " 로 들어온 모든요청은

   servlet태그에 org.springframework.web.servlet.DispatcherServlet 으로 가라고 명시를 해준것이다.

 

[HomeController.java]

/**
 * Handles requests for the application home page.
 */
@Controller  // 반드시 어노테이션을 선언해야 컨트롤러 역할을 할 수 있다.
public class HomeController {
    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = "/", method = RequestMethod.GET) // value="/" 요청할 경로
    public String home(Locale locale, Model model) {
        logger.info("Welcome home! The client locale is {}.", locale);
        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
        String formattedDate = dateFormat.format(date);
        model.addAttribute("serverTime", formattedDate );
        return "home";  // view 경로
    }
}

 

** 스프링 설정파일 servlet-context.xml을 보면 <context:component-scan base-package="com.javalec.spring_ex_pjt" /> 가 있다.

   여기서 context:component-scan 얘가 스프링 프로젝트를 스캔하는데 base-package에 지정된 com.javalec.spring_ex_pjt 안에서만 스캔한다.

   스캔도중에 @Controller 어노테이션을 만나면 그 어노테이션에 명시된 파일이 컨트롤러 역할을 할 수 있다.

 

   그리고 위에 web.xml에서 <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 로 되어있어서

           servlet-context.xml 파일을 검색하여 과정이 진행되는 것이다.

   

   [톰캣실행 -> 결과]

   http://localhost:8080/spring_ex_pjt/WEB-INF/classes... 처럼 spring_ex_pjt가 위의 com.javalec.spring_ex_pjt 지정한대로 컨텍스트 이름으로 잡혀있다.

   그러면 톰캣에서 실행하면 server.xml 을 확인해보면 <Context docBase="springEx" path="spring_ex_pjt"...   처럼 자동으로 지정되어있다.

 

   [/src/main/webapp/resources/home.jsp]

   /src/main/webapp/resources 경로에 이미지를 저장하고 home.jsp 파일에 <img src="/resources/image.png"> 태그를 넣는다.

   위의 경로를 입력하면 이미지를 못찾는다. 그러므로 컨텍스트 명부터 경로를 입력해야이미지를 찾을 수 있다.

   ex) <img src="/spring_ex_pjt/resources/image.png">

 

   ** 같은 방법으로 webapp안에 myResources폴더를 만들어 위와 같은 방식으로 똑같이하게되면 처음에 이미지가 표시되지 않을것이다.

      똑같은 웹 루트에 폴더만 생성할뿐인데 이미지를 찾을 수 없는 부분이 의아할것이다.

      이유는 servlet-context.xml을 보면 <resources mapping="/resources/**" location="/resources/" /> 가 추가되어있는데 그 아래

      <resources mapping="/myResources/**" location="/myResources/" /> 를 추가하자.

      그래야 DispatcherServlet으로 "/"로 들어오는것중에 myResources로 들어오는걸 myResources폴더에서 검색하라고 명시를 해주자.

      추가 후 이미지를 확인해보자.

 

 

참고: https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81-%EA%B0%95%EC%A2%8C/dashboard

반응형
Comments