생성 create 했다면
보는 기능view, 삭제 delete 도 필요하다.
view(아이디별 조회):
익명 게시판이기 때문에 @GetMapping(),@PathVariable로 id를 받아서 조회하는 것은 불가능하다.
작성할 때 입력한 비밀번호가 입력되어야 열람 가능한 형태.
@PostMapping("/view") 로 처리해주고
path로 못받으니 body로 받아야 한다. 비밀번호와 아이디를 입력 받을 또 다른 모델이 필요하다.
model - PostViewRequest 클래스 생성
보기 위해선 postId, password을 입력해야 한다.
package com.example.myboard.post.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 lombok.*;
//@PostMapping("/view")
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Builder
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class PostViewRequest {
@NotNull
private Long postId;
@NotBlank
private String password;
}
PostController 추가 내용: 받은 postViewRequest 를 서비스로 넘긴다.
@PostMapping("/view")
public PostEntity view(@Valid @RequestBody PostViewRequest postViewRequest){
return postService.view(postViewRequest);
}
이때 서비스가 해야할 것:
입력 받은 아이디에 해당하는 게시글이 존재하는거?
비밀 번호가 맞는가?
public PostEntity view(PostViewRequest postViewRequest) {
return postRepository.findById(postViewRequest.getPostId())
.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()));
}
return it; //맞는다면 해당 entity 리턴
}).orElseThrow( //데이터가 없다면
()->{
return new RuntimeException("해당 게시글이 존재하지 않습니다."+ postViewRequest.getPostId());
}
);
}
view(모두 조회):
controller:
@GetMapping("/all")
public List<PostEntity> list(){
return postService.all();
}
service:
public List<PostEntity> all() {
return postRepository.findAll();
}
delete :
아이디와 비밀번호를 입력해야 삭제되게 하겠다 -> PostViewRequest 를 사용하면 된다.
컨트롤러에 추가
@PostMapping("/delete")
public void delete(@Valid @RequestBody PostViewRequest postViewRequest){
postService.delete(postViewRequest);
}
서비스에 추가
public void delete(PostViewRequest postViewRequest) {
postRepository.findById(postViewRequest.getPostId())
.map(it->{
if(!it.getPassword().equals(postViewRequest.getPostId())){
var format = "비밀번호가 맞지 않습니다. %s vs %s";
throw new RuntimeException(String.format(format,it.getPassword(),postViewRequest.getPostId()));
}
//존재하지 않는다면 상태 변경
it.setStatus("UNREGISTERED");
postRepository.save(it); //변경 사항 저장
return it;
}).orElseThrow(
()->{
return new RuntimeException("해당 게시글이 존재하지 않습니다." + postViewRequest.getPostId());
}
);
}
결과 조회 :
진짜 삭제된게 아니라 status 가 unregistered 로 변경된 것.
진짜 삭제를 하려면,
PostRepository에 메서드 추가
쿼리메서드 형식으로 추가해준다.
//select * from post where id = [] and status = [] order by id desc;
Optional<PostEntity> findFirstByIdAndStatusOrderByIdDesc(Long id, String status);
쿼리 메소드는 내 마음대로 작명하는게 아니라
https://docs.spring.io/spring-data/jpa/reference/jpa/query-methods.html
스프링에서 샘플을 준다. 여기 맞춰 만들면 된다.
서비스 부분도 수정해준다.
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()));
}
return it; //맞는다면 해당 entity 리턴
}).orElseThrow( //데이터가 없다면
()->{
return new RuntimeException("해당 게시글이 존재하지 않습니다."+ postViewRequest.getPostId());
}
);
}
삭제한 글을 조회해보면
이렇게 나온다
'JAVA > 프로젝트' 카테고리의 다른 글
Spring Boot: JPA 연관관계 설정하기, Dto, Converter (0) | 2024.04.27 |
---|---|
Spring Boot: End point 개발 3, 게시글과 게시글에 달린 답변 같이 보기 (0) | 2024.04.27 |
Spring Boot : 게시판 End point 개발. board와 post 생성 (0) | 2024.04.26 |
Spring Boot : Entity 개발, DB 테이블과 연동 (0) | 2024.04.26 |
Spring Boot: 게시판 설계, ERD Diagram, DB 연동 (0) | 2024.04.26 |