반응형

JPA 15

Spring Data JPA Audit기능을 활용해 Entity 생성시간 / 수정시간 자동 매핑하기

보통 시스템에 필요한 테이블을 설계하면 이력 관리 등의 목적으로 row 생성시간, 수정시간을 저장할 컬럼 두는 경우가 많습니다.JPA를 통해 해당 테이블들을 엔티티로 매핑하면 여러 테이블에 걸쳐 중복코드가 발생할 수 있습니다.첫 째로는 각 엔티티에 생성 / 수정 시간을 매핑할 필드를 선언해줘야하고,두 번째로는 특정 엔티티가 생성, 수정 될 때 해당 필드의 값에 현재시간 값으로 세팅해주는 코드가 필요하게 되는 점입니다.이번 글에서는 Spring Data JPA 환경 제공하는 Audit 기능을 통해 이 컬럼들을 효율적으로 매핑할 수 있는 방법들을 소개합니다.Spring Data JPA AuditingAudit 기능은 엔티티에 발생하는 변경사항을 추적하는 기능을 구현하는데 도움을 줍니다.1. Auditing ..

Back-End/JPA 2020.05.27

HikariCP와 커넥션 누수(Connection Leak) 관련 트러블슈팅

문제 발생운영중인 서비스에서 사용하는 DB에서 특정 테이블들을 분리하여 별도 DB로 구축하는 일이 생겼습니다. 때문에 이를 위해 Multi Datasource를 적용하였습니다.기존 서비스는 Tomcat connection pool이 적용되어있었는데, 이번 작업을 하며 HikariCP로 변경하였습니다.(참고로 Spring Boot 2.0 부터는 HikariCP가 기본 커넥션풀이라고 합니다.)In Spring Boot 1.x, Tomcat connection pool was the default connection pool but in Spring Boot 2.x HikariCP is the default connection pool.적용을 완료하고 정상동작을 확인한 후 개발환경에 반영해둔 다음날..서비스 ..

Java ORM JPA과 객체지향 쿼리 사용(JPQL, Criteria, QueryDSL)

