Spring - MVC

0. Spirng Web 강의 소개

현재 기본적인 스프링에 대해 배웠다.
어디서부터 배울지 모르겠다. Tomcat 서블릿 jsp - web.xml을 설정해서 했엇다.
Tomcat
Tomcat Configuration
web.xml
Spiring Dispatcher를 활용해서 한다.

Spring Web
Spring Configuration
-servlet
-service
-security
Mybaties}
Tiles} 톰캣에 있던걸 가지고옴
이설정을
xml annotation java
버전에 따라 다 나뉘어서 설정을 한다.
이런설정을 도와주는 것이 spring boot이다.
시작내용들을 잡아주는 프레임워크이다.
Starter Configuration
application.properties OR YAML(제이슨같은것)
매우 설정이 줄어든다.
버전에 따라 다르고 xml 자바설정 이 뭐가다른지 어노테이션 어디에 하는건지 알 수없다.
결국 버전을 따라가는게 좋을 것이다.
이번에 배울 MVC과정은 덮어쓰기 과정 개발을 빨리하고싶다면 Spirng Boot과정

1. Spring MVC란

스프링으로 웹개발을 해보자.
Dispatcher를 집중화하기 전 모델
모델2에서 controller & Dispatcher 이것을 서블릿으로 view단을 jsp로 했다.
Dispatcher 로 포워딩을 햇엇다.
그런데 모든 컨트롤러가 Dispatcher를 구현해야하고 이것을 모두다 가지고 있는 것이 비효율적일 수 있다.
순수하게 Controller POJO(Plain Old Java Object)로 빼고
Dispatcher만 남기는 것이다. 포워딩하는 기능이 잇으니 하나만 만들면된다. 사용자 요청을 컨트롤러에게 하고 뷰단에 보여준다.
단순히 요청하는게아니라 입력값이 있다면 입력값도 컨트롤러에 제공해야한다.
입력값을 단순히 겟파라미터 등이 아니라 서블릿 기능을 이용할수잇도록해서 자바로 변형해서 전달하도록 한다..
단순히 데이터 기본형이 아니라 객체화해서 담아서 보내줄 수있다. 컨트롤러는 서블릿하나도 사용안하고 만들 수 있게 되는 것이다.

결합용을 낮춤으로서 컨트롤러를 다른데도 사용할 수 있도록 한다.
Dispatcher를 잘만들면 톰캣과 이별할 수도 있다.
Dispatcher서블릿이 알맞는 컨트롤러에대해 여러가지 url을 잘 처리해야한다. 알맞는 컨트롤러에 배분을 해줘야한다.
스프링이 또다른 문제가 생길수잇다. 꼭 스프링으로 만드는게 아니라 더 발전시킬 필요가 잇다.
MVC를 지원하기 위한 스프링라이브러리들을 사용해야한다.

2. 실습환경 준비하기

톰캣 jdk등등 스프링이 필요한 실습환경
스프링을 위한 도구들이 잇는것임.
부트에는 톰캣이 내장돠어 있어서 안해도된다. 기본적인 환경을 아는게 좋다.
https://spring.io 에서 Spring Tools 4 for Eclipse를 다운받자
스프링을 배제하고 메이븐으로만 웹프로젝트를 만들어보자.
다운받은것이 STS이다.
기존에는 이클립스 + STS플러그인을 다운받아 사용한것이다.
STS는 이클립스 베이스에 이 플러그인이 자동으로 추가된 IDE라고 보면된다.
기존 이클립스에 플러그인을 다운받아 쓰는 것은 버전 호환성 문제가 발생할 수 있으니 주의하는 것이 좋다.
오류가 준내 나던게 이런 것인듯 하다.

3. 메이븐을 이용한 기본 웹프로젝트 생성하기

https://velog.io/@yiwonjin/Maven-war%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-Cannot-access-defaults-field-of-Properties%EC%97%90%EB%9F%AC
웹프로젝트 에러 플러그인이 지정안된것임. 추가해주자.

