전체 글

The sky is the limit
앞에서 다대일 연관관계를 살펴보았다. 다대일 이번 글에서는 일대다 연관관계를 알아볼 것이다. 일대다 단방향 일대다에서 일이 연관관계의 주인이다. 객체에서는 연관관계의 주인인 Team이 members로 외래키를 관리한다. 테이블에서는 무조건 다쪽인 Member에 외래키가 들어간다. 이러한 객체와 테이블 간 차이 때문에 Team 객체는 반대편 테이블의 외래키를 관리한다. Team.members 값을 바꿨을 때 TEAM_ID가 업데이트 된다. 아래 코드를 통해 일대다 관계를 설정할 수 있다. 이때 @JoinColumn을 꼭 사용해야 한다. 사용하지 않으면, Member_Team 조인 테이블이 추가로 생기므로 비효율적이다. //Team.java @OneToMany @JoinColumn(name = "TEAM_I..
연관관계 매핑 시 고려사항 3가지 1. 다중성 다대일: @ManyToOne 일대다: @OneToMany 일대일: @OneToOne 다대다: @ManyToMany 2. 단방향, 양방향 테이블은 외래키 하나로 양쪽 조인이 가능하므로 방향의 개념이 없다. 객체는 참조용 필드가 있는 쪽으로만 참조할 수 있다. 예를 들어, Member에서 Team을 참조하고 싶으면 참조 필드 Member.team이 필요하다. 한쪽만 참조하면 단방향이고, 양쪽이 서로를 참조하면 양방향이다. 사실 객체 입장에서는 양방향이 아니라 단방향 2개이다. 3. 연관관계의 주인 테이블은 외래키 하나로 두 테이블이 연관관계를 맺는다. 객체 양방향 관계는 A->B, B->A로 참조가 2개이다. 두 참조 중에 테이블 외래키를 관리할 참조를 지정해야..
객체 연관관계와 테이블 연관관계의 차이 테이블 연관관계는 1개로 방향 개념이 없다. 테이블은 외래키 하나로 두 테이블의 연관관계를 관리한다. 외래키 Member.TEAD_ID로 Member, Team 양쪽을 조인할 수 있다. 객체는 연관관계가 2개이다. 객체를 양방향으로 참조하려면, 단방향 연관관계 2개를 만들어야 한다. Member와 Team 객체에 각각 참조값을 넣어 양쪽으로 참조를 할 수 있다. 양방향 매핑 규칙 두 개의 참조값 중 하나로 외래키를 관리해야 한다. Member.team이 바뀌었을 때 TEAM_ID를 바꿔야 할지, Team.Members가 바뀌었을 때 TEAM_ID를 바꿔야 할지 정해야 한다. 두 객체의 관계 중 하나를 연관관계 주인으로 지정한다. 연관관계 주인만이 외래키를 수정할 수..
학습 목표 객체와 테이블 연관관계 간의 차이를 이해 객체의 참조와 테이블의 외래키를 매핑 용어 이해 방향: 단방향, 양방향 다중성: 다대일, 일대다, 일대일, 다대다 연관관계 주인: 양방향 연관관계는 관리하는 주인이 필요 연관관계의 필요성 객체를 테이블에 맞추어 모델링 객체를 테이블에 맞춰서 데이터 중심으로 모델링하면 협력 관계를 만들 수 없다. 테이블과 객체 사이에는 큰 차이가 있기 때문이다. 테이블은 외래키로 조인을 사용해서 연관된 테이블을 찾는다면, 객체는 참조를 사용해서 연관된 객체를 찾는다. 객체 간에 양방향 연관관계를 만들고 싶으면, 두 객체에 필드를 추가해서 참조를 보관해야 한다. 참조를 통한 연관관계는 항상 단방향이기 때문이다. 이와 달리 테이블은 외래키 하나로 양방향 조인이 가능하다. M..
기본키를 매핑하는 방법에는 직접 할당과 자동 생성이 있다. 직접 할당 기본키로 지정하고 싶은 변수에 @Id를 선언한다. id를 직접 대입한 후에 엔티티 매니저로 persist()하면 된다. Member member = new Member(); member.setId("1"); em.persist(member); 자동 생성 자동 생성은 @Id와 @GeneratedValue를 추가하고, 키 생성 옵션을 선택하면 된다. 옵션 설명 IDENTITY 기본 키 생성을 DB에 위임한다. SEQUENCE DB 시퀀스를 사용해서 기본키를 할당한다. TABLE 키 생성 테이블을 사용한다. AUTO 선택한 DB에 따라 IDENTITY, SEQUENCE, TABLE 중 자동 지정된다. (기본값) IDENTITY 기본 키 생성..
@Column 객체의 필드를 테이블 컬럼에 매핑시켜 주는 어노테이션이다. 주요 속성 속성 기능 기본값 name 필드와 매핑할 테이블의 컬럼 이름을 지정한다. 객체의 필드명 nullable(DDL) null값 허용 여부를 설정한다. false로 설정하면, DDL 생성 시 not null 조건이 붙는다. true unique(DDL) @Table의 uniqueConstraints와 같으나 한 컬럼에 간단히 유니크 제약 조건을 걸 때 사용한다. false columnDefinition(DDL) 데이터베이스 컬럼 정보를 직접 줄 수 있다. length(DDL) 문자열 길이 제약조건; String 타입에만 사용한다. 255 사용 예시 @Enumerated 속성 속성 기능 기본값 value EnumType.ORDI..
개요 JPA는 데이터베이스 스키마를 자동으로 생성해 주는 기능을 제공한다. 아래 코드처럼 설정한 데이터베이스 방언에 맞는 DDL을 생성할 수 있다. 데이터베이스 방언이란? 데이터 타입이나 함수평, 페이징 처리 등 각 데이터베이스가 제공하는 고유 기능을 말한다. 특정 데이터베이스에 종속되는 기능을 많이 사용하면 나중에 데이터베이스를 교체하기 어렵다. 이를 해결하기 위해 JPA에서는아래와 같은 방언 클래스들을 제공한다. - H2 : org.hibernate.dialect.H2Dialect - MySQL : org.hibernate.dialect.MySQL5InnoDBDialect - Oracle 10g: org.hibernate.dialect.Oracle10gDialect 스키마 생성 옵션 create 기존..
객체와 테이블 매핑 @Entity JPA로 클래스를 데이터베이스 테이블과 매핑할 때 사용한다. JPA가 해당 엔티티를 관리하게 된다. 해당 어노테이션을 사용하기 위해서는 기본 생성자가 필요하다. final 클래스, enum, interface, inner 클래스에서는 @Entity를 사용할 수 없다. name 속성으로 JPA에서 사용할 엔티티 이름을 지정할 수 있다. 지정해주지 않으면, 기본값인 클래스 이름을 그대로 사용한다. @Table 엔티티와 매핑할 테이블을 지정한다. 속성은 다음 4가지가 존재한다. name: 매핑할 테이블 이름을 지정한다. catalog: 데이터베이스 catlog를 매핑한다. sechema: 데이터 베이스 schema를 매핑한다. uniqueConstraints: DDL을 생성할..
영속 상태가 되는 경우 i) em.persist()를 할 때 ii)em.find()를 했을 때 엔티티가 1차 캐시에 없을 때 1차 캐시에 없으면 엔티티를 DB에서 조회해 1차 캐시에 저장된다. 1차 캐시에 올라가 JPA가 관리하는 상태를 영속 상태라고 한다. 준영속 상태 영속 상태의 엔티티가 영속성 컨텍스트에서 분리되는 것이다. 준영속 상태에서는 영속성 컨텍스트가 제공하는 기능을 사용하지 못한다. 준영속 상태로 만드는 방법 em.detach(entity) 특정 엔티티만 준영속 상태로 전환한다. em.find()에서 150L Member는 영속성 컨텍스트에 없으므로 영속성 컨텍스트에 저장된다. (영속화) em.detach() 후에는 준영속 상태가 되어 영속성 컨텍스트에서 관리가 되지 않는다. //영속 상태..
플러시 플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것이다. 트랜잭션이 커밋되면 플러시가 자동으로 발생한다. 플러시가 발생하면 무슨 일이 생길까? - 변경 감지가 발생한다. - 수정된 엔티티를 쓰기 지연 SQL 저장소에 등록한다. - 쓰기 지연 SQL 저장소에 있는 등록, 수정, 삭제 쿼리를 데이터베이스에 전송한다. 영속성 컨텍스트를 플러시하는 방법 i) em.flush() - 직접 호출 Member member = new Member(200L, "member200"); em.persist(member); em.flush(); //플러시 강제 호출 em.persist()-> 영속성 컨텍스트에 엔티티가 담기고, 쿼리가 저장소에 저장된다. em.flush() -> 저장소의 쿼리가 DB에 반..
hyun_12
hyunDev