초보 개발자가 만드는 REST API 게시글 도메인 구현
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

초보 개발자가 나 홀로 만드는 REST API ( 📄게시판 서비스) (4) - 게시글 도메인 구현

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발

대상자

  • *초보 Java/Spring Boot 개발자, 백엔드 기초 학습자**
  • *난이도**: 중급 (JPA, DTO, JPQL 이해 필요)

핵심 요약

  • Post 엔티티 설계: @Builder, @Entity, @Lob 대신 String 사용, updateTitle(), updateContent() 메서드로 비즈니스 로직 강화
  • PostRepository: @QueryFetch 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() 메서드 정의
  • @QueryFetch Join 활용: left join fetch p.writer
  • countQuery를 통해 페이징 최적화
  • PostRepositoryCustom 인터페이스로 동적 검색 쿼리 분리
  • searchPosts() 메서드에서 BooleanBuilderJPAQueryFactory를 사용한 동적 쿼리 생성

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 JoinstartsWith 사용으로 성능 저하 방지
  • 트랜잭션 관리: @Transactional을 통해 데이터 일관성 보장
  • 코드 예시:

```java

public void updateTitle(String newTitle) {

checkNotRemoved();

if (newTitle == null) throw new InvalidPostFieldException(...);

this.title = newTitle;

}

```