[TIL 28] 간단한 게시판 구현하기_Spring#4

돗치·2024년 3월 19일

Spring으로 게시판 구현하기#4

수정

Board와 Post는 1:N관계이다.
이를 연결하기 위해 BoardEntity에 적용을 시켜보자.

Board는 여러개의 PostEntity를 가질 수 있다.
private List<PostEntity> postList = List.of(); 를 작성해보자. Entity 안에 변수가 있으면 얘는 column으로 보게 된다. 그래서 @OneToMany로 Mapping을 시켜주도록 할 것 이다.
@OneToMany는 1:N을 뜻한다. 여기서 1은 Board, N은 PostEntity가 된다.

N은 어떻게 설정해주는가?
@OneToMany()에서 괄호 안에 mappedBy에 boardEntity를 적는다.

    @OneToMany(
            mappedBy = "board"
    )

변수 board는 어디에 있느냐, PostEntity에 가면 해당 변수가 있어야한다. PostEntity 즉, mappedby에 해당되는 게 있어야한다.
postEntity에 boardId를

    @ManyToOne
    @JsonIgnore
    private BoardEntity board;

로 변형한다. 이렇게 연결하면 1:N으로 연결이 되는 것이다.
@ManyToOne을 쓰면 여기는 N이고 상대는 1이라는 것이 적용된다.

board를 select하면 여기에 달린 postEntity가 다시 내려오게 된다.
그럼 변경에 따른 postService도 변경을 해주자.
private final BoardRepository boardRepository;
var boardEntity = boardRepository.findById(postRequest.getBoardId()).get(); 을 추가하고

.boardId.board(boardEntity)로 변경한다.

정상적으로 매칭이 돼서 실행이 된다.

이번엔 Controller랑 Service에 view를 추가해주자

    @GetMapping("/id/{id}")
    public BoardEntity view(
            @PathVariable Long id
    ){
        return boardService.view(id);
    }
    public BoardEntity view(Long id) {
        return boardRepository.findById(id).get();
    }

Api Tester에서 http://localhost:8080/api/board/id/1 로 GET 에 SEND해보자
1게시판에 어떤 글들이 있는지 나온다.

board_id 가 내려오지 않으니 코드를 수정해주자.

DTO와 converter라는 것을 만들어줄 것이다.
BoardDto

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class BoardDto {

    private Long id;

    private String boardName;

    private String status;

    private List<PostDto> postList = List.of();
}

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class PostDto {

    private Long id;

    private Long boardId;

    private String userName;
    private String password;
    private String email;
    private String status;
    private String title;

    private String content;

    private LocalDateTime postedAt;

}

Controller랑 서비스도 Dto로 바꿔주자

    @GetMapping("/id/{id}")
    public BoardDto view(
            @PathVariable Long id
    ){
        return boardService.view(id);
    }

BoardService

@Service
@RequiredArgsConstructor
public class BoardService {
    private final BoardRepository boardRepository;
    private final BoardConverter boardConverter;

    public BoardDto create(
            BoardRequest boardRequest
    ){
        var entity = BoardEntity.builder()
                .boardName(boardRequest.getBoardName())
                .status("REGISTERED")
                .build();
        var saveEntity = boardRepository.save(entity);
        return boardConverter.toDto(saveEntity);
    }

    public BoardDto view(Long id) {
        var entity = boardRepository.findById(id).get();
        return boardConverter.toDto(entity);
    }
}

BoardConverter


@Service
public class BoardConverter {

    private final PostConverter postConverter;

    public BoardConverter(PostConverter postConverter) {
        this.postConverter = postConverter;
    }


    public BoardDto toDto(BoardEntity boardEntity){
        var postList = boardEntity.getPostList().stream()
                .map(postConverter::toDto)
                        .collect(Collectors.toList());

        return BoardDto.builder()
                .id(boardEntity.getId())
                .boardName(boardEntity.getBoardName())
                .status(boardEntity.getStatus())
                .postList(postList)
                .build();
    }
}

PostConverter

@Service
@RequiredArgsConstructor
public class PostConverter {
    public PostDto toDto(PostEntity postEntity) {

        return PostDto.builder()
                .id(postEntity.getId())
                .userName(postEntity.getUserName())
                .status(postEntity.getStatus())
                .email(postEntity.getEmail())
                .password(postEntity.getPassword())
                .title(postEntity.getTitle())
                .content(postEntity.getContent())
                .postedAt(postEntity.getPostedAt())
                .boardId(postEntity.getBoard().getId())
                .build();
    }
}


boardid까지 잘 내려오는 걸 확인할 수 있다.

0개의 댓글