해결된 질문
작성
·
125
·
수정됨
0
JPA 와 DB 설정, 동작확인 강의에서 리뉴얼된 메뉴얼을 따라서 진행하고 있는데 24분 34초에 나오는 BasicBinder 와 관련한 로그가 TRACE 레벨인 것 같은데 해당 로그가 찍히지 않습니다.
또한 org.hibernate.SQL 과 관련한 로그도 영상과는 다르게 찍히는데 이유가 뭘까요?
p6spy를 적용하여 나오는 결과 로그도 영상과 다릅니다 ( 27분 28초 )
p6spy 를 적용하면서 동일한 쿼리 내용이 2번 찍히는 것 같기도 하고 문제를 모르겠습니다.
2025-03-25T23:48:11.976+09:00 INFO 12200 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2025-03-25T23:48:12.165+09:00 INFO 12200 --- [ Test worker] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection conn0: url=jdbc:h2:tcp://localhost/~/jpashop user=SA
2025-03-25T23:48:12.168+09:00 INFO 12200 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2025-03-25T23:48:12.225+09:00 INFO 12200 --- [ Test worker] org.hibernate.orm.connections.pooling : HHH10001005: Database info:
Database JDBC URL [Connecting through datasource 'p6SpyDataSourceDecorator [com.p6spy.engine.spy.P6DataSource] -> dataSource [com.zaxxer.hikari.HikariDataSource]']
Database driver: undefined/unknown
Database version: 2.2.224
Autocommit mode: undefined/unknown
Isolation level: undefined/unknown
Minimum pool size: undefined/unknown
Maximum pool size: undefined/unknown
2025-03-25T23:48:12.864+09:00 DEBUG 12200 --- [ Test worker] org.hibernate.SQL :
create global temporary table HTE_member(rn_ integer not null, id bigint, username varchar(255), primary key (rn_)) TRANSACTIONAL
2025-03-25T23:48:12.869+09:00 INFO 12200 --- [ Test worker] p6spy : #1742914092869 | took 2ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/jpashop
create global temporary table HTE_member(rn_ integer not null, id bigint, username varchar(255), primary key (rn_)) TRANSACTIONAL
create global temporary table HTE_member(rn_ integer not null, id bigint, username varchar(255), primary key (rn_)) TRANSACTIONAL;
2025-03-25T23:48:12.976+09:00 INFO 12200 --- [ Test worker] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
2025-03-25T23:48:12.988+09:00 DEBUG 12200 --- [ Test worker] org.hibernate.SQL :
drop table if exists member cascade
2025-03-25T23:48:12.990+09:00 INFO 12200 --- [ Test worker] p6spy : #1742914092990 | took 1ms | statement | connection 2| url jdbc:h2:tcp://localhost/~/jpashop
drop table if exists member cascade
drop table if exists member cascade ;
2025-03-25T23:48:12.990+09:00 DEBUG 12200 --- [ Test worker] org.hibernate.SQL :
drop sequence if exists member_seq
2025-03-25T23:48:12.991+09:00 INFO 12200 --- [ Test worker] p6spy : #1742914092991 | took 0ms | statement | connection 2| url jdbc:h2:tcp://localhost/~/jpashop
drop sequence if exists member_seq
drop sequence if exists member_seq;
2025-03-25T23:48:12.995+09:00 DEBUG 12200 --- [ Test worker] org.hibernate.SQL :
create sequence member_seq start with 1 increment by 50
2025-03-25T23:48:12.996+09:00 INFO 12200 --- [ Test worker] p6spy : #1742914092996 | took 0ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/jpashop
create sequence member_seq start with 1 increment by 50
create sequence member_seq start with 1 increment by 50;
2025-03-25T23:48:13.000+09:00 DEBUG 12200 --- [ Test worker] org.hibernate.SQL :
create table member (
id bigint not null,
username varchar(255),
primary key (id)
)
2025-03-25T23:48:13.002+09:00 INFO 12200 --- [ Test worker] p6spy : #1742914093002 | took 2ms | statement | connection 3| url jdbc:h2:tcp://localhost/~/jpashop
create table member (
id bigint not null,
username varchar(255),
primary key (id)
)
create table member (
id bigint not null,
username varchar(255),
primary key (id)
);
2025-03-25T23:48:13.005+09:00 INFO 12200 --- [ Test worker] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2025-03-25T23:48:13.328+09:00 WARN 12200 --- [ Test worker] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2025-03-25T23:48:13.368+09:00 INFO 12200 --- [ Test worker] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: class path resource [static/index.html]
2025-03-25T23:48:13.881+09:00 INFO 12200 --- [ Test worker] jpabook.jpashop.MemberRepositoryTest : Started MemberRepositoryTest in 4.281 seconds (process running for 5.626)
2025-03-25T23:48:14.568+09:00 DEBUG 12200 --- [ Test worker] org.hibernate.SQL :
select
next value for member_seq
2025-03-25T23:48:14.589+09:00 INFO 12200 --- [ Test worker] p6spy : #1742914094589 | took 13ms | statement | connection 4| url jdbc:h2:tcp://localhost/~/jpashop
select next value for member_seq
select next value for member_seq;
2025-03-25T23:48:14.685+09:00 INFO 12200 --- [ Test worker] p6spy : #1742914094685 | took 0ms | rollback | connection 4| url jdbc:h2:tcp://localhost/~/jpashop
;
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
2025-03-25T23:48:14.710+09:00 INFO 12200 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2025-03-25T23:48:14.716+09:00 INFO 12200 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2025-03-25T23:48:14.730+09:00 INFO 12200 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
현재 설정 파일 내용들입니다.
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/jpashop
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto : create
properties:
hibernate:
# show_sql: true
format_sql: true
logging.level:
org.hibernate.SQL: debug
org.hibernate.orm.jdbc.bind: trace
Junit5를 사용하기 위해서 Junit4를 추가하지 않았습니다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.4'
id 'io.spring.dependency-management' version '1.1.7'
}
group = 'jpabook'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.10.0'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
답변 2
1
@Test
@Transactional
@Rollback(false)
void testMember() {
}
테스트의 상단에 @RollBack(false) 애노테이션을 추가해주었더니 영한님의 로그와 동일하게 출력되었습니다.
@Transactional 애노테이션을 메서드에 추가하면 테스트 완료 후 rollback이 일어나면서 실제로 db에 데이터를 저장하지 않기 때문에 insert 구문을 볼 수 없었던 것이라고 합니다.
@Rollback(false) 를 추가해주면 테스트 완료 후 롤백을 하지 않으면서, 실제로 db에 데이터를 저장하게 되며 insert 문을 수행하게 됩니다.
근데 이 경우 DB에 데이터가 남게 되어서 다음 테스트를 진행할 때 영향을 주는 문제가 발생합니다.
package jpabook.jpashop;
import jakarta.persistence.EntityManager;
import jakarta.transaction.Transactional;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
class MemberRepositoryTest {
@Autowired
MemberRepository memberRepository;
@Autowired
private EntityManager entityManager;
@Test
@Transactional
void testMember() {
//given
Member member = new Member();
member.setUsername("memberA");
//when
Long savedId = memberRepository.save(member);
Member findMember = memberRepository.find(savedId);
//then
assertThat(findMember).isEqualTo(member);
//
entityManager.flush();
entityManager.clear();
}
}
다음과 같이 기존 코드에서 EntityManager 를 추가하여 직접 flush() 하게 되면 트랜잭션이 커밋되지 않아도 INSERT 문이 실행되고, 테스트가 끝나면 @Transactional 에 의해서 롤백되므로 DB에는 반영되지 않습니다.
즉, 트랜잭션 내에서 SQL 로그를 모두 확인하면서도 테스트를 독립적으로 실행할 수 있습니다.
0
안녕하세요, 인프런 AI 인턴입니다.
spring 및 JPA 설정과 관련된 로그 레벨 문제로 보이네요. 이러한 문제는 종종 설정과 관련이 있을 수 있으며, 아래와 같은 몇 가지 사항을 점검해 보실 수 있습니다:
로그 레벨 설정:
org.hibernate.SQL
과 org.hibernate.orm.jdbc.bind
설정이 맞는 것을 확인하셨으니, 기본적으로 이 설정은 SQL 쿼리 로그와 바인딩 변수 값을 출력하도록 해야 합니다.org.hibernate.orm.jdbc.bind: trace
는 SQL 바인딩 변수 출력을 활성화합니다. trace
로그가 나오지 않는다면, logback-spring.xml
파일을 확인하여 로그 설정이 제대로 되어 있는지 확인해 보세요.p6spy 설정:
spy.properties
)을 사용하여 로그 출력 형식을 조정할 수 있습니다. p6spy 공식 문서를 참고하여 경우에 따라 로그를 조정할 수 있습니다.Spring Configuration:
spring.jpa.properties.hibernate.format_sql
등 Hibernate와 관련된 설정이 제대로 적용되고 있는지 확인하세요.p6spy-spring-boot-starter
를 사용할 경우, 추가적인 설정이 필요할 수도 있으니 공식 문서를 참고하여 설정을 확인하세요.유사한 설정 및 문제에 대한 기존의 질문 및 해결 방법을 참고하실 수 있는 링크를 공유드립니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.