본문 바로가기

데이터 접근 기술/JPA27

[JPA] JPQL 기본 문법과 SELECT 절 JPQL도 SQL과 비슷하게 SELECT, UPDATE, DELETE 문을 사용할 수 있다. 저장할 때에는 엔티티 매니저를 사용하기 때문에 INSERT문은 없다. SELECT :: = SELECT_절 FROM_절 [WHERE_절] [GROUPBY_절] [HAVING_절] [ORDERBY_절] UPDATE :: = UPDATE_절 WHERE_절 DELETE :: = DELETE_절 WHERE_절 SELECT 문 EX) SELECT m FROM Member AS m where m.username = 'hi' 엔티티의 속성은 대소문자를 구분한다. 하지만 JPQL의 키워드는 대소문자를 구분하지 않는다. JPQL에서 사용한 Member는 클래스명이 아니라 엔티티명이다. @Entity(name="Member")로 .. 2021. 1. 31.
[JPA] JPQL 소개 JPQL은 JPA를 다루는 개발자라면 필수로 학습해야 하는 객체지향 쿼리 언어이다. JPA를 사용해 엔티티를 조회할 때 식별자로 조회하는 방법인 EntityManager.find()가 있고, 연관된 객체들을 통해 a.getB()처럼 객체 그래프 탐색을 하는 간단한 방법이 존재한다. 하지만 애플리케이션을 만들다 보면 조건을 추가해야 하는 부분이 있다. 예를 들면 부서가 인사과이고 연봉이 4000 이상인 사람만 필요할 경우 조건절이 필요한데 간단한 객체 그래프 탐색이나 식별자로 조회하는 방법은 맞지 않는다. 이전 내가 사용했던 MyBatis는 쿼리를 직접 작성하여 DB와 연동했으므로 이러한 조건에 대해서 자유로 뒀지만 이것이 장점이자 단점이 되었다. JPA는 테이블을 중점으로 개발하는 것이 아닌 객체를 대상.. 2021. 1. 30.
[JPA] 즉시 로딩과 지연 로딩 JPA는 개발자가 연관된 엔티티의 조회 시점을 선택할 수 있도록 두 가지 방법을 제공한다. 즉시 로딩과 지연 로딩이다. 즉시 로딩은 엔티티를 조회할 때 연관된 Entity도 동시 조회하는데, 연관된 엔티티를 사용하던 사용하지 않던 영속성 콘텍스트에 존재하지 않으면 데이터베이스에 접근한다. 설정 방법은 다음과 같다 @ManyToOne(fetch = FetchType.EAGER) 이 방법은 만약 회원과 팀 엔티티가 존재할 때 회원 클래스에서 팀을 설정할 때 사용하는 코드의 예시이다. 즉시 로딩시 회원과 팀 두 테이블을 조회해야 하므로 쿼리를 2번 실행한 것 같지만 실제로는 즉시 로딩 최적화를 위해 조인 쿼리를 사용한다. 여기서 회원과 팀 테이블을 조회할 때 OUTER JOIN을 사용하는데 팀에 소속되지 않은.. 2021. 1. 28.
[JPA] 상속 관계 매핑 관계형 데이터베이스와 객체의 상속 개념을 묶는 것 또한 JPA에서 도움을 줄 수 있다. 1. 각각의 부모와 자식들을 테이블로 생성하여 조회할 때 조인을 사용한다. JPA에서는 조인 전략이라고 한다. 2. 통합 테이블로 변환해 하나의 테이블로 상속을 관리한다. (단일 테이블 전략) 3. 서브타입 테이블로 전환하여 각 서브 타입마다 테이블을 만든다. 조인 전략 조인 전략은 각 객체를 모두 테이블로 만들고 자식 테이블이 부모의 기본 키를 받아서 해당 키를 기본키와 외래 키로 사용하는 전략이다. 객체에는 타입이 존재하지만 테이블에는 타입이라는 것이 없기 때문에 타입을 구분하는 칼럼이 필요하다. 부모의 객체의 코드에서의 설정은 다음과 같다. @Entity @Inheritance(strategy = Inherita.. 2021. 1. 27.
Entity 매핑 JPA를 사용하는 데 가장 중요한 일은 엔티티와 테이블을 정확히 매핑하는 것입니다. 매핑하는 방법은 XML이나 어노테이션 중에 선택할 수 있다. 1. @Entity JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 사용해야 한다. 주의사항 - 기본 생성자는 필수이다. - final 클래스, enum, interface, inner 클래스에는 사용할 수 없다. - 저장할 필드에 final을 사용하면 안된다. 2. @Table @Table은 엔티티와 매핑할 테이블을 지정한다. 3. 데이터베이스 스키마 자동 생성 JPA 2. 1부 터지 원 JPA는 데이터베이스 스키마를 자동으로 생성하는 기능이 존재한다. 클래스의 매핑 어노테이션 정보와 데이터베이스 방언을 이용해 데이터베이스 스키마를.. 2020. 9. 3.
JPA 영속성 JPA를 이해하는 데 가장 중요한 용어는 영속성 콘텍스트이다. 엔티티를 영구 저장하는 환경이며 가상의 데이터베이스라고 생각하면 된다. Entity를 jpa를 통해 저장하게 되면 엔티티 매니저를 사용해 엔티티를 영속성 컨텍스에 저장하는 방법이다. 그 이후 트랜잭션이 끝나서 commit되거나, sql문이 호출된 경우 jpa는 엔티티와 데이터베이스의 로우와의 데이터를 동기화시키는 sql문을 전송하고 commit 되어 저장된다. 그렇다면 엔티티 매니저는 무슨 일을 할까? 그전에 엔티티 매니저를 생성해주는 엔티티 매니저 팩토리를 보자. 엔티티 매니저 팩토리는 말 그대로 엔티티 매니저를 만드는 공간이다. 일반적으로 데이터베이스를 하나만 사용하는 애플리케이션은 엔티티 매니저 팩토리를 하나만 생성하는데 , 그 비용이 .. 2020. 9. 2.
JPA 소개 JPA는 자바 진영의 ORM 기술 표준이다. 과거 자바 진영은 EJB라는 기술을 만들었으며 그 안에는 엔티티 빈이라는 ORM기술이 포함되어 있었다. 하지만 사용하기에 너무나 복잡하고 기술의 성숙도가 떨어지고 자바 J2EE 애플리케이션 서버에서만 동작했다. 이러한 단점을 전부 극복한 하이버네이트라는 오픈 소스 ORM프레임워크의 등장으로 많은 개발자가 하이버네이트를 사용하기 시작했고 결국 EJB 3.0에서 하이버네이트를 기반으로 새로운 자바 ORM 표준이 등장했는데 이것이 바로 JPA다. 그렇다면 ORM이란 무엇일까? ORM은 Object Relational Mapping 으로 말 그대로 객체와 관계형 데이터베이스를 매핑하는 기술이다. JPA는 다음 사진과 같이 애플리케이션과 데이터베이스 사이에서 동작한다... 2020. 9. 1.