개요 예전부터 객체지향 언어인 자바와 관계형 데이터베이스간 패러다임의 불일치로 개발자들이 많은 불편함을 겪여왔다. 객체지향 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성 줄여주는 장치들을 제공 관계형 데이터베이스는 데이터 중심으로 구조화, 집합적인 사고가 필요하고 추상화, 상속, 다형성 같은 개념이 없음 연관관계를 표현할 때 객체는 타 객체 참조 (reference) 로, 관계형 DB 는 외래키로 표현하는 등 연관관계를 표현 객체를 테이블에 맞춰 모델링 class Member { String id; // MEMBER_ID 컬럼 사용 Long teamId; // TEAM_ID FK 컬럼 사용 String userName; } class Team { Long id; // TEAM_ID PK ..

Back-End/JPA 2019.11.04

Reflection Type을 활용해 JPA 공통 AttributeConverter 구현

얼마전에 JPA에서 사용할 공통 AttributeConverter 를 구현하면서 고민했던 점들을 정리한다. 공통 AttributeConverter 의 필요성 Entity와 테이블을 매핑하다보면 String, Integer, Long, LocalDateTime 외에 Json값이 저장되어있는 컬럼이나 코드값이 저장되어있는 컬럼의 경우 AttributeConverter 를 통해 Json 모델, Enum 과 매핑을 시킨다. // Entity @Entity public class UserEntity { @Converter(converter = UserStatusAttributeConverter.class) private Status status; @Converter(converter = UserOptionAttr..

Back-End/JPA 2019.11.04

JPA 객체 연관관계 설정

@ManyToOne다대일(N:1) 관계 매핑 정보다.주요속성 optional : false로 설정 시 연관된 엔티티가 항상 있어야한다 (기본값 : true) fetch : 글로벌 Fetch 전략을 설정한다. cascade : 영속성 전이 기능을 사용한다. targetEntity : 연관된 엔티티의 타입 정보를 설정한다. (거의 사용안함)@JoinColumn외래 키를 매핑할 때 사용한다.주요속성 name : 매핑할 외래키 이름 (기본값 : 필드명 + _ + 참조하는 테이블의 기본 키 컬럼명) referencedColumnName : 외래 키가 참조하는 대상 테이블의 컬럼명 (기본값 : 참조하는 테이블의 기본 키 컬럼명) foreignKey : 테이블을 생성할 때만 사용하는 속성으로 외래 키 제..

Back-End/JPA 2018.12.02

객체 연관관계 VS 테이블 연관관계

ORM에서 가장 어려운 부분으로 손꼽히는 것은 객체의 연관관계를 표현하는 것이다.즉 테이블의 연관관계를 엔티티에 매핑하여 표현하는 것을 의미한다. 연관관계 핵심 키워드방향단방향, 양방향이 있다. 예를들어 회원과 팀이라는 관계가 있을때 회원 -> 팀 또는 팀 -> 회원이런 식으로 한 쪽으로만 참조하는 것을 단방향 관계라 하고 회원 -> 팀 -> 회원 상호 참조하는 것을 양방향이라 한다.방향은 객체에만 존재하며 테이블간 관계는 항상 양방향이다. 다중성[일대다(1:N), 다대일(N:1), 일대일(1:1), 다대다(N:M)]이 있다. 예를들어 팀과 회원의 관계에서한 팀에 여러 회원이 있을수있으니 팀과 회원은 일대다 관계로 볼 수 있다. 반대로 여려 명의 회원이 한 팀에 속하니 회원과 팀은 다대일이다.즉 [팀 1..

Back-End/JPA 2018.12.01

엔티티(Entity) 테이블(Table) 매핑

🧩 JPA 엔티티 매핑과 기본 키 전략 정리정리 기준: 『자바 ORM 표준 JPA 프로그래밍』 학습 내용 기반작성자: 백엔드 개발자용 요약 정리1️⃣ 엔티티 매핑 (Entity Mapping)JPA에서 @Entity는 해당 클래스가 JPA가 관리하는 엔티티임을 명시합니다.DB 테이블과 매핑하기 위해 다음과 같은 어노테이션을 함께 사용합니다.✔️ 주요 매핑 어노테이션어노테이션설명@Entity해당 클래스가 엔티티임을 알림@Table(name = "테이블명", uniqueConstraints = {...})테이블 이름 및 유니크 제약 조건 지정@Column일반 컬럼 매핑@EnumeratedEnum 타입 매핑@TemporalDate 타입 매핑 (예: @UpdateTimestamp로 자동 시간 설정 가능)@Lo..

Back-End/JPA 2018.11.30

영속성 컨텍스트 (Persistence Context) 란 (2)

플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다. 플러시가 호출되면 1. 변경감지가 동작해서 영속성 컨텍스트 내 모든 엔티티들을 대상으로 스냅샷과 비교해 변경사항을 찾고, 수정된 엔티티들은 UPDATE문을 생성하여 SQL저장소에 등록한다. 2. SQL저장소의 쿼리를 데이터베이스에 전송한다. (등록, 수정, 삭제 쿼리) 영속성 컨텍스트를 플러시하는 방법은 3가지가 있다. 1. 직접 호출 엔티티매니저의 flush 메소드를 호출하는 것으로 테스트, 다른 프레임워크와 JPA를 함께 사용할 때를 제외하곤 거의 사용하지 않는다. 2. 트랜잭션 커밋 시 데이터베이스에 어떤 변경도 없이 트랜잭션만 커밋해서는 아무것도 바뀌는게 없다. 때문에 항상 데이터베이스 커밋 전엔 영속성 컨텍스트의 내용을 flush하..

Back-End/JPA 2018.11.25