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까지 잘 내려오는 걸 확인할 수 있다.