본문 바로가기

자바 ORM 표준 JPA 프로그래밍 - 김영한

(9)
[JPA] 고급 매핑 (상속 관계 매핑, @MappedSuperclass) 상속 관계 매핑 위 사진과 같이 id, 이름(name), 가격(price)이라는 동일한 컬럼을 사용하는 엔티티가 여러 개있는 경우 상속 구조를 이용해 공통되는 컬럼을 추출하여 구현할 수 있다. 구현하는 방법으로는 총 3가지가 있으며 부모 클래스까지 직접 테이블과 매핑되는 3가지 방법 외에 마지막으로 부모 클래스는 테이블과 매핑하지 않고 부모 클래스를 상속받는 자식 클래스에게 매핑 정보만 제공하는 @MappedSuperclass 까지 알아보자. 조인 전략 (Joined Strategy) 조인 전략은 엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략이다. 조회할 때 조인을 자주 사용하며 조인전략을 사용하기 위해서는 타입을 구분하는 컬럼을 ..
[DB] 트랜잭션과 격리 수준 트랜잭션이란? 트랜잭션이란 데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위라고 할 수 있으며, 트랜잭션에는 여러개의 연산이 수행될 수 있다. 그리고 트랜잭션은 아래 네 가지 원칙(ACID)가 반드시 지켜져야 한다. 원자성 (Atomicity) 처음에 언급했듯이 트랜잭션에는 여러개의 연산이 수행될 수 있는데 이 연산들이 모두 성공하거나 모두 실패해야 한다. 예를 들어 은행의 계좌 이체 서비스를 개발한다고 가정하면 하나의 계좌에서는 출금이 이루어져야 하고, 이체의 대상이 되는 계좌에는 입금이 동시에 일어나야 한다. 만약 출금에는 성공했는데 입금에는 실패한다면 결국 출금 계좌의 주인은 돈만 잃은 셈이 된다. 즉 한 트랜잭션 안에 있는 모든 연산이 성공했을때만 커밋(COMMIT)되어 데이터베이스에 영..
[JPA] N + 1 문제와 해결방법 N + 1 문제란? 처음 조회한 데이터 수만큼 다시 SQL을 사용해서 연관 관계가 설정된 엔티티를 조회하는 것을 N + 1 문제라고 한다. N + 1 문제는 em.find() 메소드나 스프링 데이터 JPA의 findById() 메소드 같은 단건 조회 시에는 연관된 엔티티를 조인해서 한번에 조회해오기 때문에 문제가 되지 않지만 JPQL을 이용한 메소드를 호출할 때는 문제가 발생한다. N + 1 상황을 만들기 위해 아래와 같이 엔티티를 설정했다. Member 엔티티 @Entity @Getter @Setter @NoArgsConstructor public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private..
[JPA] 객체지향 쿼리 객체지향 쿼리란? 객체지향 쿼리란 데이터베이스 테이블을 대상으로 조회하는 SQL과 달리 엔티티 객체를 대상으로 조회하는 쿼리를 의미한다. 가장 중요한 객체지향 언어로 JPQL(Java Persistence Query language)이 있다. JPQL이 가장 중요한 이유는 이 글에서 추가로 소개할 Criteria, QueryDSL 같은 기술들은 JPQL을 편하게 작성하도록 도와주는 빌더 클래스일 뿐 결국 JPQL에 뿌리를 두고 있기 때문에 JPQL을 제대로 이해하지 못하면 위에 언급한 기술도 사용하기 어렵기 때문이다. JPQL JPQL의 특징 테이블이 아닌 객체를 대상으로 검색하는 객체지향 쿼리다. SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. JPQL 작성 시 유의사항 SELECT m..
[JPA] 프록시, 즉시로딩, 지연로딩 프록시란? 아래와 같은 상황을 가정해보고 프록시가 무엇인지 어떤 상황에서 사용되는지 한번 알아보자 회원 엔티티와 팀 엔티티가 존재하고 두 엔티티는 다대일 단방향 매핑 되어있다. @Entity @Getter @Setter @NoArgsConstructor public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; } @Entity @Getter @Setter @NoArgsConstructor public class Team { @Id @GeneratedValue..
[JPA] 연관관계 매핑 단방향 연관관계 @Entity @Getter @Setter @NoArgsConstructor public class Member { @Id @Column(name = "MEMBER_ID") private Long id; private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; public void setTeam(Team team) { this.team = team; } } @Entity @Getter @Setter @NoArgsConstructor public class Team { @Id @Column(name = "TEAM_ID") private Long id; private String name; } 데이..
[JPA] 영속성 컨텍스트란(Persistence Context)? 영속성 컨텍스트란? 영속성 컨텍스트(Persistence Context)란 해석하면 엔티티를 영구 저장하는 환경이라는 뜻으로 엔티티 매니저를 사용해 데이터를 저장하거나 조회하면 엔티티 매니저는 영속성 컨테스트에 엔티티를 보관하고 관리한다. em.persist(member); 위 코드에서 persist() 메소드는 엔티티 매니저를 사용해서 회원 엔티티를 영속성 컨텍스트에 저장한다. 조회 기능 메소드인 find()도 마찬가지이다. 동일한 memberId로 Member 객체를 두번 조회할 때 sql문으로 조회했을때는 select 쿼리가 두번 나갔지만 JPA의 find() 메소드를 이용하면 첫 번째 조회때 select 쿼리를 보내 데이터를 조회한 후 영속성 컨텍스트에 저장해놨다가 두 번째 조회부터는 데이터베이스..
[JPA] JPA 란? JPA 란 무엇인가? JPA 란 Java Persistence API의 줄임말로 자바 진영의 ORM 기술 표준이다. 여기서 ORM 이란 Object-Relational Mapping의 줄임말로 객체와 관계형 데이터베이스를 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결해준다. 즉 사용하는 언어가 다른 객체와 데이터베이스 사이에서 중간 매개체 역할을 해주는 고마운 친구이다. 덕분에 개발자는 데이터 중심인 관계형 데이터베이스를 사용해도 객체지향 애플리케이션 개발에 집중할 수 있다. JPA 를 사용하는 이유 - 생산성 JPA를 사용하기 전에는 지루하고 반복적인 CRUD를 구현할때도 개발자가 직접 sql문을 짜서 개발을 해야 했다. 하지만 JPA를 사용하면 아래 코드와 같이 자바 컬렉션에 객체를 저장하듯이 ..