1. 학습 목표 및 개요
이번 학습에서는 HTTP 데이터를 객체로 처리하는 방법과 CRUD 구현의 중요성을 다루었습니다. DTO를 사용해 계층 간 데이터를 이동시키는 원리를 이해하고, RESTful API에서의 요청 처리 방식을 실습했습니다. 이 과정에서 @ModelAttribute
와 @RequestBody
의 차이점도 명확히 정리했습니다.
2. 주요 내용
2.1 @ModelAttribute와 @RequestBody의 활용
- @ModelAttribute
- HTML 폼 데이터를 자바 객체로 매핑할 때 사용합니다.
- 주로
POST
방식의 요청에서 사용하며, 필드명과 파라미터명이 자동 매핑됩니다. - 생략 가능하지만 명시적으로 사용하는 것이 가독성에 좋습니다.
- @RequestBody
- JSON 형식의 데이터를 자바 객체로 변환합니다.
- RESTful API 구현 시 사용되며, 클라이언트에서 전달된 데이터를 역직렬화해 엔티티로 바인딩합니다.
- API 설계 시 프론트엔드와 명확한 데이터 포맷 정의가 필요합니다.
2.2 DTO (Data Transfer Object)의 필요성
- DTO의 역할 : 서버와 클라이언트 간 데이터 전송의 효율성과 보안성을 위해 사용합니다.
- 엔티티를 직접 노출하지 않는 이유
- 엔티티는 DB와 밀접하게 연결되어 있어 직접 노출하면 내부 구조가 드러납니다.
- 이를 방지하기 위해 필요한 데이터만 포함한 DTO로 변환해 반환합니다.
- 계층 간 이동 : 서비스와 컨트롤러 사이에서 데이터를 전달할 때도 DTO를 사용해 코드를 유지보수하기 쉽게 만듭니다.
3. CRUD 구현 실습
3.1 Create (생성)
- POST 요청으로 데이터를 생성합니다.
@PostMapping("/api/schedules")
public ResponseEntity<ScheduleDTO> createSchedule(@RequestBody ScheduleDTO scheduleDTO) {
Schedule newSchedule = scheduleService.create(scheduleDTO);
return ResponseEntity.status(HttpStatus.CREATED).body(new ScheduleDTO(newSchedule));
}
- 이처럼 JSON 데이터를
@RequestBody
로 받아 서비스 계층을 통해 처리합니다.
3.2 Read (조회)
- GET 요청으로 모든 스케줄 목록을 조회합니다.
@GetMapping("/api/schedules")
public ResponseEntity<List<ScheduleDTO>> getAllSchedules() {
return ResponseEntity.ok(scheduleService.getAll());
}
- ID로 특정 데이터를 조회할 때는 경로 파라미터를 사용합니다.
3.3 Update (수정)
- PUT/PATCH 요청으로 데이터를 수정합니다. PUT은 전체 수정을, PATCH는 부분 수정을 의미합니다.
@PutMapping("/api/schedules/{id}")
public ResponseEntity<ScheduleDTO> updateSchedule(@PathVariable Long id, @RequestBody ScheduleDTO dto) {
Schedule updated = scheduleService.update(id, dto);
return ResponseEntity.ok(new ScheduleDTO(updated));
}
3.4 Delete (삭제)
- DELETE 요청으로 데이터를 삭제합니다. 성공 시 204 No Content 응답을 반환합니다.
@DeleteMapping("/api/schedules/{id}")
public ResponseEntity<Void> deleteSchedule(@PathVariable Long id) {
scheduleService.delete(id);
return ResponseEntity.noContent().build();
}
4. 회고 및 개선점
- DTO의 활용이 중요한 이유를 다시금 깨달았습니다. 엔티티를 직접 반환하면 보안 문제가 생길 수 있고, DTO를 사용하면 필요한 데이터만 노출할 수 있습니다.
- 또한 Exception Handling의 중요성도 깨달았습니다. 클라이언트가 잘못된 데이터를 전송했을 때 명확한 에러 메시지를 반환하는 것이 사용자 경험에 중요합니다.
- Swagger와 같은 도구를 사용해 API 문서화를 연습해야겠습니다. 이는 협업에 필수적인 기술로 보여집니다.
5. 마무리 & TIP
- Postman 활용 : API 개발 시 Postman으로 자주 테스트하면서 수정하면 개발 속도가 빨라집니다.
- 예외 처리 일관성 유지 :
@ExceptionHandler
로 공통된 예외 처리 로직을 구성하세요. - Swagger 도입 : API 명세서를 작성해 두면 협업이 훨씬 쉬워집니다.
- DTO 매핑 자동화 : ModelMapper 또는 MapStruct 같은 라이브러리를 사용하면 DTO와 엔티티 간 매핑을 쉽게 처리할 수 있습니다.
▶ 이번 학습에서 HTTP 데이터 처리와 CRUD 구현의 기본 개념을 다시 복습했습니다. DTO를 사용한 계층 간 데이터 전송과 API 개발의 모범 사례를 이해하는 좋은 기회였습니다. 앞으로 예외 처리와 API 문서화에도 신경을 쓰며 개발해야겠습니다.
'Spring' 카테고리의 다른 글
(Spring) RESTful에 대한 이해 (0) | 2024.11.11 |
---|---|
(Spring) 데이터베이스 개념 및 MySQL 개요 (0) | 2024.11.04 |
(Spring) Path Variable & Request Param 차이점 (0) | 2024.10.29 |
(Spring) Jackson과 Spring에서의 활용 (0) | 2024.10.28 |
(Spring) 삭제 관련 Cascade 사용 여부에 따른 정리 (0) | 2024.10.24 |