반응형

JPA 8

[JPA] Fetch Join 이란? N+1 이란? fetch join을 사용하는 이유

JPA를 사용하면서 엄청 중요하다고 하는 fetch join에 대해서 간략하게 정리해 두려고한다. 모르고 남발하는 코드를 지양하자. Fetch Join이란? Fetch Join은 JPQL의 중요한 기능이다. 성능최적화를 위해 사용하는데, LazyLoading으로 설정되어있는 아이들을 Eager로딩으로 땡겨올수있는 쿼리를 만든다. 즉 연관된 엔티티나 컬렉션을 SQL 한번에 조회하는 기능이라고 보면될것같다. => 쿼리가 2번 날아갈 상황을 쿼리 1번으로 조회할 수 있게 해준다. SQL에는 없는 문법 => 지연로딩으로 설정했어도 fetch join을 사용하면 eager과 같이 동시에 조회하게 된다. (프록시가 아닌 실제 Entity이다) 예제로 회원과 팀을 함께 조회하고 싶은 상황에 맞추어 확인해보자. SQL..

JPA

[JPA] 상속관계 매핑 전략이란? @Inheritance, @DiscriminatorColumn이란?

상속관계 매핑이란? 객체는 상속관계가 존재하지만 관계형 데이터베이스에는 존재하지 않는 개념이다. 객체의 상속관계를 관계형 데이터베이스의 슈퍼타입/서브타입 관계를 매핑하는것..! 그렇다면 논리 모델을 물리 모델로 어떻게 구현할 수 있을까? JPA 입장에서는 간단하게 매핑전략만 선택하면 DB입장에서 봤을때 3가지 방식으로 구현할 수 있다. @Inheritance(strategy=InheritanceType.전략) -> default 전략은 SINGLE_TABLE(단일테이블 전략)이다. -> 전략종류 : 1). SINGLE_TABLE : 단일테이블에 한번에 모든 정보를 다 담는 전략. 위의 사진에 따르면 ALBUM / MOVIE / BOOK 별도의 테이블에 데이터를 저장한다. 2). JOINED : 각각의 테..

JPA

[JPA] @Embedded @Embeddable 이란? 예제

JPA에서는 Entity 내부의 값을 더 응집시켜 객체로 데이터를 표현한다. JPA를 사용하면서 자주 보게되는 @Embedded와 @Embeddable 어노테이션을 한번 살펴보자. 회원가입을 생각하여 간단한 코드로 확인해보도록 하자. @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name="user_id") private Long id; private String name; private String phoneNum; private String zipCode; private String address; private String addressDetail; ..

JPA

[JPA] No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer 오류

오류코드 : [JPA]No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer 문제점 : ManyToOne의 Fetch전략을 Lazy로 사용했을때 발생하는 문제점. Lazy옵션은 필요가 없을때는 물려있는 친구를 조회해 오지않기 때문에, 비어있는 객체를 Serialize 하려고하니 발생하는 문제인것 같다. 해결방법 : 세가지 정도 있다고 하는데, 차근차근 알아봐야겠다. (수정예정) 1). application파일에 spring.jackson.serialization.fail-on-empty-beans-false 를 ..

JPA

[JPA] 관계 매핑 기초 정리

연관관계 매핑을 정리해두고, JPA에서는 어떻게 사용하는지 정리해 두려고 한다. 방향 : 회원/팀 기준 단방향 : 회원 → 팀 or 팀 → 회원 둘 중 한 쪽만 다른쪽을 참조하는 관계 양방향 : 회원 → 팀, 팀 → 회원 둘이 서로를 참조하는 관계 다중성 1:1 (일대일) 1:N (일대다 혹은 다대일) N:M (다대다) 연관관계의 주인 : 양방향 연관관계를 만들 때 연관 관계의 주인을 정해야 한다. => 누가 주인인지 꼭 필요. 단방향 : 회원은 하나의 팀에만 소속될수 있다. => 회원과 팀은 다대일 관계 쿼리를 한번 확인해보자. 회원 중심 조회 SELECT * FROM MEMBER M INNER JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID 팀 중심 조회 SELECT * FROM T..

JPA

[JPA] SpringBoot + JPA @EnableJpaAuditing 이란?

보통 Entity를 기획할때 모든 엔티티에 들어가는 공통 컬럼들이 있다. 예를들어 등록일자, 수정일자 등이 해당되는데, 이때 사용할 수 있는 방법으로 공통Entity를 뽑아내서 사용할때 @EnableJpaAuditing을 사용한다. 1). 공통Entity를 작성하고, 어노테이션을 달아준다. @Getter @MappedSuperclass //공통매핑 정보만 담을 때 사용. Entity가 아닌 공통 컬럼정보만 제공한다. 보통 ID, 등록일, 수정일 정도 @EntityListeners(AuditingEntityListener.class)//JPA에게 해당 Entity는 Auditing기능을 사용함을 알려준다. public abstract class CommonEntity { @CreatedDate @Colum..

JPA

[JPA] SpringBoot Jpa 에서 Querydsl 세팅시 Qclass 못찾는 경우

Spring boot와 JPA를 처음 공부하고자 프로젝트를 파서... 간단한것들을 만들어보던중, Querydsl이라는것을 알게되어 설정잡아 보려고 했다. Qclass들도 잘 만들어지고,,, 그런데 사용하는 부분에서 Qclass를 찾지 못하여 오류 발생..!!! 에러 코드 : java.lang.ClassNotFoundException:com.won..... entity.QEntity gradle이 잘못된건지.. 세팅을 바꿔보기도 하고,,, 뭔지 잘모르겠었는데, 빌드패스를 잡아줬던게 생각이났다. => Qclass가 생성된 경로를 add Folder해서 경로를 추가해줬었다. 그래서 빌드패스쪽 output folder의 경로가 querydsl 어쩌고로 잡혀있는걸 보고 음... 이게 뭐지? 하고 resources..

JPA

[JPA] JPA Repository 메서드 명명규칙

JPA는 우리가 쿼리를 열심히 짜는것을 대신해 간단하게 표현하여 쿼리를 사용할 수 있도록 해준다. 그렇다면 어떤 형태로 메소드 이름을 붙이면 되는지, 명명 규칙에 대해 간략하게 정리해두자. 검색 메서드 1). findAll() DB에서 전체 값을 list로 불러올때 사용한다. 2). findOne() primary key로 값을 1건 조회할 때 사용한다. 3). findByXX => SQL Where절이라고 생각하자. findBy뒤에 우리가 정의한 Entity의 이름을 붙이면된다. Entity의 이름의 첫글자는 대문자로 하며, id를 조건으로 검색한다면 findById(int id) 로 검색하면 된다. 여기서 여러개의 조건을 걸고싶다면...? And조건 findByIdAndName(int id, Stri..

JPA
반응형