Spring MVC 다양한 기능들-(1)

728x90

10강. URL Mapping

    @RequestMapping 어노테이션으로 요청 주소 처리 가능하다!

[Servlet/JSP URL 주소]

-URL: 사용자가 서버에 접속해서 서비스를 받기 위해 입력하는 주소

-URL 주소는 여러 의미 갖는 값들로 구성됨

[URL 주소]

-[프로토콜] : 서버와 클라이언트 간 통신을 위한 약속 (생략 시 http)

-[IP주소]=도메인 주소

: IP 주소는 같은 네트워크 망에서 컴퓨터 구분 위해 제공되는 숫자, 고유 주소, 인터넷 망에 연결된 컴퓨터는 전 세계에서 유일한 주소 할당 받고 공유기 등에 연결된 커뮤터는 공유기 안에서 유일한 주소를 할당 받는다. 그러나 숫자는 사람이 외우기 어려워 도메인 주소라는 걸 따로 만들어서 제공함. 도메인 주소는 IP 주소로 변환되어 컴퓨터 찾을 수 있도록 한다.

-[포트번호]: 1부터 65535 번까지 구성된 숫자.

               :컴퓨터 내 프로그램 구분 위해 사용 (, 생략 시 기본 80)

-[경로1/경로2/경로3...]

: 여기서부터는 서버/개발 방식이나 분야에 따라 다르게 해석된다. Servelt/JSP 에서는 첫 경로는 Context Path 라고 부른다. 하나의 서버에서 각 웹 애플리케이션 구분 위해 지정되는 이름이며 폴더의 이름이 Context Path가 된다. 그 이후 경로는 하위 경로가 된다.

[SpringMVC에서의 주소]

-Spring MVC에서는 /Context Path/의 다음 주소를 실제 물리적 경로와 다르게 지정 O

   [하위 경로]

@Controller
public class Sub1Controller { //sub1폴더의 하위 경로 매핑

@RequestMapping(value = "/sub1/test3", method = RequestMethod.GET)
public String sub1Test3() {
       return "sub1/test3";
  }
@RequestMapping(value = "/sub1/test4", method= RequestMethod.GET)
public String sub1Test4() {
       return "sub1/test4";
  }
}

   [하위 경로 통합]

-즉, 하위 경로들 사이에 중복되는 경로에 대해서는 메소드 위에서 통합하여 묶어주고 나머지 주소를 각 메소드 위의 매핑값으로 줄 수도 있다.

@Controller
@RequestMapping("/sub2") //공통 경로를 묶어 매핑
 public class Sub2Controller {
@RequestMapping(value="/test5", method=RequestMethod.GET)
 public String test5() {
       return "sub2/test5";
 }
@RequestMapping(value="/test6", method=RequestMethod.GET)
 public String test6() {
       return "sub2/test6";
 }
}
(주의)
src/main/webapp (체크표시 누르고) ->
configure에서 maven으로 변경하고 -> 프로퍼티에서 서버(톰캣 9.0 연결)
+ 자바 1.8 버전 변경 후 -> 정상 작동 가능 

[서버 연결 결과 영상]

[요청 주소 매핑 결과 영상]

11강. 요청방식

[요청 방식 지정하기]

-Spring MVC는 요청 주소별로도 메소드 정의할 수 O

같은 주소에 대해서도 요청방식에 따라 메소드 정의할 수 O

-GET/POST/PUT/DELETE/PATCH 에 대해 처리 할 수 있다.

[@RequestMapping]

-@RequestMapping 어노테이션: 요청 주소 세팅 뿐만 아니라 요청 방식도 설정 가능

[요청 어노테이션] : @GetMapping() / @PostMapping()

-@Get/PostMapping() 사용 시, 요청별로 제공되는 어노테이션 사용할 수도 있음 (따로따로)

@GetMapping("/test6")
public String test6() {
     return "test6";
}
@PostMapping("/test6")
public String test6() {
     return "test6";
}

