Notion Link

 

www.notion.so/Repository-Interface-Respoitory-6d78269d33d54e828ffb219153965eb7

 

Repository Interface에 @Respoitory가 없는 이유

@Repository 는 컴포넌트 스캔 뿐만이 아니라 JPA의 예외를 스프링에서 공통적으로 처리할수있는 예외로 변환하는 기능도 포함되어 있다.

www.notion.so

 

 

  • @Repository 는 컴포넌트 스캔 뿐만이 아니라 JPA의 예외를 스프링에서 공통적으로 처리할수있는 예외로 변환하는 기능도 포함되어 있다.

  • @Repository 를 생략가능한 이유는 컴포넌트 스캔을 스프링 데이터 JPA가 자동으로 처리해준다.

    • @EnableJpaRepositories 이 어노테이션이 그역할을 수행하고
      • 또 jpaRepository에 대한 설정정보를 자동으로 로딩함.
    • 부트는 EnableJpaRepositories 이 자동적용 되어있기 때문에 따로 할 필요가 없음.
  • 위에서 말한 JPA 예외를 스프링 예외로 변환하는 과정도 스프링 데이터 JPA가 자동으로 처리해준다.

 

 

참고

 

인프런 강의 - 김영한 실전 스프링 데이터 JPA

https://engkimbs.tistory.com/821

'개발 > jpa' 카테고리의 다른 글

post 와 comment 내가 선택한 출력 방식  (0) 2020.06.02
JPA  (0) 2020.03.03

post 엔티티에는 OneToMany List타입의 comments 필드가 있고

comment 엔티티 에는 ManyToOne Post타입의 필드가 있다.

 

comments 필드에는 mappedBy post가 걸려있다.

 

comment 엔티티에는 대댓글을 위한 selfjoin이 걸려있고

OneToMany List<Comment> 타입의 childList 필드와 ManyToOne comment 타입의 parent 필드가 양방향으로 걸려있고

 

단방향으로는 Comment 타입의 group 필드가 있다.

 

이렇게 연관관계 설정이 되어있고 댓글과 대댓글을 표현하기위한 group 필드와 parent 필드 childList필드가 있다.

 

뷰에서 depth가 0인 댓글들을 보여주고

그 밑의 댓글들은 childList에서 가져다가 뿌려주는 방식으로 처음 가닥을 잡았다.

 

그래서 처음에는 post 엔티티에서 가져다가

comments 필드안에 있는 튜플들의 각각의 childList를 가져다가 뽑아줄려고 했으나

 

문제가 발생

Hibernate MultipleBagFetchException

(OneToMany 또는 ManyToMany 를 설정한 필드를 동시에 가져오려고 시도하면 나타나는 에러)

 

해결책은 List 타입을 Set 타입으로 변경하면 에러가 사라짐.

 

이외 에도 entitygraph를 사용하고  fetch join 시 조건을 줄수 없으므로 

필드위에 @Where과 @OrderBy를 사용해서 쿼리를 만들었으나

 

가져오는 쿼리 where로 따로 가져오는 쿼리 orderby 정렬하는 쿼리 가 발생하여

총3번의 쿼리가 발생함.

 

그래서 그냥 comment 엔티티에서 값을 가져와서 뿌려주는 방식으로 변경

포스트 와 코멘트 2번 가져오는 쿼리로 변경.

 

그냥 querydsl로 뽑을때 nested하게 뽑으면 되는 상황이였다.

 

 

 

'개발 > jpa' 카테고리의 다른 글

Repository Interface에 @Respoitory가 없는 이유  (0) 2020.08.15
JPA  (0) 2020.03.03

Hibernate

 

1. dialect (hibernate 전용옵션)

 

각 데이터베이스 벤더마다 문법들이 다르기 때문에 어떤 데이터베이스를 사용하는지 설정하면

jpa가 적용해서 알아서 맞춰줌

 

h2 : org.hibernate.dialect.H2Dialect

 

oracle 1xg : org.hibernate.dialect.Oracle1xgDialect

 

Mysql : org.hibernate.dialect.MySQL5Dialect

 

 

 

 

 

'개발 > jpa' 카테고리의 다른 글

Repository Interface에 @Respoitory가 없는 이유  (0) 2020.08.15
post 와 comment 내가 선택한 출력 방식  (0) 2020.06.02

+ Recent posts