토이 프로젝트를 진행하던 중..
특정 board를 작성한 member만 접근 가능할 수 있게 하는 기능이 필요해서 member 엔티티와 board 엔티티 사이의 관계를 맡는 엔티티의 존재가 필요했다.
반대로 특정 member가 작성한 board를 조회하는 방법으로도 사용될 수 있다고 생각해서 바로 만들어 보기로 했다.

Member와 Board 사이의 관계를 나타내는 BoardCreation은 고유 식별자인 boardCreation_id를 갖고 Member과 Board의 기본키를 참조한다.
public void write(BoardRequestDto requestDto, Long memberId){
Board board = requestDto.toEntity();
enrollBoardCreation(board, memberId);
boardRepository.save(board);
}
public void enrollBoardCreation(Board board, Long memberId){
Optional<Member> member = memberRepository.findById(memberId);
if(member.isPresent()) {
BoardCreation boardCreation = BoardCreation.builder()
.member(member.get())
.board(board)
.build();
boardCreationRepository.save(boardCreation);
}
}
이렇게 board를 DB에 저장하기 전에 boardCreation으로 멤버-작성한 글 간의 관계를 먼저 저장하려고 했다.
그런데 enrollBoardCreation을 수행하던 중 아래와 같은 오류가 발생했다.
TransientPropertyValueException
구글링 결과 원인은 영속성에 관련한 오류라고 한다.
내 경우에는 boardCreation은 member의 기본키와 board의 기본키를 참조한다.
member는 로그인을 했으니 당연히 DB에 저장돼 있을터...board가 문제였다.
board가 생성되긴 했지만 boardRepository.save 되지가 않아 DB에는 내가 생각한대로 board가 저장이 되지 않은 것이다.
그러면 해결법은 board가 먼저 DB에 저장된 다음 DB에 저장된 board를 참조해야한다.
public void write(BoardRequestDto requestDto, Long memberId){
Board board = requestDto.toEntity();
boardRepository.save(board);
//board가 먼저 저장되도록 코드 위치 변경
enrollBoardCreation(board, memberId);
}
public void enrollBoardCreation(Board board, Long memberId){
Optional<Member> member = memberRepository.findById(memberId);
if(member.isPresent()) {
BoardCreation boardCreation = BoardCreation.builder()
.member(member.get())
.board(board)
.build();
boardCreationRepository.save(boardCreation);
}
}
간단하게 코드 위치만 변경해서 오류를 해결하고 boardCreation이 DB에 정상적으로 저장된 것을 확인했다.

sdf