Spring으로 API를 만들다보면 @RequestMapping에 @PatchVariable이 있을때도 있고 없을때도 있다.
1. @RequestMapping이란?
- Spring 개발 시 특정 URL로 요청(Request)을 보내면 Controller에서 어떠한 방식으로 처리할지 정의
- 이때 들어온 요청을 특정 method와 매핑하기 위해 사용하는 어노테이션
- DispatcherServlet이 Controller 파일을 찾고, 논리적 주소가 매핑된 Method를 찾음
@RestController
public class MainController {
@RequestMapping(value = "/main", method = RequestMethod.GET)
public String Main(...) {
...
}
}
- value - 요청받을 URL
- method - 어떤 요청으로 받을지 정의 (GET, POST, PUT, DELETE 등)
주로 합쳐서 아래처럼 작성한다. (Spring 4.3 이후)
@RestController
public class MainController {
@GetMapping("/main")
public String Main(...) {
...
}
}
2. @PatchVariable 이란?
사이트들을 이용하다보면 URL에 변수가 들어가는걸 볼 수 있다.
~~~/board/lostark/4811/7952745
위의 URL에 밑줄 친 부분이 @PathVariable로 처리해줄 수 있다.
@RestController
public class MainController {
@GetMapping("/main/{name}")
public String Main(@PathVariable("name") String name) {
...
}
}
3. @PatchVariable이 있을때? 없을때?
어떤 사이트에서
클릭을 하면 +1이 올라가고,
우클릭을 하면 끝까지 올라간다고 하자.
그럼 아래와 같이 method를 두개를 둘 수 있다.
@ApiOperation(value = "캐릭터 주간 숙제 check 수정")
@PatchMapping("/check")
public ResponseEntity updateWeekCheckV3(@AuthenticationPrincipal String username,
@RequestBody TodoDto todoDto) {
// 로그인한 아이디에 등록된 캐릭터인지 검증
// 다른 아이디면 자동으로 Exception 처리
Character character = characterService.findCharacterWithMember(todoDto.getCharacterName(), username);
todoService.updateWeekCheckV3(character, todoDto.getWeekCategory(), todoDto.getCurrentGate(), todoDto.getTotalGate());
return new ResponseEntity(new CharacterDto().toDtoV2(character), HttpStatus.OK);
}
@ApiOperation(value = "캐릭터 주간 숙제 check 수정 All")
@PatchMapping("/check/all")
public ResponseEntity updateWeekCheckAllV3(@AuthenticationPrincipal String username,
@RequestBody TodoDto todoDto) {
// 로그인한 아이디에 등록된 캐릭터인지 검증
// 다른 아이디면 자동으로 Exception 처리
Character character = characterService.findCharacterWithMember(todoDto.getCharacterName(), username);
todoService.updateWeekCheckAllV3(character, todoDto.getWeekCategory());
return new ResponseEntity(new CharacterDto().toDtoV2(character), HttpStatus.OK);
}
근데 저 'all'부분을 @PathVariable을 쓴다면 하나의 메소드로도 쓸 수 있지 않을까?
그렇게해서 다른 비슷한 기능을 하는 메소드는 하나의 메소드로 만들었다.
@ApiOperation(value = "캐릭터 주간 에포나 체크",
notes = "'all'이 붙으면 전체 체크/해제",
response = CharacterDto.class)
@PatchMapping({"/epona/{all}","/epona"})
public ResponseEntity updateWeekTodoEponaCheck(@AuthenticationPrincipal String username,
@PathVariable(required = false) String all,
@RequestBody CharacterDto characterDto) {
// 로그인한 아이디에 등록된 캐릭터인지 검증
// 다른 아이디면 자동으로 Exception 처리
Character character = characterService.findCharacter(
characterDto.getId(), characterDto.getCharacterName(), username);
// all?
if(all != null) {
if (character.getWeekTodo().getWeekEpona() <3) {
character.getWeekTodo().setWeekEpona(2);
}
}
// Check 업데이트
characterService.updateWeekEpona(character);
return new ResponseEntity(new CharacterDto().toDtoV2(character), HttpStatus.OK);
}
- Mapping에 변수를 대괄호({})로 감싼다.
- @PathVariable의 required 변수의 default는 true이므로 false를 해준다.
- all이 없을때 변수 String all은 null이다.
4. Swagger-ui
Swagger-ui에서는 두개의 api가 있는것 처럼 보인다. (내용은 똑같다)