Spring 숙련 팀 프로젝트 수정

신성훈·2024년 6월 10일
0

TIL

목록 보기
34/162
post-thumbnail

뉴스피드프로젝트

맡은 업무 : 인증인가 추가 및 setter 제거 및 ManyToOne, JoinColumn 추가

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

    private String title;

    private String content;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_num")
    private User user;

    public Board(String title, String content, User user) {
        this.title = title;
        this.content = content;
        this.user = user;
    }
    public void update(String title, String content, User user) {
        this.title = title;
        this.content = content;
        this.user = user;
    }
}
  • 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.security.UserDetailsImpl;
import com.sparta.champions_league.service.BoardService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

import java.util.List;

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

    private final BoardService boardService;


    //Board 단건 조회
    @GetMapping("/boards/{boardNum}")
    public BoardResponseDto getBoard(@PathVariable Long boardNum) {
        return boardService.getBoard(boardNum);
    }

    //Board 전체 조회
    @GetMapping("/boards")
    public List<BoardResponseDto> getAllBoards() {
        return boardService.getAllBoards();
    }

    //Board 생성
    @PostMapping("/boards")
    public BoardResponseDto createBoard(@RequestBody BoardRequestDto requestDto, @AuthenticationPrincipal UserDetailsImpl userDetails) {
        return boardService.createBoard(requestDto,userDetails.getUser());
    }

    //Board 수정
    @PutMapping("/boards/{boardNum}")
    public BoardUpdateDto updateBoard(@PathVariable Long boardNum, @RequestBody BoardRequestDto requestDto, @AuthenticationPrincipal UserDetailsImpl userDetails) {
        return boardService.updateBoard(boardNum, requestDto, userDetails.getUser());
    }

    //선택 Board 삭제
    @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.entity.User;
import com.sparta.champions_league.repository.BoardRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@RequiredArgsConstructor
public class BoardService {

    private final BoardRepository boardRepository;

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

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

    //Board 생성
    public BoardResponseDto createBoard(BoardRequestDto requestDto, User user) {
        Board board = new Board(requestDto.getTitle(), requestDto.getContent(),user);
        boardRepository.save(board);
        return new BoardResponseDto(board);
    }

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

        board.update(requestDto.getTitle(), requestDto.getContent(),user);
        return new BoardUpdateDto(board);
    }

    //선택 Board 삭제
    public void deleteBoard(Long boardNum) {
        Board board = boardRepository.findById(boardNum).orElseThrow(
                () -> new IllegalArgumentException("선택한 게시물이 없습니다."));
        boardRepository.delete(board);
    }
}
  • BoardUpdateDto
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();
    }
}

📝오늘의 회고

@Setter를 지양해야 하기 때문에 제거 후 메서드 생성하여 진행 하였고, User와 ManyToOne으로 연결 및 JoinColumn 설정하고 인증 인가 관련하여 토큰값을 가지고 수정 및 생성 할 수 있도록 하였다.

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

0개의 댓글