분류 전체보기 235

14장 컬렉션과 부가 기능

👣 개요 해당 게시글에서는 JPA에서의 컬렉션, @Converter, 리스너, 엔티티 그래프에 대해서 배울 것이다. 1. JPA에서의 컬렉션 지연 로딩을 도와주는 컬렉션을 사용할 때, 의도하지 않은 시점에서의 지연 로딩을 알아야 한다. 2. @Converter 자바에서의 데이터값과 DB에서의 데이터값을 인코더와 디코더를 이용해서 쉽게 변환해주는 장치 3. 리스너 엔티티 상태변화에 따른 리스너를 제공하고 있다. 이에 따라 상태변화 시, 로깅을 하거나 특수한 업무를 자동으로 처리할 수 있다. 4. 엔티티 그래프 연관 관계의 엔티티를 한 번에 가져오는 형태를 취해서 N+1문제를 일으키지 않는 장치. JPQL의 fetch join과 같이 엔티티를 가져오지만 기존의 em.find() 메서드로도 호출할 수 있다. ..

JPA 2023.09.08

9/7

👣 개요 오늘은 주특기 2주차 시험을 봤다. 시험은 JPA 운용 능력에 대한 내용이 대부분이었다. 다대일 연관관계에 대해서도 물어보고 영속성 컨텍스트의 의미에 대해서도 물어봤다. 대충 이런 내용의 시험을 보고 그 이후에는 Lv 4 과제를 진행했다. Lv 4 과제는 기존의 Spring Security를 적용하지 않은 상태의 인증, 인가 기능을 Spring Security를 이용해서 인증 인가를 구현하는 과제였다. Lv 3까지의 과제 위에 인증, 인가를 구현한 필터를 단순히 올려놓으면 되는 구조였기 때문에 큰 어려움은 없었던 것 같다. 그 이후 '자바 ORM 표준 JPA 프로그래밍' 책의 13장을 읽으며 OSIV에 대해 공부했다. 여태 동안 Controller에서 요구하는 데이터가 변경될 때마다 담아주는 D..

TIL 2023.09.07

13장 웹 애플리케이션과 영속성 관리

👣 개요 해당 게시글은 Spring Framework로 구성된 웹 App에서의 영속성 관리 방법에 대한 글이다. Spring은 3 계층으로 웹 App을 관리하고 있고 각 계층에서의 올바른 JPA 영속성 관리 방법에 대해 이해하는 것은 매우 중요하다. 만약 영속성 컨텍스트의 생존 범위를 적절하지 못하게 설정한다면 원치하는 곳에서 Update 쿼리가 호출될 수도 있으며 지연 로딩에 의해 N+1 문제를 겪을 수도 있다. 👣 Spring Framework에서의 영속성 컨텍스트 스프링 컨테이너에서의 기본 영속성 컨텍스트의 생존 범위는 Service ~ Repository 이다. 동시에 트랜잭션의 범위 또한 Service ~ Repository 이다. 이는 Service 이외의 장소, 즉 Controller, Vi..

JPA 2023.09.07

9/6

👣 개요 오늘은 '자바 ORM 표준 프로그래밍' 책 내용 중 Spring Data JPA에 관한 것을 공부했다. 해당 기술은 JPA를 Spring framework에 맞춰 더 쉽게 사용할 수 있겠끔 만들어 놓은 라이브러리다. 사실 기존에 웹 App을 개발할 때, 거의 Spring Data JPA만 사용했기 때문에 그다지 어려운 개념은 아니었다. 하지만 해당 기술이 왜 그렇게 형성되어야 하고 복잡한 쿼리를 구현하기 위해 Spring Data JPA가 아닌 순수 JPA를 이용하는 방법에 대해 알아야 했지만 이런 것을 설명을 찾지 못해 겉햩기 수준으로만 알고 있었다. 이번 챕터를 통해 JpaRepository의 구현체에 대해서도 공부하고 NamedQuery를 적용하는 방법도 배우고 QueryDSL과 Sprin..

TIL 2023.09.06

12장 Spring Data JPA

