개발일지

[프로젝트일지 - 에러 해결] JPA 연관관계 맵핑 문제 오류 feat.클래스 이름 바꿀 때는 조심 또 조심!

2023. 5. 27. 02:08
목차
  1. 상황
  2. 어플리케이션 실행 오류
  3. 문제의 원인
  4. 수정한 결과

상황

  • 원래의 애플리케이션은 잘 실행되었다. 하지만 기존 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탄  (2) 2023.06.08
[리팩토링] 투두리스트 다크모드 코드 개선하기 feat. react  (1) 2023.06.06
[TIL] Cloud 배포에 대해서 feat. 코드스테이츠, AWS  (0) 2023.05.25
[QnA 게시판 오류일지 - 1] 질문 등록을 위한 HTTP post 요청시 응답 오류 코드 500 해결하기  (3) 2023.05.15
[KPT] Section3를 마치며 돌아보는 KPT 회고 feat.코드스테이츠  (1) 2023.05.09
  1. 상황
  2. 어플리케이션 실행 오류
  3. 문제의 원인
  4. 수정한 결과
'개발일지' 카테고리의 다른 글
  • [솔로 프로젝트] TodoList Test 작성 및 API 문서화 하기 1탄
  • [리팩토링] 투두리스트 다크모드 코드 개선하기 feat. react
  • [TIL] Cloud 배포에 대해서 feat. 코드스테이츠, AWS
  • [QnA 게시판 오류일지 - 1] 질문 등록을 위한 HTTP post 요청시 응답 오류 코드 500 해결하기
벤지_
벤지_
디자인 전공의 비전공자에서 개발자로 거듭나는 이야기를 담고자 합니다.
벤지_
벤지의 개발일지
벤지_
전체
오늘
어제
  • 분류 전체보기 (42)
    • 개발일지 (42)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 리플렉션 api
  • 개발일지
  • JPA
  • 프론트엔드
  • 데이터베이스
  • 테스트
  • 리액트
  • 스프링
  • 부트캠프
  • 자바스크립트
  • SpringRESTDocs
  • AWS
  • KPT회고
  • 백엔드
  • java
  • React
  • 자바
  • 투두리스트
  • JavaScript
  • 국비지원
  • map
  • JUnit
  • 코드스테이츠
  • SQL
  • Set
  • 화살표 함수
  • 프리프로젝트
  • til
  • 배포
  • Spring

최근 댓글

최근 글

hELLO · Designed By 정상우.
벤지_
[프로젝트일지 - 에러 해결] JPA 연관관계 맵핑 문제 오류 feat.클래스 이름 바꿀 때는 조심 또 조심!
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.