@RequestMapping
메서드 위에 @RequestMapping("/url") 이 붙으면 /url이 호출 됐을 때 해당 메서드를 실행하도록 매핑한다.
해당 클래스가 @Controller로 지정되어 있다면 , 메서드가 String을 반환했을 때 반환 값은 view 이름으로 인식된다.
@RestController로 지정되어 있다면, Rest API요청에 대한 응답 (JSON)을 반환한다.
ex1) URL 다중 설정
대부분 속성을 배열로 제공하므로 다중 설정이 가능하다.
@RequestMapping("/hello","/hi")
public String hello(){
log.info("hello");
return "ok";
}
ex2) HTTP 메소드 매핑
@RequestMapping이 특정 HTTP 메소드 요청만 허용하도록 설정할 수 있다.
- @RequestMapping(value = "/hello", method = RequestMethod.GET)
- @RequestMapping(value = "/hello", method = RequestMethod.POST)
각각 @GetMapping , @PostMapping으로 대체해서 사용할 수 있다.
ex3) 클래스단위에 설정
클래스에도 @RequestMapping Annotation을 붙일 수 있다.
이때, 클래스 아래에 모든 메서드는 기본적으로 클래스단위의 @RequestMapping을 기본으로 한다.
예를들어 클래스에 @RequestMapping("/board") 이 있다면,
아래와 같이, 메서드가 ("/find")로 지정되면 해당 메서드는 /board/find 에서 동작하게 된다.
//Controller에 @RequestMapping("/board") 존재
@GetMapping("/find")
public String findByWriterId(){
//생략
return "board/findForm";
}
위의 메서드는 /board/find라는 경로에서 GET방식으로 요청이 들어왔을 때,
resources - board폴더의 "findForm.html"이라는 View를 반환한다.
HTTP Method Mapping
@RequestMapping(value = "/URL경로", method = RequestMethod.GET)을 축약해서 사용할 수 있다.
@GetMapping / @PostMapping / @PutMapping / @DeleteMapping / @PatchMapping
1. GetMapping
GET API는 서버에서 값을 가져올 때 사용하는 API이다.
해당 URL에 GET 요청을 하면 해당 메서드가 실행된다.
아래 예제는 /member/name/{id} URI로 GET 방식으로 요청이 왔을 때 실행되는 메서드이다.
@GetMapping("/member/name/{id}")
public String getName(@PathVariable Long id){
String name = memberService.getName(id);
return name;
}
2. PostMapping
POST API는 데이터베이스에 리소스를 저장할 때 사용하는 API이다.
해당 URL에서 POST 요청을 하면 해당 메서드가 실행된다.
보통 클라이언트가 HTTP message body로 데이터를 보내면, @RequestBody로 해당 데이터를 받아서 처리한다.
아래 예제는 /member/add URI로 POST 방식으로 요청이 왔을 때 실행되는 메서드이다.
또한 메시지 바디에는 AddMemberInput 데이터가 JSON 형식으로 포함되어 있다.
@PostMapping("/member/add")
public ResponseEntity<?> addMember(@RequestBody AddMemberInput input){
MemberDto member = memberService.addMember(input);
return ResponseEntity.ok(member);
}
3. PutMapping
PUT API는 데이터베이스에 존재하는 리소스 값을 업데이트할 때 사용하는 API이다.
POST API와 거의 동일하게 HTTP messageBody로 데이터를 보내고,
받은 값으로 수정 로직을 수행한 뒤 데이터베이스에 반영한다.
@PutMapping("/member/edit")
public ResponseEntity<?> editMember(@RequestBody EditMemberInput input){
MemberDto member = memberService.editMember(input);
return ResponseEntity.ok(member);
}
POST와 방식이 유사하지만 구분하는 이유는 명시적으로 이 요청의 행위를 알리기 위함이다.
4. DeleteMapping
DELETE API는 데이터베이스에 존재하는 리소스를 삭제할 때 사용하는 API이다.
아래 예제에서는 PathVariable로 id값을 받아 해당 멤버를 삭제하고, 삭제에 대한 결과를 응답한다.
@DeleteMapping("/member/delete/{id}")
public ResponseEntity<?> editMember(@PathVariable Long id){
DeleteMemberResult result = memberService.deleteMember(id);
return ResponseEntity.ok(result);
}
정리
GET, POST, PUT, DELETE 모두 동작 방식은 똑같다.
예를 들면 GET 매핑으로도 HTTP 메시지 바디에 데이터를 담아 보내서 해당 데이터를 저장하는 로직을 수행할 수도 있다.
그러나 그렇게 하지 않는 이유는 이 요청이 어떤 목적을 갖고 있는지 명시적으로 표현하기 위해서이다.
동작이 명확하지 않을 때는 POST로 보내면 된다고 한다.
조건 매핑
Request의 조건에 따라 호출을 다르게 하도록 설정할 수 있다.
1. 특정 파라미터 조건 매핑
URL에 특정 파라미터가 존재할 때만 호출되도록 매핑한다.
아래 예제는 /mapping-param? mode=debug같이 mode=debug가 존재할 때만 호출된다.
@GetMapping(value = "/mapping-param", params = "mode=debug")
public String mappingParam() {
log.info("mappingParam");
return "ok";
}
- params="mode",
- params="! mode"
- params="mode=debug"
- params="mode!=debug" (! = )
- params = {"mode=debug", "data=good"}
2. 특정 헤더로 추가 매핑
Request 헤더에 특정 조건이 존재할 때만 호출되도록 매핑한다.
아래 예제는 /mapping-header로 요청이 왔을 때, 헤더에 mode=debug가 존재할 때만 호출된다.
@GetMapping(value = "/mapping-header", headers = "mode=debug")
public String mappingHeader() {
log.info("mappingHeader");
return "ok";
}
- headers="mode",
- headers="! mode"
- headers="mode=debug"
- headers="mode!=debug" (! = )
이외에도 여러 가지 옵션을 부여할 수 있다.
'JAVA & Spring > Spring' 카테고리의 다른 글
[Spring] 빈 생명 주기 콜백 (Bean LifeCycle) @PostConstruct / @PreDestroy (0) | 2024.02.23 |
---|---|
[Spring] 의존성 주입 방법 (DI : Dependency Injection), 생성자 주입 / 필드 주입 / setter 주입, 생성자 주입을 사용하는 이유 (0) | 2024.02.22 |
[Spring] application.properties와 application.yml의차이 (0) | 2023.08.18 |
[Spring] DB 연동 (MariaDB), MyBatis 사용 (0) | 2023.08.14 |
[Spring MVC] @RequestBody와 @RequestHeader로 JSON 주고받기 (0) | 2023.08.13 |