@Valid์ ์์น ์ค๋ฅ@NotBlank ๋ฑ์ ์ผ์ง๋ง ๊ทธ๋ฅ ํต๊ณผ๋จ.@Valid๋ ๋ฐ๋์ ๊ฒ์ฆ ๋์์ธ @RequestBody ๋ฐ๋ก ์์ ๋ถ์ด์ผ ํ๋ค.. (๋งค๊ฐ๋ณ์๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ๋ ํนํ ์ฃผ์!)์์ ํ๊ธฐ ์ ์ฝ๋
@PatchMapping("/{id}")
public ResponseEntity<UpdateScheduleResponseDto> updateSchedule(@Valid @PathVariable Long id, @RequestBody UpdateScheduleRequestDto requestDto, HttpSession session) {
SessionUser sessionUser = (SessionUser) session.getAttribute("sessionUser");
if(sessionUser == null) {
throw new IllegalArgumentException("๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.");
}
UpdateScheduleResponseDto responseDto = scheduleService.updateSchedule(id, requestDto, sessionUser.getId());
return ResponseEntity.status(HttpStatus.OK).body(responseDto);
}
์์ ํ ์ฝ๋
@PatchMapping("/{id}")
public ResponseEntity<UpdateScheduleResponseDto> updateSchedule(@PathVariable Long id, @Valid @RequestBody UpdateScheduleRequestDto requestDto, HttpSession session) {
SessionUser sessionUser = (SessionUser) session.getAttribute("sessionUser");
if(sessionUser == null) {
throw new IllegalArgumentException("๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.");
}
UpdateScheduleResponseDto responseDto = scheduleService.updateSchedule(id, requestDto, sessionUser.getId());
return ResponseEntity.status(HttpStatus.OK).body(responseDto);
}
์ํฉ: ํฌ์คํธ๋งจ ์๋ต์ status: 400์ ์ฐํ๋๋ฐ, ๋ด๊ฐ ์ ์ message = "์ด๋ฆ์ ํ๊ธ๋ก..."๊ฐ ์ ๋ณด์.
ํด๊ฒฐ: *GlobalExceptionHandler๋ฅผ ๋ง๋ค์ด MethodArgumentNotValidException์ ๊ฐ๋ก์ฑ์ผ ํฉ๋๋ค.
- ์คํ๋ง์ ๊ฒ์ฆ ์ค๋ฅ ๋ฐ์ ์ ์์ธ ๋ด์ฉ์ BindingResult(๋ฉ๋ชจ์ฅ)์ ๋ด์๋๊ธฐ๋ง ํ ๋ฟ, ์๋์ผ๋ก ๋ฐ๋์ ๋ฃ์ด์ฃผ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋น์
๋ณด์ ์์์ด ๊ฒ์ฌ๋ฅผ ํ๋ค๊ฐ "์ด? ์ด๋ฆ์ด ํ๊ธ์ด ์๋๋ค? ํ๊ณ ์๊ธฐ ๋ฉ๋ชจ์ฅ(BindingResult)์ ์ ๋๋ค.
- userName : ํ๊ธ ์๋
๊ทธ๋ฌ๊ณ ๋์ ํด๋ผ์ด์ธํธ์๊ฒ๋ ๋ ์กฐ๊ฑด์ด ์ ๋ง์ ํ๊ณ 400์๋ฌ๋ง ๋ณด์ฌ์ค๋ค.
์ ๋ฉ๋ชจ์ฅ์ ๋ด์๋๊ณ ์ ๋ณด์ฌ์ฃผ๋ ๊ฑธ๊น?
๋ณด์ ๋๋ฌธ์ด๋ค. ๋ด๋ฌ ์๋ฌ ์ ๋ณด๋ฅผ ๋๋ฌด ์์ธํ๊ฒ ๋ณด์ฌ์ฃผ๋ ํดํน์ ์ค๋ง๋ฆฌ๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ํ ๊ฐ๋ฐ์ ๋ง๋ค ์๋ฌ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ ํ์์ด ๋ค๋ฅด๋ค. ์ด๋ค ์ฌ๋์ ํ๊ตญ๋ง๋ก ์ด๋ค ์ฌ๋์ JSON์ผ๋ก ์ด๋ค ์ฌ๋์ ์๋ฆผ์ฐฝ์ผ๋ก ๋ณด์ฌ์ฃผ๊ณ ์ถ์ดํ๊ธฐ ๋๋ฌธ์ ์คํ๋ง์ ๋ฉ๋ชจ์ฅ์ ๋ค ๋ชจ์๋ ํ ๋ ๋ณด์ฌ์ง๋ ๋ฐฉ๋ฒ์ ๋ค๊ฐ ์ ํด๋ผ๊ณ ๊ถํ์ ๋๊ธฐ๋ ๊ฑฐ๋ค.
ํต์ฌ ์ฝ๋: e.getBindingResult().getAllErrors().get(0).getDefaultMessage()๋ฅผ ํตํด ๋ด๊ฐ ์ค์ ํ ๋ฉ์์ง๋ง ์ ๋ฝ์์ ๋ฆฌํด!
์ถ๊ฐํ ์ฝ๋
// 2. @Valid ์ด๋
ธํ
์ด์
๊ฒ์ฆ ์คํจ ์๋ฌ ์ก๊ธฐ (@Pattern, @NotBlank ๋ฑ)
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<String> handleValidationException(MethodArgumentNotValidException e) {
// ์ด๋
ธํ
์ด์
์ ์ ์ด๋ message๋ง ์ ๋ฝ์์ ๋ฐํ
// 1. ๋ณด์ ์์์ ์ฅ๋ถ๋ฅผ ์ฐ๋ค (getBindingResult)
// 2. ์ ํ์๋ ์๋ฌ๋ค ์ค ์ฒซ ๋ฒ์งธ๋ฅผ ๊บผ๋ธ๋ค (getAllErrors().get(0))
// 3. ๊ฑฐ๊ธฐ์ ์ ํ ๋ฉ์์ง๋ฅผ ์ฝ์ด์ ์๋ ค์ค๋ค (getDefaultMessage())
String message = e.getBindingResult().getAllErrors().get(0).getDefaultMessage();
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(message);
}
์ํฉ: @NotBlank๋ฅผ ์จ๋ DB์ ๋น๋ฒ๊ณผ ๋์กฐํ์ง ๋ชปํ๋ค.
์ด์ : Bean Validation(@์ด๋ ธํ ์ด์ )์ ํ์(Format) ๊ฒ์ฆ๋ง ๋ด๋นํ๋ค. (๋น์๋๊ฐ? ์ซ์์ธ๊ฐ? ๊ธธ์ด๋?)
ํด๊ฒฐ: ๋ ผ๋ฆฌ(Logic) ๊ฒ์ฆ์ ์๋น์ค ๊ณ์ธต์์ ํด์ผ ํ๋ค.
์ค๋ณต ์ด๋ฉ์ผ ์ฒดํฌ: userRepository.existsByEmail() (DB ์กฐํ ํ์)
๋น๋ฐ๋ฒํธ ์ผ์น ํ์ธ: user.getPassword().equals(input) (๋น์ฆ๋์ค ๋ก์ง)
์ํฉ : No property 'id' found for type 'User'; Traversed path: Schedule.user ๋ฐ์
์์ธ : ScheduleRepository์ findAllByUser_id ๋ฉ์๋ ์ถ๊ฐ ํ JPA๊ฐ Schedule์ํฐํฐ ์์ user ํ๋๊น์ง ์ฐพ์๋๋ฐ User์ํฐํฐ์์ id๋ผ๋ ํ๋๊ฐ ์์ด ๋ผ๊ณ ์๋ฌ ๋ฐ์
ํด๊ฒฐ : ๋ฉ์๋๋ช ์์ User์ํฐํฐ์ ํ๋๋ช ์ด userId์ด๊ธฐ ๋๋ฌธ์ ๋ ํฌ์งํ ๋ฆฌ ๋ฉ์๋ ๋ช ๋ ๊ทธ์ ๋ง์ถฐ ๋๋ฌธ์๊น์ง ์ ํํ ์ ์ด์ค.
findAllByUserid(User์์ ํ๋๋ช
์ด Id๋ก ์ฐพ์)findAllByUser_userId(User์์ ํ๋๋ช
userId๋ก ์ฐพ์)์์ ์ ์ฝ๋
public interface ScheduleRepository extends JpaRepository<Schedule, Long> {
List<Schedule> findAllByUserid(Long sessionUserId);
}
์์ ํ ์ฝ๋
public interface ScheduleRepository extends JpaRepository<Schedule, Long> {
List<Schedule> findAllByUser_userId(Long sessionUserId);
}
๋ฉ์๋๋ช ์ ๋ง์ถฐ์ผ ํ๋ ์ด์
JPA์ Query Method ๊ท์น ๋๋ฌธ์ด๋ค.
findAllBy+User(ํ๋๋ช )+UserId(User์ํฐํฐ ๋ด๋ถ์ ํ๋๋ช )์กฐํฉ์ผ๋ก ์ด๋ฆ์ ์ง์ด์ผ ํ๋๋ฐ, ์ด ์ค ํ๋๋ผ๋ ์ฒ ์๊ฐ ํ๋ฆฌ๊ฑฐ๋ ์ํฐํฐ์ ์๋ ํ๋๋ช ์ ์ฐ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋ ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ชป ๋ง๋ ๋ค๊ณ ๋ป๊ธด๋ค.
์ํฉ : ์ ์ ๋ฅผ ์ญ์ ํ๋๋ฐ ์ฟ ํค์ ์ธ์ ID๊ฐ ๋จ์์ ๋ก๊ทธ์ธ์ด ์ ์ง๋๋ ์ํฉ ๋ฐ์
์ด์ : DB์ ์ธ์ /์ฟ ํค์ ์๋ช ์ฃผ๊ธฐ๊ฐ ์๋ก ๋ค๋ฅด๊ธฐ ๋๋ฌธ์
userRepository.delete()๋ฅผ ํธ์ถํ๋ฉด DB์์ ์ ์ ๋ ์ฌ๋ผ์ง๋ค.sessionUser)๊ฐ ๋จ์์๋ค.ํด๊ฒฐ : ์ญ์ ํ ๋ ์ธ์
๋ ๊ฐ์ด ์ญ์
์์ ์ ์ฝ๋
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@Valid @PathVariable Long id, @RequestBody DeleteUserRequestDto deleteUserRequestDto, HttpSession session) {
SessionUser sessionUser = (SessionUser) session.getAttribute("sessionUser");
if(sessionUser == null) {
throw new IllegalArgumentException("๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.");
}
userService.delete(id, deleteUserRequestDto, sessionUser.getId());
session.invalidate();
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
}
์์ ํ ์ฝ๋
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@Valid @PathVariable Long id, @RequestBody DeleteUserRequestDto deleteUserRequestDto, HttpSession session) {
SessionUser sessionUser = (SessionUser) session.getAttribute("sessionUser");
if(sessionUser == null) {
throw new IllegalArgumentException("๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.");
}
userService.delete(id, deleteUserRequestDto, sessionUser.getId());
session.invalidate();
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
}
session.invalidate()์ ์๋ชป๋ ์์นexistsById๊ฐ true๋ฅผ ๋ฐํํ๊ณ !๊ฐ ๋ถ์ด ์์ด false๊ฐ ๋๋ if๋ฌธ ์์ session.invalidate()๋ ์คํ๋์ง ์๊ณ ๊ทธ๋ฅ ํต๊ณผ. ๊ทธ ํ userService.delete๋ก DB์์ ์ ์ ๋ง ์ง์ฐ๊ณ ์๋ต์ ๋ณด๋ด๋ฒ๋ ค์ ์ธ์
์ ๊ทธ๋๋ก ์ด์์๋ ์ํฉ ๋ฐ์userService.delete(id, ...) ์ด ๋ถ๋ถ์์ ์ญ์ ๋จ๊ณผ ๋์์ ์ธ์
์ ๋ ๋ ค๋ฒ๋ฆฐ๋ค.์์ ์ ์ฝ๋
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id, @RequestBody DeleteUserRequestDto deleteUserRequestDto, HttpSession session) {
SessionUser sessionUser = (SessionUser) session.getAttribute("sessionUser");
if(sessionUser == null) {
throw new IllegalArgumentException("๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.");
}
if(!userRepository.existsById(sessionUser.getId())) {
session.invalidate();
}
userService.delete(id, deleteUserRequestDto, sessionUser.getId());
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
}
์์ ํ ์ฝ๋
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@Valid @PathVariable Long id, @RequestBody DeleteUserRequestDto deleteUserRequestDto, HttpSession session) {
SessionUser sessionUser = (SessionUser) session.getAttribute("sessionUser");
if(sessionUser == null) {
throw new IllegalArgumentException("๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.");
}
userService.delete(id, deleteUserRequestDto, sessionUser.getId());
session.invalidate();
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
}