기술면접 연습 기록(2) - 2024.4.11

동준·2024년 4월 11일
1

3. JPA는 언제 필요하고 언제 필요하지 않은지 설명해주실 수 있을까요?

JPA는 자바의 객체와 데이터베이스의 관계매핑시키기 위한 객체 관점형 매핑 기술(ORM)이라고 볼 수 있다.

여기서 핵심은 매핑이며, 결국 기존의 복잡한 sql문에 대한 의존성을 줄이고 객체지향적 관점으로 개발을 주도하기 위해 등장한 것이 JPA이기 때문에 등장 목적과 개발 이유가 부합하지 않으면 굳이 JPA를 사용하지 않아도 된다.

예를 들면, 다대다(N:M) 관계나 일대다(1:N) 관계의 복잡한 데이터 모델을 관리해야할 때는 JPA를 기반으로 코드를 작성하는 것이 수월할 수 있다. 또한, 자동으로 쿼리문을 띄우고 처리하기 때문에 반복 작업을 줄일 수 있게 된다.

반대로, 간단한 데이터 모델을 관리하면서 서버의 성능을 중시할 때는 JPA의 사용을 지양하는 것을 고려해야 할 것이다. JPA를 사용하면서 별도의 조치를 취하지 않으면 N+1 문제 등을 마주하며 불필요한 쿼리문이 남발될 가능성이 있기 때문이다.

4. JPA의 더티 체킹이란 무엇인가요?

JPA의 기본 동작 원리는 영속성 컨텍스트에서 관리되는 엔티티의 변경을 감지하고 이를 트랜잭션 단위로 묶어서 최종 커밋함으로써 변경을 반영하는 형식으로 이뤄진다. 더티 체킹(Dirty Checking)은 영속성 컨텍스트가 엔티티의 상태를 추적하고, 트랜잭션 내에서 변경된 엔티티를 감지하는 메커니즘을 의미하는데, 트랜잭션 내에서 엔티티의 상태가 변경될 때마다 더티 체킹이 이뤄진다.

JPA는 데이터베이스에서 엔티티를 로딩할 때 해당 엔티티를 영속성 컨텍스트에 저장하면서 엔티티의 현재 상태를 추적하고, 엔티티의 필드 값 수정 여부의 변경 상태를 주기적으로 확인한다. 이때 변경 상태가 감지되면 해당 엔티티를 수정한 필드의 값이 변경된 것으로 간주하면서 해당 엔티티는 "더티(dirty)" 상태가 된다.

확인된 더티 엔티티들에 대해 적절한 쿼리문이 생성되고 이것들이 데이터베이스에 전송되어 변경을 반영시키게 된다. 이 시점이 트렌잭션 커밋이 이뤄지는 시기이며 통상적으로 변경된 필드 외의 모든 필드를 같이 업데이트하는데, 만약 변경된 필드만을 업데이트 하려면 @DynamicUpdate 어노테이션을 할당시킬 수 있다.

여담으로, 준영속 및 비영속 상태의 엔티티는 더티 체킹의 대상이 되지 못한다.

profile
scientia est potentia / 벨로그 이사 예정...

0개의 댓글