[프로그래밍] JPA 9

[JPA] JPA와 cascade, orphanRemoval

엔티티 간 관계에서 부모 엔티티에 대한 변경이 자식 엔티티에 어떻게 전파되는지, 그리고 연관관계가 끊긴 객체(Orphan)를 어떻게 처리할 것인지를 정의함.public class Parent { @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true) private List children = new ArrayList(); 여러 cascade 를 동시에 적용하려면 @OneToMany(mappedBy = "parent", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) private List children ..

[JPA] JPA 와 연관관계

연관관계JPA에서 영속 객체(Entity) 간의 연관관계를 통해 객체 지향 프로그래밍에서의 객체들 간 관계와 데이터베이스의 테이블 간 관계를 서로 매핑하여 연결함.영속객체가 테이블과 매핑되는 것 처럼 영속객체간의 관계는 테이블간의 관계와 매핑됨. 영속객체간 관계 그리고 테이블간 관계에는 차이가 있어 이해하고 매핑을 구성해야함. 객체 참조 vs. 외래 키 참조객체 지향 프로그래밍에서는 객체 간의 관계가 객체 참조를 사용하여 표현. User 객체가 여러 개의 Order 객체를 참조할 수도 있음.관계형 데이터베이스에서는 테이블 간의 관계가 외래 키를 사용하여 표현됨.  'Orders' 테이블에는 'User' 테이블의 기본 키를 참조하는 외래 키가 있을 수 있음.방향성(Direction)단방향(One-way):..

[JPA] JPA와 Column

@Column 영속 객체의 필드와 데이터베이스 테이블의 열(column)을 매핑할 때 사용.옵션 기능을 제공하며 이를 통해 영속 객체 필드의 속성을 정의할 수 있음.대부분 선택적으로 사용하며 기본값이 지정되어 있음. @Lob RDBMS에서 대규모 데이터를 저장하기 위해 BLOB 또는 CLOB 데이터 유형을 지원함.BLOB(Binary Large Object)은 기가 바이트까지의 이미지, 파일, 기타 유형의 데이터를 저장함.CLOB(Character Large Object)은 기가 바이트까지의 긴 문자열을 저장함.@Lob 어노테이션은 객체의 필드나 속성의 유형에 따라 BLOB이나 CLOB으로 구분됨.주로 @Basic 어노테이션과 함께 LAZY 로딩으로 선언하여 대규모 데이터를 필요할 때만 로드하도록 하여 ..

[JPA] JPA의 기본 키 생성 전략

기본키 적용을 위한 어노테이션:@Id: 단순히 하나의 필드를 기본키로 지정할 때 사용됨. @IdClass: 복합키를 지원하며, 별도의 클래스를 이용하여 복합키를 정의할 때 사용됨.@EmbeddedId: 복합키를 임베디드 타입으로 사용할 때 적용되며, 복합키를 내장된 객체로 처리함.기본키를 어디서 생성할지 결정해야함.애플리케이션에서 생성하는 방식과 데이터베이스에서 생성하는 방식, 두 가지 기본 키 생성 매커니즘을 결정하는 것이 필요함.애플리케이션에서 생성:자바 프로그램 내에서 유니크한 값을 생성하여 기본 키로 사용함.UUID와 같은 메소드를 사용하여 독립적으로 유니크한 값을 생성함.데이터베이스 시스템에 독립적이며 다양한 데이터베이스와 호환됨.데이터베이스에서 생성:데이터베이스의 내장 기능을 사용하여 자동으로..

[JPA] Entity Mapping

@Entity 어노테이션을 사용하면 해당 클래스가 도메인 객체를 관계형 데이터베이스의 테이블로 맵핑됨을 나타냄.@Entity 어노테이션만 사용했을 때, 기본적으로 테이블 이름은 클래스 이름을 따르며, 대소문자 구분이 일어나지 않음.대부분의 관계형 데이터베이스 관리 시스템(RDBMS)은 대소문자를 구분하지 않으므로, 이러한 기본 JPA 작명 규칙은 일반적으로 문제를 일으키지 않음.Table 이름을 명시적으로 지정하고 싶을 때 @Table 어노테이션을 사용할 수 있음.@Table 어노테이션은 테이블 이름뿐만 아니라, 카탈로그, 스키마, 인덱스 등 테이블과 관련된 추가적인 설정을 할 수 있게 해줌.@Table(name = "table")과 같이 사용하면, 실제 데이터베이스에 생성되는 테이블 이름을 'table..

