[Proj. SARAMARA] ๐Ÿ“ ๊ฐœ๋ฐœ์ผ์ง€ 3

IToriginalยท2023๋…„ 7์›” 9์ผ
0

๋‚จ์ •๋„ค๋“ค: SARAMARA Service DEV.

๋ชฉ๋ก ๋ณด๊ธฐ
3/3
post-thumbnail

์ด๋ฒˆ ์ฃผ์ฐจ์—์„œ๋Š” ์ž‘์„ฑ๋œ ๊ฒŒ์‹œ๊ธ€์—์„œ ๊ฒŒ์‹œ๊ธ€์„ ๋ˆŒ๋ €์„ ๋•Œ ํ•ด๋‹นํ•˜๋Š” ๊ฒŒ์‹œ๊ธ€์˜ ์ •๋ณด๋ฅผ ๋ฑ‰์–ด์ฃผ๊ธฐ ์œ„ํ•œ 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๊ตฌํ˜„์ฒด ํด๋ž˜์Šค์—์„œ ํ•ด๋‹น ๋กœ์ง์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ๋‹ค.

BoardService interface

public interface BoardService {

    //๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก ์š”์ฒญ Method
    Board saveBoard(BoardRequestDto.SaveRequestDto requestDto);

    // boardId๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์„ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์˜ Method
    BoardResponseDto.ReadOneBoardResponseDto readOneBoard(Long boardId);
}

BoardServiceImpl class

@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 ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.

BoardController

@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 ์ž‘์—…์„ ์ง„ํ–‰ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

fix.(์ด๋ฏธ์ง€ ์ˆ˜์ •) API Path ๊ฒฝ๋กœ๋Š” Meeting์„ ํ†ตํ•ด ์ˆ˜์ •๋˜์–ด ์ด๋ฏธ์ง€์˜ Path์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
์ˆ˜์ • ์™„๋ฃŒ Path: http://localhost:80/api/v1/board/{boardId}
๐Ÿš€ ํŒ€์›์˜ Review


ํŒ€์›์˜ ๋ฆฌ๋ทฐ ์‚ฌํ•ญ์œผ๋กœ Controller์— ์ž‘์„ฑ๋œ response ๋ฐ˜ํ™˜ ๋ฐฉ๋ฒ•์— ๊ฐ€๋…์„ฑ์ด ์ข‹์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹์ด๋ผ๋Š” ์šฉ์–ด๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

๋ฉ”์„œ๋“œ ์ฒด์ด๋‹ : ๋ฉ”์†Œ๋“œ๋ฅผ ๊ณ ๋ฆฌ๋งˆ๋ƒฅ ์ค„์ค„์ด ์—ต์–ด์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ณ„์†ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ํ•˜๋Š” ๋ฐฉ๋ฒ•

ok(response) ์‘๋‹ต ๊ฐ์ฒด๋ฅผ ๋ฐ”๋กœ ํฌํ•จํ•ด์„œ ๋ฐ˜ํ™˜ํ–ˆ์—ˆ์ง€๋งŒ, ok().body(response)๋กœ ๋ช…์‹œ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ํ˜„์žฌ๋Š” ok(response) ์™€ ok().body(response)๋Š” ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ํ•ด์„ํ•  ๋•Œ ํฐ ์ฒด๊ฐ์„ ๋ชป ๋А๊ผˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„์ง์€ ์ˆ˜์ • ์ž‘์—…์€ ํ•˜์ง€ ์•Š์•˜๋‹ค.

profile
๐Ÿ‘พISTP์˜ ๊ฐœ๋ฐœ์ž ๋„์ „๊ธฐ๐Ÿง

0๊ฐœ์˜ ๋Œ“๊ธ€

Powered by GraphCDN, the GraphQL CDN