기본 콘텐츠로 건너뛰기

Spring SQL 로깅 완벽 가이드: Log4j2와 Log4jdbc로 가독성 극대화하기

BACKEND / SPRING

Spring SQL 로깅 완벽 가이드: Log4j2와 Log4jdbc로 가독성 극대화하기

Spring 개발 중 '?'로 표시되는 쿼리 파라미터 때문에 답답하셨나요? Log4jdbc를 연동하여 SQL 실행 로그를 깔끔하게 정복하는 방법을 소개합니다.

1. 왜 Log4jdbc를 도입해야 할까?

Spring의 기본 JDBC 로깅을 사용하면 SQL 파라미터가 ?(물음표)로 마스킹되어 출력됩니다. 이로 인해 실제 어떤 값이 쿼리에 바인딩되었는지 확인하기 어렵고, 긴 쿼리가 한 줄로 출력되어 가독성이 현저히 떨어집니다.

log4jdbc-log4j2를 프로젝트에 적용하면 다음과 같은 강력한 디버깅 환경을 구축할 수 있습니다.

  • 파라미터 바인딩 확인: '?' 대신 실제 입력 값이 치환된 '실행 가능한 SQL'을 로그로 확인할 수 있습니다.
  • 가독성 향상 (Multi-line): 복잡한 쿼리를 여러 줄로 정렬하여 출력하므로 구조 파악이 용이합니다.
  • Result Set 시각화: SELECT 쿼리의 조회 결과를 콘솔에서 테이블 형태로 즉시 확인할 수 있습니다.

2. Maven 의존성 추가 (pom.xml)

가장 먼저 필요한 라이브러리를 프로젝트에 추가해야 합니다. 핵심 로깅을 담당하는 라이브러리와 커스텀 포맷팅을 지원하는 라이브러리 두 가지가 필요합니다.

<!-- log4jdbc-log4j2 (Log4j2 기반 SQL 로깅) -->
<dependency>
    <groupId>org.bgee.log4jdbc-log4j2</groupId>
    <artifactId>log4jdbc-log4j2-jdbc4</artifactId>
    <version>1.16</version>
</dependency>

<!-- log4jdbc-remix (Custom Formatter 지원) -->
<dependency>
    <groupId>org.lazyluke</groupId>
    <artifactId>log4jdbc-remix</artifactId>
    <version>0.2.7</version>
</dependency>

프로젝트에 이미 log4j2 관련 의존성이 설정되어 있는지 확인 후 진행하시기 바랍니다.

3. Log4j2 로거 설정 (log4j2.xml)

라이브러리 추가 후에는 Log4j2 설정 파일에서 어떤 SQL 정보를 출력할지 지정해야 합니다. 주요 로거 이름은 jdbc.sqlonlyjdbc.resultsettable입니다.

<Loggers>
    <!-- 1. 실행된 SQL 쿼리 로그 (바인딩 변수 포함) -->
    <Logger name="jdbc.sqlonly" additivity="false">
        <Level value="info" /> 
        <AppenderRef ref="console" />
    </Logger>

    <!-- 2. SQL 실행 결과(ResultSet)를 테이블로 출력 -->
    <Logger name="jdbc.resultsettable" additivity="false">
        <Level value="info" /> 
        <AppenderRef ref="console" />
    </Logger>

    <Root level="info">
        <AppenderRef ref="console" />
    </Root>
</Loggers>

단순히 쿼리 문장만 확인하고 싶다면 jdbc.sqlonlyinfo 레벨로 설정하고, 조회 데이터까지 검증이 필요하다면 jdbc.resultsettable도 활성화합니다.

4. DataSource 프록시 및 포맷터 설정

설정의 핵심은 기존 DataSource를 Log4jdbc 프록시 객체로 감싸는 것입니다. 이를 통해 JDBC 호출을 가로채어 로그를 남기게 됩니다. 또한 Log4JdbcCustomFormatter를 통해 출력 형식을 다듬을 수 있습니다.

<!-- 1. 원본 DataSource (예: DBCP, HikariCP 등) -->
<bean id="dataSourceSpied" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
    <property name="username" value="user"/>
    <property name="password" value="pass"/>
</bean>

<!-- 2. 프록시 DataSource (실제 빈으로 등록) -->
<bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
    <constructor-arg ref="dataSourceSpied"/>
    <property name="logFormatter">
        <!-- 3. SQL 포맷팅 설정 -->
        <bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
            <property name="loggingType" value="MULTI_LINE"/> <!-- 여러 줄 출력 -->
            <property name="sqlPrefix" value="SQL::: "/>       <!-- 로그 접두사 -->
        </bean>
    </property>
</bean>

loggingType="MULTI_LINE" 옵션은 특히 중요합니다. 이 옵션을 사용하면 SQL이 키워드 단위로 줄바꿈되어 출력되므로, 복잡한 비즈니스 로직의 쿼리를 분석할 때 시각적 피로도를 크게 줄여줍니다.

5. 실전 운영 및 성능 최적화 팁

