SpringBoot Part1 (5)
logging
๋ก๊น ์ด๋ ?
: ๋ก๊ทธ ์์คํ ์ ์ฌ์ฉ์ ๊ด๊ณ๋ ์ผ๋ จ์ ์ฌ๊ฑด์ ์๊ฐ์ ๊ฒฝ๊ณผ์ ๋ฐ๋ผ ๊ธฐ๋กํ๋ ๊ฒ์ด๋ค.
Java Logging Framework
- java.util.logging → ๊ธฐ๋ฅ์ด ๋ถ์กฑํด์ ์ ์์ฌ์ฉํ๋ค.
- Apache Commons logging
- Log4J
- Logback → ํ์ฌ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋จ. Log4J ์ฑ๋ฅ ํฅ์ ๋ฒ์ . springboot๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํจ
- SLF4J(Simple Logging Facade for Java)
! println์ ๋ด๋ถ์ synchronized๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์๋ค. → ์ด์ํ ๋ ์ฐ๋ฉด ์๋๋ค.
SLF4J
Logging Framework๋ค์ ์ถ์ํํด ๋์ ๊ฒ์ ๋๋ค. Facade ํจํด์ ์ด์ฉํ ํ๋ ์์ํฌ
Facade Patten : ๊ฑด๋ฌผ์ ์ธ๋ฒฝ์ด๋ผ๋ ๋ป์ผ๋ก, ๋ง์ ์๋ธ ์์คํ์ ๋ด๋ถ ๊ตฌ์กฐ๋ก ๋๊ณ ๊ฑฐ๋ํ ํด๋์ค(์ธ๋ฒฝ)๋ฅผ ๋ง๋ค์ด ๊ฐ์ธ์ ํธ๋ฆฌํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํด ์ฃผ๋ ํจํด
- Binding ๋ชจ๋ ์ ๊ณต
logging ํ๋ก๊ทธ๋จ์ด ๋ณ๊ฒฝ๋ ๋ ๋ง๋ค ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ํ์ ์์ด binding๋ง ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋ค์ํ ํ๋ ์์ํฌ๋ฅผ ๋์ผํ๊ธฐ ์ฒ๋ฆฌํด์ค๋ค. ๋ก๊น ํ๋ ์์ํฌ๋ฅผ ์ฐ๊ฒฐํ๋ ์ญํ ์ ํ๋ค.
Log Level
๋ก๊ทธ๋ฅผ ์ด๋ ์ ๋ ๊น์ง ๋จ๊ธธ์ง ๊ธฐ์ค์ ์ ํ๊ธฐ
- trace
- debug
- info
- warm
- error
https://logback.qos.ch/manual/architecture.html
Logger
: logger๋ค์ ์ด๋ฆ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋๋ค.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class OrderTester {
// static์ผ๋ก ์์ฑํด์ผ ๋จ ํ๋์ logger๋ง ๋ง๋ค์ด์ง๊ฒ ํ๋ค.
// org.prgrms.kdt.OrderTester
private static final Logger logger = LoggerFactory.getLogger(OrderTester.class); //๋ฉ์๋๊ฐ ์๋๋ผ class ๋จ์์์ ์์ฑ
public static void main(String[] args) throws Exception{
var applicationContext = new AnnotationConfigApplicationContext(AppConfiguration.class);
var orderProperties = applicationContext.getBean(OrderProperties.class);
logger.info("logger name => {}",logger.getName());
logger.info("version : {}",orderProperties.getVersion());
logger.info("minimumOrderAmount : {}",orderProperties.getMinimumOrderAmount());
logger.info("SupportVendors : {}",orderProperties.getSupportVendors());
logger.info("Description : {}",orderProperties.getDescription());
applicationContext.close(); // ์ปจํ
์ด๋์ ๋ฑ๋ก๋ ๋ชจ๋ Bean ์๋ฉธ
}
}
Logback
logback ์ค์ ํ๊ธฐ
lagback ์ค์ ํ์ผ ์ฐพ๋ ์์
https://logback.qos.ch/manual/configuration.html
- logback-test.xml ํ์ผ ์ฐพ๊ธฐ
- ์์ผ๋ฉด logback.groovy ์ฐพ๊ธฐ
- ๊ทธ๋๋ ์์ผ๋ฉด logback.xml ์ฐพ๊ธฐ
- ๋ชจ๋ ์์ผ๋ฉด ๊ธฐ๋ณธ ์ค์ ์ ๋ต์ ๋ฐ๋ฅธ๋ค. BasicConfiguration
BasicConfiguration
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug"> <!--root๋ ๋ชจ๋ ๋ ๋ฒจ-->
<appender-ref ref="STDOUT" />
</root>
</configuration><configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug"> <!--root๋ ๋ชจ๋ ๋ ๋ฒจ-->
<appender-ref ref="STDOUT" />
</root>
</configuration>
- logger : ํด๋ ๋จ์๋ก ๋ ๋ฒจ ์ง์ ๊ฐ๋ฅ
- patten : property ํ๊ทธ๋ก layout ์ง์ ๊ฐ๋ฅ
- %-5level : ๋ ๋ฒจ 5์๋ฆฌ ์ผ์ชฝ ์ ๋ ฌ ์ถ๋ ฅ
- %logger{36} : ๋ก๊ฑฐ 36์
- %n : ๊ฐํ
- FileAppender
<configuration>
<property name="LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"></timestamp>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender" >
<file>logs/kdt_${bySecond}.log</file>
<append>false</append>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<logger name="org.prgrms.kdt" level="info">
<appender-ref ref="FILE"/>
</logger>
<root level="warn"> <!--root๋ ๋ชจ๋ ๋ ๋ฒจ-->
<appender-ref ref="STDOUT" />
</root>
</configuration>
- RollingFileAppender
: ํธ๋ฆฌ๊ฑฐ์ ๋ฐ๋ผ ํ์ผ ์์ฑ
<configuration>
<property name="LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender" >
<file>logs/access.log</file> <!-- access.log๊ฐ ๋ง๋ค์ด์ง๊ณ ๋ ์ง๊ฐ ๋ณํ๋ฉด ํ์ผ๋ช
์ด access-%d{yyyy-MM-dd}.log๋ก ๋ณ๊ฒฝ๋๋ ํจํด : ์ต์ ํ์ผ์ ์ธ์ ๋ access.log–>-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/access-%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<logger name="org.prgrms.kdt" level="debug">
<appender-ref ref="ROLLING_FILE"/>
</logger>
<root level="warn"> <!--root๋ ๋ชจ๋ ๋ ๋ฒจ-->
<appender-ref ref="STDOUT" />
</root>
</configuration>
- Conversion
: ์์ ๋ณ๊ฒฝ ๊ฐ๋ฅ
: file์ ์์์ด ๊ธฐ๋ก๋์ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ property๋ก ํจํด์ ๋๋ ์ ์ฉํด์ค๋ค.
: ์ ์ฉ์ด ์ ๋์ง์์ผ๋ฉด main ๋ฉ์๋์
AnsiOutput.setEnabled(AnsiOutput.Enabled.ALWAYS); ์ถ๊ฐ
<configuration>
<conversionRule conversionWord="clr"
converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<property name="CONSOLE_LOG_PATTERN" value="%clr(%d{HH:mm:ss.SSS}){yellow} [%thread] %clr(%-5level) %logger{36} - %msg%n" />
<property name="FILE_LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"></timestamp>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender" >
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/access-%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<logger name="org.prgrms.kdt" level="debug">
<appender-ref ref="ROLLING_FILE"/>
</logger>
<root level="warn"> <!--root๋ ๋ชจ๋ ๋ ๋ฒจ-->
<appender-ref ref="STDOUT" />
</root>
</configuration>
SpringBoot ์์ํ๊ธฐ
(๋๋์ด)
@SpringBootApplication
: ์ต์์ Configuration์ ํฌํจํ๋ค. ๋จ ํ๋์ class ๋ง ํ์ฉํ๋ค.
: ComponentScan
: EnableAutoConfiguation
: ๊ธฐ๋ณธ์ ์ผ๋ก resources ํด๋์ application.properties/ application.YAML ํ์ผ์ ์ฝ๋๋ค. (PropertySource ์ค์ ์ด ํ์์์)
⇒ CoC ํจ๋ฌ๋ค์
https://medium.com/@dlaudtjr07/convention-over-configuration-๋-694345d2447f
SpringBoot Banner
https://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type Something
resources > banner.txt ํ์ผ์ ์ถ๊ฐ
Logging
logback ํ์ผ์ด ์์ด๋ yaml์์ ํธํ๊ฒ logging level์ ์ ํ ์์๋ค.
logging:
level:
root: warn
kdt:
version: "v1.0"
minimum-order-amount: 1
support-vendors:
- a
- b
- c
- d
description: |
line 1 hello world
line 2 xxx
line 3
logback.xml์ ์ฌ์ฉํ๋๋ springboot์ ๊ธฐ๋ฅ์ ์์ ๋ฐ์ ์ธ์์๋ค. <include resuorce>
์ธ๋ถ์์ ์ค์ ๊ฐ์ ธ์ค๊ธฐ
https://www.latera.kr/reference/java/2019-09-29-spring-boot-config-externalize/
- ํ ๋๋ ํฐ๋ฆฌ(๊ฐ๋ฐ ๋๊ตฌ๊ฐ ํ์ฑํ๋ ๊ฒฝ์ฐ ~/.spring-boot-devtools.properties )์ ๊ฐ๋ฐ ๋๊ตฌ ์ ์ญ ์ค์ ํ๋กํผํฐ
- ํ ์คํธ์ @TestPropertySource ์ด๋ ธํ ์ด์ .
- ํ ์คํธ์ properties ์ ํธ๋ฆฌ๋ทฐํธ. @SpringBootTest ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ๋ถ๋ถ์ ํ ์คํธํ๊ธฐ ์ํ ํ ์คํธ ์ด๋ ธํ ์ด์ ์์ ์ฌ์ฉ ๊ฐ๋ฅ.
- ์ปค๋งจ๋ ๋ผ์ธ ์ธ์.
- SPRING_APPLICATION_JSON ์ ํ๋กํผํฐ(ํ๊ฒฝ ๋ณ์๋ ์์คํ ํ๋กํผํฐ์ ์ฝ์ ๋ ์ธ๋ผ์ธ JSON).
- ServletConfig ์ด๊ธฐ ํ๋ผ๋ฏธํฐ.
- ServletContext ์ด๊ธฐ ํ๋ผ๋ฏธํฐ.
- java:comp/env ์ JNDI ์ ํธ๋ฆฌ๋ทฐํธ.
- Java ์์คํ ํ๋กํผํฐ( System.getProperties() ).
- OS ํ๊ฒฝ ๋ณ์
- random.* ์ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง RandomValuePropertySource .
- ํจํค์ง๋ jar ์ธ๋ถ์ ํ๋กํ์ผ ์ง์ ์ ํ๋ฆฌ์ผ์ด์ ํ๋กํผํฐ( application- {profile}.properties ์ YAML ํ์).
- ํจํค์ง๋ jar ๋ด๋ถ์ ํ๋กํ์ผ ์ง์ ์ ํ๋ฆฌ์ผ์ด์ ํ๋กํผํฐ( application- {profile}.properties ์ YAML ํ์).
- ํจํค์ง๋ jar ์ธ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ํ๋กํผํฐ( application-{profile}.properties ์ YAML ํ์).
- ํจํค์ง๋ jar ๋ด๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ํ๋กํผํฐ( application-{profile}.properties ์ YAML ํ์).
- @Configuration ํด๋์ค์ @PropertySource ์ด๋ ธํ ์ด์
- ( SpringApplication.setDefaultProperties ์ ์ํด ๋ช ์๋) ๊ธฐ๋ณธ ํ๋กํผํฐ
์คํ ๊ฐ๋ฅํ jarํ์ผ ์์ฑํ๊ธฐ
pom.xml → plugins์ ์ด์ฉํด์ jar๋ฅผ ๋ง๋ ๋ค.
mvn clean package spring-boot:repackage -> jar package๋ง๋ค๊ธฐ
ll taget -> ๋ง๋ค์ด์ง ํ์ผ ํ์ธ
java -jar target.kdt-0.0.1-SNAPSHOT.jar -> jar ์คํ(๊ตฌ๋)
- intelliJ์์ SpringBootApplication์คํ์ ํธ๋ฆฌํ๊ฒ SpringBoot ์ค์ ์ด ๊ฐ๋ฅํ๋ค.profiles ์ค์ ๊ฐ๋ฅ
Daily Mission
- ๋ก๊ทธ๋ฐฑ ์ค์ ์ ํด์ ์๋ฌ๋ ํ์ผ๋ก ๊ธฐ๋ก๋์ด์ผํ๋ค.
- springBoot ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋ณ์ ฉํ๋ค.
- ์คํ๊ฐ๋ฅํ jar ํ์ผ์ ์์ฑํ๋ค.
์ถ์ฒ - ํด๋ฆฌ : SpringBoot Part1
'Back-end ๋ฐ๋ธ์ฝ์ค > week 03 - 05 TIL (Spring)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL] 221108 - SpringBoot Part2 : JDBC (0) | 2022.11.08 |
---|---|
[TIL] 221107 - SpringBoot Part2 : Spring Test ์์ํ๊ธฐ (0) | 2022.11.08 |
[TIL] 221103 - SpringBoot Part1 - ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ ๊ด๋ฆฌ (0) | 2022.11.06 |
[TIL] 221102 - SpringBoot Part1 : Dependecy injection, ์ปดํฌ๋ํธ ์ค์บ (0) | 2022.11.03 |
[TIL] 221101 - SpringBoot Part1 : IoC, DDD, ApplicationContext (0) | 2022.11.03 |
๋๊ธ