스프링 컨트롤러 및 Mapping 애노테이션을 공부하면서 이해가 안 되던 부분을 정리해보았다.
여기서 말하는 사용자의 요청
과 적절한 응답
은 다음과 같다.
간단하게 얘기해서 클라이언트는 사이트에 접속하는 '본인'이라고 생각하면 되고,
서버에 보내는 정보는 우리가 사이트에 접속해서 상품을 구매하거나 상품 페이지에 접속을 하는 다양한 '행위'에 대한 정보라고 생각하면 된다.
그리고 이러한 정보들을 우리가 서버에 보낼 때 이에 대해 적절한 응답을 생성해야 한다.
사용자가 상품 페이지를 열고 싶은데 이상한 페이지가 뜨면 안되기 때문이다.
또한, 잘못된 링크에 대해서 오류 페이지도 적절하게 띄어야 한다.
이러한 전반적인 것을 다루기 위해
컨트롤러에서 요청을 받아 적절한 응답을 생성해주는 부분을 정의하는 것이다.
또한, 요청에 대해 적절한 응답을 생성하기 위해서 사용하는 것이
@RequestMapping
, @GetMapping
, @PostMapping
이다.
다음과 같이 입력하면 "/api"라는 URL로 GET 요청을 하는 것이다.
코드로 보면
@GetMapping("api")
public String hello(Model model) {
model.addAttribute("data", "hello!!");
return "hello";
}
반환 타입이 String
인 이유는Spring-MVC
가 문자열 반환 값을 뷰의 이름으로 해석하기 위해서이다.
Model model
형태를 보면 어디서 파라미터를 넣어줘야 하나?라고 생각할 수 있는데 그런 걱정할 필요가 없다.
Spring이 자동으로 해당 파라미터를 주입해주기 때문이다.
그리고 주입할 때 참조값으로 주입하기 때문에,
model.addAttribute("data", "hello!!");
key : "data"
value : "hello!!"
형태로 속성을 정의할 수 있다. 자바에 Map<key,value>
자료구조가 있는데 이 자료구조를 메서드의 참조값으로 받아서 키, 값 쌍을 put
해준다고 생각하면 된다.
map.put("data", "hello!!");
addAttribute
: 컨트롤러가 뷰에 데이터를 전달할 때 사용
예를 들어 @PostMapping("member/new")
와 같이 사용할 때
member/new
URL로 들어오는 POST 요청에 대해 처리해주게 된다.
코드로 알아보자
...
<form action="/members/new" method="post">
<div class="form-group">
<label for="name">이름</label>
<input type="text" id="name" name="name" placeholder="이름을 입력하세요">
</div>
<button type="submit">등록</button>
</form>
...
다음과 같이 form
태그 안에서 method = "post"
방식을 사용하고 있고
ìnput
태그를 통해 데이터를 입력하면 입력된 데이터가 전송된다.
@PostMapping("/members/new")
public String create(MemberForm form) {
Member member = new Member();
member.setName(form.getName());
memberService.join(member);
//회원 가입이 끝난 후 홈화면으로 보내는 커맨드
return "redirect:/";
}
이후 Spring이 입력받은 값을
MemberForm 객체에 name 필드에 자동으로 바인딩 한다.
public class MemberForm {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
필드에 자동으로 바인딩 되면 이제 해당 객체의 메서드를 통해 레포지토리에 정보를 담거나 따로 조작할 수 있는 것이다.
@GetMapping
: 서버의 상태를 변경하지 않는다.
@PostMapping
: 서버의 상태를 변경할 수 있는 요청이다. 데이터 생성, 수정, 삭제 등의 작업을 수행한다.
POST
, GET
에 국한되지 않고 유연하게 사용할 수 있음다양한 HTTP 메서드 처리
@RequestMapping(value = "/items", method = {RequestMethod.GET, RequestMethod.POST})
다음과 같이 GET
, POST
요청에 대해 모두 응답해주는 메서드를 정의하거나
URL 패턴 매핑
@RequestMapping("/items")
URL 요청에 대해 매핑해주거나
컨트롤러 클래스에 적용
@Controller
@RequestMapping("/api")
public class SimpleController {
@GetMapping("/hello")
@ResponseBody
public String Hello() {
return "hello";
}
}
다음과 같은 형태로 하나의 페이지를 묶고 그 안에 포함되어 있는 다른 페이지를 구성할 수 있다.
예를 들어 /api/hello
와 같이 페이지가 서로 마치 하나의 디렉토리처럼 묶이게 된다.