본문 바로가기
728x90
반응형

JPA16

[SpringBoot] Layer별 테스트 코드 작성하기 (1) - JPA를 이용한 Repository 테스트 안녕하세요. J4J입니다. 이번 포스팅은 Layer별 테스트 코드 작성하는 방법 첫 번째인 JPA를 이용한 Repository 테스트하는 방법에 대해 적어보는 시간을 가져보려고 합니다. JpaRepository 테스트 JPA를 이용하는 환경에서 repository 테스트를 수행할 때 가장 대표적으로 해볼 수 있는 테스트는 JpaRepository 사용에 대한 테스트입니다. JpaRepository를 테스트하기 위해서는 jpa에서 제공해 주는 @DataJpaTest 어노테이션을 활용하면 되는데 해당 어노테이션 내부를 확인해 보면 다음과 같이 다양한 설정 값들이 들어 있는 것을 볼 수 있습니다. @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @.. 2024. 2. 3.
[SpringBoot] Spring Boot 3 버전 이후 gradle에 querydsl 사용 환경 설정하기 안녕하세요. J4J입니다. 이번 포스팅은 spring boot 3 버전 이후 gradle에 querydsl 사용 환경 설정하는 방법에 대해 적어보는 시간을 가져보려고 합니다. 관련 글 [SpringBoot] JPA에서 QueryDSL 사용하기 [SpringBoot] QueryDSL Projections로 결과값 핸들링하기 들어가기에 앞서 Spring Boot의 3버전이 등장하면서 최근에 생성되는 많은 프로젝트들은 3 버전 이상의 환경들을 구성하고는 합니다. 3 버전부터는 3 버전 이전과 설정하는 방법이 달라지기도 하고, 3 버전 이상의 환경에서 설정하는 방법을 더 궁금해하실 것 같아서 querydsl 사용 환경 설정하는 방법만 따로 정리하려고 합니다. querydsl이 무엇인지에 대해 더 궁금하신 분들은.. 2024. 1. 22.
[SpringBoot] @Transactional 사용 방식 정리 안녕하세요. J4J입니다. 이번 포스팅은 @Transactional 사용 방식에 대해 적어보는 시간을 가져보려고 합니다. @Transactional이란? @Transactional은 Spring에서 사용 가능한 어노테이션 중 하나로 트랜잭션의 원칙이 지켜질 수 있도록 도와줍니다. 조금 더 단순한 기능에 대해서 말해보면, 비즈니스 로직이 동작되는 과정에서 에러가 발생되면 DB 작업을 모두 롤백을 시켜주고 에러가 발생되지 않으면 DB 작업을 모두 커밋하도록 도와줍니다. 비즈니스 로직에서 트랜잭션 처리가 이루어지는 계층은 Service Layer로 정의되고 있습니다. 즉, Spring 개발을 하다 보면 Controller - Service - Repository의 형태가 구성되기 마련인데 이중 Service .. 2023. 9. 25.
[SpringBoot] QueryDSL where절에 1=1 사용하기 안녕하세요. J4J입니다. 이번 포스팅은 QueryDSL where절에 1=1 사용하는 방법에 대해 적어보는 시간을 가져보려고 합니다. where절에 1=1 사용이 필요한 경우 QueryDSL에서 where절에 1=1 사용이 필요한 경우는 동적으로 사용되는 조건절에 대응하기 위해 주로 활용합니다. 이 부분은 QueryDSL뿐만 아니라 Native JPA나 Mybatis에서도 충분히 사용될 수 있는 요소입니다. 해당 상황을 알아보기 위해 다음과 같은 테이블 및 클래스 파일들이 있다고 가정해 보겠습니다. // table create table school ( no int primary key auto_increment, name varchar(50), address varchar(50) ) // entity.. 2023. 1. 25.
[SpringBoot] QueryDSL에서 DB Function 사용하기 안녕하세요. J4J입니다. 이번 포스팅은 QueryDSL에서 DB Function 사용하는 방법에 대해 적어보는 시간을 가져보려고 합니다. 들어가기에 앞서... 이번 글에서 제가 사용할 DB는 MySQL입니다. 그리고 테스트를 위한 MySQL Function을 다음과 같이 생성해뒀습니다. CREATE DEFINER=`root`@`localhost` FUNCTION `get_function_test`(p_name varchar(100), p_age int) RETURNS varchar(200) CHARSET utf8 BEGIN declare p_return_value varchar(100); select concat('이름은 ', p_name, '이고 나이는 ', p_age, '입니다.') into p_r.. 2022. 9. 29.
[SpringBoot] QueryDSL에서 상수값 사용하기 안녕하세요. J4J입니다. 이번 포스팅은 QueryDSL에서 상수값 사용하는 방법에 대해 적어보는 시간을 가져보려고 합니다. 상수값 사용 방법 QueryDSL에서 상수값을 사용하기 위해서는 Expressions를 활용해주면 됩니다. 긴 말 필요 없이 다음 코드를 확인해보시면 됩니다. package com.querydsl.repository; import static com.querydsl.entity.QStudent.student; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import com.querydsl.core.types.Projection.. 2022. 9. 26.
[SpringBoot] Found shared references to a collection 에러 안녕하세요. J4J입니다. 에러 원인 JPA를 이용하여 개발하다가 다음과 유사한 에러를 마주했던 적이 있습니다. org.springframework.orm.jpa.JpaSystemException: Found shared references to a collection: com.spring.error.entity.Board.firstFileList; nested exception is org.hibernate.HibernateException: Found shared references to a collection: com.spring.error.entity.Board.firstFileList at org.springframework.orm.jpa.vendor.HibernateJpaDialect.conv.. 2022. 6. 13.
[SpringBoot] JPA에서 QueryDSL 사용하기 안녕하세요. J4J입니다. 이번 포스팅은 JPA에서 QueryDSL 사용하는 방법에 대해 적어보는 시간을 가져보려고 합니다. QueryDSL이란? QueryDSL은 자바 코드를 이용하여 데이터베이스 query를 작성할 수 있게 도와줍니다. 일반적으로 JPA를 사용하여 개발하면 JPARepository를 상속받은 인터페이스 파일을 만들어 활용하고는 합니다. 하지만 JPARepository가 가지는 한계가 있기 때문에 상황에 따라 JPQL문을 직접 작성하기도 합니다. 여기서 문제점은 JPQL을 작성을 했지만 에러가 발생될 수 있는 코드임에도 불구하고 디버깅 단계 때 확인이 불가합니다. 결국 런타임까지 넘어갔을 때 에러가 발생될 것이고 그때서야 잘못된 코드임을 확인하여 수정작업이 이루어집니다. 게다가 개인적으.. 2022. 4. 24.
[JPA] MyBatis와 동시 사용 (DTO/엔티티 통합, 연관관계 매핑) 안녕하세요. J4J입니다. 이번 포스팅은 DTO/엔티티를 통합하여 JPA와 MyBatis를 동시 사용하는 설정에 대해 적어보는 시간을 가져보려고 합니다. 이전 포스팅에서는 DTO/엔티티를 분리하여 JPA와 MyBatis를 위한 클래스들이 독립적으로 되어있도록 구현해봤습니다. 하지만 이런 방법으로 구현했을 땐 데이터베이스에 매핑되는 클래스들을 JPA와 MyBatis 각각 1개씩 생성해줘야 됩니다. 그렇기 때문에 이번 포스팅에서는 DTO와 엔티티를 통합하여 하나의 클래스만 생성해보도록 하겠습니다. 추가적으로 MyBatis를 간단하게 사용해보신 분들은 엔티티끼리 연관관계 매핑이 되어 클래스 변수에 객체가 있을 경우 mapper에서 객체를 조회하는 방법에 대해 모르실 수 있습니다. 연관관계 매핑이 되어있을 때 .. 2021. 3. 31.
[JPA] MyBatis와 동시 사용 (DTO/엔티티 분리) 안녕하세요. J4J입니다. 이번 포스팅은 DTO/엔티티를 분리하여 JPA와 MyBatis를 동시 사용하는 설정에 대해 적어보는 시간을 가져보려고 합니다. JPA 관련되어 초기 포스팅을 했던 것처럼 JPA와 MyBatis를 동시 사용하는 프로젝트를 구성해보고자 합니다. JPA가 효율적인 것은 JPA를 사용하고, JPA로 구현을 못하거나 MyBatis가 더 효율적인 것은 MyBatis를 사용할 수 있게끔 하여 보다 효율적인 개발환경이 세팅될 것으로 생각됩니다. 이번에는 DTO와 엔티티를 분리하여 설정해보도록 하겠습니다. 서로 독립되어 있기 때문에 연관되는 것 없이 각자의 스타일대로 작성해줄 수 있다는 특징이 있습니다. DTO와 엔티티를 통합하여 설정하는 것은 다음 포스팅에서 진행하도록 하겠습니다. 이번 주제.. 2021. 3. 30.
[JPA] 연관관계 매핑 (양방향) 안녕하세요. J4J입니다. 이번 포스팅은 JPA 연관관계 매핑(양방향)에 대해 적어보는 시간을 가져보려고 합니다. 들어가기에 앞서 이전에 작성된 포스팅을 읽고 오시면 이해가 더 잘되실 겁니다. 2021.03.21 - [Spring/JPA] - [JPA] JPA 환경설정 2021.03.22 - [Spring/JPA] - [JPA] JPA Repository설정 및 CRUD 2021.03.23 - [Spring/JPA] - [JPA] 조건절(where) 메서드 2021.03.24 - [Spring/JPA] - [JPA] 복합키(Composite Key) 엔티티 2021.03.26 - [Spring/JPA] - [JPA] 연관관계 매핑 (단방향) 연관관계 주인 이전 포스팅에서 양방향으로 매핑이 되는 것은 두 .. 2021. 3. 28.
[JPA] 연관관계 매핑 (단방향) 안녕하세요. J4J입니다. 이번 포스팅은 JPA 연관관계 매핑(단방향)에 대해 적어보는 시간을 가져보려고 합니다. 들어가기에 앞서 이전에 작성된 포스팅을 읽고 오시면 이해가 더 잘되실 겁니다. 2021.03.21 - [Spring/JPA] - [JPA] JPA 환경설정 2021.03.22 - [Spring/JPA] - [JPA] JPA Repository설정 및 CRUD 2021.03.23 - [Spring/JPA] - [JPA] 조건절(where) 메서드 2021.03.24 - [Spring/JPA] - [JPA] 복합키(Composite Key) 엔티티 연관관계 매핑이란? 객체의 참조와 테이블의 외래 키를 매핑하는 작업을 연관관계 매핑이라고 합니다. 데이터베이스 관점에서는 외래키를 가지고 다른 테이블.. 2021. 3. 26.
[JPA] 조건절(where) 메서드 안녕하세요. J4J입니다. 이번 포스팅은 JPA 조건절(where) 메서드에 대해 적어보는 시간을 가져보려고 합니다. 들어가기에 앞서 이전에 작성된 포스팅을 읽고 오시면 더 이해가 잘 되실 겁니다. 2021.03.21 - [Spring/JPA] - [JPA] JPA 환경설정 2021.03.22 - [Spring/JPA] - [JPA] JPA Repository설정 및 CRUD 조건절(where) 메서드 앞서 포스팅에서 "JPA는 쿼리를 따로 작성하지 않고 인터페이스 구현만으로 실제 쿼리가 작성된 것처럼 동작하도록 해준다"라고 말한 적이 있습니다. 그렇기 때문에 만약 쿼리에 작성되던 조건절을 사용하고 싶다면 단순하게 JpaRepository 인터페이스에 메서드만 작성해주면 됩니다. 이전 포스팅에서 사용했던.. 2021. 3. 23.
[JPA] JPA Repository설정 및 CRUD 안녕하세요. J4J입니다. 이번 포스팅은 JPA Repository설정 및 CRUD에 대해 적어보는 시간을 가져보려고 합니다. 아직 환경설정을 하지 않으신 분들은 이전 포스팅 참고해주시길 바랍니다. 2021.03.21 - [Spring/JPA] - [JPA] JPA 환경설정 학교를 주제로 하여 해당 내용을 테스트해보도록 하겠습니다. 데이터베이스에는 학교라는 테이블을 만들고 스프링에서는 학교 클래스를 생성하여 기본적인 CRUD작업을 수행해보겠습니다. 프로젝트 구성 [ 1. MySQL에 학교 테이블 생성 ] create database jpa; use jpa; create table school ( school_id int auto_increment, name varchar(50), region varcha.. 2021. 3. 22.
[JPA] JPA 환경설정 안녕하세요. J4J입니다. 이번 포스팅은 JPA 환경설정에 대해 적어보는 시간을 가져보려고 합니다. 지금까지 스프링을 사용하며 데이터베이스에 접근하기 위해 MyBatis만 사용해왔었습니다. 하지만 최근에 MyBatis보다 더 핫(?)한 JPA라는 기술이 있다는 것을 알게 되었습니다. 객체와 관계형 DB를 서로 매핑하여 쿼리를 따로 작성하지 않고 정의하지 않은 메서드만을 가지고 DB동작을 실행할 수 있었고 필요시에는 직접 쿼리를 작성할 수도 있었습니다. JPA를 사용하면 개발할 때 MyBatis보다 편리함을 가져다줄 것이라고 생각하여 관련된 내용을 공부하긴 했지만 실상은 러닝 커브가 높아 아직도 이해가 안 되는 부분이 너무 많습니다. 그래서 생각한 것은 한 프로젝트에서 MyBatis와 JPA를 동시에 사용.. 2021. 3. 21.
[JPA] Composite-id class must implement Serializable 에러 안녕하세요. J4J입니다. JPA를 테스트하던 도중 새로운 Entity를 추가했더니 "Composite-id class must implement Serializable" 에러가 저를 반겼습니다. 해결방법은 간단했습니다. Entity에 Serializable을 추가했더니 정상 가동되었습니다. package com.spring.jpaTest.dto; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConst.. 2021. 3. 17.
728x90
반응형