본문 바로가기
  • 개발공부 및 일상적인 내용을 작성하는 블로그 입니다.
Spring boot

스프링 부트 - JPA 와 DB 설정 및 동작확인 - Tip

by 방구석 대학생 2020. 12. 20.

"인프런 - 실전! 스프링 부트와 JPA 활용 1 강의를 듣고 작성한 글 입니다."

www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1#

 

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 인프런

실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니다. 초급

www.inflearn.com

 

스프링 부트에서 JPA 를 활용할 때 몇가지 팁들

* 스프링 부트에서 JPA 를 활용할 경우 스프링 부트를 통해 복잡한 설정이 다 자동화 되기 때문에 persistence.xml 파일과 같은 설정 파일을 생성하지 않아도 된다.

 

* 쿼리 파라미터에 로그 남기기(이거 알면 개발할 때 엄청 편해진다고 한다.)

: 스프링 부트에서 JPA 를 쓸때 쿼리 파라미터를 남기려면 application.yml 파일에서 logging 옵션에 다음과 같은 설정을 붙여준다. -> org.hibernate.type : trace

- application.yml

logging:
  level:
    org.hibernate.SQL: debug
    org.hibernate.type : trace

 

이후 테스트 코드를 실행시켜 보면 아래와 같은 로그를 출력하는 것을 확인할 수 있다.

- Hibernate SQL

2020-12-06 22:13:22.246 DEBUG 15676 --- [           main] org.hibernate.SQL                        : 
    insert 
    into
        member
        (username, id) 
    values
        (?, ?)
2020-12-06 22:13:22.250 TRACE 15676 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [VARCHAR] - [memberA]
2020-12-06 22:13:22.251 TRACE 15676 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [BIGINT] - [1]

 

위의 SQL 에서 첫번째 파라미터로 VARCHAR 타입의 memberA, 두번째 파라미터로 BIGINT 타입의 1 이 사용되었음을 로그를 통해 알 수 있다.

 

그런데 여기서 SQL 문 내부에서 ? 로 표시되어 있는 파라미터 들을 직접 보고싶은 경우 다음의 경로에 있는 외부 라이브러리를 사용할 수 있다.

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

 

gavlyukovskiy/spring-boot-data-source-decorator

Spring Boot integration with p6spy, datasource-proxy, flexy-pool and spring-cloud-sleuth - gavlyukovskiy/spring-boot-data-source-decorator

github.com

 

해당 경로의 링크로 들어가서 README 파일을 보면 P6Spy 라이브러리에 대한 Quick Start 태그를 볼 수 있는데, 그곳에서 아래의 옵션을 build.gradle 파일에 붙여넣기 해준다.

 

- gradle 프로젝트 인 경우

implementation("com.github.gavlyukovskiy:p6spy-spring-boot-starter:${version}")

- mavan 프로젝트 인 경우

<dependency>
    <groupId>com.github.gavlyukovskiy</groupId>
    <artifactId>p6spy-spring-boot-starter</artifactId>
    <version>${version}</version>
</dependency>

 

여기서 이 옵션의 경우 버전 정보를 추가해 주어야 하는 이유는, 기본적으로 스프링 부트가 2.1.7 버전에서는 버전의 궁합에 맞는 라이브러리 버전에 대해 모두 세팅을 해 둔 상태이기 때문에 굳이 버전 정보를 받아오거나 작성하지 않아도 무관한 반면,

스프링 부트가 미리 버전 정보를 세팅해 놓지 않은 라이브러리 들의 경우에는 위의 코드와 같이 버전 정보를 받아올 수 있게끔 작성해 주어야 하기 때문이다.

 

* 강의 중 발생한 문제 사항

P6Spy 라이브러리를 프로젝트에 적용하는데 있어 현재 깃허브 README 파일 상으로 최종 버전은 1.6.3 버전이나, 해당 버전의 라이브러리를 로드 하는데 계속 실패하여 어쩔수 없이 하위 버전인 1.5.8 버전으로 대체하였다.

 

이제 gradle 을 리빌드 해준 후 다시 한번 테스트를 수행하면 아래와 같은 로그를 출력하는 것을 확인할 수 있다.

2020-12-06 22:52:13.080  INFO 11308 --- [           main] p6spy                                    : #1607262733080 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/jpashop_practice
insert into member (username, id) values (?, ?)
insert into member (username, id) values ('memberA', 1);
2020-12-06 22:52:13.084  INFO 11308 --- [           main] p6spy                                    : #1607262733084 | took 0ms | commit | connection 3| url jdbc:h2:tcp://localhost/~/jpashop_practice;

 

그런데 이런 라이브러리 들은 개발 단계에서 사용할 땐 편리 할 수 있으나, 운영 단계에서는 생각을 좀 해봐야 한다.

이런것들이 잘못하면 성능을 확 저하시킬 가능성이 있기 때문이다.

어느정도 받아 들일 수 있는 수준이라면 문제가 없겠지만 그렇지 않다면 개발 단계에서만 사용하는 것을 권장한다.