
: 스프링 부트를 활용한 애플리케이션 개발 실무
📝 목차
5장. API를 작성하는 다양한 방법
5-6. [한걸음 더] REST API 명세를 문서화하는 방법 - Swagger
5-7. [한걸음 더] 로깅 라이브러리 - Logback
- Logback 설정
- Logback 적용하기
5-8. 정리
API를 개발하면 명세관리를 해야한다.
명세?
API가 어떤 로직을 수행하는지 설명하고 로직을 수행하기 위해
어떤 값을 요청하며, 응답값으로는 무엇을 받을 수 있는지를 정리한 자료
Swagger를 사용하기 위해서는
① 의존성 추가하기
② Swagger와 관련된 설정 코드 작성하기 (Configuration)
↳ Swagger 사용을 위한 기본적인 설정 완료👍
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {
@Bean
public Docket api(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.springboot.api))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo(){
return new ApiInfoBuilder()
.title("Spring Boot Open API Test with Swagger")
.description("설명 부분")
.version("1.0.0")
.build();
}
}
.apis(RequestHandlerSelectors.basePackage("com.springboot.api))
⬇️
Swagger에서 스캔할 패키지 범위를
RequestHandlerSelectors.basePackage() 메서드를 사용해 설정
현재 프로젝트의 root package를 넣어준다!
③ 인텔리제이 IDEA에서 애플리케이션 실행 후
http://localhost:8080/swagger-ui.html로 접속하면 Swagger 페이지 출력
④ Swagger가 사용하는 대표 어노테이션으로 세부 내용 설정
@ApiOperation
: 대상 API의 설명을 작성하기 위한 어노테이션
@ApiParam
: 매개변수에 대한 설명 및 설정을 위한 어노테이션
로깅(logging)이란?
애플리케이션이 동작하는 동안 시스템의 상태나 동작 정보를 시간순으로 기록하는 것
로깅은 '비기능 요구사항' = 사용자나 고객에게 필요한 기능은 아니다!
⭐ 하지만 개발자에게는
디버깅 or 개발 이후 발생한 문제를 해결할 때 원인분석을 위해 꼭 필요한 요소
Logback 이란?
: 자바 진영에서 가장 많이 사용되는 로깅 프레임워크
slf4j를 기반으로 구현
log4j 이후에 출 시 된 로깅 프레임워크
➙ 월등한 성능 향상
➙ spring-boot-starter-web 라이브러리에 내장 (의존성 추가 안해도 된다)
Logback의 특징
✅ 크개 5개의 로그 레벨(TRACE, DEBUG, INFO, WARN, ERROR)을 설정할 수 있다.
- ERROR
: 로직 수행중에 시스템에 심각한 문제가 발생해서,
애플리케이션 작동이 불가능한 경우를 의미
- WARN
: 시스템에 에러의 원인이 될 수 있는 경고 레벨을 의미
- INFO
: 애플리케이션의 디버깅을 위한 메시지를 표현하기 위한 레벨을 의미
- DEBUG
: 애플리케이션의 디버깅을 위한 메시지를 표시하는 레벨을 의미
- TRACE
: DEBUG 레벨보다 더 상세한 메시지를 표현하기 위한 레벨을 의미
✅ 실제 운영 환경과 개발 환경에서
각각 다른 출력 레벨을 설정해서 로그를 확인할 수 있다.
✅ Logback의 설정 파일을 일정 시간마다 스캔해서
애플리케이션을 재기동하지 않아도 설정을 변경할 수 있다.
✅ 별도의 프로그램 지원 없이도 자체적으로 로그 파일을 압축할 수 있다.
✅ 저장된 로그 파일에 대한 보관 기간 등을 설정해서 관리할 수 있다.
⬇️ Logback 설정 파일 예시
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<property name="LOG_PATH" value="./logs" />
<!-- Appenders -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>[%d{yyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
</encoder>
</appender>
<appender name="INFO_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<file>${LOG_PATH}/info.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/info_${type}.%d{yyyy-MM-dd}.gz</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
</encoder>
</appender>
<!--TRACE > DEBUG > INFO > WARN > ERROR > OFF -->
<!-- Root Logger -->
<root level="INFO">
<appender-ref ref="console" />
Appender 영역
< Root 영역
appender-ref ref="INFO_LOG" />
<
/root>
</configuration>
① Appender 영역 ⭐
② Encoder 영역
③ Pattern 영역
④ Root 영역 ⭐
5장에서는,
컨트롤러를 작성해서 외부에 인터페이스를 노출하는 방법에 대해 배움
Swagger와 Logback도 다루어봄
Swagger가 제공하는 다양한 어노테이션을 통해 잘 다듬는 연습하기
어떤 정보를 로그로기록하는 것이 향후에 애플리케이션의 유지보수에 효과적인지 고민해보기
https://www.tutorialspoint.com/log4j/log4j_logging_levels.htm
https://logback.qos.ch/manual/introduction.html