[JPA] JPA의 영속성 컨텍스트

JPA를 통해 객체를 영혹화 하기 위해선 EntityManager 객체가 필요하고 ,객체는 EntityManagerFactory 객체를 통해 얻음EntityManager는 영속성 컨텍스트를 통해 영속 객체를 관리함사용자는 EntityManager 인스스 객체의 메소드들을 이용해 영속성 객체를 관리함EntityManagerFactoryEntityManagerFactory는 EntityManager 인스턴스를 생성하는 역할. 애플리케이션 전체에서 한 번만 생성되며, 이를 통해 여러 EntityManager 인스턴스를 얻을 수 있음.EntityManagerFactory는 보통 애플리케이션 시작시에 생성되며 종료 시에 닫힘. 이는 매우 비용이 많이 드는 작업이므로, 애플리케이션 내에서 재사용됨.생성 방법은 Pe..

[JPA] JPA 와 DB Dialect

데이터베이스 방언(Database Dialect)데이터베이스 방언이란 특정 데이터베이스 시스템이 사용하는 SQL 언어의 특정 변형. 각기 다른 데이터베이스가 제공하는 SQL 명령어, 함수, 데이터 타입 등에는 차이가 있음. 쿼리 예시: 데이터 페이징 조회 (첫 번째 페이지의 첫 10개 항목 조회)1. PostgreSQL Dialect: PostgreSQL은 LIMIT와 OFFSET 키워드를 사용한 페이징을 지원. SELECT * FROM employees ORDER BY id LIMIT 10 OFFSET 02. MySQL/MariaDB Dialect: LIMIT와 OFFSET을 지원하지만, 간단한 쿼리에서는 OFFSET을 생략하고 다음과 같이 작성. SELECT * FROM employees ORDER ..

[JPA] JPA?

Java Persistence API, 자바 진영의 ORM(Object Relational Mapping) 기술 표준ORM(Object Relational Mapping)은 객체와 관계형 데이터베이스 간의 호환성 문제를 해결하는 기술이다.이 기술을 통해 개발자는 객체 지향 프로그래밍 언어로 작성된 코드와 관계형 데이터베이스 사이의 '다리' 역할을 하는 매핑 레이어를 이용할 수 있다. ORM을 사용하면 개발자는 객체는 객체대로, 관계형 데이터베이스는 관계형 데이터베이스대로 설계할 수 있다.이렇게 하면, 객체 지향 프로그래밍의 장점을 살리는 동시에, 관계형 데이터베이스의 강력한 데이터 관리 능력을 활용할 수 있다. ORM 프레임워크는 이 두 세계를 연결하는 중요한 역할을 한다.객체 모델과 데이터베이스 스키마..

[JPA] 와 SQL

Java 를 사용하여 백엔드 서버 개발을 하면 객체지향 설계를 한다.DB 는 대부분 관계형 DB 를 사용한다. 따라서 이 둘을 모두 사용하려면 객체를 관계형 DB 에 저장해야 하고, SQL 로 관리해야 한다. 여기서 패러다임의 불일치가 발생하고,  이 과정에서 자바 객체를 SQL 로 바꾸거나 SQL을 자바 객체로 바꾸는 과정을 직접 코딩해줘야 한다.결론은 개발은 객체지향적으로 하지만 SQL에 의존하는 과정을 꼭 거쳐야 한다. 객체와 관계형 데이터 베이스둘은 시발점 자체가 달라 패러다임의 불일치가 발생한다.관계형 데이터 베이스의 목적은 데이터를 정규화 해서 무결성을 갖게 하는 것이고,객체는 데이터랑 메서드를 잘 결합하여 캡슐화, 추상화, 정보선별, 상속, 다형성 등 변화에 유연하게 대 하기 위함이다.캡슐화..