4. Dispatcher Servlet 라이브러리 설정하기

기본적인 WEB브라우저에 스프링을 얹어보자
https://mvnrepository.com/artifact/org.springframework/spring-webmvc
스프링 web mvc 리포지터리 추가하자.
spring-webmvc라이브러리 - DispatcherServlet.class를 사용할것이다.
오른쪽키 Copy qualified Name하면
패키지명과 클래스명을 가져올수있다.
org.springframework.web.servlet.DispatcherServlet.class

5. dispatcher-servlet.xml 파일

원래는 이렇게 서블릿을 상속받아 만들었는데 이것을 사용하지 않겟다.
package webprj;
import javax.servlet.http.HttpServlet;
public class IndexController extends HttpServlet {}

이기능을 분류해서 스프링의 DispatcherServlet가 만들것이다.
남이 만든 서블릿을 사용하려면 xml을 사용해야한다.
매핑을 해야하는데 어디서 하느냐? web.xml에서 한다.

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>    

서블릿 배울때 햇듯이 매핑해준다.
Front Controller만들었다. 어떤요청이 오더라도 매핑해준게 오게 해야한다. 모든주소를 받아서 매핑안한게 오면안된다.
http://localhost:8080/WEBPrj/index.jsp이렇게왓는데 이렇게오면 그냥 그걸 킨거니 잘못된거임.

   <servlet-mapping>
    <servlet-name>dispathcer</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

이렇게 변경해준다. 예외없이 dispathcer라는 프론트컨트롤러가 허락해야 올 수 있다.
IOException parsing XML document from ServletContext resource [/WEB-INF/dispathcer-servlet.xml
dispathcer가 모든 url을 가지고 와야하는데 원래 모든 url으르 web.xml이 햇는데
-servlet.xml이 매핑정보를 가지고 오게해야한다.
dispathcer-servlet.xml파일을 WEB-INF에 추가해주자.

6. 스프링 컨트롤러 IndexController 작성하기

스프링의 dispathcer가 사용하는 설정파일이 xml이다.
이 레퍼런스를 스프링이 제공하는 것을 사용해야한다.
https://docs.spring.io/spring-framework/docs
버전에 맞는 레퍼런스를 보자 - spring-framework-reference -core -왼쪽에 The IoC Container에서 찾을 것임.
configuration metadata로 가서 내리다보면 beans설정이 있다. 이것을 복사해오자. 이전에 만든거 가져와도된다.
여기서 ID를 클래스르 꺼내서 담는거엿늗네 MVC에서는 ID에 URL을 담아서 사용하게된다. 이러면 이것이 컨테이너에 담겨진다.
이 url을 요청하면 이것을 객체화해서 꺼내오게 되는 것이다.
<bean id="/index" class="com.newlecture.web.controller.IndexController">
POJO를 불러오기위해서는 이 기능의 함수는 약속되어있다. 바로 handleRequest이다.
서블릿을 상속받아 사용햇는데 이것이 스프링에 종속되는 것이다 또다른 종속이 된것임.

public class IndexController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
return null;
}}
반환할게 무엇인가? Dispatcher가 다빠졋으니 ModelAndView에 담아서 보내준다.

package com.newlecture.web.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;


public class IndexController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mv = new ModelAndView();
        mv.addObject("data", "Hello Spring MVC~");
        //mv.setViewName("/WEB-INF/view/index.jsp");
        mv.setViewName("index");

        return mv;
    }
}

