강의: 인프런 JPA+SpringBoot 활용 1편 

1. jpa 기본 내용 복습

- 같은 트랜잭션 안에서는 영속성 컨텍스트 조회. 같은 영속성 컨텍스트에서 아이디 같으면 같은 엔티티로 인식. 1차 캐시에서 가져옴

- 값 타입은 변경 불가능하게 설정하기 

- 실무에서는 @ManyToMany 사용하지 않기 

2. 개발 시작 단계에서 해야할 것들

-요구사항 분석

-도메인 모델 설계

-엔티티 설계

-테이블 설계: DB에서는 소문자+_ 형태로 주로 사용한다

3. 테이블에서 외래키가 있는 곳을 연관관계의 주인으로 정하기 

4. 쿼리 파라미터 확인하는 방법 : p6spy

쿼리 파라미터 로그 남기는p6spy를 이용해서쿼리 파라미터를 확인   있지만, 잘못하면 성능을 저하시키거나 병목현상을 발생시킬  있다. 되도록이면 개발 단계에서 하는 것을 추천 

p6spy이용했을 때 출력된 쿼리. 파리미터를 확인할 수 있다 

5. 엔티티 설계시 주의점 

 

1) 엔티티에는 가급적 Setter를 사용하지 말자

setter를 사용하면 변경 포인트가 많아져서 유지보수가 어려워진다

 

2) 모든 연관관계는 지연로딩으로 설정하자(fetch=FetchType.LAZY)

즉시 로딩은 예측이 어렵고, 어떤 sql 실행될지 추적하기가 어렵다jpql에서 n+1 문제가 발생할 있기 때문이다 

 

3) 컬렉션은 필드에서 초기화하자(@RequiredArgstructor, private final 이용)

이렇게 하면 null 문제에서 안전하고, 임의의 메서드에서 컬렉션을 잘못 생성하면 하이버네이트 내부 메커니즘에 문제가 발생할 수 있다. 

 

6. em.find() vs JPQL

em.find(): 영속성 컨텍스트를 먼저 조회하고 없으면 SQL을 실행한다

JPQL: SQL을 먼저 실행한다 

 

7. @Controller vs @RestController

@Controller: view를 반환하기 위한 Controller 개발 시 사용한다

강의에서는 thymeleaf를 통해 서버사이드에서 view를 렌더링하기위해 @Controller를 사용했다 

 

@ResponseBody(Controller+ResponseBody): Data(Json Format)을 반환하기 위해 사용한다 

vue.js를 통해 프론트개발을 한다거나 단순히 data를 반환해야하는 api를 개발할 때 사용 

 

8. @Transactional

DB에 접근하는 메소드를 작성할 때 @Transactional 어노테이션을 추가해야 다음과 같은 에러가 발생하지 않는다 

 

이유는 기본적으로 JPA는 transaction을 기반으로 작동하게 되어있다. 

transation 단위에 따라 1차캐시 영역에 있는 객체들이 db로 flush되어 영속화되기 때문이다

 

하지만 그러한 영속작업을 하는 persist()메소드에 객체가 들어갔으나 가능한 transaction이 존재하기 않았기에 위와같은 에러가 발생했다.

변경을 하지 않는 메소드에는 @Transactional(readOnly=true)를 선언하자

 

 

9. 하나의 엔티티에서 두 필드가 서로를 참조하는 경우(부모-자식관계)

+ Recent posts