JAVA/프로젝트

Spring Boot: End point 개발 3, 게시글과 게시글에 달린 답변 같이 보기

whyHbr 2024. 4. 27. 01:52
728x90
반응형

게시글(post)에 postid, password를 입력하고 들어가면 밑에 달려있는 댓글을 같이 보는 기능 개발,

관리자는 post 에 대한  댓글을 달기 위한 작업 개발.

reply만 가져오는 것이 아니라 사용자의 원본 글의 리스트로 내려갈 수 있도록 개발

 

패키지와 클래스 생성

입력 받는 댓글 모델 생성 

package com.example.myboard.reply.model;

import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.*;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Builder
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)

public class ReplyRequest {

    @NotNull
    private Long postId;
    @NotBlank
    private String userName;
    @NotBlank
    @Size(min = 4, max = 4)
    private String password;
    @NotBlank
    private String title;
    @NotBlank
    private String content;

}

 

위 양식대로 사용자가 입력하면 컨트롤러에서 받는다.

package com.example.myboard.reply.controller;

import com.example.myboard.reply.db.ReplyEntity;
import com.example.myboard.reply.model.ReplyRequest;
import com.example.myboard.reply.service.ReplyService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/reply")
@RequiredArgsConstructor
public class ReplyController {

    private final ReplyService replyService;

    @PostMapping("")
    public ReplyEntity create( @Valid @RequestBody ReplyRequest replyRequest){
        return replyService.create(replyRequest);

    }
}

 

 

받은 것을 서비스로 전달

package com.example.myboard.reply.controller;

import com.example.myboard.reply.db.ReplyEntity;
import com.example.myboard.reply.model.ReplyRequest;
import com.example.myboard.reply.service.ReplyService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/reply")
@RequiredArgsConstructor
public class ReplyController {

    private final ReplyService replyService;

    @PostMapping("")
    public ReplyEntity create( @Valid @RequestBody ReplyRequest replyRequest){
        return replyService.create(replyRequest);

    }
}

 

postId 1번에 대해서 답변이 달린 것이다. 

db 확인

 

 

 

게시글 따로, 답변 따로가 아닌 해당 게시글에 달린 답변도 같이 보고 싶다면,

이 기능은 findAll, findById 처럼 jpa에서 제공해주는 것이 아니라 직접 만들어야 한다.

 

ReplyRepository에 쿼리 메서드를 작성한다.

//select * from reply where post_id = [] and status = [] order by desc;
    List<ReplyEntity> findAllByPostIdAndStatusOrderById(Long postId, String status);

 

ReplyService 에서 쿼리 메서드를 사용한다.

public List<ReplyEntity> findAllByPostId( Long postId){
        return replyRepository.findAllByPostIdAndStatusOrderById(postId, "REGISTERED");
    }

 

PostEntity에 추가해준다

@Transient //db컬럼으로 인식하지 못하게
    private List<ReplyEntity> replyList = List.of();// 빈 리스트를 기본으로

화면에 보여주기만 할 뿐 db로 인식되는 것은 아니다. 답변이 없을 수도 있으니 빈리스트를 기본으로 준다.

 

PostService 를 수정해준다.

   public PostEntity view(PostViewRequest postViewRequest) {
       return postRepository.findFirstByIdAndStatusOrderByIdDesc(postViewRequest.getPostId(),"REGISTERED") //registered된 것만 select
               .map( it->{
                   //entity가 존재 할때만
                   if(! it.getPassword().equals(postViewRequest.getPassword())){
                       //db에 있는 post의 pw와 입력 받은 post의 pw를 비교해 동일하지 않다면
                       var format = "비밀번호가 맞지 않습니다. %s vs %s ";
                       throw new RuntimeException(String.format(format,it.getPassword(), postViewRequest.getPassword()));
                   }

                   //답변 같이 보여주기
                   var replyList = replyService.findAllByPostId(it.getId()); //추가
                   it.setReplyList(replyList); //추가

                   return  it; //맞는다면 해당 entity  리턴




               }).orElseThrow( //데이터가 없다면
                       ()->{
                           return new RuntimeException("해당 게시글이 존재하지 않습니다."+ postViewRequest.getPostId());
                       }
               );
    }

 

글에 달린 답변도 같이 보이는 걸 확인 할 수 있다.

728x90