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번에 대해서 답변이 달린 것이다.
게시글 따로, 답변 따로가 아닌 해당 게시글에 달린 답변도 같이 보고 싶다면,
이 기능은 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
'JAVA > 프로젝트' 카테고리의 다른 글
Spring Boot: JPA 연관관계 설정하기 -2, 최신순 정렬, 삭제된 게시글 제외 하고 조회 (0) | 2024.04.27 |
---|---|
Spring Boot: JPA 연관관계 설정하기, Dto, Converter (0) | 2024.04.27 |
Spring Boot: End point 개발 2, 조회, 개별 조회, 삭제 (0) | 2024.04.27 |
Spring Boot : 게시판 End point 개발. board와 post 생성 (0) | 2024.04.26 |
Spring Boot : Entity 개발, DB 테이블과 연동 (0) | 2024.04.26 |