이론 정리/Spring boot 16

FetchType Eager vs Lazy

JPA에서는 여러 엔티티가 서로 연관되어 있을 때에, 하나의 엔티티에서 다른 엔티티를 두가지 방법으로 찾는데, 간단히 말하면 해당 엔티티를 검색할때 바로 찾거나(Eager) 혹은 해당 엔티티를 사용할 때 찾거나(Lazy) 로 나뉜다. 이 내용들에 관해서 알아보도록 한다. LAZY전략 FetchType.LAZY 지연 전략이라고도 한다. fetchType을 LAZY로 설정하면, 이 지연로딩의 대상이 된 쪽은 프록시 객체로 가져오게 된다. 그리고 이후에 해당 대상을 실제로 사용하려 할 때에 초기화가 진행된다. XToMany의 기본 속성이 LAZY로 되어 있다. Eager전략 FetchType.EAGER 즉시 전략이라고도 한다. fetchType을 EAGER로 설정하면, 로딩할 때에 모든 값을 join하여 가져..

JPA의 프록시란?

프록시 JPA에서는 검색할 때에 em.find()말고도 em.getReference()라는 메소드를 제공한다. 이 em.getReference()는 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체를 조회한다. -> 즉 DB에 쿼리가 나가지 않은 상태로 객체를 조회한다. 코드를 통해 확인해 보자면 Member클래스에서 필요없는거 없애기 @Entity public class Member extends BaseEntity { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String username; public Long getId() { return id; } public..

Spring Data JPA를 통한 CRUD방법에 관하여..(feat 변경감지)

Spring Data JPA를 통한 CRUD방법에 관하여..(feat 변경감지) Spring Data JPA를 사용한 CRUD방법을 구현하면 어떻게 하나? 조회(Read) find나 get을 사용한다. 이 둘의 차이는 여기서 알아보자 저장(Create) save를 사용한다. 이 save에 관해 조금 후에 다시 서술한다. 삭제(Delete) delete를 사용하거나, 실제로 데이터를 삭제하고 싶지 않으면 soft delete를 하면 된다. 이제 변경(Update)를 한다면? Update방식 위에서 데이터 저장에 사용된 save에 대해 먼저 알아보자 얘 코드를 살펴보면 /* * (non-Javadoc) * @see org.springframework.data.repository.CrudRepository#s..

Spring Data JPA에서 get 과 find의 차이

Spring Data JPA에서 ID를 통하여 어떤 엔티티를 조회하고 싶을 때, 우리는 getById나 findById를 사용한다. 둘 간에 어떤 차이가 있을까?? getById @Override public T getById(ID id) { Assert.notNull(id, ID_MUST_NOT_BE_NULL); return em.getReference(getDomainClass(), id); } getById의 내부를 살펴보면 이렇게 나온다. 이 getById는 em.getReferecnce를 이용해서 엔티티를 조회..하는데, 사실 이거는 엔티티가 아니라 프록시를 반환한다는 것이다. 즉, getById를 통해 바로 DB에 검색하는게 아니라, 이를 실제로 사용할 때에 DB에 접근한다는 것이다. 한마디로..

Soft Delete와 Hard Delete의 차이와 @SQLDelete

DB의 삭제 구현 방법은 두가지가 있다. Soft Delete 데이터를 실제로 삭제하지 않고, 삭제 flag를 변경하는 방법이다. Hard Delete 실제로 데이터를 삭제하는 방법이다. 실제로 서비스를 구현할 때에는 Soft Delete를 자주 사용한다. 하지만 Spring Data JPA에서 이 Soft Delete를 구현할 때에는 주의해야 할 점이 다수 있다. 만약에 한꺼번에 많은 데이터를 삭제하는 경우가 생긴다면 어떨까?? 이러한 Bulk연산에서 Soft Delete를 사용할 때에 여러 번의 쿼링이 진행되게 될 것이다. 이를 해결하기 위해서 @SQLDelete어노테이션과 JPA에서 제공하는 deleteAllInBatch를 사용할 수 있다. @SQLDelete JPA에서 기본으로 삭제는 Hard D..

OSIV와 성능 최적화

Open Session In View : 하이버네이트 Open EntityManager In View : JPA (관례상 OSIV라 한다.) OSIV ON Spring boot 어플리케이션을 처음 실행하면 다음과 같은 warn문구가 출력된다. 2022-03-15 11:23:35.504 WARN 11052 --- [ restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to ..