본문 바로가기
반응형

전체 글124

[JPA] JPQL fetch join / 연관된 entity 한번에 select / distinct로 엔티티 중복 제거 / fetch join 페이징 안 될 때 @BatchSize 설정 fetch join을 설명하기전에 fetch type에 대해 복습을 해보자! # FetchType @ManyToOne, @OneToOne FetchType이 기본이 EAGER다 - FetchType.EAGER entity를 조회할 때 연관된 entity도 같이 조회해온다 이 경우 연관된 entity까지 select하는 쿼리가 나가야 하므로 성능이 좋지 않다 ex. member entity 조회 시 team entity까지 select 하므로 2번의 select 쿼리가 나간다 그래서 성능을 위해 모든 엔티티의 연관관계의 FetchType은 LAZY로 설정해두는 것이 좋다 - FetchType.LAZY 조회한 엔티티와 연관된 엔티티는 실제 사용 시에 조회해온다 ex. member 조회 -> member만 s.. 2022. 4. 12.
[JPA] Hibernate Query Language(HQL) Projection / 하이버네이트 쿼리 언어 프로젝션 조회 / 특정 컬럼만 조회 / 예문 하이버네이트쿼리(hql)로 조회를 해올 때 엔티티(전체 컬럼)조회와 특정 컬럼만 조회해오는 방법!! # 엔티티 조회 entityManager.createQuery 로 select 를 해올 때 엔티티 기준으로 조회해오는 것은 쉽다 // Member 엔티티 조회 List entityList = entityManager.createQuery("select m from Member m", Member.class).getResultList(); // Member의 Team 엔티티 조회 List teamEntityList = entityManager.createQuery("select m.team from Member m", Member.class).getResultList(); List teamEntityList.. 2022. 4. 11.
[Java] eqauls, hashCode 구현 시 getter 를 이용하자! eqauls, hashCode 구현 시 getter 를 이용하는 것이 좋다 => 객체에 직접 접근해서 비교하도록 구현한다면 , 프록시 객체의 경우 제대로 비교를 할 수 없다! (프록시 네 이놈 @_@) => 사실 equals, hashCode가 아니어도 getter를 사용하는 것이 좋다 [인텔리제이 Generate 이용하여 구현하는 방법] 1. command + n 으로 Generate 메뉴 열은 후 equals() and hashCode() 클릭 2. Use getters during code generation 선택 후 Next next next~ 3. 인텔리제이가 만들어준 코드! @Override public boolean equals(Object o) { if (this == o) return t.. 2022. 4. 8.
[JPA] 연관관계 영속성 전이 CASCADE # CASCADE - 부모 엔티티에서 자식 엔티티로 상태를 전이하는 것 ex. 부모 엔티티 저장할 때 자식 엔티티도 함께 저장, 게시글과 첨부파일 - Parent와 Child가 라이프사이클이 동일할 때, Child를 소유하는 Parent가 하나일 때 사용하는 것이 좋음 # CascadeType ALL - 엔티티의 모든 상태 전이 PERSIST - 엔티티 persiste(영속) 전이 REMOVE - 삭제 전이 MERGE - merge 전이 REFRESH - refresh 전이 DETACH - detach 전이 [Hibernate ORM 6.0.0 User Guide 예제 코드] @Entity public class Person { @Id private Long id; private String name; .. 2022. 4. 7.
[JPA] 지연 로딩 LAZY , 즉시 로딩 EAGER # 지연 로딩 가급적 지연 로딩 사용! 연관된 엔티티를 프록시 객체로 가져옴 실제 사용할 때 프록시 초기화(디비에서 조회해서 가져옴) @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") private Team team; # 즉시 로딩 주로 연관된 엔티티를 함께 조회해서 사용할 때 사용 조인 쿼리로 조회 ★@ManyToOne, @OneToOne => 기본이 즉시로딩이므로 Lazy로 설정해줘야함★ @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "TEAM_ID") private Team team; ★즉시 로딩은 JPQL에서 N+1 문제 일으킴★ JPQL은 SQL로 번역해서 실행함 (최적화X) -.. 2022. 4. 6.
[JPA] 프록시 entityManager.find() 데이터베이스 조회를 통해 실제 엔티티 객체 반환 entityManager.getReference() 데이터베이스 조회를 통하지 않고 프록시 엔티티 객체 반환 실제 사용시에 DB를 조회해서 실제 Entity 생성(프록시 객체 초기화) ex. member.getUsername() # 프록시 특징 - 실제 클래스를 상속 받아서 만들어짐 - 실제 클래스와 겉모양이 같음 - 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨 - 프록시 객체는 실제 객체의 참조(target)를 보관 - 프록시 객체 호출하면 실제 target의 메소드 호출 - 처음 사용할 때 한 번만 초기화 - 프록시 객체 초기화 : 프록시가 실제 엔티티가 되는 것이 아니라 실제 엔티티.. 2022. 4. 6.