1. logging
๋ก๊น ์ด๋?
์์คํ ์ ์๋ํ ๋ ์์คํ ์ ์๋ ์ํ์ ๊ธฐ๋ก๊ณผ ๋ณด์กด, ์ด์ฉ์์ ์ต์ฑ ์กฐ์ฌ ๋ฐ ์์คํ ๋์์ ๋ถ์ ๋ฑ์ ํ๊ธฐ ์ํด ์๋ ์ค์ ๊ฐ์ข ์ ๋ณด๋ฅผ ๊ธฐ๋กํด ๋ ํ์๊ฐ ์๋ค. ์ด ๊ธฐ๋ก์ ๋ง๋๋ ๊ฒ์ ๋ก๊น ์ด๋ผ ํ๋ค.
์ฆ, ๋ก๊ทธ ์์คํ ์ ์ฌ์ฉ์ ๊ด๊ณ๋ ์ผ๋ จ์ ใ์ฌ๊ฑดใ์ ์๊ฐ์ ๊ฒฝ๊ณผ์ ๋ฐ๋ผ ๊ธฐ๋กํ๋ ๊ฒ์ด๋ค.
println()์ผ๋ก ๋ก๊น ์ด ๋ถ๊ฐ๋ฅํ ์ด์
์ํฉ ๋ณ๋ก ๋ก๊ทธ๋ฅผ ์กฐ์ ํ ์ ์๊ณ ๋ณ๋๋ก ์ฒ๋ฆฌํ๊ธฐ ์ด๋ ต๋ค.
๋๋์ ๋ก๊ทธ๊ฐ ๋ฐ์ํ ๋, ํฐ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐ์ํจ๋ค. => ์ค๋ฒํค๋ ๋ฐ์ ๊ฐ๋ฅ์ฑ ์กด์ฌ
์ด์ ์ํ์์๋ ์ ๋! ์ฐ๋ฉด ์๋๋ค.
Java Logging Framework
- java.util.logging (ํ์ค ๋ก๊น API)
- Apache Commons logging
- Log4J
- Logback
- SLF4J(Simple Logging Facade for Java)
SLF4J
Logging Framework๋ค์ ์ถ์ํํด ๋์ ๊ฒ
Facade Pattern์ ์ด์ฉํ Logging Framework์ด๋ค.
๐ก Facade Pattern
ํ๋์ค์ด Façade์์ ์ ๋๋ ๋จ์ด๋ก ๊ฑด๋ฌผ์ ์ธ๊ด์ด๋ผ๋ ๋ป์ ๊ฐ์ง๊ณ ์๋ค.
๊ฑด๋ฌผ์ ์ธ๋ฒฝ์์ ๋ณด๋ฉด ์์ ๊ตฌ์กฐ๋ ๋ณด์ด์ง ์๋ ๊ฒ์ฒ๋ผ ๋ง์ ์๋ธ์์คํ (๋ด๋ถ ๊ตฌ์กฐ)์ ๊ฑฐ๋ํ ํด๋์ค(์ธ๋ฒฝ)๋ก ๋ง๋ค์ด ๊ฐ์ธ์ ํธ๋ฆฌํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.https://refactoring.guru/design-patterns/facade
SLF4J์ Binding ๋ชจ๋
SLF4J๋ ๋ฐ์ธ๋ฉ ๋ชจ๋์ ํตํด์ ๋ค์ํ ๋ก๊น ํ๋ ์์ํฌ๋ฅผ ์ง์ํ๋ค.
๋ฐ์ธ๋ฉ ๋ชจ๋์ ๋ก๊น ํ๋ ์์ํฌ๋ฅผ ์ฐ๊ฒฐํ๋ ์ญํ ์ ํ๋ค.
=> ๋ก๊น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด๋ค ๊ฒ์ด๋ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋ก๊ทธ๋ฅผ ๋จ๊ธธ ์ ์๊ฒ ํด ์ค๋ค.
Log Level
๋ก๊ทธ ๋ฉ์์ง์ ์ค์๋๋ฅผ ๋ํ๋ด๋ ๊ธฐ์ค
1. trace
๋งค์ฐ ์์ธํ ๋๋ฒ๊ทธ ์ ๋ณด
๊ฐ๋ฐ ์ค์ ์ฃผ๋ก ์ฌ์ฉ๋๋ฉฐ, ์์คํ ์ ๋์์ ์ถ์ ํ๊ณ ๋ฌธ์ ๋ฅผ ์ง๋จํ๊ธฐ ์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค.
2. debug
๋๋ฒ๊ทธ ์ ๋ณด
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ด๋ถ ์ํ์ ์คํ ํ๋ฆ์ ๋ํ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ค.
3. info
์ ๋ณด์ฑ ๋ฉ์์ง ์ ๊ณต
์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ์ ์ด๋ฒคํธ ๋ฐ ์ํ์ ๋ํ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ค.
4. warn
๊ฒฝ๊ณ ์ฑ ๋ฉ์์ง๋ฅผ ์ ๊ณต
์ ์ฌ์ ์ธ ๋ฌธ์ ์ํฉ์ ๋ํ๋ด์ง๋ง ์ฌ๊ฐํ ์ค๋ฅ๋ก ๊ฐ์ฃผ๋์ง๋ ์๋ ์ํ๋ฅผ ๊ธฐ๋กํ๋ค.
์์คํ ์ ๊ณ์ ์๋ํ์ง๋ง ์ฃผ์๊ฐ ํ์ํ ์ํฉ์ ๋ํ๋ธ๋ค.
5. error
์ค๋ฅ ์ํฉ์ ๋ํ๋
์์คํ ์ ๊ธฐ๋ฅ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์์ ๋ํ๋ด๋ฉฐ, ํด๋น ์ค๋ฅ์ ๋ํ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ค.
์์คํ ์ด ์ค์๋ ์ํ์ ์์ ์ ์๋ค.
Logger
๋ก๊น ์์ ์ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฐ์ฒด ๋๋ ํด๋์ค
import org.slf4j.Logger;
class OrderTest {
private static final Logger logger = LoggerFactory.getLogger(OrderTester.class);
}
๊ตฌํ์ฒด ๋ง๊ณ slf4j์์ ์ ๊ณตํ๋ Logger๋ฅผ ์ฌ์ฉํด๋ผ!
+)
logger.info("logger name => {} {}", logger.getName(), logger.getName());
์์ ๋กญ๊ฒ placeholder๋ฅผ ์ด์ฉํด์ log๋ฅผ ์ถ๋ ฅํ ์ ์๋ค.
2. logback
logback ์ค์ ํ์ผ ์ฐพ๋ ์์
1. logback-test.xml ํ์ผ์ ๋จผ์ ์ฐพ๋๋ค
2. ์๋ค๋ฉด logback.groovy์ ์ฐพ๋๋ค.
3. ๊ทธ๋๋ ์๋ค๋ฉด logback.xml์ ์ฐพ๋๋ค.
4. ๋ชจ๋ ์๋ค๋ฉด ๊ธฐ๋ณธ ์ค์ ์ ๋ต์ ๋ฐ๋ฅธ๋ค. => BasicConfiguration
logback.xml ํ์
<configuration>
<appender name = "STDOUT" class = "ch.qos.logback.core.ConsoleAppender">
</appender>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<logger name="org.prgms.kdt.springorder" level="info"/>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
- appender: ๋ก๊ทธ ์ด๋ฒคํธ์ ์ถ๋ ฅ ๋์์ธ Appender๋ฅผ ์ ์ํ๋ค.
- encode: ๋ก๊ทธ ๋ฉ์์ง์ ์ถ๋ ฅ ํ์์ ์ง์ ํ๋ค.
- logger: ํน์ ๋ก๊ฑฐ(logger)์ ๋ก๊ทธ ๋ ๋ฒจ์ ์ค์ ํ๋ค.
=> ํด๋น ํจํค์ง ๋ด์์ ๋ฐ์ํ๋ ๋ก๊ทธ ์ด๋ฒคํธ ์ค์
- root: ์ต์์(root) ๋ก๊ฑฐ๋ฅผ ์ค์ ํ๋ค.
+) appender-ref๋ฅผ ํตํด ํด๋น Appender๋ฅผ ๋ก๊ฑฐ์ ์ฐ๊ฒฐํด์ผ๋ง ์ถ๋ ฅ์ด ๋๋ค.
-> ์์์ ์ง์ ํ appender name ์ฌ์ฉ
Appender ์ข ๋ฅ
- ConsoleAppender: ๋ก๊ทธ๋ฅผ ์ฝ์์ ์ถ๋ ฅ
- FileAppender: ๋ก๊ทธ๋ฅผ ํ์ผ์ ์ถ๋ ฅ
- RollingFileAppender: ๋ก๊ทธ๋ฅผ ๋กค๋ง ํ์ผ ํ์์ผ๋ก ์ถ๋ ฅ, ์ผ์ ํฌ๊ธฐ ๋๋ ์๊ฐ ๋จ์๋ก ํ์ผ์ ๋ถํ ํ์ฌ ๋ก๊ทธ๋ฅผ ๊ธฐ๋ก
PatternLayout
Logback์์ ์ฌ์ฉ๋๋ ๋ก๊ทธ ๋ฉ์์ง์ ์ถ๋ ฅ ํ์์ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํด๋์ค
๋ก๊ทธ ๋ฉ์์ง์ ๋ ์ง, ์๊ฐ, ๋ก๊ทธ ๋ ๋ฒจ, ๋ก๊ฑฐ ์ด๋ฆ ๋ฑ์ ํฌํจํ ์ํ๋ ํ์์ผ๋ก ์ถ๋ ฅํ ์ ์๋ค.
<encoder> ์์ ๋ด์์ ์ฌ์ฉ๋๋ฉฐ, <pattern> ์์๋ฅผ ํตํด ์ถ๋ ฅ ํ์์ ์ ์ํ๋ค.
๐ก Conversion Word
Logback์ PatternLayout์์ ์ฌ์ฉ๋๋ ํน์ํ ๋ฌธ์์ด
%d: ๋ ์ง์ ์๊ฐ์ ์ถ๋ ฅํ๋ค. ๋ค์ํ ๋ ์ง ๋ฐ ์๊ฐ ํ์ ์ง์ ์ต์ ์ ์ฌ์ฉํ ์ ์๋ค.
%t, %thread: ๋ก๊ทธ๋ฅผ ์์ฑํ ์ค๋ ๋์ ์ด๋ฆ์ ์ถ๋ ฅํ๋ค.
%logger{length}: ์ผ์ ๊ธธ์ด ์ด์์ ๋ก๊ฑฐ ์ด๋ฆ์ ์๋ผ๋ด์ด length๋งํผ ์ถ๋ ฅํ๋ค.
%p, %level: ๋ก๊ทธ ๋ ๋ฒจ์ ์ถ๋ ฅํ๋ค.
%c: ๋ก๊ฑฐ์ ์ด๋ฆ์ ์ถ๋ ฅํ๋ค.
%m: ๋ก๊ทธ ๋ฉ์์ง ์์ฒด๋ฅผ ์ถ๋ ฅํ๋ค.
%n: ์ค ๋ฐ๊ฟ ๋ฌธ์๋ฅผ ์ถ๋ ฅํ๋ค.
์์ธํ ๊ฑด ์๋ ๋งํฌ ์ฐธ๊ณ
https://logback.qos.ch/manual/layouts.html
ConversionRule
Logback์์ ๋ก๊ทธ ์ด๋ฒคํธ๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ ๊ตฌ์ฑ ์์
์ด๋ฅผ ํตํด ์ฌ์ฉ์ ์ ์ ํจํด ๋ณํ์๋ฅผ ๋ฑ๋กํ๊ฑฐ๋ ๊ธฐ๋ณธ ๋ณํ์๋ฅผ ์ฌ์ ์ํ ์ ์๋ค.
<conversionRule conversionWord="๋ณํ์" converterClass="๋ณํ์ ํด๋์ค" />
conversionWord: ๋ก๊ทธ ํจํด์์ ์ฌ์ฉํ ๋ณํ์๋ฅผ ์ ์ํ๋ค. ์ด๋ % ๊ธฐํธ ๋ค์ ์ฌ์ฉ๋๋ ๋ฌธ์๋ก ํ์๋๋ค.
converterClass: ๋ณํ์์ ๊ตฌํ ํด๋์ค๋ฅผ ์ง์ ํ๋ค. ํด๋น ํด๋์ค๋ Logback์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ๋ณํ์ ์ค ํ๋์ผ ์๋ ์๊ณ , ์ฌ์ฉ์๊ฐ ์ง์ ๊ตฌํํ ๋ณํ์์ผ ์๋ ์๋ค.
์์
<ConversionRule
conversionWord="clr"
converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<property name="LOG_PATTERN" value="%clr(%d{HH:mm:ss.SSS}){yellow} [%thread] %clr(%-5level) %logger{36} - %msg%n"/>
Logback์์ ์ ๊ณตํ๋ ColorConverter๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๊ทธ ๋ฉ์์ง์ ์์์ ์ ์ฉํ๋ค.
%conversionWord() ํ์์ ํตํด ๋ก๊ทธ ์ด๋ฒคํธ์ ์ถ๋ ฅ ํจํด์ ๋ณํ์๋ฅผ ์ ์ฉํ๊ณ ์๋ค.
3. SpringBoot
SpringBoot Application์ ์์กด์ฑ
๐ spring-boot-starter
Spring Boot ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ๊ธฐ ์ํ ๊ธฐ๋ณธ ์์กด์ฑ์ ์ ๊ณตํ๋ค.
Spring MVC, Spring Data JPA, Spring Security, Thymeleaf ๋ฑ๊ณผ ๊ฐ์ ์ฃผ์ ๊ธฐ์ ๋ค์ ์์กด์ฑ์ ์๋์ผ๋ก ์ถ๊ฐํด ์ค๋ค.
์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ์ ํ์ํ ๊ธฐ๋ณธ์ ์ธ ์ค์ ๊ณผ ๋น(Bean) ์ค์ ๋ฑ์ด ์๋์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
๐ spring-boot-starter-test:
Spring Boot ์ ํ๋ฆฌ์ผ์ด์
์ ํ
์คํธ๋ฅผ ์ํ ์์กด์ฑ์ ์ ๊ณตํ๋ค.
JUnit, Mockito, AssertJ ๋ฑ๊ณผ ๊ฐ์ ํ
์คํธ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์์กด์ฑ์ ์๋์ผ๋ก ์ถ๊ฐํด ์ค๋ค.
Spring Boot ํ
์คํธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๋จ์ ํ
์คํธ, ํตํฉ ํ
์คํธ, ์ฌ๋ผ์ด์ค ํ
์คํธ ๋ฑ์ ๊ฐํธํ๊ฒ ์์ฑํ ์ ์๋ค.
ํ
์คํธ ์คํ ํ๊ฒฝ ์ค์ ๊ณผ ํ
์คํธ ์ ํธ๋ฆฌํฐ ํด๋์ค ๋ฑ์ด ํฌํจ๋์ด ์๋ค.
Reference
๋ค์ด๋ฒ ์ง์๋ฐฑ๊ณผ - ๋ก๊น
'๐๏ธ ํ๋ก๊ทธ๋๋จธ์ค ๋ฐ๋ธ์ฝ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SpringBoot Part2-2 (0) | 2023.07.03 |
---|---|
SpringBoot Part2-1 (0) | 2023.06.27 |
SpringBoot Part1-4 (0) | 2023.06.23 |
SpringBoot Part1-3 (0) | 2023.06.22 |
SpringBoot Part1-2 (0) | 2023.06.21 |
๋๊ธ