본문 바로가기
728x90

[JAVA]/JPA35

JPA - 엔티티와 테이블 매핑시 주의 사항 클래스 이름 중복 등의 이슈가 없으면 @Entity, @Id만 사용 만약 엔티티 클래스에 테이블 스키마 명세의 역할을 부여하고 싶다면 @Table 애너테이션으로 테이블명을 지정 기본키 생성 전략에서 데이터베이스에서 지원해주는 AUTO_INCREMENT, SEQUENCE를 이용할 수 있도록 IDENTITY, SEQUENCE 전략을 사용 @Column 정보를 명시적으로 모두 지정하는 것은 번거롭지만 유지보수성에 좋음 엔티티 클래스 필드 타입이 Java의 원시 타입일 경우 @Column 애너테이션으로 최소한 nullable=false를 설정해야 오류를 피할 수 있음 원시타입은 null값을 가질 수 없기 때문 enum 순서가 개판되는걸 피하기 위해서는 @Enumerated.STRING을 사용하자. 2022. 11. 29.
JPA - 다양한 연관관계 매핑 다대일 단방향 DB 테이블 설계 상 '다'쪽에 외래키가 있어야 한다. 가장 많이 사용하는 연관관계이다. 반대는 일대다 관계이다. 다대일 양방향 객체 연관관계에서 '일'쪽에 추가만 해주면 되고 단순 조회만 가능하다. 외래키가 있는 쪽이 연관관계의 주인이라고 생각하면 된다. 양쪽이 서로를 참조하도록 개발한다. 일대다 단방향 일대다 단방향은 일대다에서 '일'이 연관관계의 주인이다. 테이블 일대다 관계는 항상 '다'쪽에 외래키가 있다. 객체와 테이블의 차이 때문에 반대편 테이블의 외래키를 관리하는 특이한 구조이다. Team(1)과 Member(N) 테이블이 있다고 가정할 때 Team 테이블이 연관관계의 주인이다. 하지만 DB에서는 설계상 무조건 '다' 쪽에 외래키가 들어가야 한다. Team 객체는 외래키를 가지.. 2022. 11. 28.
JPA - 연관관계 매핑시 고려사항 3가지 연관관계 매핑시 고려사항 3가지 다중성 다대일 : @ManyToOne 일대다 : @OneToMany 일대일 : @OneToOne 다대다 : @ManyToMany 단방향, 양방향 테이블 외래키 하나로 양쪽 조인 가능 사실 방향이라는 개념이 없음 객체 참조용 필드가 있는 쪽으로만 참조 가능 한쪽만 참조하면 단방향 양쪽이 서로 참조하면 양방향(사실 양방향이라는 건 없음, 단방향이 두개인 것) 연관관계의 주인 테이블은 외래키 하나로 두 테이블이 연관관계를 맺는다. 객체 양방향 관계는 참조가 양쪽에서 일어난다. 때문에 둘 중에 테이블의 외래키를 관리할 곳을 지정해야한다. 연관관계의 주인은 외래키를 관리하는 참조 쪽으로 한다. 주인의 반대편은 외래키에 영향을 주지 않고 단순 조회만 가능하다. 참고 김영한 - 자바 .. 2022. 11. 28.
JPA - 연관관계 매핑 객체를 테이블에 맞춰 데이터 중심으로 모델링을 하면 협력 관계를 만들 수 없다. 테이블은 외래키로 조인을 사용해서 연관된 테이블을 찾는다. 따라서 테이블은 외래키 하나만 가지고 양쪽에서 조인을 통하여 연관된 테이블을 찾을 수 있다. 객체는 참조를 통해서 연관된 객체를 찾는다. 객체는 양쪽 모두 참조 설정을 해야 양방향 매핑이 가능하다. 이는 테이블과 객체의 큰 차이점으로 연관관계 매핑을 이해하는 데에 어려움을 야기한다. 객체의 단방향 연관관계 @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; private int age; @ManyToOne @Join.. 2022. 11. 27.
JPA - 기본 키 매핑 기본 키 매핑 방법 직접 할당 @Id만 사용 member.setMemberId(1L); 처럼 명시적으로 할당해줘야함 자동 생성 @GeneratedValue(strategy = GeneratedType.xxx) IDENTITY 기본 키 생성을 데이터베이스에 위임 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용 ex)MySQL의 AUTO_INCREMENT JPA는 일반적으로 트랜잭션 commit 시점에 INSERT SQL을 실행한다. 그러나, AUTO_INCREMENT는 데이터베이스에 INSERT SQL을 실행한 후에 ID 값을 알 수 있다. IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL을 실행하고 DB에서 식별자를 조회한다. SEQUENCE 데이.. 2022. 11. 27.
JPA - 필드와 컬럼 매핑 @Column 필드와 컬럼 매핑 속성 name : 필드와 매핑할 테이블의 컬럼 이름 / 기본값 : 객체 필드의 이름 insertable, updatable : 등록, 변경 가능 여부 / 기본값 : TRUE nullable(DDL) : null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성 시에 not null 제약 조건이 붙음. unique(DDL) : @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다. columnDefinition(DDL) : 데이터베이스 컬럼 정보를 직접 줄 수 있다. ex) "varchar(100) default 'EMPTY'" length(DDL) : 문자 길이 제약조건, String 타입에만 사용함 @Te.. 2022. 11. 27.
JPA - 객체와 테이블 매핑 @Entity @Entity가 붙은 클래스는 JPA가 관리하는 엔티티이다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수이다. 기본 생성자 생성이 필수이다. name이라는 속성이 있는데 JPA에서 사용할 엔티티 이름을 지정한다. 기본값은 클래스 이름을 그대로 사용한다. @Table 엔티티와 매핑할 테이블 지정 속성 name : 매핑할 테이블 이름 catalog : 데이터베이스 catalog 매핑 schema : 데이터베이스 schema 매핑 참고 김영한 - 자바 ORM 표준 JPA 프로그래밍 2022. 11. 27.
JPA - flush(플러시) flush(플러시) 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다. commit과는 다르다. flush 이후에 commit을 해야 한다. 보통은 commit 시에 플러시를 자동 호출하는 옵션을 사용한다. JPQL을 실행할 때도 자동으로 flush가 호출된다. 영속성 컨텍스트에 데이터를 넣고, flush가 호출되지 않으면 조회하는 쿼리를 날려도 조회가 되지 않기 때문이다. flush를 한다고 1차 캐시가 지워지는 건 아니다. flush가 발생하면 변경 사항을 감지하고 수정된 엔티티 쓰기 지연 SQL 저장소에 등록한다. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다. 1차 캐시는 지워지지 않음(영속성 컨텍스트를 비우지 않음) 영속성 컨텍스트의 변경 내용을 데이터 베이스에 동기화하는 것 영속.. 2022. 11. 26.
728x90