초보 개발자가 나 홀로 만드는 REST API ( 📄게시판 서비스) (4) - 게시글 도메인 구현
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- *초보 Java/Spring Boot 개발자, 백엔드 기초 학습자**
- *난이도**: 중급 (JPA, DTO, JPQL 이해 필요)
핵심 요약
- Post 엔티티 설계:
@Builder
,@Entity
,@Lob
대신String
사용,updateTitle()
,updateContent()
메서드로 비즈니스 로직 강화 - PostRepository:
@Query
로 Fetch Join 최적화,PostRepositoryCustom
을 통한 동적 검색 쿼리 구현 - PostService: DTO 반환,
@Transactional
적용, null 검증 강화 - PostController: REST API 엔드포인트 정의,
@RestController
사용
섹션별 세부 요약
1. 게시글 엔티티 구현
Post
클래스에@Builder
,@Entity
,@NoArgsConstructor
,@AllArgsConstructor
적용updateTitle()
,updateContent()
,remove()
메서드로 비즈니스 규칙 반영checkNotRemoved()
메서드로 삭제 상태 검증writeComment()
메서드로 댓글 생성 로직 구현@Lob
대신String
타입 사용 → 수 MB 단위의 긴 글 처리
2. 게시글 레포지토리 구현
PostRepository
인터페이스에서findByIdAndIsRemovedFalse()
,findAllByWriterAndIsRemovedFalse()
메서드 정의@Query
로 Fetch Join 활용:left join fetch p.writer
countQuery
를 통해 페이징 최적화PostRepositoryCustom
인터페이스로 동적 검색 쿼리 분리searchPosts()
메서드에서BooleanBuilder
와JPAQueryFactory
를 사용한 동적 쿼리 생성
3. 게시글 서비스 구현
PostService
클래스에서write()
,getPost()
,search()
메서드 정의- DTO 반환:
PostDetailResponse
사용 → 엔티티 노출 방지 update()
메서드에서title
,content
필드에 대한 null 검증 강화delete()
메서드로 삭제 시 필드 비우기@Transactional(readOnly = true)
로 읽기 전용 트랜잭션 적용
4. 게시글 컨트롤러 구현
PostController
에서/v2/posts
엔드포인트 정의@GetMapping
,@PostMapping
,@PatchMapping
,@DeleteMapping
사용@Valid
애너테이션으로 요청 DTO 검증writeComment()
메서드로 댓글 생성 및 리소스 위치 반환
결론
- DTO 사용: 서비스 단에서 DTO 반환으로 엔티티 노출 방지 및 API 응답 정리
- null 검증: 도메인/서비스 단에서 중복 검증 강화
- 쿼리 최적화:
Fetch Join
과startsWith
사용으로 성능 저하 방지 - 트랜잭션 관리:
@Transactional
을 통해 데이터 일관성 보장 - 코드 예시:
```java
public void updateTitle(String newTitle) {
checkNotRemoved();
if (newTitle == null) throw new InvalidPostFieldException(...);
this.title = newTitle;
}
```