참고
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에 직접 쿼리를 만들어 보내버리면 해당 쿼리는 특정 테이블에 종속적이 되버린다.