컨트롤러에서 model and view를 담아서 Dispatcher에 보내줌 이 model을 jsp에 보내줌으로써 보여지게 되는 것임.
-> 404에러
톰캣을 사용해서 할때는 근데 톰캣이 POJO를 몰라서 못가져옴.
Dispatcher는 실행되는데 포워드하는데서 오류가 나오는 것임.
web.xml에서 /*을하면 다시 Dispatcher를 거치게 되는 것이다. index.jsp를 찾으려면 다시 걸려서 오는건데 찾을 수 없게된다.
다시 *을빼주면 Dispatcher를 거치게되는데 찾아보다가 없으면 그냥 리소스를 직접 다시가져옴.
근데 이거도 문제가 된다 왠지는 다음 에 알아보자

7. View 페이지를 위한 위치

*을 지웟다. 컨트롤러와 뷰가 분리되어 잇을경우 컨트롤러만 요청하도록 해야하는데 건너뛰고 view를 부를 수 잇으면안된다.
WEB-INF에 페이지를 숨기자.
mv.setViewName("WEB-INF/view/index.jsp");
url을 또 바꿔준다.
상대경로만 쓰면 앞에 루트를빼게되고 aa/WEB-INF를찾게된다 절대경로를 써야한다.
mv.setViewName("/WEB-INF/view/index.jsp");

이클립스가 예를 불러와야하는데 안불러옴.
편법으로 같은 이름을 부여하면 파일이 없어도 거기로 가서 불러와짐.

8. ViewResolver 사용하기

view페이지를 웹인포로 옮겻다. 쉽게 찾을 수잇도록하는 ViewResolver을 설정할 것이다.
셋네임의 절대경로를 빼고 "index"만 넣어보자.
mv.setViewName("/WEB-INF/view/index.jsp"); -> mv.setViewName("index");
/WEB-INF/view/ .jsp나머지를 붙여주는게 ViewResolver이다.
자기가 자기를 요청해서 오류가 발생해버림.

<bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value= "/WEB-INF/view/"></property>
<property name="suffix" value= ".jsp"></property>
</bean>
setPrefix = prefix setSuffix = suffix가 된거임.

9. HTML 파일 설정하기

JSP때 했던 newlecutre사이트
css나 이미지가 깨진다.

10. 정적파일 서비스하기

이미지나 css가 깨져서 페이지에서 볼수 없엇음 스프링 Dispatcher의 장난임.
스프링이 정적인 파일을 제공하지 않도록 막아놓았기 때문이다. 그런데 jsp같은것은 열어 놧음.
WEB-INF
사용자가 이미지를 요청하면 디렉토리에서 찾겟다를 정해놔야한다.
<mvc:resources location="/images/" mapping="/images/"/>
<mvc:resources location="/css/" mapping="/css/
"/>

그런데 이런것보다는 resource파일에 전부 넣어서 관리한다.
<mvc:resources location="/resource/" mapping="/resource/**"/>
mvc태그를 사용하기 위해 dispatcher-servlet에 스키마파일을 추가해야한다.

xmlns:mvc="http://www.springframework.org/schema/mvc"
"http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd"
스키마파일 이.xsd고 그 정의에 대한이름이 위 긴 url이다. 이름이 너무길다? 다른스키마와 중복이안되도록 도메인이름을 추가해서 긴거임.
밑에 <>이름을 다넣으면 힘들다. 이것을 식별하기 위해서 xmlns:mvc을 해주는 것임. 스키마에 이름을 붙여주고 태그를 추가할 수있게 하는 것임.
jsp에들어가서 정적인 파일루트를 모두 /resource/를 다적어줘야해서 불편해진다.
<mvc:resources location="/static/" mapping="/**"/>
static의 루트으로 매핑하고 밑의 폴더가 다 나오게 해버리자. 그러면 정적파일들이 다보여진다.

2023.01.16 후기

스프링 MVC를 학습하기 위해 다시 newlecture페이지로 오게 되었다. 확실히 JSP로만 만들때보단 편해보인다. 더 공부해보고 싶다.

'기초단계 > SPRING' 카테고리의 다른 글

2023.01.18 Spring  (0) 2023.01.19
2023.01.17 Spring  (0) 2023.01.17
2023.01.16-1 Spring  (0) 2023.01.16
2023.01.15-2 Spring  (0) 2023.01.15
2023.01.15-1 Spring  (0) 2023.01.15

+ Recent posts