Search
Duplicate
📒

[JPA 기본] 02. JPA 시작하기

상태
완료
수업
JPA
주제
JPA
4 more properties
참고

JPA 시작하기

Entity 생성

NOTE
@Entity @getter @setter public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String name; @Column(name = "TEAM_ID") private Long teamId; }
Java
복사
@Entity
JPA에서 해당 객체를 관리하겠다는 어노테이션
@ID
해당 필드는 기본키 역할을 한다는 어노테이션
@GenetratedValue
기본키 생성전략 어노테이션
@Column
해당 필드가 DB에서 쓰일 때 적용되는 속성들

EntityManger

NOTE

EntityManager의 기본적인 CRUD

저장 : persist()
조회 : find()
삭제 : remove()
변경 : 변경은 따로 함수를 호출하기보다는 find를 해서 가져온 객체에서 setter 메서드를 통해 값을 변경하면 commit() 호출시 적용되기 전 시스템에서 변경감지를 통해 기존 객체와 차이점을 찾아서 업데이트를 자동으로 해준다!
[ 참고]
EntityManager는 쓰레드간에 공유하는게 아니다. (사용하고 버려야함)
데이터베이스의 Connection을 공유하지 않는것과 동일하다.
JPA의 모든 데이터 변경은 트랜잭션 안에서 실행되어야 한다.

JPQL

NOTE
JPA는 SQL을 추상화한 JQAL이라는 객체 지향 쿼리 언어를 제공한다. 식별자를 통한 단순 조회가 아닌, 추가 조건(복잡한 쿼리)를 통해 조회할 떄 사용한다

JPQL - 예제

NOTE
회원 전체 조회
List<Member> result = em.createQuery("select m from Member as m", Member.class).getResultList();
Java
복사
일반 쿼리와는 다르게 From절의 Member는 테이블이 아닌 Entity를 대상으로 한다.
이게 어떠한 장점이 있는가?
만약 전체 페이지를 페이징한다고 가정하자
List<Member> result = em.createQuery("select m from Member as m", Member.class) .setFirstResult(5) .setMaxResults(8) .getResultList();
Java
복사
limit 8 offeset 5를 메서드를 통해 손쉽게 처리할 수 있다.
각 DB의 방식에따라 JPA가 자동으로 맞춰준다.
ansi가 제공하는 표준 SQL 문법을 모두 제공한다.

JPQL - 특징

NOTE
JPA를 사용하면 엔티티 객체를 중심으로 개발
문제는 검색 쿼리
JOIN, 집합통계 쿼리 등등...
검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색
테이블에서 가져오면 객체지향의 패러다임이 깨지기 때문에 엔티티 객체를 대상으로 검색
모든 DB데이터를 객체로 변환해서 검색하는 것은 불가능
애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요.
RDB에 직접 쿼리를 만들어 보내버리면 해당 쿼리는 특정 테이블에 종속적이 되버린다.