본문 바로가기

Spring/JPA8

JPA 8 - Querydsl Querydsl @Test // 기존 JPQL public void startJPQL() { //member 1 find String qlString = "select m from Member m " + "where m.username = :username"; Member findMember = em.createQuery(qlString, Member.class) .setParameter("username", "member1") .getSingleResult(); assertThat(findMember.getUsername()).isEqualTo("member1"); } @Test // Querydsl public void startQuerydsl() { // QMember m = new QMember(.. 2023. 7. 12.
JPA 7 - 스프링 데이터 JPA 기존에 스프링 빈, MVC를 공부했을 때 Repository 계층의 CRUD를 모두 직접 코드로 구현했었다. 하지만 이노베이션 캠프에서 사용하는 Repository는 단순히 JpaRepository를 상속받는 인터페이스만으로 구현하는 코드 없이 모든 CRUD를 실행할 수 있었다. 뿐만 아니라 찾고자 하는 엔티티의 필드를 쿼리 메서드방식으로 선언부만 적어주면 알아서 구현된다. 이런 말도 안되는 일이 어떻게 가능한지, ' 왜 이게 되는거지? ' 라는 생각을 할 수 밖에 없었다. 일반적인 상식선에서 이게 가능한가 싶은 기능은 스프링 데이터 JPA였고, 해당 스프링 데이터 JPA에 익숙해지기 보다는, 그 뿌리인 JPA에 대해서 충분히 공부해야겠다는 생각이 들었다. 스프링 데이터 JPA의 원리에 대해서 알고 싶은.. 2023. 7. 10.
JPA 6 - 성능 최적화 엔티티 직접 반환 X 엔티티에 @RequestBody를 직접 매핑하게 되면 해당 엔티티에 @NotEmpty와 같은 UI와 직접적인 연관이 있는 로직이 추가된다. 해당 엔티티와 관련된 다양한 API가 만들어질 때 각각의 API를 위한 모든 요청사항을 엔티티에 담기는 매우 어려움. 뿐만 아니라 엔티티가 변경되면 해당 엔티티를 매핑하여 사용하는 API의 스펙이 변하게 된다. 따라서 엔티티를 직접 사용하는 게 아닌 DataTransferObject, 즉 값을 담기 위한 용도를 가진 DTO를 생성해서 해당 DTO를 이용한다. dto로 반환할 필요. ManyToOne, OneToOne 조회 성능 최적화 version 1 별다른 조치 없이 지연로딩을 유지한 채로 반환하게 되면 처음 엔티티에 대한 쿼리가 작성되고 해당.. 2023. 7. 8.
JPA 5 - 패치 조인 경로 표현식 - .(점)을 찍어 객체 그래프를 탐색하는 것 Select m.username from Member m join m.team t join m.orders o where t.name = '팀A' m.username = 상태 필드, 단순히 값을 저장하기 위한 필드 경로탐색의 끝, 추가적인 탐색 불가능 m.team t = 단일 값 연관 필드, 연관관계를 위한 연관 필드(@ManyToOne, @OneToOne, 대상이 엔티티) 묵시적 내부 조인, 추가적인 탐색 가능 m.orders o = 컬렉션 값 연관 필드(@OneToMany, @ManyToMany, 대상이 컬렉션) 묵시적 내부 조인, 추가적인 탐색 불가능 단, from 절에서 명시적 조인을 통해 별칭을 얻으면 별칭을 통해 탐색이 가능 Selec.. 2023. 7. 3.
JPA 4 - 값 타입, JPQL JPA의 데이터 타입 분류 엔티티 타입 - 데이터가 변해도 지속적으로 추적이 가능 값 타입- 값만 존재하므로 변경시 추적 불가 기본값 타입 - int,double과 같은 자바 기본 타입 / Integer, Long과 같은 래퍼 클래스 / String 임베디드 타입 - 복합 값 타입 컬렉션 값 타입 기본값 타입 생명주기를 엔티티에 의존, 엔티티가 삭제되면 해당 엔티티에 속해있는 기본값 타입들도 삭제 공유 X ex) 특정 엔티티의 기본값 타입의 변경이 다른 엔티티의 기본값 타입의 변경으로 부수효과 발생 가능성 자바의 기본 타입은 공유되지 않음 int a = 20; int b = a; a = 50; System.out.println("a = " + a) System.out.println("b = " + b) .. 2023. 7. 3.
JPA 3 - 영속성 컨텍스트, 연관관계 매핑, 즉시로딩/지연로딩 JPA의 핵심 객체지향 프로그래밍과 관계형데이터베이스는 데이터를 다루는 패러다임이 다르다. 이들을 보다 편리하게 매핑하기 위해 만들어진 ORM 객체 지향 프로그래밍과 RDB 간의 관계를 기반으로 객체와 테이블 간의 매핑을 수행 영속성 컨텍스트를 통해 엔티티를 관리 객체 그래프 탐색과 트랜잭션 관리 등을 지원. 1.영속성 컨텍스트 객체와 관계형 데이터베이스를 매핑하는 과정에서 엔티티를 저장하는 환경 persist(entity) 는 즉 DB가 아닌 영속성 컨텍스트에 엔티티를 저장한다. entity는 비영속 - 영속 - 준영속 - 삭제의 생명주기를 가진다. 비영속 - 객체가 생성된 상태 영속 - 영속성 컨텍스트에 저장된 상태, persist(entity)는 DB에 저장되어있지 않음 준영속 - 엔티티가 영속성 .. 2023. 7. 1.
JPA 2 - 연관관계 매핑, 지연로딩 오늘은 뭔가 평소보다 제대로 집중하기 힘들었다. 이번 주 평가시험에서 배포를 실패했는데 그게 마음에 걸렸는지 자꾸 신경쓰였다. 배포에 대해서는 따로 생각을 정리하면 될 걸 계속 마음이 쓰이다보니 완전히 몰입해서 공부한다는 느낌을 받기 어려웠다. 스스로에게 매우 아쉽지만 단순히 아쉬움에서 그치지 않고 반성하며 내일은 오늘보다 좀 더 나은 하루로 만들 것이다. 금요일 계획 본격적으로 캠프에서 지급해준 강의를 수강 JPA의 영속성 컨텍스트, 연관관계, 프록시에 해당하는 세 부분을 중점적으로 복습 06.30 완료 토요일 계획 캠프 강의 수강(스프링 시큐리티 부분부터) JPA 복습 및 다음 강의 07.01 스프링 시큐리티 부분이 생각보다 쉽지 않다. 아무래도 일요일 날 시큐리티 부분 다시 복습해야 할 필요가 있다.. 2023. 6. 30.
JPA 1 - 영속성 컨텍스트, 연관관계 매핑 주특기 주차 과제를 진행하면서 JPA에 대한 기초적인 이해가 부족함을 많이 느꼈다. 좌절하기보다는 다른 때보다 더 열심히 해서 충분히 숙달하는 것을 목표로 잡았다. 오늘은 영속성 컨텍스트의 특징과 장점, 그리고 연관관계의 주인의 개념적인 이해까지. 2023. 6. 29.