Spring MVC 요청 처리과정

yj k·2023년 3월 19일
0

SpringBoot

목록 보기
1/4
post-thumbnail

Handler Mapping :
어떤 방식(GET, METHOD)의 어떤 비지니스 로직(수행 메소드)을 선택해야하는지 저장되어있음
디스패쳐 서블릿은 리턴받은 값을 Controller에서 찾아서 수행 요청

Controller :
디스패쳐 서블릿에서 호출하는 메소드

Service :
Cotroller에서 호출한 메소드의 실질적인 코드 작성

View Resolver :
디스패쳐 서블릿에 리턴된 값을 받아
보여줄 화면 작성

gitignoer.io : Git에서 무시하고싶은 설정 파일들 확인할 수 있음

매핑, 핸들러메소드 작성법

@Controller :
빈으로 등록해서 사용한다
컴포넌트 스캔용

@RequestMapping :
요청과 매핑을 시켜준다

-작성법
@RequestMapping("/") 괄호 안에 작성된 경로를 연결
"/"는 기본 요청 -> bean에 설정되어있는 기본 연결(Wepapp/main.jsp)로 포워딩

-> 해당 경로에 요청에 응답할 파일 작성

메소드에 요청 매핑하기

  1. main.jsp에 요청연결 버튼 작성
  2. 연결할 페이지 경로에 페이지 작성
    메소드 위에 @RequestMapping 어노테이션을 적어준다
  3. return 값에 최종으로 포워딩할 화면 값(주소 MappigResult)를 넣는다.
  4. 최종적으로 포워딩할 화면(model에 담은 값을 보여줄)을 경로에 작성
  • 작성법
    @RequestMapping("menu/regist")

DispatcherServlet은 웹 요청을 받으면 @Controller가 달린
컨트롤러 클래스에 처리를 위임한다.
그 과정은 컨트롤러 클래스의 핸들러 메소드에 선언된 다양한 @RequestMapping 설정 내용에 따른다.

Model 변수 :
최종적으로 포워딩할 화면을 만들 때 동적인 데이터들을 담아서 가져간다.
-작성법
model.addAttribute("message", " 메뉴 등록용 핸들러 메소드 호출함");

@RequestMapping 설정에 method 방식을 지정하지 않으면 get/post 요청을 둘 다 처리한다.

요청 방식지정:

@RequstMapping(value="/menu/modify", method=RequestMethod.GET)

*POST 방식으로 정의된 메소드가 없는데 호출하는 경우에는 405 - 허용하지 않는 메소드라는 오류가 발생

요청 메소드별 전용 어노테이션 :
핸들러 메소드보다 간결하게 작성할 수 있다.
요청 메소드 어노테이션
GET @GetMapping
POST @PostMapping

-작성법
@GetMapping("/menu/delete")
@PostMapping("/menu/delete")

또 다른 Mapping 방법

클래스 레벨에 @RequestMapping 어노테이션 사용이 가능하다
클래스 레벨에 URL공통 부분을 이용해서 설정하면 매번 핸들로 메소드 URL에 중복 되는 내용을 작성하지않아도된다.

여러개의 패턴을 매핑할 수도 있다.

@PathVariable

PathVariable로 전달되는 값은 반드시 매개변수와 이름이 동일해야하며 동일하지 않은 경우 @PathVariable("이름")을 설정해주어야한다.
핸들러 메소드에서 요청 객체를 들춰서 전달된 값을 꺼내볼 필요없이 url경로에 위치한 값을 value로 인식하는 방식으로 REST형 웹 서비스를 설계할 떄 유용하다.

/detail/{변수명}
detail뒤에 오는 값을 중괄호 안에 변수명으로 만듦

  • 작성법

*parisng이 불가능한 PathVariable이 전달되면 400- 잘못된 요청 에러가 발생한다.

405, 400오류 : 디스패쳐 오류

@RequstMapping 뒤에 아무것도 적지 않으면
클래스에 설정된 매핑 설정과 일치하면서 다른 요청처리에 대한 핸들러 메소드가 준비되지 않았다면 해당 메소드를 요청한다.

핸들러 메소드 파라미터 작성법

메소드의 return 타입을 void로 하는 경우 viewResolver는 요청 주소 자체를 view name으로 해석하게된다.
EX)
@RequestMapping("/main") 일경우 main을 view name으로 해석하여 연결

1. HttpServletRequest로 요청 파라미터 전달받기 :

