Spring

    Logback + MDC를 이용한 request 로깅

    MDC를 이용한 로깅 MDC Mapped Diagnostic Context Logging 을 남기고, 문제가 발생하여 Logging을 추적할 때 멀티쓰레드 환경에서 로그가 뒤섞여 요청별로 흐름을 파악하기가 힘듭니다. 이때 요청(Request)별로 요청의 흐름별로 로깅을 파악하면 문제 파악을 훨씬 용이하게 할 수 있습니다. MDC는 로깅 프레임워크에서 사용되는 기능이며 현재 실행중인 컨텍스트(혹은 쓰레드)에 메타 정보를 넣고 관리할 수 있는 공간입니다. 각각의 로그 메시지에 대한 컨텍스트 정보를 추가하여 제공하고, 로그 메시지를 보다 구체적이고 유용하게 만들어줍니다. 내부적으로 쓰레드 로컬을 사용하며 Map 형태로 되어있어, Key Value 형태로 값을 보관하고 꺼낼 수 있어 관리에 용이합니다. 즉 스레..

    Logback.xml include 태그 사용하여 깔끔하게 분리하기

    Logback을 사용하다 보면, 엄청나게 길어지는데요 이걸 줄여 깔끔하게 관리할 수 있는 방법이 있습니다. 태그는 주 구성 파일 내에서 외부 구성 파일을 포함하는 데 사용됩니다. 태그를 이용해 구성을 여러 파일로 분할하여 구성을 더 조직화하고 재사용할 수 있습니다. 먼저 분리할 파일을 생성합니다. console-appender.xml [%d{HH:mm:ss.SSS}][%-5level] [%thread] [%logger.%method:line%line] - %msg%n utf8 분리된 파일에 태그로 감싸줘야 합니다 다음 메인 파일에서 include(포함) 시킵니다. logback-spring.xml 태그로 포함시켜 줍니다. 이 때 디렉토리와 일치시켜줘야 합니다. 일반적으로 로그백 파일은 /src/main/..

    Logback 을 이용하여 AWS Cloud Watch에 로그 전송

    Spring 애플리케이션에서 Logback을 이용하여 AWS Cloud Watch로 전송하여 수집하는 방법에 대해 정리합니다. 의존성 추가 // https://mvnrepository.com/artifact/ca.pjer/logback-awslogs-appender implementation 'ca.pjer:logback-awslogs-appender:1.6.0' 2021년 1.6.0 버전 이후로 업데이트 되지 않고 있어서 유심히 알아보고 사용하는 것이 좋습니다. aws log dependency 1.5.0 을 사용하면 accessKey, secretAccessKey를 logback-spring.xml에 추가하지 않아도 동작합니다. 1.5.0은 aws cloudwatch credentials 인증을 ac..

    Logback 로그 Logger마다 다른 파일에 기록하는 방법

    SpringBoot에서 Logger마다 각기 다른 파일에 분리하는 방법에 대해 정리합니다. 1. 요구사항과 예제 에러 로그는 logs/error/error.log 에 기록되어야 한다 sql 실행 시간을 기록한 로그는 logs/sql/sql_execute_time.log 에 기록되어야 한다 warn 로그는 logs/warn/warn.log에 기록되어야 한다. 요구사항과 예제를 간단하게 구현한 클래스입니다. public class LoggerTest { private ErrorLogger errorLogger = new ErrorLogger(); private WarnLogger warnLogger = new WarnLogger(); private SqlLogger sqlLogger = new SqlLogg..

    Logback 사용 정리

    logback이란 log4j 이후에 나왔으며 log4j 보다 향상되고 가장 널리 사용되고 있는 Java 로깅 라이브러리 입니다. https://logback.qos.ch/index.html- 공식 문서 https://github.com/qos-ch/logback - Github https://logback.qos.ch/documentation.html - Docs slf4j의 구현체로써 SpringBoot의 기본 log로 사용되고 있으며 spring-boot-starter-web안에 spring-boot-starter-logging의 logback이 기본적으로 포함되어 있어서 별다른 dependency 추가 없이 사용할 수 있습니다. 또한 Automatic Reloading 기능을 제공하여 별도에 재시작..

    Java 로깅 logger, log4j, logback, slf4j 비교

    로그(log)는 소프트웨어의 이벤트를 시스템의 상태 및 동작 정보를 시간 경과에 따라 기록하는 것을 의미합니다. 소프트웨어 개발 과정 혹은 개발 후에 동작상태를 파악하여 문제가 발생했을 때 진단하고 해결하는데 도움이 됩니다. 또한 로그들은 운영과 관리에 도움이 되는 정보가 될 수 있으며 좋은 데이터가 되기도 합니다. 로그를 기록하는 행위를 로깅(logging)이라고 하며, Java 언어에서는 다양한 로깅 라이브러리를 지원합니다. 하지만 각각 로깅 라이브러리가 내부적으로 어떻게 동작하는지 모르면 성능상 이슈를 발생시킬 수 있기 때문에 어떤 상황에서 어떤 로깅 라이브러리를 써야할지 잘 알고 사용하는 것이 좋습니다. 디버깅이나, System.out.println(이하 sysout)이랑 비교했을 때 로깅 라이브..

    Spring Bean scope

    Spring Bean scope Spring Bean 스코프란, 스프링 Bean이 앱이 구동되는 동안의 존재할 수 있는 범위를 뜻합니다. 스프링 컨테이너는 빈 객체를 생성하고, 관리하며, 제거하는 것을 담당합니다. 이때 빈 객체의 스코프(scope)를 설정하여 빈 객체의 생명 주기를 제어할 수 있습니다 기본적으로 스프링의 빈은 싱글톤으로 만들어 지지만, 개발자가필요에 의해 빈의 스코프를 지정할 수 있습니다. 스프링에서는 다음과 같은 다섯 가지 스코프를 제공합니다. 스프링 공식 문서 Scope Description singleton (기본값) 스프링 IoC 컨테이너당 하나의 인스턴스만 사용 - 한마디로 앱이 구동되는 동안 하나만 쓴다는 거임 prototype 매번 새로운 빈을 정의해서 사용 request ..

    Spring 2.7 버전대 RestDocs Cookie 문서화 방법(RestDocs 2.0.7)

    프로젝트 버전 SpringBoot 2.7.8 Spring Rest Docs 2.0.7 프로젝트를 진행하던 중, 인증과정에서 RefreshToken을 Cookie로 사용할 일이 있어 RestDocs로 Cookie를 문서화 하여야 했습니다. 이와 관련해서 RestDocs 공식문서, github 이슈, StackOverFlow글을 관련하여 찾아보았습니다. https://github.com/spring-projects/spring-restdocs/pull/592 https://docs.spring.io/spring-restdocs/docs/2.0.7.RELEASE/reference/html5/ https://stackoverflow.com/questions/39472873/how-can-i-document-th..

    RestDocs - Custom Error Code Enum 문서화

    RestDocs - Custom Error Code Enum 문서화 Enum으로 Custom ErrorCode 관리시 Enum 문서 자동화 방법 SpringBoot 버전 2.7.8 restdocs 버전 2.0.7 개요 데브코스에서 프로젝트를 하다 고민이 생겼습니다. 프론트엔드와의 협업간에 API 문서로 Spring RestDocs를 사용하고 있었고, API 사용 시 에러 응답에 대해 httpStatus 코드만으로는 클라이언트에 에러에 대해 디테일하게 설명할 수가 없어서 클라이언트가 개발과정 중 생긴 오류들에 대해 정확하게 알 수 있게 우리는 ErrorCode를 Enum으로 정의해서 내려주기로 하였습니다. public enum ErrorCode { ... NOT_MATCHED_COMMENT_AUTHOR(H..

    UriComponentsBuilder, ServletUriComponentsBuilder, 201 URI 생성

    URI의 개념과 UriComponentsBuilder의 필요성 인터넷상에 존재하는 모든 자원(Resource)은 URI를 이용하여 그 위치를 나타낸다. 아래와 같이 다양한 구성요소로 이루어진 URI를 개발자가 직접 문자열로 작성하는 것은 상당히 불편한데, scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment] Scheme UserInfo Host Port Path Query Fragment 스프링에서는 URI를 보다 쉽게 다룰 수 있도록 도와주는 UriComponentsBuilder를 제공한다. UriComponents 클래스 UriComponents 클래스는 말 그대로, URI를 구성하는 Components들을 효과적으로 다룰 수 있도록 ..