Spring/JPA

    QueryDSL과 1차 캐시 의문점

    QueryDSL이 무엇인지 궁금하시다면 아래 더보기를 눌려주세요. 더보기 QueryDSL이란? 오픈소스 프로젝트로 JPQL을 Java 코드로 작성할 수 있게 해주는 라이브러이다. 왜 사용하는가? Spring Data JPA를 사용하여 CRUD 및 여러 쿼리 메서드 기능을 사용하더라도 결국 커스텀한 쿼리가 필요하게 된다. 이 때 JPQL을 사용하게 되는데 복잡한 로직의 경우 쿼리 문자열이 상당히 길어져서 매우 복잡해진다. JPQL을 잘못작성하더라도 해당 쿼리를 실행하게 되는 코드가 클라이언트(사용자)에 의해서 사용되지 않으면 알 수가 없다. 이러한 문제점을 해결해주고 여러 편의성을 제공한다. JPA를 사용할 때 동적 쿼리와 복잡한 쿼리 문제 해결 가능 쿼리를 문자가 아닌 자바 코드로 작성 가능 문법 오류를..

    @Transactional은 조회만 할 때 있어야할까?

    @Transactional은 조회만 할 때 있어야할까?

    스프링 부트 프로젝트를 진행하면서 트랜잭션 어노테이션을 적지 않은곳에서 조회가 잘되고 있었다. 하지만 어느 곳에서는 읽기 전용 트랜잭션인 `@Transactional(readOnly = true)`를 적어 성능 최적화를 하고 있었다. 여기서 든 의문이 트랜잭션이 애초에 없었으면 읽기 전용으로 안만들어도 되는 것이 아닌가? 였다. 📚 그렇다면 한번 살펴보자 SpringBoot JPA를 사용하고 있고, 단순 조회하는 서비스(Service) 계층이 있다고 가정한다. 스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용하고 있다. 이것은 말 그대로 트랜잭션의 범위와 영속성 컨텍스트의 생존 범위가 같다는 의미이다. 트랜잭션 시작 → 영속성 컨텍스트 생성 트랜잭션 끝 → 영속성 컨텍스트 종료 이런..

    deleteAll() vs deleteAllInBatch()

    deleteAll() vs deleteAllInBatch()

    기본기를 다지는 혼자만의 프로젝트에서 잘 쓰이지않는 Spring Data Jpa의 deleteAll() 메서드를 사용하게 되었다. DB에서 데이터의 삭제는 매우 중요한 부분으로 실무에서는 잘 쓰이지 않는다고 하였다. (개인정보는 없애고 나머지 부분은 남긴다던지, 복구라든지 데이터가 필요한 부분이 있기 때문에) 자 그럼 나의 상황을 먼저 간략하게 설명하고 deleteAll()와 deleteAllInBatch()를 비교하면서 동작원리도 파헤쳐보자. 엔티티 구조 Comment 엔티티 (댓글) 댓글과 대댓글은 셀프조인 되어있는 구조 Post 엔티티 (게시글) 현재 상황 본인이 등록한 게시글을 DB에서 삭제하려는 행동을 하려고 한다. 이 때 게시글과 연관되어 있는 댓글을 먼저 삭제하여야 게시글을 삭제할 수 있다...

    Spring Data JPA - 파라미터 바인딩

    Spring Data JPA - 파라미터 바인딩

    스프링 데이터 JPA는 다음 2가지 방법으로 파라미터 바인딩을 지원한다. 위치 기반 이름 기반 SELECT m FROM Member m WHERE m.username = ?0 // 위치 기반 SELECT m FROM Membeer m WHERE m.username = :name // 이름 기반 스프링 데이터 JPA의 기본값으로는 위치 기반 파라미터 바인딩을 지원한다. 이것은 파라미터 순서로 바인딩하는 것이다. 📝 코드 가독성과 유지보수를 위해 위치 기반보다는 이름 기반을 사용하게 된다. 위치 기반은 순서 실수가 있기 때문이다. 위 내용은 공식문서에서도 적혀져 있다. By default, Spring Data JPA uses position-based parameter binding, as describe..

    Spring Data JPA - DTO 직접 조회

    Spring Data JPA - DTO 직접 조회

    조회하는 것은 Entity만 가능 한 것이 아니다!! DTO도 조회가 가능하다. 먼저 아래 코드처럼 @Query를 사용하여 레포지토리 메서드에 쿼리를 정의하자. 위 쿼리를 살펴보면 select에 new study.datajpa.dto.MemberDto가 적혀져 있다. 이것은 패키지 구조를 적어놓은 것인데 아래 MemberDto 클래스의 package 위치를 살펴보자. 그리고 조회하고 싶은 DTO 생성자를 적어야한다. 우리가 조회하려는 것은 Member 와 Member의 Team을 조인한 테이블에서 Member의 id와 username Team의 name을 DTO에 담아서 조회할 것이다. 당연히 조건없이 조회하기에 여러 행을 조회할 수 있으므로 List로 반환한다. DTO로 직접 조회하려면 JPA의 new..

    Spring Data JPA - 쿼리 메서드 기능

    Spring Data JPA - 쿼리 메서드 기능

    스프링 데이터 JPA가 제공하는 쿼리 메서드 기능을 살펴보자. 쿼리 메서드 기능은 여러가지 방법으로 사용할 수 있다. 메서드 이름으로 쿼리 생성 메서드 이름으로 JPA NamedQuery 호출 @Query 사용해서 Repository Interface에 쿼리 정의 1. 메서드 이름으로 쿼리 생성 Member 엔티티가 있다고 생각할 때, 이름과 나이를 기준으로 회원을 조회하자. 순수 JPA Repository로 구현하면 위와같이 메서드를 만들어서 써야한다. 하지만 저번 블로그글 때 사용했던 스프링데이터JPA를 쓰면 간단해진다. 스프링 데이터 JPA는 메서드 이름을 분석해서 JPQL을 생성하고 실행하기 때문에 스프링 데이터 JPA 공식 문서를 참고해서 사용하자. 😈 주의할 점 이 기능은 엔티티의 필드명이 변..

    Spring Data JPA

    Spring Data JPA

    스프링 데이터 JPA란? 스프링 프레임워크에서 JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트이다. 반복되는 CRUD 문제를 편하게 처리해준다. 인터페이스만 작성하면 실행 시점에 스프링 데이터 JPA가 구현 객체를 동적으로 생성해서 주입해준다. 따라서 구현클래스 없이 인터페이스만 작성해도 개발이 된다. 순수 JPA 기반 Repository 를 살펴보자. 순수 JPA 기반 Repository를 써서 데이터 계층에 접근하려면 위와 같이 클래스에 @Repository 를 써야한다. 그러면 컴포넌트 스캔 대상이되서 스프링 빈에 등록을 해주므로 다른 클래스에서 사용할 수 있다. @PersistenceContext로 스프링 컨테이너가 엔티티 매니저를 가져와준다. 엔티티 매니저를 통해 JPA를 사용할 수 있다...

    JPA 객체지향 쿼리 언어 소개

    JPA 객체지향 쿼리 언어 소개

    JPA는 다양한 쿼리 방법을 지원한다. JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 대부분 JPQL, QueryDSL로 해결한다. JPQL SQL을 추상화한 객체 지향 쿼리 언어이다. SQL과 문법이 유사함. (SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원) JPQL은 엔티티 객체를 대상으로 쿼리를 수행함. (SQL은 데이터베이스 테이블을 대상으로 쿼리를 수행함) SQL을 추상화했기에 특정 DB 문법에 의존하지 않음. List result = em.createQuery("select m from Member m where m.username like '%kim..