스프링/JPA 10

[JPA 기초] fetch join시에 XtoMany에서 List Collections들과 join시에 중복 데이터 삭제하는법 (JPQL + distinct)

//==fetch join시에 XtoMany에서 List Collections들과 join시에 중복 데이터 삭제하는법 ==// ex) Order를 불러올 때, orderItems도 join해서 부르면 orderItems의 개수만큼 중복 Order가 불려온다. Order에 연결된 orderItems 개수만큼 중복된 모습 fetch join 나쁜 예 public List findAllWithItem(OrderSearch orderSearch) { return em.createQuery("select o from Order o" + " join fetch o.member m" + " join fetch o.delivery d" + " join fetch o.orderItems oi" + " join fetch..

스프링/JPA 2022.04.05

[JPA 기초] API 사용시 DTO로 변환하는 이유 + 주의사항 (DTO 내부에 Entity객체가 없어야 한다)

API 사용을 할 때 DTO를 만들어서 받는 이유 API 스펙에 맞춰서 @ResponseBody Entitny를 사용하는게 아니라 DTO를 하나 만들어서 해야한다. Entity를 사용하게되면 어디까지 API에서 받고 Binding 되는지, 추가적으로 다른 코드에서 Binding 했는지 모를 수도 있다. (모든 변수가 들어올 가능성이 있으므로) 따라서 DTO에 해당 API를 FIT하게 맞춰서 딱 받는 스펙을 알 수 있다. 외부에 Entity를 보여줘서도 안됨. 받은 Request를 CreateMemberRequest DTO를 바인딩하여 생성, CreateMemberResponse로 전송 @PostMapping("/api/v2/members") public CreateMemberResponse saveMem..

스프링/JPA 2022.04.05

[JPA 기초] OSIV (Transaction 생존 범위에 따른 성능, 대처에 대해)

