본문 바로가기

JPA

(12)
[JPA] JPA 활용1 - 웹 계층 개발 - 회원 도메인 개발 계층형 구조 사용controller, web: 웹 계층service: 비즈니스 로직, 트랜잭션 처리repository: JPA를 직접 사용하는 계층, 엔티티 매니저 사용domain: 엔티티가 모여 있는 계층, 모든 계층에서 사용**개발 순서: 서비스, 리포지토리 계층을 개발하고, 테스트 케이스를 작성해서 검증, 마지막에 웹 계층 적용**  회원 리포지토리package com.example.jpaspring.test1.repository;import com.example.jpaspring.entity.Member;import jakarta.persistence.EntityManager;import jakarta.persistence.PersistenceContext;import org.springframe..
[JPA] JPA 활용1 - 도메인 분석 설계 참고: 실제 코드에서는 DB에 소문자 + _(언더스코어) 스타일을 사용하겠다.**데이터베이스 테이블명, 컬럼명에 대한 관례는 회사마다 다르다. 보통은 대문자 + _(언더스코어)나 소문자 + _(언 더스코어) 방식 중에 하나를 지정해서 일관성 있게 사용한다.  **참고: 외래 키가 있는 곳을 연관관계의 주인으로 정해라.**연관관계의 주인은 단순히 외래 키를 누가 관리하냐의 문제이지 비즈니스상 우위에 있다고 주인으로 정하면 안된 다.. 예를 들어서 자동차와 바퀴가 있으면, 일대다 관계에서 항상 다쪽에 외래 키가 있으므로 외래 키가 있는 바퀴 를 연관관계의 주인으로 정하면 된다. 물론 자동차를 연관관계의 주인으로 정하는 것이 불가능 한 것은 아니지만, 자동차를 연관관계의 주인으로 정하면 자동차가 관리하지 않는..
[JPA] JPA 활용1 - 프로젝트 환경설정 start.spring.io 사이트에서 스프링 부트 2.x에 대한 지원이 종료되어서 더는 선택할 수 없습니다. 이제는 스프링 부트 3.0이상을 선택해주세요. 스프링 부트 3.0을 선택하게 되면1. Java 17이상을 사용해야 합니다.2. javax 패키지 이름을 jakarta로 변경해야 합니다.- 오라클과 자바 라이센스 문제로 모든 javax 패키지를 jakarta로 변경하기로 했습니다.3. H2 데이터베이스를 2.1.214 버전 이상 사용해야 합니다. plugins { id 'java' id 'org.springframework.boot' version '3.3.1' id 'io.spring.dependency-management' version '1.1.5'}group = 'com.e..
[JPA] JPA 기본값 타입 기본값 타입JPA에서 데이터 타입은 크게 두 가지로 분류할 수 있습니다: 엔티티 타입과 값 타입입니다.엔티티 타입정의: @Entity로 정의된 객체.특징:데이터가 변해도 식별자(ID)로 지속해서 추적 가능.식별자를 통해 동일한 객체를 유지.예를 들어, 회원 엔티티에서 키나 나이 값이 변경되어도 동일한 회원으로 인식 가능.값 타입정의: 자바 기본 타입이나 객체로 단순히 값으로 사용.특징:식별자가 없고 값만 있음.값이 변경되면 추적 불가.예를 들어, 숫자 100을 200으로 변경하면 완전히 다른 값으로 인식.값 타입 분류기본 값 타입예시: String name, int age특징:생명 주기가 엔티티에 의존.예를 들어, 회원을 삭제하면 이름과 나이 필드도 함께 삭제됨.값 타입은 공유 불가.예를 들어, 회원 이..
[JPA] JPA 프록시와 연관관계 관리 프록시(Proxy)는 JPA와 Hibernate에서 자주 사용되는 개념으로, 실제 엔티티 객체를 대리하여 동작하는 가짜 객체입니다. 프록시를 통해 데이터베이스 조회를 지연시키고, 성능을 최적화할 수 있습니다. 프록시의 주요 특징데이터베이스 조회 지연:em.find() 메소드는 데이터베이스를 즉시 조회하여 실제 엔티티 객체를 반환합니다.em.getReference() 메소드는 데이터베이스 조회를 미루고, 프록시 객체를 반환합니다. 실제 데이터는 프록시 객체의 메소드가 처음 호출될 때 조회됩니다.프록시 객체의 구조:프록시 객체는 실제 엔티티 클래스를 상속받아 만들어집니다.프록시 객체는 실제 엔티티 객체를 참조하는 방식으로 동작합니다.프록시 객체의 초기화:프록시 객체는 처음 사용할 때 한 번만 초기화됩니다.초..
[JPA] JPA 고급 매핑 상속관계 매핑JPA는 객체 지향 프로그래밍의 상속을 데이터베이스의 슈퍼타입 서브타입 관계로 매핑할 수 있습니다. 이를 통해 상속 구조를 데이터베이스에 저장할 수 있습니다. 상속관계 매핑에는 여러 전략이 있으며, 각각의 장단점이 있습니다.주요 어노테이션@Inheritance(strategy=InheritanceType.XXX)JOINED: 조인 전략SINGLE_TABLE: 단일 테이블 전략TABLE_PER_CLASS: 구현 클래스마다 테이블 전략@DiscriminatorColumn(name="DTYPE")상속관계에서 구분 컬럼을 정의할 때 사용합니다.@DiscriminatorValue("XXX")각 엔티티가 구분 컬럼에서 가질 값을 정의합니다.조인 전략 (JOINED Strategy)장점테이블 정규화가 잘..
[JPA] JPA 연관관계 매핑 (2) 단방향과 양방향 연관관계테이블에서의 연관관계테이블: 외래 키 하나로 양쪽 조인 가능. 방향이라는 개념이 없음.객체: 참조용 필드가 있는 쪽으로만 참조 가능.한쪽만 참조하면 단방향.양쪽이 서로 참조하면 양방향.연관관계의 주인테이블: 외래 키 하나로 두 테이블이 연관관계를 맺음.객체 양방향 관계: A -> B, B -> A처럼 참조가 2군데.객체 양방향 관계: 참조가 2군데 있음. 둘 중 테이블의 외래 키를 관리할 곳을 지정해야 함.연관관계의 주인: 외래 키를 관리하는 참조.주인의 반대편: 외래 키에 영향을 주지 않음, 단순 조회만 가능. 다대일 [N:1]다대일 관계에서는 여러 엔티티가 하나의 엔티티와 연관됩니다. 예를 들어, 여러 Member가 하나의 Team에 속하는 경우입니다.- 가장 많이 사용하는 연..
[JPA] JPA 연관관계 매핑 (1) "객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다."는 말은 객체 지향 프로그래밍과 관계형 데이터베이스 설계 간의 근본적인 차이점을 설명합니다. 이를 더 자세히 이해하려면, 객체 지향 프로그래밍과 관계형 데이터베이스 설계의 차이점을 고려해야 합니다.객체 지향 프로그래밍 (OOP)객체와 협력 관계:객체 지향 프로그래밍에서 객체들은 서로 협력하여 기능을 수행합니다. 예를 들어, Member 객체와 Team 객체는 서로 참조하고 협력하여 데이터를 처리합니다.객체 간의 관계는 참조 (reference)를 통해 직접 연결됩니다.상태와 행위:객체는 상태(state)와 행위(behavior)를 가지며, 메서드를 통해 다른 객체와 상호작용합니다.관계형 데이터베이스 (RDB)테이블과 외래 ..
[JPA] JPA 엔티티 매핑 @Entity 어노테이션을 사용하면 JPA가 해당 클래스를 엔티티로 인식하여 관리하게 됩니다. 엔티티 클래스 작성 시 주의할 점과 @Entity 어노테이션의 속성에 대해 정리해 보겠습니다.@Entity 어노테이션@Entity 어노테이션은 JPA가 해당 클래스를 엔티티로 인식하고, 데이터베이스 테이블과 매핑할 수 있도록 합니다. 이 어노테이션은 클래스 수준에 적용해야 합니다.주의 사항기본 생성자:JPA가 엔티티 객체를 생성할 때 사용합니다.반드시 파라미터가 없는 public 또는 protected 기본 생성자가 필요합니다.final 키워드 사용 제한:엔티티의 필드에는 final 키워드를 사용할 수 없습니다. JPA가 엔티티의 상태를 변경할 수 있어야 하기 때문입니다.필수 어노테이션:JPA를 사용하여 데이터..
[JPA] JPA 영속성 관리 JPA(Java Persistence API)에서 가장 중요한 두 가지 개념은 "객체와 관계형 데이터베이스 매핑하기"와 "영속성 컨텍스트"입니다. 이 두 개념은 JPA를 이해하고 효과적으로 사용하는 데 핵심적인 역할을 합니다.1. 객체와 관계형 데이터베이스 매핑하기객체-관계 매핑(ORM: Object-Relational Mapping)객체와 관계형 데이터베이스 간의 매핑을 정의하는 과정입니다. 이를 통해 객체 지향 프로그래밍 언어의 객체를 데이터베이스 테이블에 저장하고, 데이터베이스 테이블의 데이터를 객체로 변환할 수 있습니다.주요 매핑 어노테이션@Entity: 이 어노테이션을 클래스에 붙이면 JPA가 이 클래스를 엔티티로 인식합니다. 즉, 데이터베이스 테이블에 매핑되는 객체로 사용됩니다.@Table: ..