본문 바로가기

Spring Framework/JPA8

엔티티 저장 시 연관 엔티티의 아이디로만 연관관계 설정하는 법 궁금한 점 연관 관계가 있는 엔티티의 ID를 알고있고 굳이 그 연관 엔티티의 다른 필드를 사용할 필요가 없는 경우에도 Repository에서 해당 엔티티를 찾아서 넣어줘야 하는걸까? @RequiredArgsConstructor public class Example { private final TeamRepository teamRepository; private final MemberRepository memberRepository; public void saveMember() { // 팀 아이디를 이미 알고있고 굳이 팀 내부의 다른 필드를 사용할 이유가 없는 경우 Long teamId = 1; Member member = new Member(); member.setTeam(???); // 멤버에 팀을 외.. 2022. 7. 15.
@GeneratedValue 로 UUID 사용하기 참고용이기 때문에 간단하게 사용법하고 주의사항만 정리하겠습니다. 사용법 Entity @GeneratedValue 어노테이션을 설정 @Column을 BINARY(16)으로 타입을 UUID로 @Id @GeneratedValue @Column(columnDefinition = "BINARY(16)") private UUID id; 결과 UUID에서 대시(-)를 제외한 나머지 32자리 문자열이 자동생성되어 저장됩니다. 주의사항 @Column을 직접 BINARY(16)으로 정의한 이유는 디비마다 다르겠지만 JPA로 스키마 자동생성하면 컬럼타입이 BINARY(255)로 정의됩니다. 이러한 경우 UUID는 255를 제외한 16만큼의 자리를 차지하는데 자리를 채우고 남은 공간을 특정 값으로 채워버리는 DB가 존재할 수.. 2022. 6. 13.
Transaction (트랜잭션) ACID Atomic (원자성) All or Nothing 하나의 트랜잭션 내에서 이루어지는 모든 작업은 모두 완료되어 Commit되거나 모두 실행되지 않고 Rollback되어야합니다. Consistency (일관성) 모든 트랜잭션이 종료된 후에는 DB의 제약조건을 모두 지키고 있는 상태가 되어야 합니다. Isolation (격리성) 트랜잭션은 다른 트랜잭션과 독립적으로 동작해야합니다. 하나의 트랜잭션에 다른 트랜잭션이 끼어들면 안됩니다. 현실적으로는 끼어들기도 하는 성능과 안정성의 trade-off 가 있는 특성입니다. Isolataion Level (트랜잭션의 격리 수준) 동시에 여러 트랜잭션이 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있는 정도에 관한 Lev.. 2022. 6. 10.
엔티티 매핑 엔티티와 테이블을 매핑하는 어노테이션에 대해서 알아보려고 합니다. JPA는 다양한 매핑 어노테이션을 지원하는데 크게 4가지로 분류할 수 있습니다 객체와 테이블 매핑 @Entity @Table 기본 키 매핑 @Id 필드와 컬럼 매핑 @Column 연관관계 매핑 @ManyToOne, @JoinColumn 연관관계 매핑은 양이 많아 다른 게시물로 정리하도록 하겠습니다. 객체와 테이블 매핑 @Entity JPA를 사용해서 테이블과 매핑할 클래스에 @Entity 를 붙입니다. JPA가 관리하는 객체를 Entity라 합니다. name 속성 JPA에서 사용할 엔티티 이름을 지정합니다. 보통 기본값인 클래스 이름을 사용합니다. 다른 패키지에 이름이 같은 엔티티클래스가 존재한다면 이름을 지정해서 충돌을 피해야 합니다. .. 2022. 6. 10.
영속성 관리 JPA가 제공하는 기능은 크게 엔티티와 테이블을 매핑하는 설계 부분과 매핑한 엔티티를 실제 사용하는 부분으로 나눌 수 있습니다. 여기서는 매핑한 엔티티를 EntityManager를 통해 사용하는 법을 정리하려합니다. 여기서는 Hibernater를 기준으로 정리합니다. 구조 요청이 올 때마다 EntityManagerFactory를 통해 EntityManager를 생성합니다. EntityManager는 내부적으로 DB 커넥션을 통해 DB를 사용합니다. Entity Manager Factory EntityManager를 생성합니다. 생성 비용이 크기 때문에 하나만 생성해 애플리케이션 전체에서 공유하여 사용합니다. 설정 정보를 읽어 JPA를 동작시키기 위한 기반 객체 생성 및 커넥션 풀 생성 등으로 생성 비용이.. 2022. 6. 10.
데이터베이스 방언 (Dialect) 데이터베이스 방언이란? JPA는 특정 데이터베이스에 종속적이지 않아 손쉽게 다른 데이터베이스로 교체할 수 있습니다. 다만, 데이터베이스 벤더마다 SQL 문법과 함수가 조금씩 다른데 이를 Dialect(방언)이라고 합니다. JPA 구현체들은 다양한 데이터베이스 Dialect 클래스를 제공합니다. 개발자는 JPA가 제공하는 표준 문법에 맞춰 JPA를 사용하면 되고, 특정 데이터베이스에 의존적인 SQL은 데이터베이스 Dialect가 처리해줍니다. 스프링부트에서 application.properties에서 hibernate.dialcet=db별 방언 클래스 로 사용합니다. 하이버네이트의 방언 지원 정보는 아래의 주소에서 확인 가능합니다. https://docs.jboss.org/hibernate/orm/4.3/.. 2022. 6. 10.
JPA 소개 📗 JPA 😡 SQL을 직접 다룰 때 발생하는 문제점 반복되는 작업들 반복되는 CRUD 코드 작성 JAVA 애플리케이션은 JDBC API를 사용해 DB와 통신하며 데이터를 CRUD 합니다. 개발자는 애플리케이션과 DB 사이에서 SQL 및 JDBC API 코드를 작성해야 합니다. 연결해야하는 테이블 및 데이터가 늘어날수록 반복적인 CRUD 코드들을 계속해서 반복해서 작성해주어야합니다. SQL에 의존적인 개발 엔티티에 변경점이 발생하면 관련된 모든 SQL을 수정해야합니다. DAO를 열어서 어떤 SQL이 실행되는지 직접 확인하고 수정해야합니다. 이와 관련된 자바 CRUD 코드들도 수정을 해주어야합니다. 이러한 변경이 잦아지면 변경할 코드도 많아지고 관리하기가 어렵습니다. 패러다임의 불일치 자바와 관계형 데이터.. 2022. 6. 10.
Test용 H2 DB application.yml 설정 H2 DB 란? 자바 기반의 오픈 소스 RDBMS입니다. Server 모드와 Embeded 모드를 지원합니다 Embeded 모드의 경우, In memory로 동작합니다. (휘발성) 브라우저 기반의 콘솔 프로그램입니다. 별도의 설치과정이 필요없고, 2MB 용량으로 매우 가볍고 빠릅니다. ANSI 표준 SQL을 사용합니다. JDBC API를 지원합니다. 주로 개발단계에서 테스트용 인메모리 DB로 사용됩니다. application.yml spring: datasource: url: jdbc:h2:mem:test username: sa password: driver-class-name: org.h2.Driver h2: console: enabled: true jpa: defer-datasource-initial.. 2022. 6. 9.