Spring - 입력값 처리 @GetMapping

2020. 8. 25. 18:11개발공부/Spring

728x90

Date: 08/18/20 (Day 04)

Spring MVC

jsp <form></form> 에서 입력값을 받아 Controller가 처리하는 방법을 알아본다. 반복적으로 나오는 다이어그램이 있는데 Spring Web 흐름을 이해하려면 필수적이라고 느껴진다.

 


1. GET과 POST 방식으로 요청, 응답하는 방법

  • Requst 맵핑으로 각기 다른 메서드를 만들어준다. GET/POST
  • 응용: 게시판 글쓰기 페이지 board/write 와 board/write POST 로 URL 구분해서 사용자에게 보여줄 화면과 실제 DB 업데이트는 POST로 전달된다고 보면된다.
  • @GetMapping과 @PostMapping 으로 간결하게 쓸 수 있다(SPRING 4부터 지원)
  • @Controller @RequestMapping("/request")로 지정해주면 메서드에서 상위 단계위치를 줄여 쓸 수 있다.

2. 컨트롤러 메서드를 void로 받음

  • 컨트롤러의 요청 메서드를 void리턴 타입으로 지정.
  • req-ex02를 요청받으면 request/req-ex02로 보내주겠다.
  • 하지만 요청과 return URL이 같다면? -> void 처리 & return 삭제

3. 입력값 처리

  • JSP 때처럼 request.getParameter도 가능함
  • 3-1. context path 변경

  • context path는 변경이 가능하며, Server 폴더 내 server.xml 페이지에서 가능하다. → 반대로 가변적이기 때문에 변수화가 필요하다

 

   1) JSTL을 사용한다. scope는 적용될 범위이며 application으로 하는게 무난하다.

   2) <c: url> 태그를 사용한다.


  • 3-2. 입력값 처리방식

   1) 가장 많이 사용하는 입력값 처리 방식: 커맨드 객체 활용

    VO를 활용해 getter로 값을 받는다. 매우 편리!


    2) @RequestParam 아노테이션을 이용한 요청 처리 방법

 


3) HttpServletRequest 타입의 request 매개변수 

     잘 사용하지 않는 방식으로 있다는 것 정도만 참고하자

이슈

  복습하는 도중에 Spring 서버 실행이 안되는 오류가 발생했다. IllegalStateExecption이란 오류가 Ambiguous한 mapping이 발견되어 발생했다고 나와있다. StackOverflow에 검색해보니 Controller에서 POST mapping을 같은 주소로 중복해서 받았기 때문에 발생하는 오류라고 했다.

java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'appController' bean method

실제로 POST로 된 join 메서드가 중복해서 생성되어 있었고 삭제하니 정상적으로 서버가 올라갔다.

참고지식

  • JSP: SendRedirect는 응답 → 재요청 → 응답. Forward는 가져온 응답을 그대로 가져감
  • 다중 선택가능함. request.parameterValues 배열로 돌려줄 수 있는 메서드를 사용한다.
  • DB에 필요한 두 파트: DAO, VO
    • SQL 테이블 만들고 나서 DAO, VO 객체를 위한 생성을 진행해주면 된다.
    • web.xml에 filter를 추가해주면됨. DispatchServlet 에 도달하기 전에 filter를 거쳐서 감SPRING에서 encoding(UTF-8)하는 방법
   <filter>
       <filter-name>encodingFilter</filter-name>
       <filter-class>
            org.springframework.web.filter.CharacterEncodingFilter
         </filter-class>
       <init-param>
         <param-name>encoding</param-name>
         <param-value>UTF-8</param-value>
       </init-param>
       <init-param>
         <param-name>forceEncoding</param-name>
         <param-value>true</param-value>
       </init-param>
    </filter>
    <!-- 위에 지정한  encodingFilter이름을 모든 패턴에 적용-->
    <filter-mapping>
       <filter-name>encodingFilter</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>

 

코로나 때문에 2주 간 휴강인데 학원에서 1주일이 지났지만 공지는 아직 안나온 걸 보니 내부 회의에서 계류 중인가 보다. Spring은 동작 원리가 중요한데 Day 1,2,3에 배운 설정하는 방법은 기억이 안난다. 개강 때까지 MVC 흐름은 꼭 기억하고 있자.