본문 바로가기

자바 ORM 표준 JPA 프로그래밍

(9)
9장_값 타입 값 타입과 불변 객체 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다. member1.setHomeAddress(new Address("OldCity")); Address address = member1.getHomeAddress(); address.setCity("NewCity"); member2.setHomeAddress(address); 우리는 회원2의 주소만 NewCity로 변경되길 기대했지만 회원1의 주소도 NewCity로 변경되어 버린다. 이렇게 값 타입의 실제 인스턴스 값을 공유하는 것은 위험하다. 대신에 값을 복사해서 사용해야 한다. 따라서 부작용 없이 안전하게 사용하기 위해서는, 값 타입은 불변하게 설정한다. 즉, 불변 객체로 설계해야 한다. 동일성 비교: 인스턴스의 참조..
8장_프록시와 연관관계 정리 프록시 1. 프록시 객체에 member.getName()을 호출해서 실제 데이터를 조회한다. 2. 프록시 객체는 실제 엔티티가 생성되어 있지 않으면 영속성 컨텍스트에 실제 엔티티 생성을 요청하는데 이것을 초기화라 한다. 3. 영속성 컨텍스트는 데이터베이스를 조회해서 실제 엔티티 객체를 생성한다. 4. 프록시 객체는 생성된 실제 엔티티 객체의 참조를 Member target 멤버변수에 보관한다. 5. 프록시 객체는 실제 엔티티 객체의 getName()을 호출해서 결과를 반환한다. 프록시의 특징 프록시 객체는 처음 사용할 때 한 번만 초기화된다. 프록시 객체를 초기화한다고 프록시 객체가 실제 엔티티로 바뀌는 것은 아니다. 프록시 객체가 초기화되면 프록시 객체를 통해서 실제 엔티티에 접근할 수 있다. 프록시 ..
7장_고급 매핑 상속 관계 매핑 1. 각각의 테이블로 변환(조인 전략) 장점 테이블이 정규화된다. 외래키 참조 무결성 제약조건을 활용할 수 있다. 저장공간을 효율적으로 사용한다. 단점 조회할 때 조인이 많이 사용되므로 성능이 저하될 수 있다. 조회 쿼리가 복잡하다. 데이터를 등록할 때 INSERT SQL을 두 번 실행한다. 2. 통합 테이블로 변환(단일 테이블 전략) 장점 조인이 필요없으므로 일반적으로 조회 성능이 빠르다. 조회 쿼리가 단순하다. 단점 자식 엔티티가 매핑한 컬럼은 모두 null을 허용해야 한다. 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. 그러므로 상황에 따라서는 조회 성능이 오히려 느려질 수 있다. 구분 컬럼을 꼭 사용해야 한다. @DiscriminatorColumn을 꼭 설정해야 한다..
6장_다양한 연관관계 매핑 5장에서 언급한 내용이 대부분이다. 다대다 연결은 사용하지 않는데, 왜냐하면 실무에서는 컬럼이 추가될 수도 있는데 이럴 경우 ManyToMany를 사용할 수 없다. 추가한 컬럼들을 매핑할 수 없기 때문이다. 따라서 중간다리 역할을 하는 엔티티를 만들고 다대다 관계를 일대다, 다대일 관계로 만든다. 복합 기본 키 복합키는 별도의 식별자 클래스로 만들어야 한다. equals와 hashCode 메소드를 구현해야 한다. 기본 생성자가 있어야 한다. 식별자 클래스는 public 이어야 한다. @IdClass를 사용하는 방법 외에 @EmbeddedId를 사용하는 방법도 있다. 위와 같이 복합키를 사용하면 ORM 매핑에서 처리할 일이 상당히 많아진다. 복합키를 사용하지 않고 간단히 다대다 관계를 구성하는 방법을 알아..
5장_연관관계 매핑 기초 엔티티는 단방향 관계이지만, 테이블은 양방향 관계이다.(외래키로 서로 참조할 수 있기 때문) 따라서, 엔티티는 서로 다른 단방향 관계 2개로 양방향 관계를 표현한다. 엔티티는 위와 같이 참조를 사용해서 연관관계를 탐색할 수 있는데 이것을 객체 그래프 탐색이라 한다. (테이블은 조인) @ManyToOne @JoinColumn(name="~~") 외래키를 갖고 있는 주인에 위와 같은 어노테이션을 사용한다. 항상 '다'인 부분이 외래키의 주인이다. name 속성의 기본값은 필드명+_+참조하는 테이블의 기본키 컬럼명 @OneToMany(mappedBy="~~") 주인이 아닌 부분은 위와 같은 어노테이션을 사용한다. name 속성의 값은 반대쪽 매핑의 필드 이름이다. 조회 객체 그래프 탐색(객체 연관관계를 사용한..
4장_엔티티 매핑 @Entity JPA가 관리한다. 기본 생성자는 필수다.(JPA가 엔티티 객체를 생성할 때 생성자가 없을 경우, 자동으로 기본 생성자를 만든다.) final 클래스, enum, interface, inner 클래스에는 사용할 수 없다. 저장할 필드에 final을 사용하면 안된다. @Table 엔티티와 매핑할 테이블을 지정한다. @Table(name="~~~") @Column 객체 필드를 테이블 컬럼에 매핑한다. 속성으로 name, nullable 등이 있다. @Enumerated enum 타입을 매핑할 때 사용한다. EnumType.ORDINAL, EnumType.STRING 이 있다. @Temporal 날짜 타입을 매핑할 때 사용한다. TemporalType.DATE, TemporalType.TIME,..
3장_영속성 관리 앤티티 매니저 팩토리와 앤티티 매니저 엔티티 매니저는 데이터베이스 연결이 꼭 필요한 시점까지 커넥션을 얻지 않는다. 영속성 컨텍스트 영속성 컨텍스트란, 엔티티를 영구 저장하는 환경이라는 뜻이다. persist() 함수를 이용해서 저장한 것이 결국 정확히 말하면 영속성 컨텍스트에 저장한다는 뜻이다. 엔티티의 생명주기 1) 비영속 persist()를 하기 이전의 상태. 즉, 영속 컨텍스트에 아직 저장하지 않은 상황이다. 2) 영속 영속성 컨텍스트가 관리하는 엔티티를 영속 상태라고 한다. 즉, 영속성 컨텍스트에 의해 관리된다는 뜻이다. 3) 준영속 영속성 컨텍스트가 엔티티를 관리하지 않는 상태를 말한다. 4) 삭제 영속성 컨텍스트와 데이터베이스에서 엔티티를 삭제한 것을 말한다. 영속성 컨텍스트의 특징 영속 상..
2장_JPA 시작 주의할 것 H2 실행 시 h2.bat을 실행시킨 뒤 Server 설정으로 바꿔서 들어갈 것 어노테이션 @Entity 테이블이라고 생각하면 된다. 이 클래스를 테이블과 매핑한다고 JPA에게 알려준다. 이를 엔티티 클래스라고 한다. @Table(name="~~~") 엔티티 클래스에 매핑할 테이블 정보를 알려준다. 이 어노테이션을 생략하면 클래스 이름을 테이블 이름으로 매핑한다. @Id 엔티티 클래스의 필드를 테이블의 PK에 매핑한다. 이를 식별자 필드라고 부른다. @Column(name="~~~") 필드를 컬럼에 매핑한다. 매핑 어노테이션이 없으면 필드를 컬럼명으로 매핑한다. 데이터베이스 방언 JPA는 특정 데이터베이스에 종속적이지 않은 기술이다. 하지만, 데이터베이스마다 문법이 조금씩 다르다는 문제점이 있..
1장_JPA 소개 JPA의 장점 생산성 단순 쿼리문을 작성하는 시간을 줄여준다.(ex. persist, save, find, findId 등) CREATE TABLE 과 같은 DDL문을 작성하는 시간 역시 줄여준다. 유지보수 SQL을 직접 사용할 경우, 엔티티에 필드 하나만 추가되어도 이와 관련된 모든 API를 변경해야 한다. 하지만 JPA는 알아서 해준다! 패러다임의 불일치 해결 상속, 연관관계, 객체 그래프 탐색, 비교하기와 같은 패러다임의 불일치 문제 해결 성능 다양한 성능 최적화 기능을 제공한다. 데이터 접근 추상화와 벤더 독립성 예로, 페이징 처리는 데이터베이스마다 달라서 사용법을 각각 배워야 한다. 하지만 JPA를 사용한다면 그냥 데이터베이스가 변경되었다는 것만 알리면 된다. 표준 JPA는 자바 진영의 ORM ..