[Spring] RestAPI 게시판 API만들기 - 2 (게시글 작성, 수정, 단건 조회)

nana·2024년 9월 7일
0

Spring

목록 보기
2/9

✨요구사항

  1. 게시글 작성 API
    • 제목, 작성자명, 비밀번호, 작성 내용을 저장하고
    • 저장된 게시글을 Client 로 반환하기
  2. 선택한 게시글 조회 API
    • 선택한 게시글의 제목, 작성자명, 작성 날짜, 작성 내용을 조회하기
      (검색 기능이 아닙니다. 간단한 게시글 조회만 구현해주세요.)
  3. 선택한 게시글 수정 API
    • 수정을 요청할 때 수정할 데이터와 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후
    • 제목, 작성자명, 작성 내용을 수정하고 수정된 게시글을 Client 로 반환하기

✔️게시글 작성 API (registPost)

controller/BoardController.java

@RestController
@RequiredArgsConstructor //BoardService에 대한 멤버 사용
@RequestMapping("/api/boards")
public class BoardController {

private final BoardWriteService boardWriteService;
    private final BoardService boardService;


    @RequestMapping(method = RequestMethod.POST)
    public ResponseEntity<BoardList> registOnePost(@RequestBody BoardList list){
        if (boardWriteService.registPost(list).getSeqNo() > 0) {
            System.out.println("Your Post Number is "+ list.getSeqNo());
            return ResponseEntity.status(HttpStatus.CREATED).body(list);
        } else if(boardWriteService.registPost(list).getRegId() == ""){ //등록자 누락
            return (ResponseEntity<BoardList>) ResponseEntity.status(-10);
        }
        else if(boardWriteService.registPost(list).getPassword() == ""){ //비밀번호 누락
            return (ResponseEntity<BoardList>) ResponseEntity.status(-11);
        }
        else{
            return(ResponseEntity<BoardList>) ResponseEntity.badRequest();
        }
    }
}

userService/BoardWriteService.java


@Service
public class BoardWriteService {



    private final BoardListRepository boardListRepository;

    public BoardWriteService(BoardListRepository boardListRepository) {
        this.boardListRepository = boardListRepository;
    }

    /***
     * 게시글 등록
     * 작성 내용 저장 후 게시글 Client로 반환(게시물 번호 반환하기)
     */

    public BoardList registPost(BoardList post)
    {
        DateFormat now = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");

        post.setRegDate(now.format(new Date()));
        post.setUseYn("Y");


        return boardListRepository.save(post);
    }
}

작성에 관한 내용 Create/Update는 BoardWriteService로 따로 뺐다.
이후 유지보수가 편할 것 같고 작성에 관한 메서드(제약조건같은것..) 한번에 모아두기 위해서.

DateFormat now = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
작성 날짜를 실시간으로 받아오기 위해 DateFormat를 사용하였다.
처음에 이 포맷이 이상하게 (2024-09-01 000:00:00) 이런식으로 들어가서 애좀 먹었는데 DateFormat의 대소문자(YYYY, MM, dd, HH, mm, ss)에 따라 달라지더라..
혹시나 포맷오류가 난다면 대소문자 확인 해 볼것.

repository/BoardListRepository.java

@Repository
public interface BoardListRepository extends JpaRepository<BoardList, String> {
 BoardList findBySeqNo(Integer seqNo);
}

작성 된 게시물을 반환해야 하므로 등록시엔 seq_no를 반환하고 반환된 seq_no로 게시물 하나를 조회 해 온다.

👉🏻결과

postman으로 json으로 데이터 전송하여 201 결과를 반환하는 것을 확인할 수 있었다.

✔️게시글 수정 API (updatePost)

메서드 명을 editPost로 할까 하다가.. CURD 기능 구현이니 update로 가기로 함.

BoardController.java

//게시글 수정
    @PutMapping("/post/{seq_no}")
    public ResponseEntity<?> updatePost(@PathVariable("seq_no") Integer seq_no, @RequestBody BoardList list){
        BoardList editedPost = boardWriteService.editPost(list, seq_no);

        if(editedPost != null)
            return ResponseEntity.ok(editedPost);
        else
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ReturnCodes.PASSWORD_NOT_CORRECT);
    }

이번엔 POST가 아닌 PUT로 매핑해준다.
파라미터로 seq_no를 전달해 주고 @PathVariable어노테이션을 사용한다.

@PathVariable

  • 경로 변수를 표시하기 위해 메서드의 매개변수에 사용된다.
  • 경로 변수는 중괄호 {id}로 둘러싸인 값을 나타낸다.
  • url 경로에서 변수 값을 추출하여 매개변수에 할당한다.
  • 기본적으로 경로 변수는 반드시 값을 가져야 하며, 값이 없는 경우 404오류가 발생한다.
  • 주로 상세 조회, 수정, 삭제와 같은 작업에서 리소스 식별자로 사용된다.

BoardWriteService.java

 /**
     * 선택한 게시글 수정.
     * 수정 요청 시 수정할 데이터와 비밀번호 같이 보내서 서버에서 비밀번호 일치여부 확인 후
     * 제목, 작성자명, 작성내용을 수정하고 수정된 게시글 Client로 반환
     * */

    public BoardList editPost(BoardList post, Integer seq_no){
        DateFormat now = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");

        String password = boardListRepository.findBySeqNo(seq_no).get().getPassword();

        if(CheckPassword(post.getPassword(), password)) {
            post.setSeqNo(seq_no);
            post.setEditDate(now.format(new Date()));
            post.setEditId(post.getEditId());
            post.setUseYn("Y");

            return boardListRepository.save(post);
        }
        else
            return null;
    }

    private Boolean CheckPassword(String edit_password, String password){
        return (edit_password.equals(password));
    }

등록되어있는 password와 수정 시 입력한 password가 동일한지 확인하기 위해 CheckPassword 메서드를 생성하였다.
자꾸 동일한 비밀번호임에도 실패가 떠서 확인해 보니 string 비교는 .equals를 써야하는 것을 자꾸 까먹는다 ㅠㅠ 신경쓰자!

👉🏻결과

✔️게시글 단건 조회 API (getPost)

BoardController.java

//게시물 단건 조회
    @GetMapping(value = "/post/{seq_no}")
    public ResponseEntity<?> getPost(@PathVariable("seq_no") Integer seq_no){
        BoardList post = boardService.getPost(seq_no);

        if(post != null)
            return ResponseEntity.ok(post);
        else
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ReturnCodes.POST_NOT_FOUND);
    }

단건 조회는 @GetMapping으로 가져온다.
파라미터로 seq_no를 전달해 주고 @PathVariable어노테이션을 사용한다.
게시물 번호가 없거나, 있음에도 use_yn = 'N'인 경우 실패를 반환한다.

BoardService.java

	/**
     * 게시글 단건 조회
     * */
    public BoardList getPost(Integer seq_no){
        Optional<BoardList> boardListOptional = boardListRepository.findBySeqNo(seq_no);
        return boardListOptional.orElseThrow(()-> new NoSuchElementException("Post not found"));
    }

👉🏻결과

profile
BackEnd Developer, 기록의 힘을 믿습니다.

0개의 댓글