๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ๋ฐœ ์ผ์ง€ ๐Ÿ‘ฉ‍๐Ÿ’ป

spring boot) ํŠน์ • SQL ๋กœ๊ทธ ๊ฐ์ถ”๊ธฐ

by chuyj15 2025. 6. 18.
728x90
๋ฐ˜์‘ํ˜•
SMALL

Spring Boot + Log4jdbc + MyBatis์—์„œ /* NOT_SQL_LOG */ ์ฃผ์„์œผ๋กœ SQL ๋กœ๊ทธ ์ œ์™ธํ•˜๊ธฐ


โœจ ๊ฐœ์š”

์‹ค์ œ ๊ฐœ๋ฐœ์—์„œ๋Š” ๋กœ๊ทธ์— SQL์ด ์ฐํžˆ๋Š” ๊ฒŒ ์œ ์šฉํ•  ๋•Œ๊ฐ€ ๋งŽ์ง€๋งŒ,
โœ… ๋ฏผ๊ฐํ•œ ์ฟผ๋ฆฌ๋‚˜
โœ… ๋„ˆ๋ฌด ์ž์ฃผ ํ˜ธ์ถœ๋˜๋Š” ๋ฐ˜๋ณต ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ, ๋กœ๊ทธ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ ์ž ๋กœ๊ทธ ์ถœ๋ ฅ์„ ์ œ์™ธํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Spring Boot + Log4jdbc ํ™˜๊ฒฝ์—์„œ,
/* NOT_SQL_LOG */๋ผ๋Š” ์ฃผ์„์„ MyBatis XML ํŒŒ์ผ์— ์‚ฝ์ž…ํ•˜๋ฉด ํ•ด๋‹น SQL๋งŒ ๋กœ๊ทธ์— ์ถœ๋ ฅ๋˜์ง€ ์•Š๋„๋ก ํ•„ํ„ฐ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ—๏ธ ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ

  • Spring Boot: 3.3.4
  • Java: 17
  • MyBatis + XML ๋งคํผ
  • Log4jdbc: 1.16
  • Log4j2: 3.3.1
  • ๋กœ๊ทธ ์ถœ๋ ฅ์€ log4jdbc-log4j2-jdbc4.1 ์‚ฌ์šฉ
  • SQL ๋กœ๊ทธ๋ฅผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜๊ธฐ ์œ„ํ•œ Log4j2 Filter ์ ์šฉ

๐Ÿ” ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ์š”์•ฝ

  1. MyBatis SQL XML์— ์ฃผ์„ ์ถ”๊ฐ€
  2. ์ปค์Šคํ…€ Log4j2 Filter ์ƒ์„ฑ
  3. log4j2.xml์— ํ•„ํ„ฐ ๋“ฑ๋ก

๐Ÿ“Œ Step 1. XML ๋งคํผ์— ์ฃผ์„ ์ถ”๊ฐ€

mapper.xml ํŒŒ์ผ์˜ SQL์— ์•„๋ž˜ ์ฃผ์„์„ ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค: (/* NOT_SQL_LOG */)

<select id="getAB">
	/* NOT_SQL_LOG */
	SELECT * FROM user WHERE id = 5;
</select>

์ด ์ฃผ์„์ด ํฌํ•จ๋œ ์ฟผ๋ฆฌ๋Š” ๋กœ๊ทธ์— ์ฐํžˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


๐Ÿ› ๏ธ Step 2. ํ•„ํ„ฐ ํด๋ž˜์Šค ์ƒ์„ฑ

SqlLogFilter ํด๋ž˜์Šค๋Š” Log4j2์˜ ์ปค์Šคํ…€ ํ•„ํ„ฐ๋กœ, /* NOT_SQL_LOG */ ๋ฌธ์ž์—ด์„ ๊ฐ์ง€ํ•˜์—ฌ ๋กœ๊ทธ ์ถœ๋ ฅ์„ ๋ง‰์Šต๋‹ˆ๋‹ค.

package kr.co.sh.SmartWork.common.util;

import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Node;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.filter.AbstractFilter;

/**
 * SQL ๋กœ๊ทธ์—์„œ 
 */
