Spring/JPA 1

1. 프로젝트 환경설정

wch_t 2023. 8. 16. 02:08

1. JUnit5 테스트 에러

 

이걸 보지않고, JUnit5으로 테스트하다가 1시간동안 테스트 오류 잡아내느라 힘들었다는...

 

 

 

Tip. Build.gradle에 라이브러리 추가하자.

(vscode의 live-server 같은?)

 

 

 

 

 

2. JPA와 DB 설정, 동작확인

 

1) spring.jpa.hibernate.ddl-auto: create

   - 애플리케이션  실행 시점에 테이블을 drop 하고, 다시 생성한다.

 

2) show_sql: true

   - System.out에 하이버네이트 실행 SQL을 남긴다.

 

3) org.hibernate.SQL

   - logger를 통해 하이버네이트 실행 SQL을 남긴다.

 

4) org.hibernate.orm.jdbc.bind: trace

   - SQL 실행 파라미터를 로그로 남긴다. (쿼리 파라미터를 DB에 접속해 확인하지 않고, 로그로 보고 싶을 때)

 

   - 외부 라이브러리 사용

      → https://github.com/gavlyukovskiy/spring-boot-data-source-decorator

         cf. 개발 단계에서는 편하게 사용해도 된다. 하지만 운영 단계에서는 시스템 자원을 사용하므로(병목), 꼭 성능테스트를 하고 사용하자

 

 

 

 

+. lombok 사용 시 dependency에 아래 코드 추가

 

 

+. @PersistenceContext

      : 스프링이 만들어둔 EntityManager를 주입시켜 준다.

 

 

   *사용해야 하는 이유

     https://batory.tistory.com/497

 

    1) EntityManager를 사용할 때 주의해야 할 점은 여러 쓰레드가 동시에 접근하면 동시성 문제가 발생하여 쓰레드 간에는 EntityManager를 공유해서는 안된다.

  • 일반적으로 스프링은 싱글톤 기반으로 동작하기에 빈은 모든 쓰레드가 공유한다.
  • 그러나 @PersistenceContext으로 EntityManager를 주입받아도 동시성 문제가 발생하지 않는다.

 

   2) 동시성 문제가 발생하지 않는 이유는

  • 스프링 컨테이너가 초기화되면서 @PersistenceContext으로 주입받은 EntityManager를 Proxy로 감싼다.
  • 그리고 EntityManager 호출 시마다 Proxy를 통해 EntityManager를 생성하여 Thread-Safe를 보장한다.