상황
- 원래의 애플리케이션은 잘 실행되었다. 하지만 기존 Qna 엔티티와 Reply 엔티티의 클래스명을 생각해봤을 때 너무 모호하다는 생각을 했다. 왜냐면 Qna 사실 질문과 답변이라는 말을 아우르고 있고 Reply는 답변도 되지만 사실은 댓글이라는 느낌이 강했다. 그래서 Qna -> QnaQuestion 으로 Reply -> QnaAnswered 라는 이름으로 변경하고자 했다.
- Qna 엔티티 이름을 QnaQuestion으로 인텔리제이의 Refactor 기능을 활용해서 변경했다.
- 하지만 그 이후 애플리케이션을 실행할 때 오류가 난다.
어플리케이션 실행 오류
org.springframework.beans.factory.BeanCreationException: Error creating
bean with name 'entityManagerFactory' defined in class path resource
[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]:
Invocation of init method failed; nested exception is
org.hibernate.AnnotationException: Unknown mappedBy in:
com.codestates.qnaBoardProject.board.entity.QnaQuestion.qnaAnswered,
referenced property unknown:
com.codestates.qnaBoardProject.board.entity.QnaAnswered.qna
오류 내용을 분석해봤을 때 H2 메모리에 JPA가 엔티티들을 통해서 테이블을 생성하고 데이터를 구성하려고 하는데 mapping이 제대로 되지 않은 것들이 있는 것 같다. 아마 Qna → QnaQuestion 으로 이름을 바꾸고 하면서 엔티티간의 연관관계 맵핑 부분을 손봐줘야될 것 같다
문제의 원인
질문과 답변의 연관관계 맵핑에서 문제가 있었다. 인텔리제이에서 제공하는 refactor 기능을 이용하면 매개변수나 변수로 선언된 다른 클래스의 모든 이름을 다 바꿀 수 있다. 하지만 @OneToOne 과 같은 애노테이션에 들어간 맵핑이름은 바꾸지 못한 것.. 코드로 확인해보자
// 기존 코드
public class QnaAnswered {
...
@OneToOne
@JoinColumn(name = "QNA_ID")
private QnaQuestion qnaQuestion;
...
}
public class QnaQuestion {
...
@OneToOne(mappedBy = "qna")
private QnaAnswered qnaAnswered;
...
}
위의 코드를 보면 질문과 답변이 서로 1:1 관계로 맵핑이 되어 있다. 여기서 QnaQuestion 클래스의 maapedBy 를 보면 qna로 되어있다. 이 mappedBy가 굉장히 헷갈리기 좋은데 사실 이렇게 생각하면 좋다. “나와 연관관계를 맺고 있는 클래스가 나를 참조할 때 정해놓은 필드명” 지금 QnaAnswered 에서는 원래는 qna 였지만 인텔리제이의 Refactor로 인해 qnaQuestion으로 바뀌어 있는 상황이다.
그러니 저 QnaQuestion 클래스에 있는 mappedBy를 답변 클래스가 나를 참조하는 필드명인 qnaQuestion 으로 바꿔 주어야 한다.
// 변경한 코드
public class QnaAnswered {
...
@OneToOne
@JoinColumn(name = "QNA_ID")
private QnaQuestion qnaQuestion;
...
}
public class QnaQuestion {
...
@OneToOne(mappedBy = "qnaQuestion")
private QnaAnswered qnaAnswered;
...
}
수정한 결과
✨성공! 예상대로 애플리케이션이 잘 실행 되었다. 사실 처음에는 깃으로 시간여행을 해서 전 커밋으로 돌아갈까 생각도 했었다. 뭔가 에러가 크게 보였기 때문이다. 하지만 이 에러를 이렇게 회피하면 다음에 이러한 일이 있을 때 또 해결하지 못할 수 있으니 한번 되는 데까지 해결해보자는 마음으로 찬찬히 에러메세지 부터 봤는데 역시 겁먹지 않고 처음부터 에러메세지를 잘 분석해서 찾아가보면 답이 나온다. 앞으로도 에러에 너무 겁먹지 말고 하나 하나 차근차근 디버깅해가며 해결하는 재미를 맛봐야겠다
'개발일지' 카테고리의 다른 글
[솔로 프로젝트] TodoList Test 작성 및 API 문서화 하기 1탄 (0) | 2023.06.08 |
---|---|
[리팩토링] 투두리스트 다크모드 코드 개선하기 feat. react (1) | 2023.06.06 |
[TIL] Cloud 배포에 대해서 feat. 코드스테이츠, AWS (0) | 2023.05.25 |
[QnA 게시판 오류일지 - 1] 질문 등록을 위한 HTTP post 요청시 응답 오류 코드 500 해결하기 (0) | 2023.05.15 |
[KPT] Section3를 마치며 돌아보는 KPT 회고 feat.코드스테이츠 (1) | 2023.05.09 |