
이번주는 JPA 대해 배우게 된다!
실습 내용은 간단한 것 같으니, 돌아가는 원리에 대해 공부해보자
EntityManager를 주입할 때, 사용하는 어노테이션이다.
EntityManager는 동시성 문제 때문에 쓰레드 간에 EntityManager를 공유해서는 안된다.
@PersistenceContext가 EntityManger를 주입받을 때, 동시성 문제가 발생하지 않도록 도와준다.
총 4가지가 있다
GenerationType.IDENTITY
GenerationType.SEQUENCE
hibernate: call next value for USER_PK_SEQ @Entity
@SequenceGenerator(
name = "USER_PK_GENERATOR",
sequenceName = "USER_PK_SEQ",
initailValue = 1,
allocationSize = 50
)
public class PkEx() {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator="USER_PK_GENERATOR")
private Long id;
private String name;
}
GenerationType.TABLE
@Entity
@TableGenerator(
name = "USER_PK_GENERATOR",
table = "USER_PK_SEQ",
pkColumnValue = "USER_SEQ",
allocationSize = 1
)
public class PkEx() {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator="USER_PK_GENERATOR")
private Long id;
private String name;
}
GenerationType.AUTO

위 사진을 보면, JpaRepository는 CrudRepository를 상속받은 PagingAndSortingRepository를 상속받음을 알 수 있다. 그래서, JpaRepository는 CrudRepository에 정렬, 페이징 기능이 추가되었음을 알 수 있다.
//CrudRepository
Iterable<T> findAll();
//JpaRepository
List<T> findAll(Sort sort);
두 repository에서 findAll을 가져와봤는데, 둘의 차이를 확실히 볼 수 있다.
CrudRepository의 findAll은 반환형이 Iterable인데, JpaRepository에선 List이다.
또한, Sort 파라미터를 받고 있어, JpaRepository에서만 정렬을 지원함을 알 수 있다.
이렇게 보면, JpaRepository가 CrudRepository의 상위호환이라 전혀 사용할 이유가 없어보이는데, 사용하는 경우가 존재한다.