모든 설정을 마쳤다면, 운영 환경(Production) 배포 시 다음 사항을 반드시 고려해야 합니다.

  • 개발 환경(Dev): jdbc.sqlonlyjdbc.resultsettableINFO로 설정하여 디버깅 효율을 극대화합니다.
  • 운영 환경(Prod): SQL 로깅은 I/O 성능 저하를 유발할 수 있으며, 민감한 데이터가 로그 파일에 남을 보안 위험이 있습니다. 따라서 로깅 레벨을 WARN 또는 ERROR로 상향 조정하여 불필요한 로그 적재를 방지해야 합니다.
  • Spring Boot 사용자: XML 설정 대신 Java Config(@Configuration)를 사용하거나, 편리한 설정을 돕는 log4jdbc-spring-boot-starter 라이브러리 활용을 권장합니다.

💡 이제 지저분한 로그 대신, 구조화되고 읽기 쉬운 SQL 로그를 통해 쾌적한 개발 환경을 경험해 보시기 바랍니다.

댓글

이 블로그의 인기 게시물

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 (Request Parameter 전체보기)

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 Java Servlet Request Parameter 완전 정복 웹 애플리케이션에서 클라이언트로부터 전달되는 Request Parameter 를 확인하는 것은 필수입니다. 이 글에서는 Java Servlet 과 JSP 에서 GET/POST 요청 파라미터를 전체 출력하고 디버깅하는 방법을 다양한 예제와 함께 소개합니다. 1. 기본 예제: getParameterNames() 사용 Enumeration<String> params = request.getParameterNames(); System.out.println("----------------------------"); while (params.hasMoreElements()){ String name = params.nextElement(); System.out.println(name + " : " + request.getParameter(name)); } System.out.println("----------------------------"); 위 코드는 요청에 포함된 모든 파라미터 이름과 값을 출력하는 기본 방법입니다. 2. HTML Form과 연동 예제 <form action="CheckParamsServlet" method="post"> 이름: <input type="text" name="username"><br> 이메일: <input type="email" name="email"><b...

PostgreSQL 달력(일별,월별)

SQL 팁: GENERATE_SERIES로 일별, 월별 날짜 목록 만들기 SQL 팁: GENERATE_SERIES 로 일별, 월별 날짜 목록 만들기 데이터베이스에서 통계 리포트를 작성하거나 비어있는 날짜 데이터를 채워야 할 때, 특정 기간의 날짜 목록이 필요할 수 있습니다. PostgreSQL과 같은 데이터베이스에서는 GENERATE_SERIES 함수를 사용하여 이 작업을 매우 간단하게 처리할 수 있습니다. 1. 🗓️ 일별 날짜 목록 생성하기 2020년 1월 1일부터 12월 31일까지의 모든 날짜를 '1 day' 간격으로 생성하는 쿼리입니다. WITH date_series AS ( SELECT DATE(GENERATE_SERIES( TO_DATE('2020-01-01', 'YYYY-MM-DD'), TO_DATE('2020-12-31', 'YYYY-MM-DD'), '1 day' )) AS DATE ) SELECT DATE FROM date_series 이 쿼리는 WITH 절(CTE)을 사용하여 date_series 라는 임시 테이블을 만들고, GENERATE_SERIES 함수로 날짜를 채웁니다. 결과 (일별 출력) 2. 📅 월별 날짜 목록 생성하기 동일한 원리로, 간격을 '1 MONTH' 로 변경하면 월별 목록을 생성할 수 있습니다. TO...

CSS로 레이어 팝업 화면 가운데 정렬하는 방법 (top·left·transform 완전 정리)

레이어 팝업 센터 정렬, 이 코드만 알면 끝 (CSS 예제 포함) 이벤트 배너나 공지사항을 띄울 때 레이어 팝업(center 정렬) 을 깔끔하게 잡는 게 생각보다 어렵습니다. 화면 크기가 변해도 가운데에 고정되고, 모바일에서도 자연스럽게 보이게 하려면 position , top , left , transform 을 정확하게 이해해야 합니다. 이 글에서는 아래 내용을 예제로 정리합니다. 레이어 팝업(center 정렬)의 기본 개념 자주 사용하는 position: absolute / fixed 정렬 방식 질문에서 주신 스타일 top: 3.25%; left: 50%; transform: translateX(-50%) 의 의미 실무에서 바로 쓰는 반응형 레이어 팝업 HTML/CSS 예제 1. 레이어 팝업(center 정렬)이란? 레이어 팝업(레이어 팝업창) 은 새 창을 띄우는 것이 아니라, 현재 페이지 위에 div 레이어를 띄워서 공지사항, 광고, 이벤트 등을 보여주는 방식을 말합니다. 검색엔진(SEO) 입장에서도 같은 페이지 안에 HTML이 존재 하기 때문에 팝업 안의 텍스트도 정상적으로 인덱싱될 수 있습니다. 즉, “레이어 팝업 센터 정렬”, “레이어 팝업 만드는 방법”과 같이 관련 키워드를 적절히 넣어주면 검색 노출에 도움이 됩니다. 2. 질문에서 주신 레이어 팝업 스타일 분석 질문에서 주신 스타일은 다음과 같습니다. <div class="layer-popup" style="width:1210px; z-index:9001; position:absolute; top:3.25%; left:50%; transform:translateX(-50%);"> 레이어 팝업 내용 <...