본문 바로가기

Spring/JPA34

OSIV ( Open Session In View ) 에 대해 알아보자. 김영한님의 JPA 활용 2편을 들으면서 OSIV 라는 개념에 대해서 정리한 내용입니다. JPA 를 프로젝트에 적용하고 리팩토링 하는 과정에 들은 강의인데, 이전 학습할 때 한번도 듣지 못한 용어를 보게 되어 더욱 집중해서 보았던 것 같습니다. 현재 리팩토링을 진행하고 있는 프로젝트에서도 API 만 구현하고 있지만 ADMIN 페이지는 아니기 때문에, false 로 변경하였습니다. 스프링부트 프로젝트를 생성하고 바로 실행시키면, 콘솔창에 아래와 같은 WARN 표시가 생성되는 것을 볼 수 있습니다. 해당 표시는 ERROR 표시가 아니면서 실행에 아무런 영향이 없기 때문에 크게 신경쓰지 않고 넘어갔던 것 같습니다. 먼저, Spring.jpa.open-in-view 는 true , false 로 지정해줄 수 있습.. 2023. 3. 18.
JPA 벌크 연산 처리 방법 및 주의점 JPA 에서 벌크 연산을 하는 방법에 대해 알아보겠습니다. 먼저, 벌크 연산은 말 그대로 어떤 조건이나 상황에 따라 한번에 연산(수정) 하는 것을 의미합니다. 가장 중요한 개념은, 벌크 연산 시 SQL 을 실행하는 것이기 때문에 1차 캐시를 거치지 않고 바로 DB 로 접근해서 값을 수정합니다. 따라서, 1차 캐시를 초기화 하지 않으면, 수정한 데이터의 DB 값과 1차 캐시에 있는 값의 정합성이 다르게 됩니다. 예시는 스프링 데이터 JPA 강의 및 QueryDsl 내용을 참고했습니다. 2가지 방법으로 나뉩니다. 스프링 데이터 JPA 를 사용하지 않는 방법과 스프링 데이터 JPA 를 사용한 방법으로 나뉩니다. 먼저 첫번째 스프링 데이터 JPA 를 사용하지 않는 방법입니다. 예시는 정해진 age 보다 크거나 .. 2023. 2. 25.
@queryProjection 이란 ? querydsl 프로젝트를 하면서 Dto 생성자에 @queryProjection 을 사용하는 코드를 보았습니다. 간단히, Q타입의 파일을 만들어주어, repository 에서 querydsl 코드를 작성할 때 도움을 주는 것으로 학습했는데, 조금 더 자세히 살펴보려고 합니다. 먼저, Projection 은 select 절에 대상을 지정하는 것입니다. 즉 테이블에서 원하는 컬럼만 뽑아서 조회할 수 있습니다. Entity를 직접 사용하면 불필요한 데이터 값을 넘길 수 있는데, 원하는 컬럼만 뽑아 사용한다면 더욱 효율적인 코드를 작성할 수 있기에 충분히 사용할만한 가치가 있다고 생각합니다. 편리하지만 아키텍처에 관련해 고려해야 할 점이 있습니다. Dto 클래스의 생성자가 QueryDsl 에 의존하게 됩니다. .. 2023. 2. 24.
querydsl 다중 조건 검색 만들기 https://josteady.tistory.com/848 이전에 학습하려고 간단히 예제를 만들어보고, 개인프로젝트에 적용해보려고 합니다. 전 포스팅에서는 0원 이상 0원 이하의 조건으로 검색했으나, 이번에는 카테고리를 추가해보려고 합니다. querydsl 를 위한 customRepository는 이전에 만들었으니 바로 코드를 확인해보겠습니다. public class GoodsRepositoryImpl implements GoodsRepositoryCustom { private final JPAQueryFactory queryFactory; private final CategoryRepository categoryRepository; public GoodsRepositoryImpl(EntityManage.. 2023. 2. 5.
Querydsl 동적 쿼리 - 기초 예제 Querydsl 학습을 하면서 기초이지만, 기초를 토대로 응용할 수 있기때문에 정리해보았습니다. 동적쿼리에 관련된 코드를 짜지 못해보았는데 연습하면서 접해볼 수 있어서 동적쿼리가 무엇인지, Querydsl를 왜 사용해야하는지 알게되었습니다. 해당 예제는 Dto 타입을 조회하는 것이 아닌 Entity 를 조회하는 예제입니다. 만들 예제는 아주아주 간단한, 설정한 값 사이에 있는 상품을 조회하는 것 입니다. 실제로, 상품이 000원~ 000원 사이의 상품을 검색해본 경험이 많아서 주제로 선택했습니다. 스프링 데이터 JPA 인터페이스를 따로 만들어주고, 사용자 정의 인터페이스를 하나 더 작성해주었습니다. 먼저, 스프링 데이터 JPA 인터페이스를 만들었습니다. 기본적인 CRUD 기능을 자동으로 지원해줍니다. G.. 2023. 2. 4.
QueryDsl 설정 방법 - Spring boot 2.7.x + 23.02.03 수정 + 23.02.04 내용추가 ( Unable to load class 'com.mysema.codegen.model.Type'. 에러 ) https://www.inflearn.com/questions/355723/compilequerydsl-%EC%98%A4%EB%A5%98 compileQuerydsl 오류 - 인프런 | 질문 & 답변 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼 www.inflearn.com 김영한님의 실전 Querydsl 강의를 시작하고 Querydsl 설정방법에 대해 간단히 정리하고자 합니다. 강의의 버전은 2.. 2023. 2. 3.
List 타입을 Page 타입으로 리팩토링 현재 JPA 를 이용해서 페이징 기능을 사용하고 있으나, 불필요한 Response 생성 및 API 를 클라이언트에게 보내줄때 좀 더 편리하게 사용할 수 있도록 리팩토링을 하려고 합니다. 먼저 현재 코드를 보면 아래와 같습니다. 이전에 가장 중요한 것은 어떤 반환값이든 엔티티를 반환값으로 사용하지 않습니다. 엔티티가 변경되면 API 를 사용하고 있는 화면에 장애가 발생할 수 있기 때문에 Dto 클래스를 필수로 사용합니다. List 타입을 갖고 있는 것을 볼 수 있는데, GoodsPageResponse를 따로 만들어준 이유는 페이징에 필요한 정보만 축약해서 응답해주려고 만들었습니다. // 상품 전체 조회 @GetMapping("/goods") @ResponseStatus(HttpStatus.OK) @ApiO.. 2023. 1. 28.
JPA N+1 문제 알아보기 프로젝트에서 페이징이 걸려있는 상품 전체 조회 및 키워드로 검색할 시에 N + 1 문제가 발생하여 해결방법에 대해 알아보고자 한다. 현재 Goods 엔티티에서는 2개 이상의 컬렉션이 있고, 페이징이 걸려있기 때문에 fetch join으로 해결할 수 없어 batch size를 통한 방법을 알아보았다. 뿐만 아니라 N+1 문제의 원인 , 해결방법에 대해 학습한 내용을 정리하려고 한다. N+1 문제로 인해 대량의 데이터가 있는 애플리케이션이 아니라면 성능에 상관없이는 그냥 지나칠 수 있는 문제이지만,성능 개선을 위해서는 필요한 지식이라고 생각한다. 학습하면서 생각해보았다.상황에 맞추어 적절한 방법을 선택해야겠지만, 지연로딩은 필수로 사용하며 페이징과 List 컬렉션을 사용해야 한다면 Batch Size 를 사.. 2023. 1. 25.
@Convert - T타입 + Map 사용하기 개인프로젝트로 쇼핑몰을 제작하면서 상품에 대한 옵션을 계획했으며 구현을 진행했다. 네이버스마트 스토어처럼 한 상품에 여러 옵션을 가지고 있을 수 있어야 했는데, 제약조건이 있었다. 1. 옵션은 없을 수도 있지만 N 개가 될 수 있다. 2. 옵션의 명칭은 자유롭게 작성가능하다. EX ) 색상 : 검정 // 컬러 : 검정 // 색깔 : 검정 처럼 사용자 마음대로 가능하다. 옵션값을 JSON 형태로 나타내야 했는데 spring jpa convert 를 사용했다. 언제 사용할까? JPA 가 지원하지 않는 타입을 매핑할때 두 개 이상의 속상을 갖는 밸류 타입을 한 개 칼럼에 매핑할 때 @Converter를 사용하기 위해서는 AttributeConverter 인터페이스를 구현해야 한다. 클래스를 따로 만들어야 하며.. 2023. 1. 14.