본문 바로가기

개발기술/ORM

(9)
embedded key 와 joincolumn에 대하 정확히 보셨어요! 지금 이 AuthMenu 엔티티에서 auth나 menu 필드에 실제 값이 들어가지 않는다면, 그 이유는 대부분 아래 두 가지 중 하나 때문입니다:✅ 원인 1. insertable = false, updatable = false 때문java복사편집@ManyToOne(fetch = LAZY) @JoinColumn(name = "auth_id", insertable = false, updatable = false) private Auth auth; 이 설정은 JPA에게 다음과 같이 지시합니다:🔒 이 auth_id는 DB에 insert/update할 때 사용하지 마라.👉 즉, 읽기 전용 필드로만 사용하겠다는 뜻입니다.결과적으로:auth나 menu 필드는 persist() 시 아무 역할도 하..
JPA 데이터 조회 구현 ; EntityFetch JPA Method, JPQL, QueryDSL, 네이티브SQL JPA에서 제공하는 주요 조회 쿼리 생성 방법JPA는 객체를 기반으로 검색할 수 있도록 여러 가지 방법을 제공합니다.조회 방법설명JPQL (Java Persistence Query Language)엔티티 객체를 대상으로 SQL과 유사한 문법으로 조회네이티브 SQLJPA에서 직접 SQL을 사용할 수 있도록 지원QueryDSLJPQL을 타입 안전하게 편리하게 작성할 수 있도록 도와주는 빌더 클래스 JPA Method 생성시 Method Naming 룰 in Spring Data JPAfindbyId : Id를 기준으로 해당하는 엔티티를 반환save() : PK에 해당하는 엔티티가 존재하지 않으면 create, 존해자면 update 함.업데이트 : jpa에서는 업데이트문이 존재하지 않고 find()로 엔티티..
Persistence Context, EntityManager Persistence Context 개념JPA가 데이터를 DB로부터 불러오거나 저장할 때 사용하는 1차 캐시. 이 안에 들어간 엔티티들은 영속 상태(Persistent State) 라고 불리고, JPA가 자동으로 변경 사항을 추적합니다.트랜잭션이 시작될때 영속성 컨텍스트를 생성하였다가 트랜잭션이 끝나면 추적한 변경사항을 일괄 DB에 반영합니다.JPA 동작 구조 (Repository → EntityManager → Persistence Context)JPA는 DB가 아니라 Persistence Context를 다루는 기술이다.EntityManager는 이 Persistence Context를 조작하는 표준 API 계층이며, Repository는 EntityManager를 추상화해서 개발자가 쉽게 사용할 수..
JPA 데이터 조회방식 개념 JPA 내에서 데이터를 조회하는 2가지 방식1. 엔티티 기반 조회 (Entity-based fetch) join fetch, find(), JPQL, EntityGraph반환: 엔티티특징: 영속성 컨텍스트에 등록됨 (관리됨)엔티티 기반 fetch는 도메인 객체를 조작하거나, 트랜잭션 내에서 상태를 변경할 때 사용JoinFetch는 영속성 컨텍스트 내 연관관계를 자동으로 맞춰줘야하기에 대용량 데이터 조회에 성능이 좋지않음SELECT u FROM User u JOIN FETCH u.posts 2. 값 기반 조회 (DTO Projection)new Dto(...), Projections.constructor(), Tuple, native query반환: DTO, 값 객체, 튜플특징: 영속성 컨텍스트에 등록..
JPA 기타기능 (Pageable, auditing, data.sql 기능) 1. Auditing functionality : Persistency Layer에서 특정 이벤트 발생시에 자동적으로 데이터값을 생성해주는 기능을 말한다. 레코드 생성자, 생성일 등 데이터의 히스토리를 추적하는데 사용된다. Auditing 기능을 적용할 Entity 클래스에@EntityListeners (AuditingEntityListener.class)를 추가하고, 필요한 필드에 @CreatedDate나 @LastModifiedDate와 같은 애너테이션을 붙입니다. 이 entitylistener들은 entity의 lifecycle을 파악하고 lifecycle의 특정부분에 지정된 코드를 실행하도록 한다.@EntityListeners(AuditingEntityListener.class)@Configur..
JPA 활용의 필요성과 활용법 JPA의 필요성repository에서 지원하는 method만큼 sql 작성문양이 줄어든다SQL mapper을 사용할 때 필요한 dto mapping이 최소화된다데이터 테이블의 변경이 코드의 변경으로 이어지는 것이 최소화된다. 객체의 필드만 수정하면 대부분이 sql 자동으로 변경됨     JPA와 Native Query에서 테이블 변경이 미치는 영향 변경 사항 JPA (JPQL, @EntityGraph)JPA Native Query (nativeQuery = true)컬럼 추가/삭제✅ 자동 반영 (@Column 매핑 변경)❌ Native Query 수정 필요컬럼 타입 변경✅ 자동 반영 (타입 변경 시 엔티티 수정)❌ Native Query 직접 수정 필요JOIN 관계 변경✅ @OneToMany, @Many..
Spring JPA 트랜잭션 @Transactional이 실제로 하는 일public void transactionalMethod() { PlatformTransactionManager transactionManager = getTransactionManager(); // 트랜잭션 매니저 획득 TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); // 트랜잭션 시작 EntityManager entityManager = entityManagerFactory.createEntityManager(); // Persistence Context 생성 bindEntityManagerToTransactio..
Spring JPA Entity 설정 Entity 생성하기Entity 생성하기 엔티티(Entity)란 JPA에서 데이터베이스 테이블과 매핑되는 클래스를 의미하며, 각 엔티티 객체는 데이터베이스에서 독립적으로 관리되는 레코드(행, row)를 나타냅니다. @Entity : JPA에서 해당 클래스가 데이터베이스 테이블과 매핑됨을 나타내는 필수 애너테이션@Table(name="테이블명") : 클래스명과 테이블명을 다르게 지정하고 싶은 경우에는 @Table 어노테이션을 사용하여 원하는 테이블명을 명시Entity의 Column 설정하기 Table column들의 속성을 annotation을 통해서 셋팅해둔다..@Id: 엔티티 클래스를 정의할 때는 기본적으로 기본 키(primary key)로 사용할 필드를 지정합니다 @GeneratedValue(S..