스프링 ch2-20 ~ ch2-22

서현우·2022년 7월 3일
0

스프링의정석

목록 보기
64/85

ch2-20 ~ ch2-22

  • @GetMapping, @PostMapping
  • redirect, forward
  • InternalResourceViewResolver
  • InternalResourceView
  • RedirectView
  • JstlView

pom.xml

@GetMapping, @PostMapping은 스프링 4.3 이상부터 사용 가능하다.
따라서 pom.xml의 properties태그에 스프링 버전을 5.0.7로 변경해준다.

<properties>
	<java-version>11</java-version>
	<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
</properties>

servlet-context.xml

<!-- view-controller태그는 오직 GetMapping만 가능하다. -->
<!-- GET으로 컨트롤러에서 어떤 작업 없이 연결만 해주는 경우, 
servlet-context.xml에 view-controller태그로 넣어줄 수 있다.
But STS에서는 문제 없었지만, 인텔리제이에서 오류가 발생해서 @GetMapping으로 대체했다. -->
<view-controller path="/register/add" view-name="registerForm"/>

@GetMapping, @PostMapping

@RequestMapping대신 사용한다.
맵핑될 URL의 공통 부분을 @RequestMapping으로 작성 가능하다.
GET과 POST는 메서드가 다르므로 같은 url로 맵핑이 가능하다.
URL 패턴을 사용 할 수 있다. - ?는 한글자, *는 여러글자, **는 하위경로 포함.

URL인코딩 - 퍼센트 인코딩

URL인코딩 - URL에 포함된 non-ASCII문자를 문자열로 변환.
Base64 - 6bit씩 끊어서 변환

RegisterController.java

회원가입 컨트롤러.
registerForm에서 registerInfo로 Post로 전송 하기 전에,
registerForm의 요청에서 받은 user 객체의 유효성 검사를 해야 한다.
유효성 검사를 통과하지 못하면 모델에 msg를 key로 저장해서 다시 registerForm으로 redirect하게 한다.
브라우저에서는 자동으로 인코딩을 해주지만, 컨트롤러의 메세지인 msg는 수동으로 인코딩을 해주고, 전달받는 뷰에서 디코딩 해줘야 한다.
redirect는 원래 모델을 전송 할 수 없지만, 스프링이 자동으로 URL재작성을 해서 전송해준다.

@Controller
public class RegisterController {
    @GetMapping("/register/add")
    public String register() {
        return "registerForm"; // WEB-INF/views/registerForm.jsp
    }

//    @RequestMapping("register/save", method= RequestMethod.POST) //아래와 동일.
    @PostMapping("/register/save") //spring 4.3부터 @PostMapping 사용 가능.
    public String save(User user, Model m) throws Exception {
        //1. 유효성 검사
        if(!isValid(user)) {
            //브라우져에서는 자동으로 인코딩을 해주지만,
            //컨트롤러에서는 수동으로 인코딩 해줘야 한다.
            String msg = URLEncoder.encode("id를 잘못입력하셨습니다.", "utf-8");
//            return "redirect:/register/add?msg="+msg; //URL재작성 //아래 2줄과 같다.
            m.addAttribute("msg", msg); //모델이 msg를 담아서 넘겨준다.
            return "redirect:/register/add"; //redirect는 모델을 넘겨줄 수 없지만, 위처럼 스프링이 자동으로 URL재작성을 해준다.
        }

        //2. DB에 신규회원 정보를 저장
        return "registerInfo";
    }

    private boolean isValid(User user) {
        return true;
    }
}

registerForm.jsp

POST로 저장된 url로 데이터를 전송 할 때, 각 태그의 id를 request 저장소의 key로 저장해서 컨트롤러로 전달한다.
유효성 검사를 통과하지 못하면 redirect:/register/add로 다시 돌아오고, 컨트롤러에서 받은 msg를 param.msg로 사용한다.
컨트롤러에서 받은 메세지이므로 마찬가지로 디코딩해줘야한다. 그리고 java.net의 디코딩을 page에 임포트 해줘야 한다.

<div id="msg" class="msg"> ${URLDecoder.decode(param.msg, "utf-8")} </div>

registerInfo.jsp

registerForm에서 컨트롤러로 데이터를 넘겨주고, 유효성 검사를 통과하면 registerInfo로 넘어온다.
User의 첫글자를 소문자로 한 user가 key값으로 모델에 저장되어서 넘어오므로, user.sns 이렇게 사용가능하다.

<h1>sns=${user.sns}</h1>

redirect

요청 2번, 응답 2번.
1번째 요청은 수동으로 하고,
2번째 요청은 자동으로 되면서 무조건 GET으로만 가능하다.
처리하지 못한 페이지에서 redirect하라는 응답을 보내고, 다른 페이지에 다시 요청 하고 응답을 받는다.
URL이 2번째 요청으로 변경된다.

forward

요청 1번, 응답 1번. GET은 GET으로, POST는 POST로 forward한다.
처리하지 못한 페이지에서 request, response객체를 다른 페이지로 넘겨주고, 그 페이지 에서 처리 후 응답을 보낸다.
URL이 처음 요청 그대로 된다.

RedirectView

요청이 들어오면 DispatcherServlet이 받아서, Model객체를 만들어서 Controller로 보낸다. Controller에서 작업을 하지 못하고, redirect가 포함된 문자열을 DispatcherServlet으로 반환하면, DispatcherServlet은 RedirectView로 내용을 보내고, RediretView는 redirect해라는 응답을 만들어서 Client로 전송한다. 이 응답메세지를 보고 Client는 해당 URL로 다시 요청을 한다.

JstlView

DispatcherServlet이 요청을 받은 후, 모델객체를 만들어서 Controller에 전달한다. Controller에서 작업 후, Model에 내용을 저장하고, view이름을 DispatcherServlet으로 반환한다.
DispatcherServlet은 InternerResourceViewResolver로 뷰 이름을 보내서, 접두사와 접미사를 붙인 정확한 view이름을 얻는다.
JSP뷰를 사용한다면 JstlView를 거쳐서 해당 JSP로 Model객체를 보내고, 해당 JSP에서 클라이언트로 응답한다.

InternalResourceView

forward에 사용된다.
DispatcherServlet이 요청을 받으면 Model객체를 생성하고, Controller로 보낸다. Controller에서 작업 후 forward가 붙은 문자열을 DispatcherServlet으로 반환하면, DispatcherServlet은 InternalResourceView로 이 문자열을 보내고, InternalResourceView는 forward 할 URL을 DispatcherServlet으로 넘겨주고, DispatcherServlet은 해당 URL에 맵핑된 메서드를 가진 Controller에 다시 전달한다.

profile
안녕하세요!!

0개의 댓글