2024. 10. 11. 10:47ㆍ내일배움캠프/Schedule Management
댓글 CRUD 에 대한 구현을 진행한 후 진행한 API 테스트를 기록하기 위해 작성한다. 또한 요구사항에 명시된 '영속성 전이' 에 대한 부분도 간략하게 나마 정리해볼 생각이다. 이번에 작성한 코드는 여기서 확인할 수 있다.
1. 댓글 생성
댓글 작성시 쿼리 파라미터와 RequestBody 로 요청 파라미터를 받도록 구현했다. 쿼리 파라미터에는 댓글을 작성할 일정의 'id' 값이 RequestBody 에는 작성할 댓글의 '본문(body), 작성자명(author)' 정보가 담겨있다. 정상 요청을 하면 '201 Created' 응답과 생성된 댓글의 정보가 반환된다.
요청 파라미터가 유효하지 않을 경우 아래와 같은 응답과 예외 정보를 반환한다.
'(1)' 의 경우 존재하지 않는 일정에 댓글을 작성하는 경우이다. '404 Not Found' 응답과 해당 일정을 찾을 수 없다는 예외 코드 및 메시지를 반환한다. '(2)' 의 경우 RequestBody 안의 요청 파라미터가 유효하지 않은 경우이다. '400 Bad Request' 응답과 예외 코드 및 메시지, 유효하지 않은 파라미터 이름 및 이유를 말하는 메시지가 반환된다.
2. 댓글 조회(단건)
댓글 조회시 조회할 댓글의 'id' 를 쿼리 파라미터로 전달 받도록 구현했다. 결과로는 '200 OK' 응답과 조회한 댓글 정보를 반환해 준다.
만약 존재하지 않는 댓글에 대한 조회를 요청한 경우 아래와 같이 '404 Fot Found' 응답과 예외 코드 및 메시지를 반환한다.
3. 댓글 목록 조회
댓글 목록 조회시 '검색 조건(작성자명)' 을 통해 모든 댓글을 조회할 수 있도록 구현했다. 물론 검색 조건이 없을 경우 기본적으로 모든 댓글을 조회할 수 있다. '200 OK' 응답과 함께 조회한 댓글 목록 정보를 반환한다.
일정 목록 조회 때와 마찬가지로 댓글 목록 조회 또한 검색 조건에 해당하는 댓글 목록을 조회하지 못할 경우 예외가 아닌 빈 목록을 반환하도록 구현하였다.
4. 댓글 수정
댓글 수정시 댓글의 '본문(body)' 만을 수정할 수 있도록 구현했다. 쿼리 파라미터로 댓글의 'id' 를 전달, RequestBody 를 통해 수정할 'body' 를 전달 받는다. 요청 수행후 '204 No Content' 응답을 하고 별도로 수정된 댓글의 정보를 반환하지 않는다. 왜 수정된 댓글 정보를 반환하지 않았는지는 저번 게시글에 이미 작성을 했으므로 넘어가 보도록 하겠다.
만약 존재하지 않는 댓글의 정보를 수정하려하거나 수정 정보가 유효하지 않은 경우 아래와 같은 응답과 예외 코드 및 메시지를 반환한다.
존재하지 않는 댓글 수정 요청시 해당 댓글을 찾을 수 없다는 '404 Not Found' 응답과 예외 코드 및 메시지가 반환되며, 요청 파라미터(body) 가 유효하지 않은 경우 '400 Bad Request' 응답과 예외 코드 및 메시지, 유효하지 않은 파라미터 이름 및 유효하지 않은 이유를 반환한다.
5. 댓글 삭제
댓글 삭제시 삭제할 댓글의 'id' 를 쿼리 파라미터로 전달 받도록 구현했다. 댓글 삭제시 '204 No Content' 응답을 하며, 별도의 정보를 반환하지는 않는다.
만약 존재하지 않는 댓글에 대한 삭제를 요청한 경우 아래와 같이 '404 Not Found' 응답과 예외 코드 및 메시지를 반환한다.
마지막으로 요구사항에 대해서 말해 보자면 현재 일정과 댓글을 '1:N' 관계(양방향)로 매핑되어 있다. 그리고 요구사항에는 '일정이 삭제되면 댓글도 삭제되어야 한다.' 라는 내용이 명시되어 있다. 나의 경우 이를 '영속성 전이' 를 활용해보라는 말로 이해했고 아래와 같이 코드를 수정했다.
// Schedule 클래스(Entity)
@OneToMany(mappedBy = "schedule", cascade = CascadeType.REMOVE)
private List<Comment> comments = new ArrayList<>();
수정 내용은 '@OneToMany' 어노테이션에 'cascade' 속성을 추가하고 'CascadeType.REMOVE' 옵션을 지정했다. 한 마디로 "Schedule 이 삭제되면 연관 엔티티(Comment)도 삭제할게" 라는 명령을 하게 되는 것이다. 'CascadeType' 에는 'ALL, PERSIST, MERGE 등' 다양한 옵션이 존재하지만 당장은 '일정 삭제시 댓글 삭제' 가 수행되기만 하면 되므로 'REMOVE' 를 사용해 '삭제' 에 대한 영속성 전이만을 적용하였다. 되도록 내가 추적하기 힘든 수행을 피하고 싶어 필요한 기능만을 사용한 것이다.
6. 정리
현재 일정도 그렇고 댓글도 그렇고 '전체(목록) 조회' 시 동적 쿼리를 직접 작성해 사용하고 있다. 하지만 JPA 를 최대한 활용해 진행하는 과제인 만큼 해당 부분도 좀 더 학습을 통해 JPA 를 활용할 수 있도록 수정할 필요성을 느꼈다.
'내일배움캠프 > Schedule Management' 카테고리의 다른 글
[일정 관리 앱] N : M(다대다) 관계 풀어내기 (0) | 2024.10.12 |
---|---|
[일정 관리 앱] 기묘한 모험 - 1 : N 관계에서의 전체 조회 (0) | 2024.10.11 |
[일정 관리 앱] 일정 수정, 삭제 API 테스트 (0) | 2024.10.09 |
[일정 관리 앱] 일정 생성, 조회 API 테스트 (0) | 2024.10.08 |
[일정 관리 앱] JPA 를 사용한 일정 관리 앱 구현시작 (0) | 2024.10.07 |