[Spring] Spring MVC에서의 HTTP 요청 처리(Get,Post, @GetMapping, @PostMapping ...)
Java + Spring Boot로 개인 미니 프로젝트를 진행하면서, Controller에서 자주 사용하는 HTTP 요청 처리 어노테이션인 @GetMapping과 @PostMapping이 헷갈려서 정리를 하고자 글을 작성한다.
우선 Get과 Post에 대해서 먼저 이해를 해보자.
Get
용도
클라이언트에서 서버로 어떠한 리소스로부터 정보를 요청하기 위해 사용되는 메서드
데이터를 읽거나(Read), 검색(Retreive)할 때 사용되는 메서드로 요청을 전송할 때 URL 주소 끝에 파라미터로 포함되어 전송된다.
이 부분을 쿼리 스트링(Query String)이라고 부른다.
특징
- URL에 데이터를 포함시켜서 요청 → 민감한 데이터를 사용할 때는 사용해선 안된다.
- 데이터를 Header에 포함하여 전송
- 데이터 길이에 대한 제한 존재
- 성공 시 200 HTTP 응답 코드를 XML, JSON, 여러 데이터(html, txt ...), 여려 형식의 데이터와 함께 반환
- 여러 번 반복해서 호출되어도 동일한 결과가 나타난다(idempotent; 멱등성)
위와 같은 특징으로 인해 주로 조회할 때만 사용
→ 안전하다고 간주, 데이터 변형의 위험 없이 사용할 수 있다.
Post
용도
리소스를 생성 및 업데이트하기 위해 서버에 데이터를 보내는 데 사용된다.
특징
- URL에 데이터를 노출하지 않고 요청한다.
- 데이터를 Body에 포함한다.
- Body 타입은 요청 Header의 Content-Type에 요청 데이터의 타입표시에 따라 결정
- 데이터 길이에 대한 제한 없음 → 대용량 데이터 전송 가능
- URL에 데이터가 노출되지 않으므로 GET 방식보다 안전해보임
→ 하지만 개발자도구와 같은 툴로 요청 내용 확인 가능 → 민감한 데이터의 경우에는 반드시 암호화를 해야함. - 캐싱을 할 수 없다.
- 브라우저에 기록이 남지 않는다.
- 여러 번 반복해서 호출하면 서버 상태에 변경이 발생할 수 있다(Non-idempotent)
GET VS POST
특징 | GET | POST |
캐시 | ⭕️ | ❌ |
브라우저 기록 | ⭕️ | ❌ |
북마크 추가 | ⭕️ | ❌ |
데이터 길이 제한 | ⭕️ | ❌ |
HTTP 응답 코드 | 200(Ok) | 201(Created) |
언제 주로 사용하는가? | 리소스 요청 | 리소스 생성 |
리소스 전달 방식 | 쿼리스트링 | HTTP Body |
idempotent | ⭕️ | ❌ |
HttpMethod
- GetMapping: HTTP Get Method에 해당하는 단축 표현. 서버의 리소스를 조회할 때 사용
- PostMapping: HTTP Post Method에 해당하는 단축 표현. 서버에 리소스를 등록(저장)할 때 사용
- PutMapping: 서버의 리소스를 모두 수정
- PatchMapping: 서버의 리소스를 일부 수정
- DeleteMapping: 서버의 리소스를 삭제
RequestMapping
- 특정 URI로 요청을 보내면 Controller에서 어떠한 방식으로 처리할 지 정의를 하는데,
이 때 들어온 요청을 특정 메서드와 매핑하기 위해 사용하는 것이 RequestMapping이다. - 가장 많이 사용하는 특성은 value, method
- value: 요청받을 URL 설정
- method: 어떤 요청으로 받을지 정의(GET, POST, PUT, DELETE, PATCH)
- 예시
@RestController
public class HelloController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String helloGet(...) {
...
}
@RequestMapping(value = "/hello", method = RequestMethod.POST)
public String helloPost(...) {
...
}
@RequestMapping(value = "/hello", method = RequestMethod.PUT)
public String helloPut(...) {
...
}
@RequestMapping(value = "/hello", method = RequestMethod.DELETE)
public String helloDelete(...) {
...
}
}
이런 식으로 모든 메서드를 매핑하면 코드가 길어진다. 따라서 아래와 같이 매핑한다.
@RestController
@RequestMapping(value = "/hello")
public class HelloController {
@GetMapping()
public String helloGet(...) {
...
}
@PostMapping()
public String helloPost(...) {
...
}
@PutMapping()
public String helloPut(...) {
...
}
@DeleteMapping()
public String helloDelete(...) {
...
}
}
공통적인 URL은 class에 @RequestMapping으로 설정하고 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping을 붙이면서 나머지 코드는 생략할 수 있다. 추가 URL을 붙이고 싶으면 각 어노테이션에 추가적인 URL을 작성하면 된다.
@Controller
@RequestMapping(value = "/items")
public class ItemController {
@GetMapping("/new")
public String updateItem(...) {
...
}
}
updateItem에 들어가려면 /items/new를 입력해야 들어갈 수 있다.
@RequestMapping은 Class와 Method에 붙일 수 있다.
@GetMapping, @PostMapping, @PutMapping, @DeleteMapping들은 Method에만 붙일 수 있다.
Handler
Spring MVC에서는 핸들러가 @Controller클래스를 의미한다.
@GetMapping, @PostMapping과 같은 어노테이션들을 핸들러 메서드라고 부른다.
→ Handler Mapping이란, 사용자의 요청과 이 요청을 처리하는 Handler를 매핑해주는 역할을 하는 것
예시
@GetMapping, @PostMapping
@GetMapping("/new")
public String New() {
return "/Login/회원가입";
}
@PostMapping("/new")
public String create(MemberForm form) {
Member member = new Member();
member.setName(form.getName());
member.setPhoneNumber(form.getPhoneNumber());
memberService.join(member);
return "redirect:/";
}
HTML - <form>
<form action="/new" method="post">
참고자료
https://mungto.tistory.com/436
https://whales.tistory.com/120
https://tjdwns4537.tistory.com/48