레이블이 스프링로깅인 게시물을 표시합니다. 모든 게시물 표시
레이블이 스프링로깅인 게시물을 표시합니다. 모든 게시물 표시

2022년 1월 9일 일요일

[자바스프링동영상]스프링 JPA로깅, Log4J, Logback-spring, 오라클교육/오라클학원/자바학원/스프링학원/자바교육/스프링교육

 [자바스프링동영상]스프링 JPA로깅, Log4J, Logback-spring, 오라클교육/오라클학원/자바학원/스프링학원/자바교육/스프링교육


https://www.youtube.com/watch?v=3HzIvCF7miQ&list=PLxU-iZCqT52AlV-Y7UlwSQp8N6pMjijFX&index=10http://ojc.asia/bbs/board.php?bo_table=LecJpa&wr_id=362 

https://www.youtube.com/watch?v=2Ct32nlhBzA&list=PLxU-iZCqT52AlV-Y7UlwSQp8N6pMjijFX&index=1 


스프링 JPA로깅, Log4J, Logback-spring

스프링 JPA로깅, Log4J, Logback-springLoggingSQL을 대신 작성해 주는 JPA 기술을 사용하다 보면 과연 적합한 SQL을 사용하는지 궁금해지기 마련입니다. 특히나 테이블 크기가 크고 복잡한 조인 쿼리를 사

ojc.asia

https://www.youtube.com/watch?v=poDicowrj_Y&list=PLxU-iZCqT52AlV-Y7UlwSQp8N6pMjijFX&index=11 



 Logging

SQL을 대신 작성해 주는 JPA 기술을 사용하다 보면 과연 적합한 SQL을 사용하는지 궁금해지기 마련입니다. 특히나 테이블 크기가 크고 복잡한 조인 쿼리를 사용해서 여러 테이블의 데이터를 구해야 하는 경우 JPA가 최적의 SQL을 작성해서 사용하는지 검토해 볼 필요가 있습니다. 


오랜 역사의 오라클데이터베이스도 때때로 최적의 쿼리를 사용하지 않고 있는 모습을 볼 수 있습니다. 그럴 때 힌트를 사용해서 개발자가 직접 쿼리의 실행계획을 조정할 필요가 있습니다. 이와 마찬가지로 JPA가 작성해서 사용하는 쿼리도 최적의 쿼리가 아닐 수 있습니다. 어떤 SQL 쿼리를 사용하느냐에 따라 성능의 차이가 날 수 있기 때문에 개발자가 직접 확인 해야 합니다. 이를 위해 프로젝트에 로깅기술을 적용해서 사용된 쿼리를 살펴보기 쉽도록 만들 필요가 있습니다.


     프로젝트 생성

앞서 작업한 프로젝트 chapter1-4를 선택한 상태에서 ctrl+c, ctrl+v 키를 연속으로 눌러서 소스 전체를 복사해 chapter1-5라고 명명하면서 프로젝트를 추가합니다.




 디펜던시 설정

pom.xml 파일에 다음 설정을 추가합니다.

<dependency>

<groupId>org.bgee.log4jdbc-log4j2</groupId>

<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>

<version>1.16</version>

</dependency>

    로깅 환경설정

환경설정파일에 로깅을 위한 설정을 추가합니다.

application.properties

# DATASOURCE

#spring.datasource.url=jdbc:mysql://localhost:3306/testdb?createDatabaseIfNotExist=true

spring.datasource.url=jdbc:log4jdbc:mysql://localhost:3306/testdb?createDatabaseIfNotExist=true

#spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy


# Logging

logging.config=classpath:logback-spring.xml

기존 드라이버 설정은 # 주석으로 막고 드라이버 스파이를 사용하도록 변경합니다. 로깅설정의 상세한 내용은 logback-spring.xml에 작성합니다. logback은 log4j를 업그레이드 한 기술입니다.


logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--  

jdbc.sqlonly    : Logs only SQL

jdbc.sqltiming  : Logs the SQL, post-execution, including timing execution statistics

jdbc.audit      : Logs ALL JDBC calls except for ResultSets

jdbc.resultset  : all calls to ResultSet objects are logged

jdbc.connection : Logs connection open and close events

-->

<configuration>

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

<!-- By default, encoders are assigned 

the type ch.qos.logback.classic.encoder.PatternLayoutEncoder -->

<encoder>

