Spring 게시판 3 - 게시판 CRUD

춤인형의 개발일지·2024년 12월 24일

Spring실습

목록 보기
4/40

24/12/24

게시판 만들기

게시판 만들기 CRUD

🔥1단계

게시판 조회
내가 만든 api

  • 목록 조회
    • GET
    • Path
      • /boards
    • Example Endpoint
    • Response Message
      • data
        • boardId Number 게시판 ID
        • boardName String 게시판 이름

조회니까 Get
받을 값이 여러개니까 List
프론트엔트에 응답을 보낼게 BoardResponse
❓엔티티로 받으면 안되나요? -> 왜냐면 엔티티에는 중요한 데이터들이 들어있기 때문에 분리를 해줘야함
input값은 board전체니까 필요없음

//BoardController
 @GetMapping("/boards")
    public List<BoardResponse> getBoard(){
        return boardService.findAll();
    }
//BoardService
public List<BoardResponse> findAll() {
        List<Board> boards = boardRepository.findAll();
        return boards.stream().map(board -> new BoardResponse(board.getName(), board.getId())).toList();
    }

boardRepository.findAll()이 함수는 List<Board>타입이니까 이걸 boardResponse형태로 바꿔줘야한다. 왜? 우리는 List<BoardResponse>이걸 내보내줘야 이걸 받아서 controller에서 반환해주니까!

public record BoardResponse(
        String name,
        Long id) {
}

응답을 보낼 애는 따로 dto를 만들어줘야한다. entity는 누구도 몰라야하기 때문에 응답받을 애와 달라야한다.

게시판 생성
API

//controller
@PostMapping("/boards")
    public BoardResponse createBoard(@RequestBody BoardRequest boardRequest){
        return boardService.create(boardRequest);
    }

BoardRequest로 요청받을 값을 가져오고(요청받을 값이니까 requestBody- 주로 여러개일때? 사용한다고 함)

//service
public BoardResponse create(BoardRequest boardRequest) {
        Board board = boardRepository.save(new Board(boardRequest.name()));
        BoardResponse boardResponse = new BoardResponse(board.getName(), board.getId());
        return boardResponse;

    }

요청과 응답은 있어야한다. 둘 다 따로따로 구별해줘야함

//response
public record BoardResponse(
        String boardName,
        Long id) {
}

게시판 이름 수정
API

프론트에서 주는 데이터는 없을 수도 있다. 따라서 항상 findById를 해야한다. 실제로 데이터 베이스에 있는건지 확인해야한다.

//게시판 수정
//controller
    @PutMapping("/boards/{boardId}")
    public void putBoard(@PathVariable Long boardId, @RequestBody BoardRequest boardRequest){
        boardService.update(boardId, boardRequest);
    }

내가 id를 받아서 id를 수정하는게 아니니까, 요청되는 값도 받아야한다. 따라서 path와, body둘다 받아야한다.

//service
@Transactional
    public void update(Long boardId, BoardRequest boardRequest) {
        Board board = boardRepository.findById(boardId).orElseThrow();
        board.setName(boardRequest.name());
    }

@Transactional : 트렌젝션
롤백 되거나 커밋되거나

  • 롤백: 없었던 일로 되돌린다.
  • 커밋: DB에 실제로 반영되는것
    ex) 쇼핑몰 결제를 했는데 중간에 뭔가 에러가 나서 결제 취소가 되면, 돈은 다시 들어와야하는데 트렉젠션이 없으면 중간에 돈이 증발되어버리는 현상이 발생한다. 이걸 막아주는 역할!

게시판 삭제
API

  • 삭제
    • DELETE
    • Path
    • Request Parameters
      • Path Segment Parameter
        • boardId Number 게시판 ID
    • Response Message
      • message String
      • data String 삭제된 게시판 ID
//controller
//게시판 삭제
    @DeleteMapping("/boards/{boardId}")
    public void deleteBoard(@PathVariable Long boardId){
        boardService.delete(boardId);
    }
//service
public void delete(Long boardId) {
        Board board = boardRepository.findById(boardId).orElseThrow();
        boardRepository.delete(board);
    }

😐 느낀점

일단, 아직은 처음이라 어려운,,응,,
1. 응답, 요청은 entity와는 분명히 독립되어야한다.
2. 내가 어떤 값을 요청받을 건지도 잘 파악해야한다.
3. API를 잘 설계해야한다.

0개의 댓글