OSIV Open Session in view : 하이버네이트 Open EntityManager in view : JPA 관례상 OSIV라고 한다. (JPA 가 나중에 나옴) 서버시작때 warn을 주는 모습 2022-02-14 00:12:00.577 WARN 19764 --- [ restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning..

스프링/JPA 2022.04.05

[JPA 기초] JPA에서 기존 엔티티의 값을 수정하는 방법 (부제 : 왜 em.merge() 사용을 지양해야하는가)

준영속Entity의 경우 (준영속Entity는 em.find를 한 것이 아닌, DB에는 존재하지만 순간적으로 자바에서 객체로만 관리되어져 EntitnyManager 1차캐시에 등록X 객체 > Update할 경우 2가지 방법이 존재한다. 변경 감지를 수동으로 사용하는 법 (영속 Entitny로 등록해줘서 dirtyChecking으로 수정되게 하는 법) 결과적으로 말하자면 merge 사용은 지양해야한다. 변경 감지는 따로 updateMethod를 파서 해당 id로 em.find를 시켜 영속성을 만들어 1차캐시에 저장하고, 이후 그 객체를 변경해주면 이후 tx 커밋시에 자동 등록된다. merge도 이와 비슷한 맥락인데, 1차 캐시에서 찾다가 없으면 db에서 꺼내온다. 여기서 영속성이 생기고, 이후 찾아온 객체..

스프링/JPA 2022.04.05

[JPA 기초] 기본 Entity 설정시 사용되는 annotation 정리

@PersistenceContext 이 어노테이션이 있으면 EntityManager가 주입된다. build.gradle의 jpa보고 yml 파일 읽어서 설정된 대로 만들어서 DI 해줌. EntityManger 객체는 JPA에서 CRUD를 호출하는 기능 @Repository public class MemberRepository { /*이 어노테이션이 있으면 EntityManager가 주입된다. jpa보고 yml 파일 읽어서 */ @PersistenceContext private EntityManager em; @Embeddable (내장타입 대상 클래스의 상단) @Embedded (내장타입을 사용하는 객체의 변수 설정 위) Jpa의 내장타입이란 뜻입니다. Jpa에서 domain 생성시 경우에 따라 안에 들..

스프링/JPA 2022.04.05

Query By Example 간단 예제, 사용

이번 스프링에서 밀어주는 query 탐색법이다. Entity를 생성해서 Example 객체로 변환, repository로 찾아버림 JPA Repository findAll과 같은 메서드에 이미 Example 버전을 만들어 놨다. (left join이 안되어서 실무에선 주로 QueryDsl을 사용한다.) 버전 1. 그냥 Entity객체 생성해서 실행 @Test public void queryByExampleTest() throws Exception { //given Team teamA = new Team("teamA"); Member m1 = new Member("m1",0,teamA); Member m2 = new Member("m2",0,teamA); em.persist(teamA); em.persis..

스프링/JPA 2022.03.01

`SpringDataJPA` 기본 save 작동 과정 (merge와 persist를 중심으로 효율성 개선)

기본적으로 SpringDataJPA의 기본 구현체인 save는 새로운 엔티티면 저장(persist) 기존에 있으면 (db에서 한번이라도 퍼올렸던 경험) merge를 한다. SimpleJpaRepository의 save 메서드 모습. @Repository @Transactional(readOnly = true) public class SimpleJpaRepository implements JpaRepositoryImplementation { @Transactional @Override public S save(S entity) { Assert.notNull(entity, "Entity must not be null."); if (entityInformation.isNew(entity)) { em.persi..

스프링/JPA 2022.02.27

API 구현시 Parameter로 자동 Paging 객체 매핑하기

Pageable 인터페이스를 구현체로 SpringDataJPA의 기능을 이용해 SpringBoot가 Parameter로 PageRequest라는 객체를 생성을 해서 구현을 해준다. //마지막 파라미터로 Pageable 인터페이스 받아서 쓰면 된다. //파라미터 Page 넘기면 자동으로 Mapping, Paging @GetMapping("/members") public Page list(Pageable pageable){ return memberRepository.findAll(pageable); } 페이징을 위해 Pageable을 받는 findAll이 PagingAndSortingRepository에 구현되어있다.(Data JPA) @NoRepositoryBean public interface Pagin..

스프링/JPA 2022.02.25

Entity를 변경/생성할 때, 변경자와 시간 히스토리 관리하려면?

순수 JPA로 하는 법 @MappedSuperclass 를 선언한 속성값 선언용 Class를 만들어 Entity에서 상속받게 하라. MappedSuperclass 생성, 변수 선언 @MappedSuperclass //실제 상속관계는 아니고 그냥 값만 내려서 사용할 수 있게 해주는 class //이걸 선언해야 이후 상속한 Entity Table 생성시 변수값이 추가된다. public class JpaBaseEntity { @Column(updatable = false) //DB의 값이 변경되지 않게 고정해주는 어노테이션 private LocalDateTime createdDate; private LocalDateTime updatedDate; @PrePersist //persist (등록) 하기전에 발동 ..

스프링/JPA 2022.02.24

Spring Data JPA 구현체를 만들고 싶다면?

💡 Spring Data JPA 레포지토리가 인터페이스만 정의하기 때문에 인터페이스 구현체를 만들 때 만들어야하는 기능이 너무 많다. 인터페이스의 메서드를 직접 구현하는 방법을 알아보자. 만약 Spring JPA data 를 상속하고 있는 Repository interface를 구현하려고 하려면 이 모든 method들을 구현해야 한다. 그러나 따로 메서드를 빼서 내가 원하는 구현을 하고 싶을 땐 어떻게 해야할까? ex ) 직접 sql 접근 (JDBC Connection), QueryDsl 사용할 때 쿼리 직접 넣으니까 빼서 구현 등 custom Interface 생성 public interface MemberRepositoryCustom { List findMemberCustom(); } custom I..

스프링/JPA 2022.02.23
1