개인 프로젝트/Toy & Side

[TOY] 개발 - Application(PostService)

kwang2134 2024. 11. 30. 15:19
728x90
반응형
728x90

이전 진행 상황

  • usecase dto -> 순수 엔티티 변경
  • 수정용 UpdateDTO 추가
  • modify 메서드 수정
  • 커스텀 예외 추가(Base, User)

  • Post

Post

PostService 개발에 따라 수정된 사항들과 추가된 사항이 존재합니다.


변경 사항

  • usecase(crud, recommend) 메서드 추가 및 재배치
  • PostRepository 메서드 추가 -> PostType을 통한 검색
  • Post 엔티티 메서드 추가 -> 추천, 비추천, 종류 변경

추가 사항

  • PostService 추가
  • 커스텀 예외 추가 -> Post
  • PostQueryRepository 인터페이스 추가

변경 내용

interface PostCrudUseCase - 수정

recommend 유스케이스에 존재하던 인기글 변경 메서드가 삭제되고 crud 유스케이스에 각 게시글 타입을 변경하는 메서드가 추가되었습니다.

public interface PostCrudUseCase {
    Post createPost(Post post);

    Post updatePost(Long postId, PostUpdateDTO dto);

    void deletePost(Long postId);

    Post viewPost(Long postId);

    List<Post> searchPosts(PostSearchCond searchCond);

    void changeToPopular(Long postId);

    void changeToNormal(Long postId);

    void changeToNotice(Long postId);
}

interface RecommendPostUseCase - 수정

추천 기능과 인기글 조회에 관한 기능만 제공하게 되었습니다.

public interface RecommendPostUseCase {

    void recommendPost(Long postId);

    void notRecommendPost(Long postId);

    List<Post> viewPopularPosts();
}

interface PostRepository - 수정

게시글 타입을 통한 검색 메서드가 추가되었습니다.

public interface PostRepository extends JpaRepository<Post, Long> {
    List<Post> findByUserId(Long userId);
    
    List<Post> findByPostType(PostType postType);
}

class Post - 수정

추천, 비추천을 위한 메서드와 게시글 타입 변경을 위한 메서드가 추가되었습니다.

    public int recommendPost() {
        this.recomCount++;
        return recomCount;
    }
    
    public int notRecommendPost() {
        this.notRecomCount++;
        return notRecomCount;
    }
    
    public void changeTypeNormal() {
        this.postType = PostType.NORMAL;
    }
    
    public void changeTypeNotice() {
        this.postType = PostType.NOTICE;
    }
    
    public void changeTypePopular() {
        this.postType = PostType.POPULAR;
    }

추가 내용

class PostService - 추가

PostService 로직이 구현되었습니다. 기본적인 게시글 목록 조회의 경우 searchPosts 메서드의 모든 조건 검색으로 처리하였습니다. 단순 게시글 목록 조회가 필요한 경우 searchCond에 아무런 조건 없이 검색하게 됩니다.

@Slf4j
@Service
@RequiredArgsConstructor
public class PostService implements PostCrudUseCase, RecommendPostUseCase {

    private final PostRepository repository;
    private final PostQueryRepository queryRepository;

    @Override
    @Transactional
    public Post createPost(Post post) {
        return repository.save(post);
    }

    @Override
    @Transactional
    public Post updatePost(Long postId, PostUpdateDTO dto) {
        Post post = repository.findById(postId)
                .orElseThrow(() -> new PostNotFoundException(postId));
        post.modify(dto);
        return post;
    }

    @Override
    @Transactional
    public void deletePost(Long postId) {
        repository.deleteById(postId);
    }

    @Override
    @Transactional(readOnly = true)
    public Post viewPost(Long postId) {
        return repository.findById(postId)
                .orElseThrow(() -> new PostNotFoundException(postId));
    }

    @Override
    @Transactional(readOnly = true)
    public List<Post> searchPosts(PostSearchCond searchCond) {
        return queryRepository.searchPosts(searchCond);
    }

    @Override
    @Transactional
    public void recommendPost(Long postId) {
        Post post = repository.findById(postId)
                .orElseThrow(() -> new PostNotFoundException(postId));

        int recommendCount = post.recommendPost();
    }

    @Override
    @Transactional
    public void notRecommendPost(Long postId) {
        Post post = repository.findById(postId)
                .orElseThrow(() -> new PostNotFoundException(postId));

        int notRecommendCount = post.notRecommendPost();
    }

    @Override
    @Transactional
    public void changeToPopular(Long postId) {
        Post post = repository.findById(postId)
                .orElseThrow(() -> new PostNotFoundException(postId));

        post.changeTypePopular();
    }

    @Override
    @Transactional
    public void changeToNormal(Long postId) {
        Post post = repository.findById(postId)
                .orElseThrow(() -> new PostNotFoundException(postId));

        post.changeTypeNormal();
    }

    @Override
    @Transactional
    public void changeToNotice(Long postId) {
        Post post = repository.findById(postId)
                .orElseThrow(() -> new PostNotFoundException(postId));

        post.changeTypeNotice();
    }

    @Override
    @Transactional(readOnly = true)
    public List<Post> viewPopularPosts() {
        return repository.findByPostType(PostType.POPULAR);
    }
}

interface PostQueryRepository - 추가

게시글 조건 검색의 복잡한 동적 쿼리를 위한 Repository로 Querydsl 의존성을 가져 기존 adapters 패키지에 설계되었으나 의존성 만족을 위해 interface를 정의하여 adapters 패키지 아래 구현체를 생성하게 변경하였습니다. Service 클래스에선 domain 패키지 아래 repository의 PostQueryRepository 인터페이스에만 의존하게 됩니다.

public interface PostQueryRepository {
    List<Post> searchPosts(PostSearchCond searchCond);
}

class PostNotFoundException - 추가

Post를 찾지 못했을 경우 발생하는 커스텀 예외입니다. 예외 코드로 P001을 가집니다.

public class PostNotFoundException extends BaseException {
    public PostNotFoundException(Long postId) {
        super("User not found with id: " + postId, "P001");
    }
}
728x90