👣 개요 실제로 Spring Boot에서 JPA를 사용할 때는 직접 메서드를 구현할 필요가 없다. Spring Data JPA를 이용하면 이미 많이 정형화된 Id를 이용한 단일 조회, 전체 조회, 생성, 삭제 등등 영속성 컨텍스트를 이용하는 메서드는 구현이 된 상태로 사용 가능하다. 어째서 JpaRepository를 상속받은 Repository를 정의하는 것만으로도 위와 같은 혜택을 누릴 수 있는지와 QueryDSL과 같은 기술과 접목시키는 방법 등을 해당 게시물에 기록할 예정이다. 👣 환경 설정 Spring Boot의 Gradle에 다음과 같은 설정이면 Spring Data JPA를 사용할 수 있다. dependencies { ... // JPA implementation 'org.springframe..

JPA 2023.09.06

영속성 컨텍스트 vs JPQL

👣 개요 JPQL은 영속성 컨텍스트에서 미리 조회하고 DB에 쿼리를 보내지 않고 DB에 쿼리를 먼저 보낸 후에 영속성 컨텍스트를 재정비한다. JPQL의 경우, 영속성 컨텍스트를 활용하지 않기 때문에 비교적 성능이 떨어질 수 있기 때문에 되도록 JPQL보다 find()와 같은 메서드를 사용하는 것이 좋다. 하지만, 통계 쿼리와 같은 복잡한 쿼리를 보내는 것에 영속성 컨텍스트를 활용하기란 어려움이 많기에 JPQL을 사용할 수 밖에 없다. 👣 플러시 모드와 최적화 원래 JPQL을 실행하면 Flush Mode가 FlushModeType.AUTO로 되어 있기 때문에 영속성 컨텍스트와 DB 사이의 동기화를 유지할 수 있다. FlushModeType.AUTO란, JPQL 쿼리를 DB로 보내고 결과를 받아올 때마다 영..

JPA 2023.09.06

QueryDSL

👣 개요 QueryDSL은 JPQL 언어를 그대로 작성함으로서 일어나는 단점을 커버하기 위해 생긴 기술이다. 해당 기술을 통해 런타임이 아닌 컴파일 단계에서 오류를 미리 잡아낼 수 있다는 특징이 있고 동적으로 쿼리를 작성할 수 있다는 장점이 있다. 👣 의존성 추가 Gradle 기준으로 QueryDSL의 의존성 추가하는 방법이다. dependencies { ... // JPA implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // Querydsl 추가 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-a..

JPA 2023.09.06

9/5

👣 개요 오늘은 Lv 3 과제를 끝내고 제출을 했다. Lv 3를 끝마치고 하루종일 QueryDSL에 투자를 했다. 여기서 실수를 한 것이 Tistory의 장점 중 하나가 새로운 글을 작성하기 전이라면 자동으로 임시저장 기능을 제공해서 글 작성 창이 꺼져도 내용이 보존된다. 하지만, 나는 기존의 작성된 게시글을 수정하는 방법으로 QueryDSL 내용을 작성했다. 이는 내가 하루종일 작성한 QueryDSL 내용을 모두 날려먹는 참사를 일으켰고 이 참사 이후 5분간 말을 잃은 채로 멍하니 있었다. 하지만 오늘 게시글을 작성하는 대부분의 시간은 코드를 작성하며 테스트를 하는 시간이 길어서 그렇지 알고 있는 내용을 다시 작성하는 것은 얼마 안 걸릴 것이라 믿고 있기에 오늘 취침 전에 모든 내용을 복구할 계획이다...

TIL 2023.09.05

9/4

👣 개요 오늘은 Lv 3 과제를 시작하는 날이었으나 Spring Security에 대한 공부가 필요하다는 페어 분의 의견에 따라 하루 정도는 원하는 공부를 하도록 했다. 나 또한 QueryDSL에 대한 공부를 하길 원했기도 했고 상대방이 기술에 대한 이해도가 높은 것은 여러모로 이점이 많은 일이었기에 해당 방식에 동의했다. 그리하여 오늘은 JPQL에 대한 깊은 공부를 함과 동시에 QueryDSL에 대한 공부도 진행했다. 하지만 역시 만만치 않았다. 항상 쿼리를 JPQL을 이용해서 복잡한 쿼리도 만들어 봤고 QueryDSL도 얕게 나마 프로젝트에서 사용해본 적도 있었기에 어렵지 않게 코드로 구현할 거라 생각했다. 하지만 지식에 구멍이 매우 많았고 이것을 코드로 구현하기 까지 문제가 너무 많았다. 우선 JD..

TIL 2023.09.04

10장 객체지향 쿼리 언어

👣 개요 여태까지의 JPA로는 제한적인 쿼리만 수행할 수 있었다. 때문에 복잡한 검색 조건을 사용하기 위해 다양한 쿼리 기술을 지원한다. JPQL, Criteria, QueryDSL 등등이 이것에 속한다. 👣 JPQL JPQL은 SQL과 달리 테이블 중심적 언어가 아니라 객체 지향적 언어다. SQL을 추상화해서 특정 벤더에 의존적이지 않아서 이식성이 좋다. 기본 문법 1. 대소문자 구분 2. 엔티티 이름 - Table 이름을 기입하는 것이 아닌 @Entity(name = "XXX")의 이름 속성을 사용한다. 3. 별칭 필수 - 'Member AS m' 과 같이 별칭을 꼭 사용해야 함. TypeQuery 클래스 쿼리 내용을 담고 있는 클래스로서 특정 메서드를 호출하면 DB에 쿼리에서 필요한 정보를 가지고 ..

JPA 2023.09.04