나는 Spring에서 메서드를 만들면서 가장 헷갈렸던 부분이 바로 어떤 자료형으로 반환할 것인가였다.
CRUD에 따라 깔끔하게 정리해보자!
| 상황 | 반환 타입 |
|---|---|
| 저장 (CREATE) | ResponseDto (저장된 데이터 반환) or boolean (성공 여부만) |
| 조회 (READ, 전체 목록) | List |
| 조회 (READ, 단일 데이터) | ResponseDto |
| 수정 (UPDATE) | boolean (성공 여부) or ResponseDto (수정된 데이터 반환) |
| 삭제 (DELETE) | boolean (성공 여부) |
1️⃣ 데이터를 다시 클라이언트에게 줘야 하는가?
Yes! → ResponseDto 또는 List<ResponseDto>
No → boolean, void, ResponseEntity<Void>
2️⃣ 조회된 데이터가 하나인가? 여러 개인가?
하나 → ResponseDto
여러 개 → List<ResponseDto>
3️⃣ 성공 여부만 필요한가?
Yes → boolean
No → ResponseDto, ResponseEntity<String>
💡 응답을 상태 코드로 전달하고 싶을떄~!
1. API 응답을 HTTP 상태 코드로 명확하게 전달하려면? → ResponseEntity<T>
2. 메시지를 포함 → ResponseEntity<String>
3. 데이터가 있으면 → ResponseDto, 여러 개면 List<ResponseDto>
마찬가지로 repository에서 인터페이스를 만들고 상속한다
사용자에게 요청받을 데이터가 있으니까! RequestDto를 입력받도록 하자
먼저 원하는 id에 맞는 비밀번호를 쿼리에서 찾아주고(findPw) DB에 저장된 비밀번호와 입력받은(dto.getPassword())가 같으면 업뎃해주고, 틀렸으면 잘못된 입력이라고 반환해주자
@Override
public boolean updateTodoById(RequestDto dto) {
String findPW = "SELECT password FROM todo WHERE id = ?";
String Pw = jdbcTemplate.queryForObject(findPW, new Object[]{dto.getId()}, String.class);
if (!dto.getPassword().equals(Pw)) {
System.out.println("잘못된 비번");
return false;
} else {
String updateTodo = "UPDATE todo SET userName = ?, todo =? , updateDate = ? WHERE id= ?";
jdbcTemplate.update(updateTodo, dto.getUserName(), dto.getTodo(), LocalDateTime.now(),dto.getId());
return true;
}
}
삭제 기능도 거의 비슷하지만 쿼리문만 바꿔주었다
String sql = "DELETE FROM todo WHERE id = ?";
@Override
public boolean updateTodoById(RequestDto dto) {
return todoRepository.updateTodoById(dto);
}
역시 서비스에서도 boolean 타입을 사용하고, 입력받은 dto를 레포로 넘어갈 수 있게 설정했다.
삭제도 같은 로직이다!
@PutMapping("/update")
public ResponseEntity<String> updateTodoById(@RequestBody RequestDto dto){
boolean isUpdated = todoService.updateTodoById(dto);
if (isUpdated){
return ResponseEntity.ok("업뎃 됨!");
}
else {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("잘못된 업뎃입니다");
}
}
마지막으로 컨트롤러에서는 사용자에게 입력받고 조정하는 역할을 담당하도록 해주자
url을 @PutMapping을 사용해서 입력 받는 어노테이션으로 쓰고
@RequestBody로 입력받는다고 명시해주자
삭제 기능의 경우 @DeleteMapping("/delete")를 사용해 삭제해주자!
ResponseEntity<String> 사용을 통해 HttpStaus를 지정할 수 있도록 해줬다.