JAVA/프로젝트

Spring Boot: End point 개발 2, 조회, 개별 조회, 삭제

whyHbr 2024. 4. 27. 00:45
728x90
반응형

생성 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());
                       }
               );
    }

 

삭제한 글을 조회해보면

이렇게 나온다 

728x90