Topic (오늘의 주제)
JPA (Java Persistence API)와 ORM의 개념
Why (왜 사용하는가? 왜 중요한가?)
- 실무: 지루하고 반복적인 SQL 쿼리 작성(CRUD)에서 해방시켜 줍니다. 개발자는 비즈니스 로직에만 집중하고, SQL은 JPA가 알아서 만들어줍니다.
- 구조적 의미: 패러다임 불일치 해결이 핵심입니다. 객체지향 언어(Java)와 관계형 데이터베이스(RDB)는 근본적으로 구조가 다른데, JPA가 중간에서 이를 맞춰주는 통역사(Translator) 역할을 합니다.
- 면접 의도: "JPA와 Hibernate의 차이", "MyBatis(SQL Mapper)와의 차이", "N+1 문제" 등 DB 접근 기술에 대한 깊이 있는 이해도를 확인하기 위해 반드시 물어보는 주제입니다.
Core Concept (핵심 개념 정리)
| 요소 | 내용 |
| 개념 정의 | JPA: 자바 진영의 ORM 기술 표준(인터페이스 모음). ORM (Object-Relational Mapping): 객체(Object)와 관계형 DB(Relational) 테이블을 매핑(Mapping)해주는 기술. |
| 동작 방식 | 1. 개발자가 자바 객체(Entity)를 조작함 (member.setName("A")). 2. JPA(구현체)가 이를 감지. 3. JPA가 적절한 SQL(UPDATE...)을 생성하여 DB에 실행. 4. DB 결과를 다시 자바 객체로 변환하여 반환. |
| 장점/단점 | 장점: 생산성 향상, 유지보수 용이(필드 추가 시 쿼리 수정 불필요), 특정 DB에 종속되지 않음(Dialect). 단점: 복잡한 쿼리 작성 어려움(QueryDSL로 보완), 러닝 커브가 높음, 잘못 쓰면 성능 이슈(N+1). |
| 필요 조건 | DB 테이블과 1:1로 매핑되는 Entity 클래스(@Entity)가 있어야 함. |
| 비교 | vs MyBatis: MyBatis는 개발자가 SQL을 직접 작성(SQL Mapper). JPA는 SQL을 프레임워크가 작성(ORM). vs Hibernate: JPA는 '인터페이스(설계도)', Hibernate는 이를 구현한 '구현체(제품)'. |
Interview Answer Version (면접 답변식 요약)
"JPA는 자바 애플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 ORM 표준 인터페이스입니다.
객체와 테이블 간의 패러다임 불일치를 해결해주어, 개발자가 SQL을 직접 작성하지 않고도 객체지향적으로 데이터를 관리할 수 있게 해줍니다.
JPA 자체는 인터페이스이므로, 실제로는 주로 Hibernate라는 구현체를 통해 동작하며, Spring Boot에서는 이를 더 쉽게 추상화한 Spring Data JPA를 사용합니다."
Practical Tip (사용시 주의할 점 or 활용 예)
1. JPA, Hibernate, Spring Data JPA의 관계 구분
이 세 가지를 혼동하는 경우가 많습니다.
- JPA: "표준 명세" (껍데기/인터페이스) → java.persistence 패키지
- Hibernate: "구현체" (알맹이/라이브러리) → org.hibernate 패키지
- Spring Data JPA: "사용 편의 모듈" (스프링이 제공하는 껍데기 위의 껍데기) → Repository 인터페이스
- 실무 코드: public interface MemberRepository extends JpaRepository<Member, Long> {}
2. 변경 감지 (Dirty Checking)
JPA의 가장 큰 매력 중 하나입니다. 데이터를 수정할 때 update() 같은 메서드를 부를 필요가 없습니다.
- 동작: 트랜잭션 안에서 조회한 객체의 값을 바꾸기만 하면, 트랜잭션이 끝날 때(Commit) JPA가 변경된 내용을 감지해서 알아서 UPDATE 쿼리를 날립니다.
- Java
@Transactional public void updateName(Long id, String newName) { Member member = memberRepository.findById(id).get(); // 1. 조회 member.setName(newName); // 2. 수정 (끝! 저장 메서드 호출 안 해도 됨) }
3. 기본 생성자 필수
- JPA Entity 클래스는 반드시 **기본 생성자(NoArgsConstructor)**가 있어야 합니다. (주로 protected로 둠). JPA가 리플렉션 기술을 써서 객체를 만들기 때문입니다.
예상 꼬리질문 정리
- Q: JPA 사용 시 N+1 문제란 무엇이고 어떻게 해결하나요?
- 핵심 키워드: 연관 관계가 설정된 엔티티를 조회할 때, 조회된 데이터 갯수(N)만큼 연관된 데이터를 가져오기 위해 추가 쿼리가 발생하는 성능 문제. Fetch Join이나 @EntityGraph, BatchSize로 해결.
- Q: 즉시 로딩(EAGER)과 지연 로딩(LAZY)의 차이는?
- 핵심 키워드: 실무에서는 무조건 **LAZY(지연 로딩)**를 기본으로 씀. 필요할 때만 쿼리를 날리기 위해. EAGER는 예측 불가능한 쿼리가 나가서 위험함.
- Q: 영속성 컨텍스트(Persistence Context)가 뭔가요?
- 핵심 키워드: 엔티티를 영구 저장하는 환경. 1차 캐시, 변경 감지, 트랜잭션 쓰기 지연 등의 기능을 제공하는 JPA의 논리적인 메모리 공간.
'Archive > Daily Dev Q&A' 카테고리의 다른 글
| Daily Dev Q&A: ORM (Object-Relational Mapping)의 개념과 한계(Trade-off) (0) | 2026.01.07 |
|---|---|
| Daily Dev Q&A: Web Server vs WAS (Web Application Server) (1) | 2026.01.06 |
| Daily Dev Q&A: RESTful API 설계 원칙과 애매한 상황(Edge Case)의 현실적 해결 전략 (0) | 2025.12.31 |
| Daily Dev Q&A: session 로그인 방식과 token 로그인 방식 (0) | 2025.12.31 |
| Daily Dev Q&A: Spring Security의 인증과 인가 (0) | 2025.12.31 |