매핑 어노테이션을 이용한 경로 매핑
@GetMapping
@PostMapping
@RequestMapping
등을 사용하여 url 매핑
굳이
GetMapping, PostMapping 쓰는 이유?
가독성, 명확성
하나의 url 에 대해 GET, POST 모두 매핑 가능
@GetMapping("/page")
public String getPage(){
...
}
@PostMapping("/page")
public String editPage(){
...
}
이처럼 동일한 url에 대해 GET, POST 각각 나눠서 매핑이 가능
요청 파라미터 접근
HttpServletRequest
@PostMapping("/test/step1"){
public String handleStep1(HttpServletRequest request){
String agreeParam = request.getParam("agree");
...
}
@RequestParam
@PostMapping("/test/step1"){
public String handleStep1(@RequestParam(value = "agree", defaultValue =
"false")Boolean agreeVal){
if(!agreeVal){
return "test/step1";
}
return "test/step2";
}
리다이렉트 처리
@GetMapping("test/step1")
public String handleStep2Get(){
return "redirect:/test/step2";
}
커맨드 객체를 이용해서 요청 파라미터 사용하기
HttpServletRequest 방식으로 여러 파라미터를 받으면
@PostMapping("/test/step3")
public String handleStep3(HttpServletRequest request) {
String email = request.getParameter("email");
String name = request.getParameter("name");
String password = request.getParameter("password");
String confirmPassword = request.getParameter("confirmPassword");
RegisterRequest regReq = new RegisterRequest();
regReq.setEmail(email);
regReq.setName(name);
...
}
와 같이 파라미터 하나하나 다 HttpServletRequest 에서 추출해야 함
but
커맨드 객체를 사용하면
public class RegisterRequest(){
private String name;
private String email;
...
public void setName(name){
name = this.name;
}
public String getName(){
return name;
}
...
}
@PostMapping("/test/step3")
public String handleStep3(RegisterRequest reqReq){
...
}
와 같이 객체 안의 필드와 파라미터를 매핑해줌
그냥 우리가 흔히 쓰는 dto 라고 보면 됨
뷰 JSP 코드에서 커맨드 객체 사용하기
<p><strong>${registerRequest.name}님</strong></p>
와 같이 jsp 에서 커맨드 객체 사용 가능
@ModelAttribute 어노테이션으로 커맨드 객체 속성 이름 변경
커맨드 객체에 접근할 때 속성 이름을 변경하고 싶으면
public String handleStep3(@ModelAttribute("formData") RegisterRequest regReq){
...
}
와 같이 사용
주요 에러 발생 상황
요청 매핑 애노테이션과 관련된 주요 익셉션
- 404 에러: 요청 경로를 처리할 컨트롤러가 존재하지 않거나, WebMvcConfigurer를 이용한 설정이 없거나 뷰 이름에 해당하는 JSP 파일이 존재하지 않는다면 발생하는 에러.
- 405 에러: 지원하지 않는 전송 방식을 사용한 경우 발생하는 에러.
ex) POST 방식만 처리하는 요청 경로를 GET방식으로 연결하면 발생
@RequestParam이나 커맨드 객체와 관련된 주요 익셉션
- 400에러:
-요청 파라미터의 값을 @RequestParam이 적용된 파라미터 타입으로 변환할 수 없는 경우 발생
-요청 파라미터 값을 커맨드 객체에 복사하는 과정에서도 발생. 만약 커맨드 객체의 프로퍼티가 int 타입인데 요청 파라미터의 값이 "abc"라면, "abc"를 int 타입으로 변환할 수 없기에 에러 발생
Model을 통해 컨트롤러에서 뷰에 데이터 전달하기
컨트롤러는 뷰가 응답 화면을 구성하는데 필요한 데이터를 생성해서 전달해야하는데 이때 사용하는 것이 Model이다.
뷰에 데이터를 전달하는 컨트롤러는 다음 두가지를 하면 된다.
- 요청 매핑 애노테이션이 적용된 메서드의 파라미터로 Model을 추가
- Model 파라미터의 addAttribute()메서드로 뷰에서 사용할 데이터 전달
@Controller
public class HaewonController{
@RequestMapping("/test")
public String test(Model model, @RequestParam(value = "name",
required = false)String name){
model.addAttribute("greeting","안녕하세요"+name);
return "test";
}
}
addAttribute()메서드의 첫번째 파라미터는 속성 이름이다. 뷰 코드는 이 이름을 사용해서 데이터에 접근한다.
위 코드에서는 greeting을 사용해 데이터에 접근하고 있다.
JSP에선 ${greeting}을 사용해서 속성값에 접근한다.
지금까지 구현한 컨트롤러는 두가지 특징이 있었다.
- Model을 이용해서 뷰에 전달할 데이터 설정
- 결과를 보여줄 뷰 이름을 리턴
지금까진 이 둘을 따로 처리한 예시들을 봤으나 ModelAndView는 모델과 뷰 이름을 함께 제공하기에 이를 사용하면 이 두 가지를 한번에 처리할 수 있다.
커맨드객체 : 중첩, 콜렉션 프로퍼티
jsp 에서 체크박스처럼 같은 속성이름으로 여러 데이터가 들어올 때
커맨드 객체에
private List<String> checkBoxValues;
와 같이 선언해주면 리스트에 해당 데이터가 들어옴
이거뭐 다아는거라 설명할 필요성이 없네
Model을 통해 컨트롤러에서 뷰에 데이터 전달하기
model.addAttribute("data", data);
처럼 사용하면
jsp에서
${data}
로 사용 가능
'복습 > Spring' 카테고리의 다른 글
[Spring 5 프로그래밍 입문] MVC 4: 날짜 값 변환, @PathVariable, Exception 처리 (1) | 2025.07.09 |
---|---|
[Spring 5 프로그래밍 입문] MVC 3: 세션, 인터셉터, 쿠키 (1) | 2025.07.06 |
[Spring 5 프로그래밍 입문] 스프링 MVC 동작 방식 (1) | 2025.07.02 |
[Spring 5 프로그래밍 입문] AOP 프로그래밍 (0) | 2025.07.02 |
[Spring 5 프로그래밍 입문] 빈 라이프 사이클과 범위 (1) | 2025.07.01 |