본문 바로가기

웹 프로그래밍/JPA

JPA 활용(2) 팁 정리


@ResponseBody 

데이터 자체를 Json으로 보냄


@Valid

엔티티를 검증함


엔티티가 바뀌면 API 스펙도 같이 바껴버림 -> 엔티티를 바로 쓰는것이 아니라 API 스펙에 맞춰서 별도의 DTO 클래스로 해결

-> 안정적인 운영가능

 

엔티티는 노출이 안되는 방향으로 설계 해야함


의존관계는 

Controller -> Service -> Repository 이런식으로 한방향으로 흘러야함(단방향)


Repository는 가급적 순수한 엔티티를 다루는 용

복잡한 api 화면처리는 따로 QueryRepository화 시켜서 클래스로 만듬(구별) -> 유지, 보수


DTO 안에서도 엔티티가 있으면 그것까지 DTO로 바꾸어야함 (겉과 속이 같이)


일대다(컬렉션)를 페치 조인 하는 순간 페이징이 불가함(데이터가 뻥튀기 되니까 기준점이 모호해짐) 


페이징과 컬렉션 엔티티를 함께 조회하고 싶으면 모든 XToOne 관계는 row수를 증가시키지 않기 때문에 패치 조인으로 싹다 불러오고 컬렉션은 지연로딩으로 세팅한 뒤 성능 최적화를 위해 hibernate.default_batch_fetch_size(글로벌하게) 또는 @BatchSize(구체적으로)를 적용함-> IN 쿼리로 사이즈(max 천개)만큼 땡김

-> 1 + N + M이 1 + 1 + 1이 되는 강력함


OSIV ON: 영속성 켄텍스트와 데이터베이스 커넥션을 API반환까지 유지(완전 종료까지)

(장점) 지연로딩으로 최적화 가능 

(단점) 오랫동안 커넥션 유지(API 대기시간만큼) -> 커넥션 부족

 

OSIV OFF: 지연로딩을 트랜잭션 안에서만 처리해야함. 즉, 컨트롤러나 뷰에서 지연로딩을 못함


 

'웹 프로그래밍 > JPA' 카테고리의 다른 글

Querydls 기본  (3) 2023.03.21
스프링 데이터 JPA  (0) 2023.03.18
JPA 활용(1) 팁 정리  (0) 2023.03.08
객체 지향 쿼리 언어_중급  (0) 2023.03.08
객체 지향 쿼리 언어_기본  (0) 2023.03.07