๐๏ธ P6Spy SQL Logging
๐๏ธ P6Spy SQL Logging
P6Spy
๋์
๊ทผ๊ฑฐ
- ์ฝ๋์์
DB
์ ๊ทผ ์SQL
๋ฌธ์ด ์์๋๋ก ์คํ๋๋์ง ํ์ธํ๊ธฐ ์ํจWHERE
์กฐ๊ฑด์ ์์ํ ๊ฐ์ด ๋ค์ด๊ฐ๋์งLazy Loading
์ด ์์์น ์๊ฒ ์ฌ๋ฌ ๋ฒ ๋ฐ์ํ๋์ง(N+1
)- ํน์ ์กฐํ๊ฐ ๋๋ฌด ๋๋ฆฐ ๊ฑด ์๋์ง
์์กด์ฑ ์ฃผ์
1
2
/* p6spy */
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'
Spring Boot
3.0.0
์ด์์1.9.0
์ดํ ๋ฒ์ ์ ์ฌ์ฉํด์ผ ํ๋ค.ย
1
2
3
2025-03-06T00:08:48.284+09:00ย ย INFO 8720 --- [nio-8080-exec-6] p6spyย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย : #1741187328284 | took 0ms | statement | connection 19| url jdbc:oracle:thin:@localhost:1521:xe
select m1_0.member_email,m1_0.member_name,m1_0.member_description,m1_0.created_at,m1_0.modified_at,w1_0.leader_email from tbl_workspace w1_0 join tbl_member_workspace mw1_0 on w1_0.workspace_id=mw1_0.workspace_id join tbl_member m1_0 on m1_0.member_email=mw1_0.member_id where m1_0.member_del_flag=?
select m1_0.member_email,m1_0.member_name,m1_0.member_description,m1_0.created_at,m1_0.modified_at,w1_0.leader_email from tbl_workspace w1_0 join tbl_member_workspace mw1_0 on w1_0.workspace_id=mw1_0.workspace_id join tbl_member m1_0 on m1_0.member_email=mw1_0.member_id where m1_0.member_del_flag='0';
- ๊ธฐ๋ณธ
Hibernate
Logging
์ ํ๋ผ๋ฏธํฐ๋ฅผ?
๋ก ์จ๊ธด๋ค. P6Spy
๋ฅผ ์ถ๊ฐํ๋ฉด ํ๋ผ๋ฏธํฐ ๊ฐ์ด ๋ ธ์ถ๋ ์ฑ๋กSQL
๋ฌธ์ดLogging
๋๋ค.- ํ ์ค๋ก ํํ๋์ด ๋ณด๊ธฐ์ ๋ถํธํ๋ฐ, ๋คํ์ค๋ฝ๊ฒ๋
P6Spy
๋Query Formatting
์ ์ง์ํ๋ค.
Query Formatting
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Configuration
public class P6SpyConfig implements MessageFormattingStrategy {
@PostConstruct
public void setLogMessageFormat() {
P6SpyOptions.getActiveInstance().setLogMessageFormat(this.getClass().getName());
}
@Override
public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) {
return String.format("[%s] | %d ms | %s", category, elapsed, formatSql(category, sql));
}
private String formatSql(String category, String sql) {
if (sql != null && !sql.trim().isEmpty() && Category.STATEMENT.getName().equals(category)) {
String trimmedSQL = sql.trim().toLowerCase(Locale.ROOT);
if (trimmedSQL.startsWith("create") || trimmedSQL.startsWith("alter") || trimmedSQL.startsWith("comment")) {
return FormatStyle.DDL.getFormatter().format(sql);
} else {
return FormatStyle.BASIC.getFormatter().format(sql);
}
}
return sql;
}
}
@PostConstruct
๋@Configuration
์ ์ํด ์์กด์ฑ ์ฃผ์ ์ด ์๋ฃ๋ ํ ์คํํ ๋ฉ์๋์ ์ ์ธํ๋ค.P6Spy
์ต์ ์์ ํ์ฑํ๋Instance
๋ฅผ ๊บผ๋ด์Formatting
์Overriding
ํ๋ ์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2025-03-06T01:01:07.304+09:00ย ย INFO 23432 --- [nio-8080-exec-8] p6spyย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย : [statement] | 1 ms |
select
m1_0.member_email,
m1_0.member_name,
m1_0.member_description,
m1_0.created_at,
m1_0.modified_at,
w1_0.leader_email
from
tbl_workspace w1_0
join
tbl_member_workspace mw1_0
on w1_0.workspace_id=mw1_0.workspace_id
join
tbl_member m1_0
on m1_0.member_email=mw1_0.member_id
where
m1_0.member_del_flag='0'
DB
์กฐํํ๋ ํน์ ๋ฉ์๋์SQL
๋ฌธ์Logging
ํด ๋ณด๋ฉด ์์ ๊ฐ์ด ์ถ๋ ฅ ๋๋ค.
ํ๊ณ
logback
์resultSet
์Table
ํ์์ผ๋กLogging
ํ ์ ์์ด์ ๊ต์ฅํ ํธํ๋ ๊ธฐ์ต์ด ์๋ค.P6Spy
์ ์ด๋ฒ์ ๋์ ํด๋ณด๋SQL
๋ฌธ์ ํ์ธํ๋ ๊ธฐ๋ฅ ๋ฐ์ ์์ด์Logback
๋ณด๋ค๋ ๋ถํธํ๋ฐ, ๊ทธ๋๋ ๊ธฐ๋ฅ์ด ์ ํ๋ ๋งํผ ๊ฐ๋ณ๋ค๋ ์ฅ์ ์ด ์์ด์Trade-off
๋ฅผ ๊ณ ๋ คํ์ฌ ์ ํํด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.
This post is licensed under CC BY 4.0 by the author.