[요청 어노테이션 동시에 설정]

-@RequestMapping 으로 요청 방식 동시에 설정 가능

@RequestMapping(value = "/test7", method= {RequestMethod.GET,RequestMethod.POST} )
public String test7() {
     return "test7";
}

  <GET 방식과 POST 방식 차이>

[HTTP]
-웹 상에서 클라이언트 서버 간 데이터 주고 받을 수 있는 프로토콜
-클라이언트가 HTTP 프로토콜 통해서 서버에 요청 보내면,
서버는 요청에 맞는 응답을 클라이언트에게 전송.

  *[GET 방식]
-클라이언트가 서버로 데이터 요청하기 위해 사용하는 Method
ex. [http://localhost:3000/login?id=admin&pw=1234]
URL 뒤에 쿼리 스트링(keyvalue) 붙이고 내용을 투명하게 HTTP 패킷의 헤더에 포함해서 서버에 데이터를 요청함
ex. ID/PW 보안 문제. 따라서 단순 데이터 조회 시 사용

  *[POST
방식]

-클라이언트가 서버로 데이터를 전송해 리소스를 추가/생성하기 위해 사용하는 Method
-POST 방식GET 방식과 다르게 데이터들이 URL에 표시 X
-HTTP 패킷 Body에 담겨서 서버로 데이터가 전송된다.
-ex. [http://localhost:3000/login]

12강. 파라미터 추출하기

[파라미터 추출하기]

-클라이언트 요청 발생 시 전달하는 파라미터 데이터를 손쉽게 주입받을 수 있도록 다양한 방식을 제공하고 있다.

-Spring MVCServlet/JSP처럼 요청 방식에 따라 파라미터 추출 방식이 달라지지는 않음

[HttpServletRequest 사용하기]

-Spring MVC는 필요한 객체/데이터 주입받아 사용함

-Servlet/JSP에서 파라미터 데이터 추출할 때 HttpServletRequest 타입을 통하여 받는데,

Spring MVC에서 이 객체를 주입받아 사용할 수 있다.

-파라미터 추출 뿐 아니라, HttpServletRequest 객체가 필요할 경우 사용 O

@GetMapping("/test1")
public String test1(HttpServletRequest request) {
 
     String data1 = request.getParameter("data1");
     String data2 = request.getParameter("data2");
     String data3 = request.getParameter("data3");
                           . . .
}

[WebRequest 사용하기]

-HttpServletRequest 클래스를 확장한 클래스이다.

-기능이 확장된 HttpServletRequest 클래스라고 생각하면 된다.

@GetMapping("/test3")
public String test3(WebRequest request) {
     String data1 = request.getParameter("data1");
     String data2 = request.getParameter("data2");
     String [] data3 = request.getParameterValues("data3");
                     ...
return "result";
}

[@PathVariable]

-데이터가 요청 주소에 있을 경우 값을 주입받을 수 있는 어노테이션.

-Restful API 서버 프로그래밍할 때 사용 방식

        - 요청주소/1/2/3

ex. [ http://test.com/sub1/sub2/sub3 ]

@GetMapping("/test4/{data1}/{data2}/{data3}")
public String test4(@PathVariable String data1,
                        @PathVariable String data2,
                        @PathVariable String data3) {
     System.out.println("data1:" + data1);
     System.out.println("data2:" + data2);
     System.out.println("data3:" + data3);

      return “result”;
}

[@RequestParam]

-파라미터 데이터를 직접 주입받을 수 O

-지정된 변수의 이름과 파라미터 이름이 같을 경우 값을 주입받음

-가능한 경우, 형 변환도 처리해줌

      -value 설정: 파라미터 이름과 변수의 이름이 다를 경우, 파라미터 이름을 직접 지정해줌
     -required 설정 : false 설정 시 ->지정된 이름의 파라미터 없을 경우 null 주입됨
     -defaultValue 설정: 넘어오는 값 없어도 기본적으로 기본값 설정 가능

    <1> 기본 : 지정변수 = 파라미터 이름 같을 경우, 단순히 값만 주입

@GetMapping("/test5")
public String test5(@RequestParam int data1,
                        @RequestParam int data2,
                        @RequestParam int[] data3) {

          System.out.println("data1: " + data1);
          System.out.println("data2: " + data2);

          for(int a1: data3) {
                System.out.println("data3: " + a1);
           }
          return "result";
}

    <2> value 지정 : 지정변수 != 파라미터 이름 다른 경우, 직접 파라미터 이름 지정함

@GetMapping("/test6")
public String test6(@RequestParam (value="data1") int value1,
                        @RequestParam (value="data2")int value2,
                        @RequestParam (value="data3") int [] value3) {
          . . . 
        return "result";

}

    <3> required 설정 :존재하지 않는 파라미터에 대해 오류 발생하지 않고 null 주입

@GetMapping("/test7")
public String test7(@RequestParam (required = false) String data1) {
                          ...
return “result”;
}

    <4> defaultValue 설정 : 넘어오는 파라미터 없을 경우, 기본값 세팅

@GetMapping("/test7")
public String test7(@RequestParam (defaultValue = "0") int data1) {
     . . . 
return "result";
}

   -> 변수로 파라미터 주입받을 경우, 다량의 데이터 한 번에 받기가 어려움 -> 객체로 한 번에 받기

13강. 객체로 파라미터 주입받기

[Map으로 주입받기]

-클라이언트가 전달하는 모든 파라미터 데이터를 한번에 Map으로 받기

-단 동일명으로 전달되는 2개 이상의 파라미터에 대해서는 여러 값 중 하나만 담게 됨

-따라서 동일명으로 전달되는 파라미터 2개 이상일 경우, List로 주입받아야 함

@GetMapping("/test1")
public String test1(@RequestParam Map<String , String> map,
                        @RequestParam List<String> data3){
   . . . 
    return "result";
}

[@ModelAttribute]

-@ModelAttribute 사용하면 파라미터를 빈 객체로 자동 주입받을 수 O

-전달되는 파라미터 이름과 동일한 파라미터에 자동 주입

-이 어노테이션은 생략 가능 O

-이러한 객체를 커맨드 객체(Command Object)’ 라고 부름

@GetMapping("/test2")
public String test2(@ModelAttribute DataBean bean1) {
   . . . 
    return "result";
}

14강. ViewResolver  

[ViewResolver]

-컨트롤러에서 전달받은 View의 이름 토대로 jsp 찾아 선택하고 jsp 데이터 분석해 응답결과 만들어 전달하는 요소이다.

-본 과정에서는 ViewResolver가 사용할 View의 이름 지정 방법과 jsp 통해 응답결과 만들 때 필요한 데이터 전달 방법에 대해 살펴본다.

[HttpServletRequest]

-Spring MVCjsp 처리할 때 HttpServletRequest객체를 jsp 쪽으로 전달한다.

-ViewResolever는 이를 이용해 JSP 작업 시 데이터를 사용할 수 O

[Model 객체]

-Model 객체를 주입받아 세팅하면 HttpServletRequest 객체에 담겨 이를 JSP로 전달 가능O

@GetMapping("/test3")
public String test3(Model model) {
    . . .
}

[ModelAndView]

ModelAndViewModel에 값을 세팅하는 기능과 View 이름 지정하는 기능을 갖고 있다.

@GetMapping("/test4")
public ModelAndView test4(ModelAndView mv) {
     //(1) Model에 값을 세팅
     mv.addObject("data1", 500);
     mv.addObject("data2", 200);

     // (2) - View 이름 지정하는 기능
     mv.setViewName("test4");
     return mv;
}

[학습정리]

-ViewResolver에 의해 JSP가 실행되고 응답결과가 만들어진다.

-Controller에서 View 지정할 때 ViewResolver가 사용할 데이터를 Request 영역에 저장O


[참고] - 만들면서 배우는 Spring MVC 5

 

728x90