Spring Data: 76개의 글
개요 JPA를 사용하면서 개발하다보면 간혹 LazyInitializationException 이라는 예외를 접하게 될 것이다. 이번에 포스팅할 OSIV는 해당 예외와 밀접한 관련이 있다. 또한 OSIV의 활성화 여부에 따라 JPA를 사용해서 개발하는 애플리케이션 성능에 큰 영향을 미치게 된다. 이번 기회에 OSIV에 대한 개념을 이해해보자. 1. 영속성 컨텍스트 먼저 선행되어야 할 지식은 JPA의 영속성 컨텍스트이다. 영속성 컨텍스트는 JPA에서 가장 중요한 개념중 하나로, 쉽게 말해 눈에 보이지 않으며 Entity를 영구히 저장하는 환경이라는 뜻이다. 하나의 트랜잭션 안에서 이루어지는 데이터들은 영속화되어 데이터를 조회할때 1차캐시라는 공간에서 가져오게 된다. 아래 예제들을 보면서 이해해보자. 📝예제 ..
Lazy Loading JPA의 유일한 단점은 사용하기 쉬운만큼 성능적인 측면에서 발생할 수 있는 이슈를 간과하기 쉽다는 것인데, 성능이 안나올때 가장 먼저 고려해봐야할 부분이 즉시로딩(EAGER LOADING)으로 설정된 Fetch 전략이 있는지 확인하는 것이다. 하지만 @OneToOne 매핑시 Fetch 전략을 Lazy로 설정해도 EAGER로 동작하는 경우가 있다. 어떤 경우에 이러한 문제점이 발생하는지, 해결책은 무엇인지 예시를 통해 알아보도록 하자 예시 1. @OneToOne 단방향 매핑 @Entity public class User { @Id @GeneratedValue @Column(name = "USER_ID") private Long id; @OneToOne(fetch = FetchType..
트랜잭션 트랜잭션이란 더 이상 쪼갤 수 없는 최소 단위의 작업을 뜻하는 개념이다. 트랜잭션 경계 안에서 진행된 작업은 commit() 을 통해 모두 성공하던지, 아니면 rollback()을 통해 모두 취소돼야 한다. 하지만 트랜잭션이라고 모두 같은 방식으로 동작하는 것은 아니다. 이 밖에도 트랜잭션의 동작방식을 제어할 수 있는 몇 가지 조건이 있다. 트랜잭션 전파 트랜잭션 전파란 트랜잭션의 경계에서 이미 진행 중인 트랜잭션이 있을 때 또는 없을 때 어떻게 동작할 것인가를 결정하는 방식을 말한다. 예를들어 A 라는 트랜잭션이 시작되고, 아직 끝나지 않은 시점에서 B 라는 트랜잭션안에 있는 메소드를 호출한다면 B는 어떤 트랜잭션에서 동작해야 할까? 자신을 호출한 A 트랜잭션에서 동작해야 할까, 아니면 자신의..
자바 ORM 표준 JPA 프로그래밍 1. 영속성 컨텍스트 -영속성 컨텍스트는 JPA에서 가장 중요한 개념중 하나로, 논리적인 개념, 눈에 보이지 않으며 Entity를 영구히 저장하는 환경 이라는 뜻이다. 영속성 컨텍스트를 이해하기전에 먼저 EntityManagerFactory와 EntityManager를 간단하게 이해하고 넘어가자. EntityManagerFactory는 고객이 요청이 올 때마다 (쓰레드가 하나 생성될 때마다) EntityManager를 생성한다. EntityManager는 내부적으로 DB connection pool을 사용해서 DB에 접근한다. EntityManagerFactory JPA 는 EntityManagerFactory 를 만들어야 한다. application loading 시..
학교에서 작은 프로젝트를 하고있는데 포인트충전(결제시스템)을 구현할 방법을 찾아가 아임포트(i'm port)라는 API를 발견하게 되었다. 정말 간편하고 쉽게 결제시스템을 구현할 수 있게 해주는 API다. 아임포트 공식 홈페이지 개발자를 위한 무료 결제연동 API, 아임포트 아임포트를 import하세요. 아임포트의 풍부한 REST API 기능을 이용하면 결제연동이 훨씬 쉬워집니다. 지금 시작하세요. www.iamport.kr 1. 먼저 아임포트 사이트에 가입을 합니다. 2. 회원가입후 시스템설정으로 이동합니다. 시스템설정 초기페이지 3. PG설정(일반결제 및 정기결제) 를 클릭합니다. 시스템 설정 페이지2 4. PG사 카카오페이 선택 후 테스트모드 ON 합니다. 5.전체저장을 누르면 가맹점식별코드(CID..
1. build.gradle 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-validation' 스프링부트 버전 2.3 이전에는 web 의존성에 validation이 포함되어있었지만 2.3 버전 이후 분리되었습니다. 따라서 스프링부트 2.3 이후의 버전을 사용하시는 분들은 반드시 해당 의존성을 추가해야합니다. 2. 회원가입 DTO 사용자가 회원가입 폼에 입력한 정보들을 담을 DTO를 생성해야 합니다. 여기서는 간단하게 이메일,비밀번호,닉네임,휴대폰번호 정도만 받아보겠습니다. @Getter public class UserDto { @NotBlank(message = "닉네임을 입력해주세요.") @Size(min = 2, max = ..
영속성 컨텍스트(persistence context) : 엔티티를 영구 저장하는 환경 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶다면 CASCADE 기능을 사용하면 된다. *JPA에서 엔티티를 저장할 때 연관된 엔티티는 모두 영속 상태이어야 한다. @Entity @Data public class Person { @Id @GeneratedValue private Long id; @OneToMany(mappedBy ="person" , cascade= CascadeType.PERSIST) private List children = new ArrayList(); } 위와 같이 cascade = CascadeType.PERSIST로 지정하면 부모를 영속화할 때 연관된 자식들도..
Mybatis 1. 익숙한 SQL 쿼리문 사용 가능. 2. 쿼리문을 xml로 분리 가능 3. 복잡한 쿼리문 작성 가능 4 . 비슷한 쿼리 남발 JPA 1. SQL 쿼리문 구현 필요X 2. 구현할 소스코드의 양이 Mybatis보다 상대적으로 적다. 3. CRUD 메소드를 기본적으로 제공. 4. Mybatis는 쿼리가 수정되어 데이터 정보가 변경되면 그에 맞게 DTO또한 수정해야 하는데, JPA는 객체만 변경해주면 된다. 5. 복잡한 쿼리는 사용 불가능(JPQL 또는 Query dsl 사용) 출처 : https://1-7171771.tistory.com/66
김영한님이 강의하신 실전! Querydsl 강좌를 학습하고 정리한 내용입니다. 소스코드는 Github를 참고해주세요. 시작하기에 앞서 테스트용 MySQL 설치 및 Gradle 프로젝트에서 Querydsl 설정하는 방법에 대해 알아봅니다. Docker MySQL 설치 docker run -d --name test_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin007! mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci Gradle에서 Querydsl 설정 build.gradle 파일에 querydsl 설정을 추가한다. 설정을 추가하고 build 또는 compileQuerydsl을 ..
Entity 클래스란 JPA에서 실제 데이터베이스의 테이블과 매칭되는 클래스입니다. JPA를 사용하면서 Entity 클래스를 작성하였고, 프로젝트 초기에는 Entity로 Repository 뿐만 아니라 Service, Controller 영역까지 사용하였습니다. Entity를 화면에 띄우는 데까지 사용하다 보니 양방향으로 연결된 엔티티는 순환 참조 문제가 발생하였고, 다른 Entity를 참조하고 있는 경우 현재 Entity 뿐만 아니라 다른 Entity에도 원치 않는 변경이 일어나거나, 무거운 양의 데이터를 들고 여러 영역을 오가는 것이 성능 상에도 좋지 않을 것으로 생각하였습니다. 따라서 DB Layer에는 Entity, View Layer에서는 DTO를 사용하여 역할을 분리하여 Entity와 DTO가..