JPA

반응형
· JPA
데이터베이스 테이블의 연관관계를 설계하는 방법은 크게 2가지다. 조인 컬럼(외래 키) 사용 조인 테이블(브릿지 테이블) 사용 조인 컬럼 사용 테이블 간에 관계는 주로 조인 컬럼이라 부르는 외래 키 컬럼을 사용해서 관리한다. 연결할 테이블이 많아 질수록 컬럼이 많아질 수 있다. 조인한 테이블이 필수일때는 INNER JOIN(NOT NULL)을, 필수가 아닐때는 OUTER JOIN(NULL)으로 조인한다. 조인 테이블 사용 조인 테이블을 생성해 연결할 테이블들의 기본 키들을 엮어서 연결한다. 나는 보통 브릿지 테이블로 부르고 다대다 연결을 할때, 다른 테이블에 조인이 추가될 가능성이 높을때 주로 사용한다. 테이블마다 필요한 정보만 저장할 수 있어서 이 방법을 선호하지만 조인 테이블이 많아져 SQL이 느려질 ..
· JPA
복합키 JPA는 영속성 컨텍스트에 엔티티를 보관할 때 엔티티의 식별자를 키로 사용한다. 식별자 필드가 2개 이상이면 별도의 식별자 클래스를 만들어 식별자를 구분해야 한다. JPA는 복합 키를 지원하기 위해 @IdClass와 @EmbeddedId 2가지 방법을 제공한다. @IdClass는 관계형 데이터베이스에 가까운 방법이고, @EmbeddedId는 좀 더 객체 지향에 가까운 방법이다. 복합키 매핑에 예제에서 확인해보자 복합 키: 식별 관계(Identifying Relationship) 매핑 식별 관계는 부모 테이블의 기본 키를 내려받아서 자식 테이블의 기본 키 + 외래 키로 사용하는 관계다. PARENT 테이블의 기본 키 PARENT_ID를 받아서 CHILD 테이블의 기본 키(CHILD_ID) + 외래 ..
· JPA
@MappedSuperclass를 사용하면 부모 클래스는 테이블과 매핑하지 않고 부모 클래스를 상속받는 자식 클래스에게 매핑 정보만 제공한다. 비유를 하자만 추상 클래스와 비슷한데 @Entity는 실제 테이블과 매핑되지만 @MappedSuperclass는 실제 테이블과 매핑되지 않는다. 단순히 매핑 정보를 상속할 목적으로만 사용된다. 이 클래스를 직접 생성해서 사용할 일은 거의 없으므로 추상 클래스로 만드는 것을 권장한다. @MappedSuperclass public abstract class BaseEntity { @Id @GeneratedValue @Column(name = "ID") private long id; @Column(name = "NAME") private String name; } @E..
· JPA
관계형 데이터베이스에는 객체지향 언어에서 다루는 상속이라는 개념이 없다. 대신 슈퍼타입 서브타입 관계(Super-Type Sub-Type Relationship)라는 모델링 기법이 객체의 상속 개념과 가장 유사하다. ORM에서 이야기하는 상속 관계 매핑은 객체 상속 구조와 데이터베이스의 슈퍼타입 서브타입 관계를 매핑하는 것이다. 조인 전략(각각의 테이블로 변환) 각각을 모두 테이블로 만들고 조회할때 조인을 사용한다. JPA에서는 조인 전략이라 한다. 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략이다. 구분 컬럼으로 타입을 구분한다. @Entity @Inheritance(strategy = InheritanceType.JOINED) // 조인 전략 사용 @Discrim..
· JPA
엔티티의 연관관계를 설정할때 주의해야할 부분들이 있다. 다중성 다중성에는 다대일(@ManyToOne) 일대다(@OneToMany) 일대일(@OneToOne) 다대다(@ManyToMany) 가 있다. 다중성을 판단하기 어려울 때는 반대방향을 생각해 보면 된다. 참고로 일대다의 반대 방향은 항상 다대일이고, 일대일의 반대방향은 항상 일대일이다. 일대일 관계에서는 외래키를 어느 테이블에서도 가질 수 있다. 어느 테이블이든 외래키 하나만 있으면 양쪽으로 조회할 수 있다. 주 테이블에 외래키가 있으면 주 테이블이 외래키를 가지고 있으므로 주 테이블만 확인해도 대상 테이블과 연관관계가 있는지 알 수 있고, 대상 테이블에 외래키가 있을때는 일대일에서 일대다로 변경할 때 테이블 구조를 그대로 유지할 수 있다. 단방향,..
· JPA
아래 자주 쓰이는 기본적인 객체 관계 매핑 어노테이션을 정리해보았다. @JoinColumn 외래 키를 매핑할 때 사용한다. 속성 기능 기본값(Default) name 매핑할 외래 키 이름 필드명 + _ + 참조하는 테이블의 기본 키 컬럼 referencedColumnName 외래 키가 참조하는 대상 테이블의 컬럼명 참조하는 테이블의 기본 키 컬럼명 foreignKye(DDL) 외래 키 졔약조건을 직접 지정할 수 있다. 이 속성은 테이블을 생성할 때만 사용한다. unique nulldable insertable updatable columnDefinition table @Column의 속성과 같다 class Member { @ManyToOne @JoinColumn(name = "team_id", refer..
· JPA
Hibernate란? 하이버네이트는 자바 언어를 위한 ORM 프레임워크이고 JPA의 구현체로, JPA 인터페이스를 구현하고 내부적으로 JDBC API를 사용한다. 하이버네이트는 자바객체를 통해 데이터베이스가 Oracle, MySql, MSSQL 등 에 상관없이 다룰수 있도록 하는 추상화를 목표로 한다. Mybatis에 익숙한 사람들이라면, Mybatis 구조가 들어가는 자리에 Hiberante가 들어오는 구조라고 이해하면 된다. 이를 통해 개발자는 SQL를 직접 사용하지 않고 메서드 호출만으로 쿼리가 수행된다, 즉 SQL을 작성하는 시간을 줄여 생산성이 높아진다. 하지만 직접 SQL을 작성하는것보다는 성능상 좋지 않고 세밀하게 데이터를 조작하기 힘들다. 이를 보안하기 위해 JPQL과 NativeQuery..
· JPA
JPA르 사용하는데 가장 중요한 일은 엔티티와 테이블을 정확히 매핑하는 것이다. 따라서 매핑 어노테이션을 숙지하고 사용해야 한다. 아래 자주 쓰이는 기본적인 엔티티 매핑 어노테이션을 정리해보았다. @Entity JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여햐 한다. @Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라 부른다. 속성 기능 기본값(Default) name 엔티티 이름을 지정한다. 이름이 같은 엔티티 클래스가 있다면 다른 이름을 지정해서 충돌되지 않게 해야한다. 미 설정 시 클래스 이름을 그대로 사용 기본 생성자는 필수 (public, protected) final 클래스, enum, interface, inner 클래스에는 사용할 수 없다. ..
· JPA
엔티티 매니저(Entity Manager) JPA에서 엔티티 매니저(Entity Manager)는 엔티티를 저장하고, 수정하고, 삭제하고 조회하는 등 엔티티와 관련된 모든 일을 처리한다. 또한 영속성 컨텍스트를 통해 데이터의 상태 변화를 감지하고 필요한 쿼리를 자동으로 수행한다. Spring Data JPA에서는 EntityManager를 자동으로 Bean이 등록되기때문에 직접 사용하지는 않는다. 엔티티 매니저 팩토리와 엔티티 매니저 데이터베이스를 하나만 사용하는 애플리케이션은 일반적으로 엔티티 매니저 팩토리를 하나만 생성한다. 엔티티 매니저 팩토리는 이름 그대로 엔티티 매니저를 만드는 공장인데, 공장을 만드는 비용은 상당히 크다. 따라서 한 개만 만들어서 애플리케이션 전체에 공유하도록 설계되어 있다. ..
· JPA
JPA란? 자바 ORM 기술에 대한 표준 명세로, JAVA에서 제공하는 API 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다. SQL을 매핑하지 않고 자바 클래스와 DB테이블을 매핑한다. ORM이란? Object Relation Mapping의 약자로 객체를 통해 간접적으로 DB를 다루고 객체와 데이터를 자동으로 매핑한다. Query가 아닌 메서드로 데이터를 생성하고 조작할 수 있다. JPA 동작 과정 JPA는 애플리케이션과 JDBC 사이에서 동작한다. 개발자가 JPA를 사용하면, JPA 내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신한다. 즉, 개발자가 직접 JDBC API를 쓰는 것이 아니다. JPA 특징 데이터를 객체지향적으로 관리할 수 있기 때문..
반응형
Beekei
'JPA' 카테고리의 글 목록 (4 Page)