상세 컨텐츠

본문 제목

Board

백엔드 공부진행도/연습 코드

by myeongjaechoi 2024. 11. 20. 16:40

본문

게시판
- 글 작성
- 글 수정
- 글 삭제
- 글 조회
-> 조회수
- 글 목록 (페이징)
-> 제목, 생성일, 글 번호(boardId), 조회수
- 좋아요 기능
댓글
- 작성
- 수정
- 삭제
- 조회

로그인 / 로그아웃
-> (세션 or 쿠키) + jwt

회원 가입 
———————————
사용기술 

-필수

spring boot 3.x
spring data jpa
spring security 

session or cookie

rest api

jwt
h2
vaildator -> request dto에서 유효성 검사하기

git / github

-선택
query dsl, junit5(테스트 코드), spring rest docs
——————————————

조건
1. http 상태 코드 정확하게 사용하기
2. session or cookie의 차이 이해하고 왜 썻는지 문서
3. api 문서화 -> 스웨거
4. api restful 조건 지키기
5. 자바(클래스, 메소드, 변수) 네이밍 규칙 정확히 지키기
6. 예외처리 정확한 익셉션 사용
-> 자바 기본 익셉션이 애매하면 커스텀 익셉션 사용
7. 구글 무지성 복붙 금지 -> 왜 이렇게 되는지 이해하기
8. jpa 양방향 연관관계 금지 -> 왜 양방향 안 하는지 조사하기
9. 한 메소드는 하나의 행위만 실행
10. 무분별한 setter, getter 지양
-> setter는 금지
11. 지피티 복붙 금지
12. 자신이 복붙 or 작성한 코드에 대해 이해가 없다면 사용 금지
13. 트렌젝션 스크립트 금지

*같은 일을 3번이상 반복하면 이건 뭔가 잘 못 되었다. 같은 일 
3번이상 반복하지 않기* => 코드의 중복 최소화

 

라는 과제를 최대한 해결할 예정이다. 

해당 github 주소는https://github.com/myeongjaeking/Board/tree/main 이다.

@OneToMany와 @ManyToOne을 사용하면서 @ManyTOMany를 사용하지 않으면 양방향이 아닌줄 알았는데, @ManyToOne 또는 @OnetoMany로 한 번만 연결해줘야 단방향인 걸 처음 알았다. 평상시 하드코딩만 하기 때문에, 객체지향적으로 짜는 것도 연습하고 실전에서 급할 때도 객체지향적으로 짤 수 있게 연습하는 것이다. 

글 목록 페이징할 때, 어차피 글 조회하면 해당 글의 정보가 다 들어가야돼서 이 정보들을 다 Page로 넘기고 프론트에서 처리하면 되지않나? 라고 생각했지만, 

@Builder
public record BoardGetResponse(
        String title,
        String content,
        LocalDate createBoard,
        int viewCount,
        int likeCount
) {

}
@Builder
public record BoardPageResponse (
        String title,
        Long id,
        LocalDate createBoard,
        int viewCount
){
}

언제 어디서 값이 변할지 모르는 상황이기 때문에 항상 따로따로 만들어주고, 나중에 수정사항이 있으면 최대한 기존코드는 건들지 않게 하기위해 나누어서 사용했다.

Response는 @Builder와 record를 사용하였고, Request는 @Builder를 사용할 필요가 없었다. 왜냐하면 정보를 받는 것이기 때문이다. Paging도 처음해봤는데, jpa pagable이 있어서 어려운 것 없었다.

public Page<BoardPageResponse> getList(int page){
    List<Sort.Order> sorts = new ArrayList<>();
    sorts.add(Sort.Order.desc("createBoard"));
    Pageable pageable = PageRequest.of(page,5,Sort.by(sorts));
    Page<Board> boards = boardRepository.findAll(pageable);
    Page<BoardPageResponse> boardPageResponses = boards.map(board ->
            new BoardPageResponse(
                    board.getTitle(),
                    board.getId(),
                    board.getCreateBoard(),
                    board.getViewCount()
            ));
    return boardPageResponses;
}

처음에 boards를 boardPageResponse에 for문을 사용해서 담았었는데, map으로 하면 더 직관적이고 유지보수가 쉽다고 배웠다.(함수형 프로그래밍) postman에서 확인하고 싶은데, PathVariable을 안 쓰고 int page를 어떻게 사용하나 고민이 있었는데, 찾아보니 

@GetMapping("/boarList")
public ResponseEntity<Page<BoardPageResponse>> pasing(@RequestParam(value="page", defaultValue="0") int page){

    return ResponseEntity.ok(this.boardService.getList(page));
}

postman

쿼리 파라미터를 사용하여 잘 작동하는 것을 확인할 수 있었다.

관련글 더보기