230720_ JPA

hoy_·2023년 7월 20일
0

Today, I Learned

목록 보기
32/36

1. 오늘의 일정

  1. 팔로잉/팔로우 리스트 구현

  2. 팀원 미팅, 프론트 구상




2. 배운 내용

  1. Oracle, mySQL과 같은 관계형 데이터베이스(RDB)에서 JSON 형태로 데이터를 저장하는 것은 비효율적이다. 데이터의 독립성이 높고 구조를 자유롭게 변경할 수 있는 것이 RDB의 장점인데, JSON 형태의 경우 이 장점을 살릴 수 없다.

  2. 반드시 entity간의 참조가 필요한 것은 아니다. 관리 포인트가 늘어나기 때문에 양방향 연관관계를 지양하는 것처럼, 테이블 간의 관계 설정을 정하는 것은 굉장히 조심스러운 일이다. 테이블을 사용할 때 대부분의 로직이 겹치는 경우에만 Join해주는 것이 좋다.




3. 발생한 오류

  1. 테이블 구조를 변경하며 코드에 대격변이 있었다. 기존에 해결하지 못했던 오류도 있고 이번에 새롭게 생긴 오류도 많았는데 그중 가장 많은 비중을 차지했던 게 테이블과 쿼리문에서 발생했다.
org.hibernate.query.QueryTypeMismatchException: Specified result type [com.sarida.logtown.entity.User] did not match Query selection type [com.sarida.logtown.entity.Follow] - multiple selections: use Tuple or array
	at org.hibernate.query.spi.AbstractSelectionQuery.throwQueryTypeMismatchException(AbstractSelectionQuery.java:352) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
	at org.hibernate.query.spi.AbstractSelectionQuery.verifyResultType(AbstractSelectionQuery.java:342) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
	at org.hibernate.query.spi.AbstractSelectionQuery.checkQueryReturnType(AbstractSelectionQuery.java:290) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
	at org.hibernate.query.spi.AbstractSelectionQuery.visitQueryReturnType(AbstractSelectionQuery.java:232) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
	at org.hibernate.query.sqm.internal.QuerySqmImpl.<init>(QuerySqmImpl.java:263) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
	at org.hibernate.internal.AbstractSharedSessionContract.createCriteriaQuery(AbstractSharedSessionContract.java:1343) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
	at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:1304) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
	at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:120) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]

타입 불일치 오류. 이것 외에도 다양한 에러와 만났다.


해결

  1. 테이블에서 발생했던 에러는 하나의 테이블로 두 번의 참조를 하려고 해서 생긴 문제였다. 참조 자체를 하지 않는 것으로 구조를 변경하여 해결했지만 원래 불가능한 방법인지 join을 잘못 걸어준 건지는 추가적인 확인이 필요하다.
    entity에서 문제가 발생하면 서버가 죽어버리기 때문에 확인하기가 참 힘들다.

  2. 다른 테이블의 타입으로 쿼리를 날려 타입 불일치 에러가 발생했다. 커스텀 쿼리를 날려주는 것으로 해결했다.
 //	List<User> findAllByFromUser(String username); => 타입 불일치
  @Query(value = "select a from Follow f INNER JOIN User a ON f.toUser = a.username where f.fromUser = :username")
  List<User> findAllByFromUser(@Param("username") String username);



4. 앞으로의 나는

  1. 프론트 구상 및 구현(Figma 다시 만들기)
  2. 전체적인 병합 및 테스트, 시간이 된다면 팔로잉/팔로우 카운트 표시 추가
profile
배우는 사람

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

유익한 글 잘 봤습니다, 감사합니다.

답글 달기