양뱡향 매핑 시 가장 많이 하는 실수 양방향 관계에서 가능 많이 하는 실수는 연관관계의 주인 값을 입력하지 않고 진행하는 것이다.Team team = new Team();team.setName("TeamA");em.persist(team);Member member = new Member();member.setName("member1");// 역방향(주인이 안니 방향)만 연관관계 설정 team.getMembers().add(member);em.pesist(member);이런 경우 연관관계의 주인인 member의 team값은 null이 저장이 된다. 양방향의 주인은 외래키를 관리자 역할을 하므로 Member.team 값을 입력해 주어야 정상적으로 값이 매핑이 되게 된다. 순수한 객체를 고려그렇다면 연관관계..
Framework
2024.03.21 - [Framework/JPA] - [연관관계 매핑 기초] 단방향 연관관계와 객체와 테이블의 차이이전 포스팅에서는 단방향에 대해 알아보았다. 이때 객체와 테이블은 패러다임의 차이가 있어 관계를 표현하는 게 다른 것을 확인했다. 테이블은 기본적으로 외래키 조인을 활용한 양방향인데 객체의 필드를 참조하는 방식은 단방향이다. 양방향 연관관계데이터베이스 테이블처럼 양방향으로 조회하기 위해선 반대쪽 객체의 단방향 참조를 추가하여 양방향 연관관계를 매핑할 수 있다. 회원과 팀은 다대일 관계이다. 반대로 팀과 회원은 일대다 관계이다. 팀쪽에(반대쪽 엔티티)의 회원에 대한 단방향 연관관계를 추가하므로 Team.members라는 List 컬렉션이 추가됨을 알 수 있다.다대일 관계에서 표현한 것이다...
객체의 참조는 필드를 매핑한다. 이 필드를 매핑하긴 위해선 @JoinColum을 이해할 필요가 있다. @Entity public class Member { @Id @Colunm(name = "MEMBER_ID") private String id; private String username; //연관관계 매핑 @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; //연관관계 설정 private void setTeam(Team team) { this.team = team; } //Getter, Setter}@Entitypublic class Team { @Id @Col..
들어가기 앞서서 키워드 정리엔티티들은 대부분 다른 엔티티와의 연관관계를 가지고 있다. 예를 들면, 주문 엔티티는 상품 엔티티와 연관이 있고 상품 엔티티는 카테고리, 재고 등과 연관이 되어있다. ORM과 관계형 DB의 차이에서 정리한 적 있는데 객체와 테이블은 관계를 맺는 방식이 다르다. 객체는 참조를 통해 관계를 맺고 테이블은 외래키를 이용하여 관계를 맺는다.이 둘은 완전히 다른 특징을 가지기 때문에 이것을 ORM 맵핑으로 처리하는 것은 가장 어려운 부분이다. 이번 [연관관계 매핑 기초]를 통해 객체의 참조와 테이블의 외래 키를 매핑하는 방법을 학습하는 것이 목표이다. 핵심 키워드방향(Direction): 단방향과 양방향이 있다. 다중성(Multiplicity): 다대일(N:1), 일대..
기본 키 매핑 @Id 어노테이션만 사용하면 기본 키를 애플리케이션에서 직접 할당한다. 기본 키를 애플리케이션에서 직접 할당하는 방식 대신에 오라클의 시퀀스 오브젝트나 MySQL의 AUTO_INCREMENT 같은 데이터베이스가 생성해 주는 값을 이용하려면 어떻게 해야 할까? JPA에서 제공하는 데이터베이스 기본 키 생성 전략 JPA가 제공하는 DB 기본 키 할당 전략은 직접 할당 방식, 자동 생성 방식 두 가지가 있다. 직접 할당 방식은 애플리케이션이 기본 키를 직접 할당하는 방식이다. 자동 생성 방식은 대리키를 사용하는 방식으로 AUTO, IDENTITY, SEQUENCE, TABLE 네 가지 옵션이 있다. 해당 방식들은 DB에 의존되는 방식이다. package jakarta.persistence; pu..
필드와 컬럼 매핑 분류 매핑 어노테이션 설명 필드와 컬럼 매핑 @Column 컬럼을 매핑한다. @Enumerated 자바의 enum 타입을 매핑한다. @Temporal 날짜 타입을 매핑한다. @Lob BLOB, CLOB 타입을 매핑한다. @Transient 특정 필드를 데이터베이스에 매핑하지 않는다. 기타 @Access JPA가 엔티티에 접근하는 방식을 지정한다. @Column @Column은 객체 필드를 테이블 컬럼에 매핑한다. 가장 많이 사용되며 기능도 많다. 속성 기능 기본값 name 필드와 매핑할 테이블의 칼럼 이름 객체의 필드 이름 insertable(거의 사용되지 않음) 엔티티 저장 시 이 필드도 같이 저장한다. false 설정 시 이 필드는 데이터베이스에 저장하지 않는다. false 옵션을 ..
DDL 자동 생성 데이터베이스 스키마 자동생성은 객체에 정의한 정보를 바탕으로 테이블을 만들어주는 기능이다. JPA가 DDL(Data Definition Language, 데이터 베이스의 스키마(테이블명, 열 이름 등)를 만들어주는 SQL문 집합)을 자동으로 생성해 준다. 특징 및 사용 애플리케이션 실행 시점에 객체에 지정한 정보를 바탕으로 DDL을 자동으로 생성한다. 데이터베이스 테이블 중심에서 객체 중심의 개발이 가능해진다. 데이터베이스 방언(SQL Dialect)에 맞는 적절한 DDL을 생성한다. 예를 들어 String 값은 일반적으로 varchar타입으로 분류되지만 Oracle 데이터베이스인 경우 varchar2로 해당 데이터베이스 언어에 맞게 생성이 된다. 편리하지만 실제 운영 서버에서 사용하기..
JPA 사용에 있어 가장 중요한 일은 엔티티와 테이블을 정확히 매핑하는 것이다. 따라서 매핑 어노테이션을 숙지하고 있어야 한다. 대표 어노테이션 객체와 테이블 매핑 : @Entity, @Table 필드와 컬럼 매핑 : @Column 기본 키 매핑 : @Id 연관관계 매핑 : @ManyToOne, @JoinColumn 객체와 테이블 매핑 @Entity JPA를 사용해서 테이블과 매핑할 클래스는 @Entity를 붙여서 사용한다. @Entitiy가 붙은 클래스는 JPA가 관리하며, 엔티티라고 한다. 적용 시 주의사항 기본 생성자는 필수이다(파라미터가 없는 public 또는 protected 생성자). final 클래스, enum, interface, inner 클래스에는 사용할 수 없다. 저장할 필드에 fin..
준영속은 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 것을 준영속 상태라고 한다. 따라서 준영속 상태의 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할 수 없다. 영속상태를 준영속 상태로 만드는 방법 영속상태를 준영속으로 만드는 방법은 3가지이다. em.detach(entity) : 특정 엔티티만 준영속 상태로 전환한다. em.clear() : 영속성 컨텍스트를 완전히 초기화한다. em.close() : 영속성 컨텍스트를 종료한다. 엔티티를 준영속 상태로 전환: detach() public void testDetached() { ... //회원 엔티티 생성, 비영속 상태 Member memberA = new Member(); memberA.setId("memberA"); //회원 엔티티 영속 상태 ..
플러시(flush)는 영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 것을 말한다. 플러시가 발생하면 다음과 같은 일이 발생되게 된다. 변경 감지가 동작하여 영속성 컨텍스트에 있는 모든 엔티티의 스냅샷과 비교하여 수정된 엔티티를 찾는다. 수정된 엔티티는 수정 쿼리를 만들어 쓰기 지연 SQL 저장소에 등록한다. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다. (등록, 수정, 삭제 쿼리) 영속성 컨텍스트를 플러시 하는 방법 직접호출 엔티티 매니저의 flush() 메소드를 직접 호출해서 영속성 컨텍스트를 강제로 플러시한다. 테스트나 다른 프레임워크와 JPA를 함께 쓰는 경우를 제외하고 거의 사용되지 않는다. 트랜잭션 커밋 시 플러시 자동 호출 트랜잭션을 커밋하지 않으면 데이터베이스에 SQL이 전..