JPA의 필요성
- repository에서 지원하는 method만큼 sql 작성문양이 줄어든다
- SQL mapper을 사용할 때 필요한 dto mapping이 최소화된다
- 데이터 테이블의 변경이 코드의 변경으로 이어지는 것이 최소화된다.
- 객체의 필드만 수정하면 대부분이 sql 자동으로 변경됨
JPA와 Native Query에서 테이블 변경이 미치는 영향
변경 사항 | JPA (JPQL, @EntityGraph) | JPA Native Query (nativeQuery = true) |
컬럼 추가/삭제 | ✅ 자동 반영 (@Column 매핑 변경) | ❌ Native Query 수정 필요 |
컬럼 타입 변경 | ✅ 자동 반영 (타입 변경 시 엔티티 수정) | ❌ Native Query 직접 수정 필요 |
JOIN 관계 변경 | ✅ @OneToMany, @ManyToOne 수정만으로 해결 | ❌ SQL 직접 수정 필요 |
테이블 이름 변경 | ✅ @Table(name="새이름") 수정만으로 해결 | ❌ Native Query의 FROM 테이블명 수정 필요 |
JPA를 적절히 활용한다는 것은 단순히 JPA를 사용하는 것이 아니라, JPA의 특성과 장점을 최대한 살려 효율적인 데이터 접근 방식을 적용하는 것을 의미해.
즉, 성능, 가독성, 유지보수성, 비즈니스 로직과의 분리 등을 고려하여 적절한 방법을 선택하는 것이 중요해.
🔹 JPA를 적절히 활용하는 방법
1️⃣ 엔티티 설계를 올바르게 하기
✔ 연관관계 매핑을 정확하게 설정하기
- 연관관계(@OneToMany, @ManyToOne, @OneToOne, @ManyToMany)를 제대로 이해하고, 불필요한 관계는 줄이기.
- 연관관계의 주인(Owner) 을 명확히 설정하여 데이터 일관성을 유지.
✔ 객체 지향적으로 설계하기
- DB 테이블 기반이 아니라, 객체 중심으로 설계해야 JPA의 장점을 활용할 수 있음.
- 연관된 엔티티를 컬렉션(List, Set)으로 직접 다룰 수 있도록 설계.
2️⃣ 쿼리 성능 최적화하기
✔ N+1 문제를 피하기 위해 fetch join 활용하기
- N+1 문제: 연관된 엔티티를 조회할 때 추가로 N개의 쿼리가 발생하는 문제.
- 해결책으로 fetch join 또는 EntityGraph를 사용할 수 있음.
3️⃣ 데이터 변경 시 트랜잭션과 영속성 컨텍스트 활용
✔ 변경 감지(Dirty Checking) 활용
- JPA는 트랜잭션이 끝날 때 자동으로 변경 사항을 감지하고 반영함.
- save() 같은 메서드를 따로 호출할 필요 없이, 영속성 컨텍스트에서 엔티티를 변경하면 자동으로 업데이트 됨.
- ✅ save()를 생략하여 코드를 단순하게 유지하고 가독성을 높일 수 있음.
✅ 트랜잭션 종료 시점에 한 번의 flush()로 업데이트를 처리하여 성능을 최적화할 수 있음.
✅ 1차 캐시를 활용하여 불필요한 UPDATE 쿼리를 방지할 수 있음.
✅ 동시성 문제를 줄이고, 안정적인 데이터 일관성을 유지할 수 있음.
- ✅ save()를 생략하여 코드를 단순하게 유지하고 가독성을 높일 수 있음.
4️⃣ 조회 전용 데이터를 위한 DTO 변환
✔ JPA 엔티티는 서비스 계층에서 직접 노출하지 않기
- 엔티티를 그대로 반환하면 불필요한 데이터 노출, 무분별한 필드 변경 위험이 있음.
- 조회 전용 데이터는 DTO로 변환해서 반환하는 것이 좋음.
5️⃣ 트랜잭션 범위를 최소화하고 필요한 곳에서만 사용하기
✔ 쓰기 작업(CUD)은 반드시 트랜잭션 안에서 실행
- @Transactional을 붙여야 영속성 컨텍스트의 변경 감지가 정상적으로 작동함.
✔ 읽기 작업(쿼리 조회)은 가급적 read-only로 설정
- 조회 작업에서는 @Transactional(readOnly = true)를 사용하면 성능이 향상됨.
✅ 결론: "JPA를 적절히 활용한다"는 의미
- 엔티티 설계를 객체 지향적으로 잘 구성하고 연관관계를 정확히 매핑한다.
- N+1 문제를 방지하고 쿼리를 최적화하기 위해 fetch join 또는 QueryDSL을 활용한다.
- 영속성 컨텍스트와 변경 감지 기능을 활용하여 불필요한 save() 호출을 줄인다.
- 조회 전용 데이터는 DTO로 변환하여 불필요한 데이터 로딩을 줄인다.
- 트랜잭션 범위를 최소화하고 필요한 곳에서만 사용하여 성능을 최적화한다.
👉 이러한 원칙들을 지키면 JPA를 "적절히" 활용하는 것이라 볼 수 있어! 🚀
'개발기술 > ORM' 카테고리의 다른 글
JPA 쿼리 메소드 정의 ; JPA Method, JPQL, QueryDSL, 네이티브SQL (0) | 2025.03.05 |
---|---|
JPA 기타기능 (Pageable, auditing, data.sql 기능) (0) | 2025.02.28 |
Spring JPA Hibernate 트랜잭션 (0) | 2024.12.22 |
Spring JPA Entity 설정 (2) | 2024.10.28 |
Spring JPA 개념, 초기설정, Repository 인터페이스 구현 (0) | 2024.07.22 |