Pull Request Link: [Feat/๊ฒ์๊ธ์์ธ์กฐํ] ํ๋์ ๊ฒ์๊ธ ๊ฐ์ ธ์ค๊ธฐ #39
์ด๋ฒ ์ฃผ์ฐจ์์๋ ์์ฑ๋ ๊ฒ์๊ธ์์ ๊ฒ์๊ธ์ ๋๋ ์ ๋ ํด๋นํ๋ ๊ฒ์๊ธ์ ์ ๋ณด๋ฅผ ๋ฑ์ด์ฃผ๊ธฐ ์ํ API๋ฅผ ๊ฐ๋ฐํ๊ธฐ๋ก ํ๋ค.
๊ฒ์๊ธ ์์ฑ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ฅ ๋จผ์ ์ค๊ณํ ERD์ API ๋ช
์ธ์๋ฅผ ํตํด์ Entity ํ์ธ๊ณผ API path๋ฅผ ํ์ธํ๋ค.
์ค๊ณํ Entity๋ฅผ ํ์ธ์ ํ ์ดํ, ํ๋์ ๊ฒ์๊ธ ์กฐํ์ ํ์ํ Dto๋ฅผ ์์ฑํ๋ค.
์์ฑ๊ณผ๋ ๋ค๋ฅด๊ฒ RequestDto๊ฐ ์๋ DataBase์ ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ์์
์ ์ํด ResponseDto
์ผ๋ก ํด๋์ค๋ฅผ ๋ง๋ค์๋ค.
public class BoardResponseDto {
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class ReadOneBoardResponseDto {
private Long boardId;
private String title;
private String content;
private CategoryBoard categoryBoard;
private String memberNickname;
private String memberEmail;
private Long boardCnt;
private Long likeCnt;
private LocalDateTime deadLine;
}
}
BoardResponseDto ํด๋์ค๋ฅผ ์์ฑํ์ฌ Inner Class์ธ ReadOneBoardResponseDto๋ฅผ ์์ฑํ์ฌ ๊ฒ์๊ธ ์กฐํ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ DTO๋ฅผ ๊ตฌํํ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒ์๊ธ์์ ๋ณด์ฌ์ง ํ์์ ์ ๋ณด๋ก ํ์์ ์ ๋ณด์ธ ๋๋ค์๊ณผ ์ด๋ฉ์ผ์ ์ฌ์ฉํด์ฃผ๊ธฐ ์ํด์ ๋ณ๋์ memberNickName๊ณผ memberEmail์ ์ปฌ๋ผ๊ฐ์ ์ถ๊ฐํด์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ ์์ฑ๋ ๊ฒ์๊ธ์ ๋ถ๋ฌ์ค๊ธฐ ์ ์ Repository class์์ ์ญ์ ๋์ง ์์ boardId ๊ฐ๋ง ์กฐํํ ์ ์๋๋ก ํด์ฃผ๊ธฐ ์ํด BoardRepository ์ธํฐํ์ด์ค์ findByBoardIdAndDeletedAtIsNull()
๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ฌ ID๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒ์๊ธ์ ์กฐํํ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์๋ค. (SoftDel ์ํฉ์ ๊ณ ๋ คํด์ Null ์ธ Id์ ๊ฐ๋ง ์กฐํํ๋๋ก ๊ตฌ์ฑ)
public interface BoardRepository extends JpaRepository<Board, Long> {
Optional<Board> findByBoardIdAndDeletedAtIsNull(Long boardId);
}
ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ธฐ ์ํ ์์ ์ ๋ง์ณค๋ค, ์ด์ ๋น์ฆ๋์ค ๋ก์ง์ ์์ฑํ๊ธฐ ์ํด์ Service ์ธํฐํ์ด์ค์ Service๊ตฌํ์ฒด ํด๋์ค์์ ํด๋น ๋ก์ง์ ์๋์ ๊ฐ์ด ์์ฑํ๋ค.
public interface BoardService {
//๊ฒ์๊ธ ๋ฑ๋ก ์์ฒญ Method
Board saveBoard(BoardRequestDto.SaveRequestDto requestDto);
// boardId๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ํด๋น ๊ฒ์๊ธ์ ์กฐํํ๋ ๊ธฐ๋ฅ์ Method
BoardResponseDto.ReadOneBoardResponseDto readOneBoard(Long boardId);
}
@RequiredArgsConstructor
@Log4j2
@Service
public class BoardServiceImpl implements BoardService {
private final BoardRepository boardRepository;
private final MemberRepository memberRepository;
// ... (๊ฒ์๊ธ ์์ฑ ๊ด๋ จ ์ฝ๋ ์๋ต)
@Override
public BoardResponseDto.ReadOneBoardResponseDto readOneBoard(Long boardId) {
Board board = boardRepository.findByBoardIdAndDeletedAtIsNull(boardId)
.orElseThrow(() -> new EntityNotFoundException("๊ฒ์๊ธ์ ์ฐพ์ ์ ์์ต๋๋ค."));
// Member information
String memberNickname = board.getMember().getNickname();
String memberEmail = board.getMember().getEmail();
// ๊ฒ์๊ธ ์ ๋ณด์ ๋ฉค๋ฒ ์ ๋ณด๋ฅผ ๋งคํํด์ ์๋ต
BoardResponseDto.ReadOneBoardResponseDto responseDto =
BoardResponseDto.ReadOneBoardResponseDto.builder()
.boardId(board.getBoardId())
.title(board.getTitle())
.content(board.getContent())
.categoryBoard(board.getCategoryBoard())
.memberNickname(memberNickname)
.memberEmail(memberEmail)
.boardCnt(board.getBoardCnt())
.likeCnt(board.getBoardCnt())
.deadLine(board.getDeadLine())
.build();
return responseDto;
}
}
๋ง์ง๋ง์ผ๋ก ์์ฑํ Service๋ฅผ ๋์ํ Controller ํด๋์ค๋ฅผ ์์ฑํด์ฃผ์๋ค.
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/board")
public class BoardController {
private final BoardService boardService;
// ... (๊ฒ์๊ธ ์์ฑ ๊ด๋ จ ์ฝ๋ ์๋ต)
@GetMapping("/{boardId}")
public ResponseEntity<Object> readOneBoard(@PathVariable Long boardId) {
BoardResponseDto.ReadOneBoardResponseDto boardResponseDto = boardService.readOneBoard(boardId);
// ์๋ต ๋ฐ์ดํฐ ์์ฑ
Map<String, Object> response = new HashMap<>();
response.put("code", 200);
response.put("msg", "success");
// ๊ฒ์๊ธ ์ ๋ณด
response.put("data", boardResponseDto);
return ResponseEntity.ok(response);
}
}
์ด๋ฒ ์คํ๋ฆฐํธ๋ ํธ๋ฌ๋ธ ์ด์์์ด ์ด๋ ต์ง ์๊ฒ Read ์์ ์ ์งํ ํ ์ ์์๋ค.
ํ์์ ๋ฆฌ๋ทฐ ์ฌํญ์ผ๋ก Controller์ ์์ฑ๋ response ๋ฐํ ๋ฐฉ๋ฒ์ ๊ฐ๋
์ฑ์ด ์ข์ ๋ฐฉ๋ฒ์ผ๋ก ๋ฉ์๋ ์ฒด์ด๋
์ด๋ผ๋ ์ฉ์ด๋ฅผ ์๊ฒ ๋์๋ค.
๋ฉ์๋ ์ฒด์ด๋ : ๋ฉ์๋๋ฅผ ๊ณ ๋ฆฌ๋ง๋ฅ ์ค์ค์ด ์ต์ด์ ๋ฉ์๋๋ฅผ ๊ณ์ํด์ ์ฌ์ฉํ ์ ์๊ฒ๋ ํ๋ ๋ฐฉ๋ฒ
ok(response)
์๋ต ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก ํฌํจํด์ ๋ฐํํ์์ง๋ง, ok().body(response)
๋ก ๋ช
์์ ์ธ ๋ฐฉ๋ฒ์ ์ค ์ ์๋ค๋ ๊ฒ์ ์๊ฒ๋์๋ค.
ํ์ง๋ง, ํ์ฌ๋ ok(response) ์ ok().body(response)๋ ์ฝ๋๋ฅผ ์ฝ๊ณ ํด์ํ ๋ ํฐ ์ฒด๊ฐ์ ๋ชป ๋๊ผ๊ธฐ ๋๋ฌธ์ ์์ง์ ์์ ์์ ์ ํ์ง ์์๋ค.