Spring의 전반적인 공부 ch03
스프링MVC 프레임워크 동작 방식
https://spiderwebs.co.kr/SpringBasicProject/survey
위의 그림은 스프링 MVC 핵심 구성 요소와 각 요소간의 관계를 나타내는 이미지이다. 해당 이미지를 참조하면서 알아보자
DispatcherServlet은 모든 연결을 담당한다 웹 브라우저로부터 요청이 들어오면 DispatcherServlet은 요청을 처리하기 위해 HandlerMapping에게 빈 객체 컨트롤러 검색을 요청한다
HandlerMapping은 클라이언트의 요청 경로를 이용해서 컨트롤러 중에서 이를 처리할 컨트롤러 빈 객체를 DispatcherServlet에게 리턴한다
이후 DispatcherServlet은 HandlerAdapter 에게 요청 처리를 위임하고 HandlerAdapter는 컨트롤러의 알맞는 메서드를 호출해서 요청을 처리하고 그 결과를 DispatcherServlet에 리턴한다 이때 HandlerAdapter는 처리결과를 ModelAndView(View의 이름을 담고있다)라는 객체로 변환해서 리턴한다
DispatcherServlet은 ModelAndView로 결과를 받으면 결과를 보여줄 view를 찾기 위해 ViewResolver 사용한다
ViewResolver는 view 이름에 해당하는 View 객체를 찾거나 생성해서 리턴한다
마지막으로 DispatcherServlet은 ViewResolver가 리턴한 View 객체에게 응답 결과 생성을 요청하고 View 객체는 응답결과를 생성하고 모든 과정이 끝난다
요청 매핑
@RequestMapping
@GetMapping : Get 방식의 요청 처리
@PostMapping : Post방식의 요청 처리
@RequestParam : 요청 파라미터의 접근
<form action="create" method="post">
<label>
<input type="checkbox" name="agree" value="true"> 약관 동의
</label>
<input type="submit" value="다음 단계" />
</form>
@PostMapping("/create")
public String create(@RequestParam(value = "agree",defaultValue = "false")Boolean agree){
if(!agree){
return "register/terms";
}else{
return "register/create";
}
}
위의 예제에서 form을 post 방식으로 'create' 로 요청을 보냈다 해당 요청을 받기 위해 @Requestparam 어노테이션을 사용하여 값을 받았다.
value 속성 은 Http 요청 파라미터의 이름과 매핑된다 여기서는 fom태그에 input 요소의 name이 해당되겠다
defaultValue 속성은 파라미터 값이 없을때 사용할 문자열이다
@RequstParam 어노테이션의 경우 요청 파라미터가 적으면 상관이 없는데 회원가입처럼 여러개의 파라미터 처리해야할 경우는 어떻게 해야할까?
이러한 경우 Command 객체를 사용한다
@PostMapping("/register/step3")
public String handleStep3(@ModelAttribute RegisterRequest regReq) {
try {
memberRegisterService.regist(regReq);
return "register/step3";
} catch (DuplicateMemberException e) {
return "register/step2";
}
}
@ModelAttribute 어노테이션을 사용하여 커맨드 객체를 지정주었다 그렇게되면 요청 파라미터의 값들이 객체와 매핑되게 된다.
스프링MVC 는 커맨드 객체가 리스트 타입의 프로퍼티를 가졌거나 중첩 프로퍼티를 가진 경우에도 요청 파라미터의 값을 알맞게 커맨드 객체에 설명해주는 기능을 제공한다
예를 들어)
요청 파라미터의 이름이 "프로퍼티[인덱스]" 형식 이면 List 타입 프로퍼티의 값 목록으로 처리한다
요청 파라미터의 이름이 "프로퍼티.프로퍼티이름" 과 같은 형식이면 중첩 프로퍼티 값을 처리한다
예제를 통해 알아보자
public class AnsweredData {
private List<String> responses;
private Respondent res;
public List<String> getResponses() {
return responses;
}
public void setResponses(List<String> responses) {
this.responses = responses;
}
public Respondent getRes() {
return res;
}
public void setRes(Respondent res) {
this.res = res;
}
}
@PostMapping
public String surveySubmit(@ModelAttribute AnsweredData answeredData) {
return "survey/submitted";
}
유효성 검사
폼에 입력한 값을 검증하는 과정과 에러메시지 처리는 애플리케이션 개발할 때 필수 사항이다.
스프링은 이 두가지 문제를 처리하기 위해 방법을 제공하고 있다
- 커맨드 객체를 검증하고 결과를 에러 코드로 저장
- VIEW에서 에러 코드로부터 메시지를 출력
커맨드 객체 검증과 에러 코드 지정하기
다음 방법을 살펴보자
Validator 인터페이스를 구현한 클래스를 통해 검증할 수 있다.
해당 인터페이스의 메서드는 다음과 같은데
@Override
public boolean supports(Class<?> clazz) {
return false;
}
@Override
public void validate(Object target, Errors errors) {
}
supports 메서드는 Validator가 검증할 수 있는 타입인지 검사
validate 메서드는 첫 번째 파라미터로 전달받은 객체를 검증하고 오류 결과를 Errors에 담는 기능을 정의한다