<pattern>

%d{yyyyMMdd HH:mm:ss.SSS} [%thread] %-3level %logger{5} -%msg %n

</pattern>

</encoder>

</appender>


<logger name="jdbc" level="OFF" />

<logger name="jdbc.sqlonly" level="DEBUG" additivity="false">

<appender-ref ref="STDOUT" />

</logger>

<logger name="jdbc.resultsettable" level="DEBUG" additivity="false">

<appender-ref ref="STDOUT" />

</logger>


<include resource="org/springframework/boot/logging/logback/base.xml"/>


<appender name="dailyRollingFileAppender" 

class="ch.qos.logback.core.rolling.RollingFileAppender">

<prudent>true</prudent>

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<fileNamePattern>applicatoin.%d{yyyy-MM-dd}.log</fileNamePattern>

<maxHistory>30</maxHistory>

</rollingPolicy>

<filter class="ch.qos.logback.classic.filter.ThresholdFilter">

<level>INFO</level>

</filter>

<encoder>

<pattern>

%d{yyyy:MM:dd HH:mm:ss.SSS} %-5level --- [%thread] %logger{35} : %msg %n

</pattern>

</encoder>

</appender>


<logger name="org.springframework.web" level="INFO"/>

<logger name="org.thymeleaf" level="INFO"/>

<logger name="org.hibernate.SQL" level="INFO"/>

<logger name="org.quartz.core" level="INFO"/>

<logger name="org.h2.server.web" level="INFO"/>


<root level="INFO">

<appender-ref ref="STDOUT" />

<!-- 프로젝트 루트 폴더에서 파일생성을 확인 (applicatoin.20YY-MM-DD.log) -->

<appender-ref ref="dailyRollingFileAppender" />

</root>

</configuration>

 "STDOUT" 설정으로 로깅정보가 콘솔에 출력됩니다.

 "dailyRollingFileAppender" 설정으로 로깅 정보가 프로젝트 루트에 파일로 기록됩니다.


log4jdbc.log4j2.properties

로깅을 처리할 때 로거가 참조하는 설정정보를 알려줍니다.

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

# multi-line query display

log4jdbc.dump.sql.maxlinelength=0


    테스트

스프링 기동 로그 살펴보기

application.properties 파일에 spring.jpa.hibernate.ddl-auto=create 설정으로 프로젝트가 기동 시 기존 테이블을 삭제하고 다시 생성할 것입니다. 로그 정보에서 관련 로그내역을 찾아보세요.

drop table if exists employee
 

create table employee (empno bigint not null, ename varchar(255), job varchar(255), primary key (empno)) ENGINE=InnoDB


data.sql에 작성된 쿼리를 처리하는지 확인합니다.

INSERT IGNORE INTO EMPLOYEE(empno, ename, job) VALUES(7839,'KING','PRESIDENT');

INSERT IGNORE INTO EMPLOYEE(empno, ename, job) VALUES(7566,'JONES','MANAGER');

INSERT IGNORE INTO EMPLOYEE(empno, ename, job) VALUES(7698,'BLAKE','MANAGER');

INSERT IGNORE INTO EMPLOYEE(empno, ename, job) VALUES(7782,'CLARK','MANAGER');


브라우저로 접근해서 데이터를 요청하여 테스트 합니다.


질의 관련 로그 살펴보기

드라이버스파이는 조회쿼리인 경우 결과를 보기 좋게 테이블로 표시해 줍니다.

select employee0_.empno as empno1_0_, employee0_.ename as ename2_0_, employee0_.job as job3_0_ from employee employee0_


쿼리의 퍼포먼스를 판단할 수 있는 실행계획까지는 보여주지 않으므로 로그에 표시된 쿼리를 데이터베이스 전용 프로그램에서 실행하여 실행계획을 살펴 보시기 바랍니다.


https://www.youtube.com/watch?v=w6XoZ3Luzus&list=PLxU-iZCqT52AlV-Y7UlwSQp8N6pMjijFX&index=4 

 

#JPA, #로깅, #스프링로깅, #Log4J, #스프링교육, #자바교육, #오라클교육,#스프링학원, #자바학원, #SQL학원, #오라클학원, JPA, 로깅, 스프링로깅, Log4J, 스프링교육, 자바교육, 오라클교육,스프링학원, 자바학원, SQL학원, 오라클학원

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...