Spring 숙련 팀 프로젝트

신성훈·2024년 6월 7일

TIL

목록 보기
33/162
post-thumbnail

뉴스피드프로젝트

맡은 업무 : 게시판 CRUD 구현

  • Entity
package com.sparta.champions_league.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name="boards")
public class Board extends Timestamped{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long boardNum;

    private String title;

    private String content;

}
  • Controller
package com.sparta.champions_league.controller;

import com.sparta.champions_league.dto.BoardRequestDto;
import com.sparta.champions_league.dto.BoardResponseDto;
import com.sparta.champions_league.dto.BoardUpdateDto;
import com.sparta.champions_league.service.BoardService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api")
public class BoardController {

    private final BoardService boardService;


    @GetMapping("/boards/{boardNum}")
    public BoardResponseDto getBoard(@PathVariable Long boardNum) {
        return boardService.getBoard(boardNum);
    }

    @GetMapping("/boards")
    public List<BoardResponseDto> getAllBoards() {
        return boardService.getAllBoards();
    }

    @PostMapping("/boards")
    public BoardResponseDto createBoard(@RequestBody BoardRequestDto requestDto) {
        return boardService.createBoard(requestDto);
    }

    @PutMapping("/boards/{boardNum}")
    public BoardUpdateDto updateBoard(@PathVariable Long boardNum, @RequestBody BoardRequestDto requestDto) {
        return boardService.updateBoard(boardNum, requestDto);
    }

    @DeleteMapping("/boards/{boardNum}")
    public ResponseEntity<String> deleteBoard(@PathVariable Long boardNum) {
        boardService.deleteBoard(boardNum);
        return new ResponseEntity<>("게시물 삭제 되었습니다.", HttpStatusCode.valueOf(200));
    }

}
  • Service
package com.sparta.champions_league.service;

import com.sparta.champions_league.dto.BoardRequestDto;
import com.sparta.champions_league.dto.BoardResponseDto;
import com.sparta.champions_league.dto.BoardUpdateDto;
import com.sparta.champions_league.entity.Board;
import com.sparta.champions_league.repository.BoardRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class BoardService {

    private final BoardRepository boardRepository;

    public BoardResponseDto getBoard(Long boardNum) {
        return boardRepository.findById(boardNum)
                .map(BoardResponseDto::new)
                .orElseThrow(() -> new IllegalArgumentException("해당 게시글을 찾을 수 없습니다."));
    }

    public List<BoardResponseDto> getAllBoards() {
        List<Board> boards = boardRepository.findAllByOrderByCreatedAtDesc();
        if (boards.isEmpty()) {
            throw new IllegalArgumentException("먼저 작성하여 소식을 알려보세요!");
        }
        return boards.stream()
                .map(BoardResponseDto::new)
                .toList();
    }

    public BoardResponseDto createBoard(BoardRequestDto requestDto) {
        Board board = new Board();
        board.setTitle(requestDto.getTitle());
        board.setContent(requestDto.getContent());
        boardRepository.save(board);
        return new BoardResponseDto(board);
    }

    @Transactional
    public BoardUpdateDto updateBoard(Long boardNum, BoardRequestDto requestDto) {
        Board board = boardRepository.findById(boardNum).orElseThrow(
                () -> new IllegalArgumentException("선택한 게시물이 없습니다."));

        board.setTitle(requestDto.getTitle());
        board.setContent(requestDto.getContent());
        Board updatedBoard = boardRepository.save(board);
        return new BoardUpdateDto(updatedBoard);
    }

    public void deleteBoard(Long boardNum) {
        Board board = boardRepository.findById(boardNum).orElseThrow(
                () -> new IllegalArgumentException("선택한 게시물이 없습니다."));
        boardRepository.delete(board);
    }
}
  • Repository
package com.sparta.champions_league.repository;

import com.sparta.champions_league.entity.Board;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface BoardRepository extends JpaRepository<Board, Long> {
    List<Board> findAllByOrderByCreatedAtDesc();
}
  • RequestDto
package com.sparta.champions_league.dto;

import lombok.Getter;

@Getter
public class BoardRequestDto {
    private String title;
    private String content;

}
  • ResponseDto
package com.sparta.champions_league.dto;

import com.sparta.champions_league.entity.Board;
import lombok.Getter;

@Getter
public class BoardResponseDto {
    private Long boardNum;
    private String title;
    private String content;

    public BoardResponseDto(Board board) {
        this.boardNum = board.getBoardNum();
        this.title = board.getTitle();
        this.content = board.getContent();
    }
}
  • UpdateDto
package com.sparta.champions_league.dto;

import com.sparta.champions_league.entity.Board;
import lombok.Getter;

@Getter
public class BoardUpdateDto {
    private Long boardNum;
    private String title;
    private String content;

    public BoardUpdateDto(Board board) {
        this.boardNum = board.getBoardNum();
        this.title = board.getTitle();
        this.content = board.getContent();
    }
}

📝오늘의 회고

CRUD에 대해 명확하게 알아가는 시간이 되었다.

profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글