인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

summerender님의 프로필 이미지

작성한 질문수

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

JPA와 DB 설정, 동작확인

TRACE 레벨의 로그가 찍히지 않는 것 같아요( 해결완료 )

해결된 질문

작성

·

125

·

수정됨

0

  1. JPA 와 DB 설정, 동작확인 강의에서 리뉴얼된 메뉴얼을 따라서 진행하고 있는데 24분 34초에 나오는 BasicBinder 와 관련한 로그가 TRACE 레벨인 것 같은데 해당 로그가 찍히지 않습니다.

  2. 또한 org.hibernate.SQL 과 관련한 로그도 영상과는 다르게 찍히는데 이유가 뭘까요?

  3. 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

summerender님의 프로필 이미지
summerender
질문자

해결 방법 1

@Test
@Transactional
@Rollback(false)
    void testMember() {

}

테스트의 상단에 @RollBack(false) 애노테이션을 추가해주었더니 영한님의 로그와 동일하게 출력되었습니다.

@Transactional 애노테이션을 메서드에 추가하면 테스트 완료 후 rollback이 일어나면서 실제로 db에 데이터를 저장하지 않기 때문에 insert 구문을 볼 수 없었던 것이라고 합니다.
@Rollback(false) 를 추가해주면 테스트 완료 후 롤백을 하지 않으면서, 실제로 db에 데이터를 저장하게 되며 insert 문을 수행하게 됩니다.

근데 이 경우 DB에 데이터가 남게 되어서 다음 테스트를 진행할 때 영향을 주는 문제가 발생합니다.

해결 방법 2 (권장)

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 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

spring 및 JPA 설정과 관련된 로그 레벨 문제로 보이네요. 이러한 문제는 종종 설정과 관련이 있을 수 있으며, 아래와 같은 몇 가지 사항을 점검해 보실 수 있습니다:

  1. 로그 레벨 설정:

    • org.hibernate.SQLorg.hibernate.orm.jdbc.bind 설정이 맞는 것을 확인하셨으니, 기본적으로 이 설정은 SQL 쿼리 로그와 바인딩 변수 값을 출력하도록 해야 합니다.
    • org.hibernate.orm.jdbc.bind: trace는 SQL 바인딩 변수 출력을 활성화합니다. trace 로그가 나오지 않는다면, logback-spring.xml 파일을 확인하여 로그 설정이 제대로 되어 있는지 확인해 보세요.
  2. p6spy 설정:

    • p6spy는 SQL 로그를 포맷해서 출력해주는 추가적인 라이브러리입니다. 이를 통해 p6spy가 두 번 로그를 찍는 것처럼 보이는 건 본질적으로 p6spy가 SQL을 모니터링하고 포맷해서 보여주는 동작입니다. 이는 기본적인 동작이므로 걱정하지 않으셔도 됩니다.
    • p6spy의 설정 파일(spy.properties)을 사용하여 로그 출력 형식을 조정할 수 있습니다. p6spy 공식 문서를 참고하여 경우에 따라 로그를 조정할 수 있습니다.
  3. Spring Configuration:

    • spring.jpa.properties.hibernate.format_sql 등 Hibernate와 관련된 설정이 제대로 적용되고 있는지 확인하세요.
    • p6spy-spring-boot-starter를 사용할 경우, 추가적인 설정이 필요할 수도 있으니 공식 문서를 참고하여 설정을 확인하세요.

유사한 설정 및 문제에 대한 기존의 질문 및 해결 방법을 참고하실 수 있는 링크를 공유드립니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.