@Plugin(name = "SqlLogFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE)
public class SqlLogFilter extends AbstractFilter {

    private static final String NOT_SQL_LOG_COMMENT = "/* NOT_SQL_LOG */";

    protected SqlLogFilter(Result onMatch, Result onMismatch) {
        super(onMatch, onMismatch);
    }

    @Override
    public Result filter(LogEvent event) {
        if (event == null || event.getMessage() == null) {
            return Result.NEUTRAL;
        }

        String message = event.getMessage().getFormattedMessage();
        
        // /* NOT_SQL_LOG */ ์ฃผ์„์ด ํฌํ•จ๋œ SQL๋ฌธ์ธ์ง€ ํ™•์ธ
        if (message.contains(NOT_SQL_LOG_COMMENT)) {
            return Result.DENY; // ๋กœ๊ทธ ์ถœ๋ ฅ ์ฐจ๋‹จ
        }
        
        return Result.NEUTRAL; // ๋‹ค๋ฅธ ๋กœ๊ทธ๋Š” ์ •์ƒ ์ถœ๋ ฅ
    }

    @PluginFactory
    public static SqlLogFilter createFilter(
            @PluginAttribute("onMatch") Result onMatch,
            @PluginAttribute("onMismatch") Result onMismatch) {
        
        Result match = onMatch != null ? onMatch : Result.NEUTRAL;
        Result mismatch = onMismatch != null ? onMismatch : Result.NEUTRAL;
        
        return new SqlLogFilter(match, mismatch);
    }
}

๐Ÿ“ ์œ„์น˜ ์˜ˆ์‹œ:
kr.co.project.common.util.SqlLogFilter


โš™๏ธ Step 3. log4j2.xml์— ํ•„ํ„ฐ ๋“ฑ๋ก

log4j2.xml์˜ JDBC ๋กœ๊ฑฐ ์„ค์ •์— ํ•„ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:

<Filters>
    <SqlLogFilter onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>

 

์˜ˆ์‹œ)

 


โœ… ๊ฒฐ๊ณผ ํ™•์ธ

// ์ด ์ฟผ๋ฆฌ๋Š” ๋กœ๊ทธ์— ์ฐํž˜
<select id="getBC">
	SELECT * FROM attendance WHERE user_id = 1;
</select>


// ์ด ์ฟผ๋ฆฌ๋Š” ๋กœ๊ทธ์— ์ฐํžˆ์ง€ ์•Š์Œ
<select id="getAB">
	/* NOT_SQL_LOG */
	SELECT * FROM user WHERE id = 5;
</select>

๐ŸŽฏ ์ •๋ฆฌ

ํ•ญ๋ชฉ์„ค๋ช…
๋ชฉ์  ํŠน์ • SQL ๋กœ๊ทธ ๊ฐ์ถ”๊ธฐ (๋ณด์•ˆ or ๋กœ๊ทธ ๊ฐ€๋…์„ฑ)
๋ฐฉ๋ฒ• /* NOT_SQL_LOG */ ์ฃผ์„์„ ํ™œ์šฉํ•œ ํ•„ํ„ฐ๋ง
์ ์šฉ ๋Œ€์ƒ MyBatis XML ๋งคํผ + log4jdbc ํ™˜๊ฒฝ
์ปค์Šคํ„ฐ๋งˆ์ด์ง• log4j2 ํ•„ํ„ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์œ ์—ฐํ•˜๊ฒŒ ํ™•์žฅ ๊ฐ€๋Šฅ
 

๐Ÿงฉ ํ™œ์šฉ ํŒ

  • ๋ฏผ๊ฐ ์ •๋ณด ์กฐํšŒ ์ฟผ๋ฆฌ (ex. ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ฃผ๋ฏผ๋ฒˆํ˜ธ ๋“ฑ)
  • ๋Œ€์šฉ๋Ÿ‰ ๋ฐฐ์น˜ ๋ฐ˜๋ณต ์ฟผ๋ฆฌ
  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ค‘ ๋กœ๊ทธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์„ ๋•Œ

๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”!
๋„์›€์ด ๋˜์…จ๋‹ค๋ฉด โญ๏ธ ๊ณต๊ฐ + ์Šคํฌ๋žฉ ๋ถ€ํƒ๋“œ๋ ค์š”!

728x90
๋ฐ˜์‘ํ˜•
LIST