HttpServletRequest를 매개변수로 만들고
Model객체에 넣어준다.
전달받은 변수들의 값을 넣어준다.
(request.getParameter("name")

속성을 전달할 페이지의 속성값을 사용

위 방법보다 더 개선된 방법 사용
(반복된 코드 등 문제)

2. @RequestParam 이용하여 요청 파라미터 전달받기 :

1번에서 한 가공 작업을 서블릿이 다 처리해줌

요청 파라미터를 매핑하여 호출 시 값을 넣어주는 어노테이션으로 @Pathvariable처럼 변수 옆에 작성한다.
form name 속성값과 매개 변수의 이름이 다른 경우 @RequestParam("name")을 설정하면된다.
또한 어노테이션은 생략 가능하지만 명시적으로 작성하는 것이 의미 파악에 쉬우며 그 외의 설정을 작성할 경우에도 어노테이션이 필요하다.

-작성법
+RequestParam 이용하여 요청 파라미터 전달받기 사진

*전달하는 form의 name 속성이 일치하는 것이 없는경우 400 - 잘못된 요청 에러가 발생하는데
required 속성을 false로 설정하면 해당 name값이 존재하지 않아도 null로 처리하며 에러가 발생하지 않는다.
(기본값이 true이기 떄문에 설정하지 않으면 에러가 발생한다)

  • 값을 입력하지 않고 넘겼을 떄 modigyPrice=""와 같이 빈 문자열이 넘어오게되면 parsing 관련 에러가 발생할 수 있다.(400 잘못된요청)
    값이 넘어오지 않는 경우 defaultValue를 이용해 기본값을 설정할 수 있다.

파라미터가 여러개인 경우 Map으로 한번에 처리할수도 있다
이때 Map의 key는 form의 name속성이된다.

3. @ModelAttribute 이용하여 파라미터 전달받기 :
DTO와 같은 모델을 커멘드 객체로 전달 받을 수 있다.

매개변수부에 @ModelAttribute(데이터 타입 변수)를 직접 선언
EX.@ModelAttribute(MenuDTO menu)

*DTO 클래스를 작성할 때 커멘드 객체(핸들러 메소드의 파라미터로 전달 받는 객체)로 이용하기 위해서는 form의 name값과 필드명이 일치해야한다.

  • 작성법

  • 커멘드 객체를 생성하여 매개변수로 전달해준뒤 해당 인스턴스를 Model에 담는다. 경우에 따라서 form에 입력한 값을 다음 화면으로 바로 전달해야하는 경우가 발생하는데 이떄 유용하게 사용할 수 있다.
    @ModelAttribute("모델에 담을 key값")을 지정할 수 있으며 지정하지 않으면 타입의 앞 글자를 소문자로 네이밍한 규칙을 따른다.
    어노테이션 생략가능하지만 명시적으로 작성하는 것이 알아보기 좋다.

커멘드 객체란?
디스패쳐 서블릿에서 만들어서 컨트롤러의 핸들러 메소드쪽에 매개변수로 전달해주는 객체

4-1,4-2 HttpSession 이용하기 :

*HttpSession 매개변수 선언
핸들러 메소드 호출 시 세션 객체를 넣어서 호출한다.

로그아웃 관리

  • 세션 객체 만료로 세션에 저장된 값이 모두 사라짐

@SessionAttributes 사용하기

SessionAttributes를 이용하여 session에 값 담기

  • 클래스 레벨에 SessionAttributes 어노테이션을 이용하여 세션에 값을 담을 key값을 설정해두면 Model에 해당 key값이 추가되는 경우 session 영역에 자동으로 등록한다.

로그아웃 관리
*sessionAttributes로 등록된 값은 session의 상태를 관리하는 SessionStatus의 setComplete 메소드를 호출해야 사용이 만료된다.

@RequestBody를 이용하여 파라미터 전달받기 :

*Http요청 본문 자체를 모델로 변환 시켜주는 어노테이션으로
출력해보면 쿼리 스트링 형태의 문자열에 전송된다.

*JSON으로 전달하는 경우 Jackson컨버터로 자동 파싱하여 사용할 수 있어 주로 Rest API 구현 시 많이 사용한다.
(JavaScript Object notation)

@ReqeustHeader
content-type의 내용을 가져오겠다
@CookieValue
세션 아이디 고유값을 받아옴

ViewResolver

1.문자열로 뷰 이름 반환하기 :

문자열로 redirect하기 :

*접두사로 redirect: 을하면 redirect 처리가되며
EX. redirect:main
main을 다시 요청하도록한다.

2.redirect에 model을 이용한 데이터 추가

  • redirect시 기본 데이터 타입을 model에 추가하면 url의 parameter가된다.


ㄴ URL의 한글값은 깨져서 나온다
보이게하고싶다면 encoding 코드를 추가한다.

encoding한 후 나오는 값을 decoding하면 원하는 한글 값을 얻을 수 있다.

3.문자열로 redirect하면서 flashAttribute 추가하기 :

  • RedirectAttributes에 addFlashAttribute를하면 redirect햇을 경우에도 requestScope에서 값을 꺼내 쓸 수 있다.
    원래는 세션에 임시로 값을 담고 소멸시키는 방식이므로 동일한 키 값이 존재하면 덮어쓰기 할 수 있음에 유의한다.

4.ModelAndView로 뷰 이름 지정해서 반환하기 :

  • 모델과 뷰를 합친 개념이다.
    핸들러 어댑터가 핸들러 메소드를 호출하고 반환받은 문자열을 ModelAndView로 만들어 DispatcherServlet에 반환하는데
    이 때 문자열을 반환해도 되지만 ModelAndView를 미리 만들어서 반환할 수도 있다.

5. ModelAndView로 redirect하기

6. ModelAndView로 redirect하면서 flashAttribute 추가하기

0개의 댓글

관련 채용 정보