* GRADLE
https://velog.io/@swchoi0329/Spring-Boot%EC%97%90%EC%84%9C-JPA-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
Spring Boot에서 JPA 사용하기
JPA는 여러 ORM 전문가가 참여한 EJB 3.0 스펙 작업에서 기존 EJB ORM이던 Entity Bean을 JPA라고 바꾸고 JavaSE, JavaEE를 위한 영속성(persistence) 관리와 ORM을 위한 표준 기술이다. JPA는 ORM 표준 기술로 Hibe
velog.io
Web,Service,Repository,Dto,Domain
- Web Layer
- 흔히 사용하는 컨트롤러(@Controller)와 JSP/freemarker 등 뷰 템플릿 영역입니다.
- 이외에도 필터(@Filter), 인터셉터, 컨트롤러 어드바이스(@ControllerAdvice)등 외부 요청과 응답에 대한 전반적인 영역을 이야기 합니다.
- Service Layer
- @Service에 사용되는 서비스 영역입니다.
- 일반적으로 Controller와 Dao의 중간 영역에서 사용됩니다.
- @Transactional이 사용되어야 하는 영역이기도 합니다.
- Repository Layer
- Database와 같이 데이터 저장소에 접근하는 영역
- Dao(Data Access Object) 영역
- Dtos
- Dto(Data Transfer Object)는 계층 간에 데이터 교환을 위한 객체 ( Request/ Response )
- Domain Model
- 도메인이라 불리는 개발 대상을 모든 사람이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화시킨 것을 도메인 모델이라고 한다.
- 이를테면 택시 앱이라고 하면 배차, 탑승, 요금 등이 모두 도메인이 될 수 있습니다.
- @Entity가 사용된 영역이 도메인 모델이다. ( entity class 데이터 기반으로 특정 메소드를 통한 SQL 을 실행해줌 == MyBatis 에서는 mapper.xml 과 유사 )
* DOMAIN 계층에서 Entity 의 field data 를 변경 해 주는 것만으로도 repository 의 역할을 대신 해 줄 수 있음 ( sql 실행 )
( JPA의 영속성 컨텍스트 ) *
@@ 조인방법 @@
JPA 조인 컬럼 및 조인 테이블 사용하기
데이터베이스 테이블의 연관관계를 설계하는 방법은 크게 2가지 입니다.조인 컬럼 사용(외래 키)조인 테이블 사용(테이블 사용)테이블 간에 관계는 주로 조인 컬럼이라 부르는 외래 키 컬럼을
velog.io
@@JPA N+1 문제 및 해결방안@@ - https://jojoldu.tistory.com/165
@@ JPA는 왜 지연 로딩을 사용할까?@@ - https://velog.io/@bread_dd/JPA%EB%8A%94-%EC%99%9C-%EC%A7%80%EC%97%B0-%EB%A1%9C%EB%94%A9%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C
@@ JPA 다양한 Join 방법 정리 (N+1, queryDSL, fetch join) @@ — wedul - https://wedul.site/638
>>
1. 현업에서는 조인 Entity 에 FetchType.LAZY 를 사용
- 지연 로딩 LAZY : 조인해서 JPA 로 쿼리를 실행 할 때, EAGER '즉시로딩' 이라면 LEFT JOIN 으로 한방코딩 , LAZY '지연로딩' 이라면 N+1 로 연관된 ENTITY 별로 SELECT 조회 실시. 언뜻보면 LEFT JOIN 이 좋아보이지만, 현업에서는 수많은 테이블과 필드값을가지지고 있음. LEFT JOIN 은 연관된 모든 테이블 칼럼을 풀스캔. '지연로딩'은 쿼리실행이 ENTITY 별로 수행하지만 해당 파라미터로 조회 안되는 ENTITY(테이블)도 다수존재(스킵?) . 결론은 FetchType.LAZY 사용
2. Hibernate 기본 쿼리메소드로는 복잡한 쿼리에있어 제한이 많음. 때문에 Spring data JPA (JPQL, QueryDSL 등) 은
쿼리문을 작성할 수 있도록 스프링 어노테이션으로 기능제공. Hibernate 도 쿼리사용가능한 기능을 제공하긴 하지만
interface 로 제공하지는 않고 어노테이션이 아니기때문에 편의성하락 .
Spring data JPA 로 쿼리문작성시 연관된 모든 엔티티를 join 하지 않고 그 쿼리에 해당하는 엔티티만 조인하기 때문에
N+1 쿼리문제, 미사용엔티티 조인 등 성능관련 이슈 감소. (left join fetch로 사용함)
3. JPQL 에 쿼리문 작성시 SELECT DISTINCT 로 작성하는건 JOIN 할 때 '카티션 곱'연산을 하기에 같은 ROW가 중복됨을 방지하기 위해. ( 혹은 ENTITY 에 JOIN 필드를 선언할 때 , Set 컬렉션을 사용 ; set은 중복허용불가 )
** 강의보면서 토이프로젝트 트라이 **
========================================================================================
추가 참조 ( 메이븐 )
https://parkhyeokjin.github.io/jpa/2019/11/08/JPA-chap11.html
스프링에서 JPA 사용 하기(스프링부트, JPA)
이번에는 스프링 프레임워크에서 JPA를 사용 하는 방법에 대해서 정리 해보겠습니다. 스프링 프레임워크 프로젝트에서 스프링 데이터 JPA를 얼마나 효율적이고 간단하게 사용이 가능 한지 기능
parkhyeokjin.github.io
추가참조(QueryDSL)
JPA를 사용하면서 고려해야 했던 점
SI 에서 항상 ~Batis 류의 쿼리 매퍼를 사용하다가 좋은 기회가 있어 JPA를 실무에서 계속 사용중입니다. JPA는 아무래도 ORM이다보니 쿼리 매퍼와 다른 점도 많고 조심해서 다루지 않으면 오류가 발
velog.io