<< 학습 목표 >>
1. SQL 로그를 콘솔에 출력할 수 있다.
로그 ( Log ) 란 흔적을 말함
클라이언트가 서버로 요청을 보내면 서버는 요청 정보를 로그에 남김
나중에 로그에 남은 이 요청 정보를 분석해서 사용자들이 어떤 서비스를 많이 이용하는지, 어느 시간대에 많이 이용하는지 등을 분석할 수 있음
이처럼 운영에 필요한 로그를 남길 수도 있지만 개발에 필요한 로그를 남길 수 있음
개발에 필요한 로그는 주로 디버깅을 위해 남김
클라이언트가 어떤 값을 보냈을 때 내가 만든 API가 어떻게 동작하고 어떤 결과를 응답하는지 등을 남겨 디버깅에 활용함
이때 중요하게 활용되는 로그 중 하나는 SQL 로그임
개발 직무 중 DBA 가 있을 정도로 DB, SQL를 제대로 다루기 위해서는 많은 공부가 필요함
그래서 백엔드 개발자들은 주로 당장에 필요한 DB, SQL과 관련된 최소한의 지식만 가지고 공부하고 취업하고 실무에서 개발함
이 때문에 개발 중 SQL이 의도치 않게 동작할 경우 이 SQL을 확인해야되는데 로그를 남기지 않으면 SQL을 확인하기 어렵거나 불가능할 수 있음
이번에는 SQL 로그를 남기는 방법을 배워보자
자바에는 로그를 남기는 방법이 많은데 일반적으로 별도의 로깅 프레임워크를 사용해서 로그를 남김
자바 로깅 프레임워크에는 log4j, log4j2, SLF4J, apache common logging, logback 등이 있음
Spring Boot 로 만든 프로젝트는 기본적으로 logback 로깅 프레임워크가 내장되어있음
우리 프로젝트에 logback 로깅 프레임워크를 사용해 SQL 로그를 남겨보자
logback 로깅 프레임워크를 사용하려면 먼저 xml 파일을 만들어 로깅 설정을 해야함
프로젝트 -> src/main/resources -> logback-spring.xml 파일을 추가하고 아래 설정 코드를 추가하자
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative] [%thread] %-5level %logger{36} - %msg%n</Pattern>
</encoder>
</appender>
<logger name="com.study.chapter04" level="debug" />
<root level="info">
<appender-ref ref="console" />
</root>
</configuration>
<< 코드 설명 >>
우선 설정 파일 이름에 오타가 있으면 안됨
SpringFramework는 설정 파일을 찾을 때 설정 파일의 이름으로 찾기 때문에...
설정 코드를 이해할 필요는 없음
"SQL 로그를 출력하려면 이렇게 써야하는구나" 라고 생각하고 넘어가자
여기까지가 로그를 출력하기 위한 설정 끝임
이제 쿼리, DAO, 컨트롤러를 추가해 SQL 로그가 출력되는지 확인하자
<< 쿼리 >>
프로젝트 -> src/main/resources -> mapper -> Member7.xml 파일을 추가하고 아래 코드를 추가하자
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.study.chapter04.MemberDao7">
<select id="getMember" resultType="com.study.chapter04.MemberDto" parameterType="com.study.chapter04.MemberDto">
SELECT id, pw, nickname, tel FROM member
<where>
<if test="nickname != null">
AND nickname = #{nickname}
</if>
<if test="tel != null">
AND tel = #{tel}
</if>
</where>
</select>
</mapper>
<< DTO >>
프로젝트 -> com.study.chapter04 -> MemberDto 클래스를 추가하고 아래 코드를 추가하자
package com.study.chapter04;
import java.time.LocalDateTime;
import lombok.Data;
@Data
public class MemberDto {
private int idx;
private String id;
private String pw;
private String nickname;
private String tel;
private LocalDateTime joinDateTime;
private boolean isDel;
}
<< DAO >>
프로젝트 -> com.study.chapter04 -> MemberDao7 클래스를 추가하고 아래 코드를 추가하자
package com.study.chapter04;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface MemberDao7 {
MemberDto getMember(MemberDto member);
}
<< 컨트롤러 >>
프로젝트 -> com.study.chapter04 -> MyBatisController7 클래스를 추가하고 아래 코드를 추가하자
package com.study.chapter04;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MyBatisController7 {
@Autowired
private MemberDao7 memberDao;
@GetMapping("/chapter04/mybatis/v7/member")
public void getMemberByNickname(MemberDto parameter) {
MemberDto member = memberDao.getMember(parameter);
System.out.println("<< 조회 결과 >>");
System.out.println(member);
}
}
이제 서버를 실행시키고 컨트롤러를 호출해보자
이때 닉네임(nickname) 이나 연락처(tel) 파라미터를 보내야함
컨트롤러를 호출하면 DAO를 타고 SQL이 실행되며 콘솔에 로그가 남을 것
'Spring + Boot > Boot-Chapter04' 카테고리의 다른 글
Chapter04. Spring Boot - DB / MyBatis 심화, cache, cache-ref 태그 (2) | 2023.05.31 |
---|---|
Chapter04. Spring Boot - DB / MyBatis 심화, sql, include, property 동적 쿼리 (1) | 2023.05.30 |
Chapter04. Spring Boot - DB / MyBatis 심화, bind, resultMap 동적 쿼리 (0) | 2023.05.29 |
Chapter04. Spring Boot - DB / MyBatis 심화, SET 동적 쿼리 (0) | 2023.05.28 |
Chapter04. Spring Boot - DB / MyBatis 심화, WHERE 동적 쿼리 (0) | 2023.05.28 |