티스토리 뷰

1. Spring Boot datasource 설정 검색


spring.datasource.initialization-mode= always

어플리케이션이 시작될 때 직접 데이터 초기화 하는 것. import.sql


커넥션풀보다 요청량이 많으면 클라이언트들이 대기해야 한다. 커넥션



JPA를 사용하는 이유


- 패러다임의 불일치 해결 : 객체지향과 SQL의 불일치

- 성능 : 이건 확실하지 않다.

- 데이터 접근 추상화와 벤더 독립성 : JPA를 사용하면 SQL이 각 DBMS(MySQL, Oracle)에 따라 만들어져서 독립적이다.


영속성 컨텍스트





트랜잭션


- PlatformTransactionManager가 트랜잭션을 관리해 주는 역할을 한다.

- 최초에 SELECT을 할 때는 엔티티 매니저가 SQL문을 만들어서 DB에서 객체를 가져온다.

2번째 조회할 때는 엔티티 매니저가 가지고 있는 객체가 반환된다.

- 동일 트랜잭션 내에서는 1차 캐시가 적용된다.

- 트랜잭션 내에서 같은 아이디에 해당하는 쿼리가 2번 실행되면 최초 1번만 실행되는 것이고 2번쨰에는 기존에 엔티티 매니저가 가지고 있는 객체를 반환.

- 영속성이 부여가 될 때 그 객체의 복사본이 하나 만들어진다.

- 트랜잭션이 커밋될 때, 엔티티 매니저는 복사본과 변경된 객체를 비교한다. 바뀐 것이 있다면 자동으로 Update 문을 만들어서 트랜잭션이 끝날 때 업데이트가 일어나게 된다.



일대다 다다대


- 레이지 로딩.



1+N 쿼리 문제


목록을 가져오는 쿼리 + 레이지 로딩으로 하는 쿼리 1번


레파지토리 Repository

- CRUD를 한다.

- Service는 Repository와 관계를 맺고 호출한다. Service는 트랜잭션이 있는 곳이다.

- Repository에 메서드를 생성하는데 Fetch Join하는 것을 만든다.

     - Fetch Join은 레이지 로딩하는게 아니고 


** 레이지 로딩과 Fetch Join을 적절히 사용해야 한다

- 테이블 내에서 편하게 가져오려면 레이지 로딩을 가져오고

- 그 select 된 리스트 내에서도 가져오려면 Fetch Join을 사용한다


실습


Category에 보드가 속해 있는 상황이다.

보통 category.getBoard() 모든 게시물을 가져오는 경우가 없다. 보통 보드를 가져올 때는 일정 개수만 가져온다.

1:N 관계에서 너무 많은 데이터를 가져올 수 없을 때는 Repository로 가져와야 한다.


1:N 관계에서 개념적으로는 일대다 관계이지만, 모든 데이터를 다 불러오지는 않는다.

데이터가 적을 때는 레이지 로딩으로 사용할 수 있지만

너무 많을 때는 Repository로 가져온다.



BoardRepository


쿼리 메서드 : 메서드 이름을 보고 자동으로 쿼리가 만들어진다.

레포지토리는 기본적으로


EntityManager는 빈으로 등록 가능하다



BoardRepositoryImpl 구현방법 3가지


1. EntityManager를 주입 받는다

JPQL 문자열을 조작해서 where 절을 넣다 뺐다 해서.

--> JPA를 공부한 사람에게 익숙하다.


2. Criteria JPQL : 동적 SQL. 좀 어렵다


3. QueryDSL : 자동으로 소스코드를 생성해서 이용하는 것


--> 다음시간에는 1번, 3번을 실습할 예쩡

도커 예습해오면 좋다.


1교시에는 DBMS, JDBC에 대해 배움

2교시 트랜잭션 - 이해할만한데 프록시, 호출 부분이 어렵

3교시 JPA. 1대1, 1대다, 다대1, 다대다 - 레이지 로딩, 페치 조인 개념이 어렵다

4교시 실습

5교시 테스트 코드 작성


댓글