[KB IT's Your Life TIL] 오늘의 학습 내용: REST와 로깅

JUN·2024년 8월 19일
0

KB IT's your life

목록 보기
6/16
post-thumbnail

주요 개념 및 키워드

  • REST (Representational State Transfer)
  • RESTful API
  • 로깅 (Logging)
  • SLF4J (Simple Logging Facade for Java)
  • Logback과 Log4j

학습한 내용

REST란?

REST(Representational State Transfer)는 웹 서비스 디자인 아키텍처 중 하나로, Roy Fielding이 2000년에 그의 박사 학위 논문에서 소개한 개념이다.

REST의 핵심 개념

  • 자원(Resource): 모든 것이 자원으로 간주되며, URI(Uniform Resource Identifier)를 통해 식별된다.
  • 표현(Representation): 자원의 현재 상태는 XML, JSON, HTML 등 다양한 형식으로 표현될 수 있다.
  • 상태 전이(State Transfer): 클라이언트와 서버 간에 자원의 상태를 주고받는다.
  • HTTP 메서드: REST는 주로 HTTP 프로토콜을 사용하며, GET, POST, PUT, DELETE 등의 메서드를 활용한다.
  • 무상태(Stateless): 각 요청은 독립적이며, 서버는 요청 간에 상태를 유지하지 않는다.
  • Idempotency(멱등성): 여러 번 실행해도 결과가 동일한 연산의 특성이다.
  • HATEOAS: 클라이언트가 동적으로 서버에서 제공하는 링크를 따라 자원에 접근 및 상태 변경할 수 있다.
  • Client-Server Architecture: 클라이언트와 서버가 서로 독립적으로 개발되고 배포될 수 있는 구조이다.

REST API와 RESTful API

REST API

  • REST 원칙을 따르는 애플리케이션 프로그래밍 인터페이스를 의미한다.
  • RESTful API와 비교할 때 보다 일반적인 개념이다.

RESTful API

  • REST 원칙을 따르는 애플리케이션을 구현하는 방식에 대한 구체적인 지침을 의미한다.
  • REST API의 구현을 통해 일관된 인터페이스를 제공하는 것을 목표로 한다.
  • 특징
    • 자원 기반 접근: 자원은 URI를 통해 접근할 수 있으며, 각 자원은 고유한 URI를 가진다.
    • HTTP 메서드 사용: 자원에 대한 CRUD 작업(Create, Read, Update, Delete)을 수행하기 위해 HTTP 메서드(GET, POST, PUT, DELETE)를 사용한다.
    • 표현형식: JSON 또는 XML과 같은 표준 표현 형식을 사용하여 자원의 상태를 클라이언트와 서버 간에 교환한다.
    • HATEOAS: 자원 상태와 관련된 링크를 제공하여 클라이언트가 동적으로 서버와 상호작용한다.
  • 둘 다 REST 원칙을 기반으로 하지만, RESTful API는 REST API의 구현 세부 사항을 명확하게 따르는 것을 의미한다.

로그 관리의 기본

Spring은 다양한 로깅 라이브러리와 통합이 잘 되어 있다. 기본적으로 SLF4J를 사용하여 로깅을 처리하며, 일반적으로 Logback이나 Log4j2를 많이 사용한다.

SLF4J란?

SLF4J(Simple Logging Facade for Java)는 자바에서 다양한 로깅 프레임워크를 사용할 수 있게 하는 추상화 계층이다. SLF4J를 사용하면 특정 로깅 프레임워크에 종속되지 않고, 런타임 시에 사용할 로깅 프레임워크를 선택할 수 있다.

SLF4J 심화

  • SLF4J(Simple Logging Facade for Java)는 자바에서 다양한 로깅 프레임워크(Logback, Log4j, Java Util Logging 등)를 사용할 수 있게 하는 일종의 추상화 계층
  • SLF4J를 사용하면 특정 로깅 프레임워크에 종속되지 않고, 런타임 시에 사용할 로깅 프레임워크를 선택할 수 있음.
    • 로깅 추상화
      • SLF4J는 다양한 로깅 프레임워크에 대해 통일된 API를 제공
      • 따라서, 애플리케이션 코드에서 SLF4J API만 사용하면 나중에 로깅 프레임워크를 교체하거나 설정을 변경할 때 코드 수정이 필요 없음.
    • 경량
      • SLF4J 자체는 매우 가볍고, 로깅 프레임워크와의 의존성을 최소화
    • 런타임 바인딩
      • SLF4J는 런타임에 사용할 로깅 프레임워크를 바인딩할 수 있음. 예를 들어, Logback, Log4j 2 등을 선택할 수 있음.
  • SLF4J를 사용하기 위해서는 먼저 SLF4J API를 의존성으로 추가하고, 원하는 로깅 구현체(Logback, Log4j 등)를 바인딩으로 추가해야 함.
implementation 'org.slf4j:slf4j-api:2.0.0'
implementation 'ch.qos.logback:logback-classic:1.2.11'
  • 로그 메시지 작성 : SLF4J는 다양한 로그 레벨을 제공
    • logger.trace("Trace level message");
    • logger.debug("Debug level message");
    • logger.info("Info level message");
    • logger.warn("Warning level message");
    • logger.error("Error level message");
  • SLF4J는 파라미터를 이용한 로그 메시지 작성도 지원하여 성능과 코드 가독성을 높일 수 있음
int userId = 12345;
String status = "active";
[logger.info](http://logger.info/)("User with ID {} has status {}", userId, status);
  • SLF4J는 단독으로 로그를 기록하지 않으며, 실제로 로그를 기록하는 것은 Logback, Log4j 2 등
    • 이를 위해 SLF4J는 바인딩 라이브러리를 통해 특정 로깅 구현체와 연결됨.
      1. Logback과 바인딩: logback-classic을 추가하면 SLF4J는 Logback을 사용함.
      2. Log4j2와 바인딩: SLF4J와 Log4j2를 함께 사용하려면 log4j-slf4j-impl 의존성을 추가해야 함.

Logback 과 Log4j

  • Logback과 Log4j는 둘 다 자바 애플리케이션에서 사용되는 대표적인 로깅 프레임워크
  • 프레임워크는 유사한 점이 많지만, 몇 가지 차이점도 존재
  • 공통점
    1. SLF4J 지원: Logback과 Log4j 모두 SLF4J(Simple Logging Facade for Java)를 지원. SLF4J는 로깅 API로, 런타임에 실제 로깅 프레임워크를 선택할 수 있게 해줌.
    2. 로깅 레벨: 두 프레임워크 모두 동일한 로깅 레벨을 지원(TRACE, DEBUG, INFO, WARN, ERROR, FATAL)
    3. 구성 파일: XML, JSON, YAML 등 다양한 형식의 설정 파일을 지원. 또한, 환경별로 다양한 설정을 적용할 수 있는 유연성을 제공
    4. 다양한 Appender: 콘솔, 파일, 네트워크, 데이터베이스 등 다양한 출력 매체를 지원하는 Appender들을 제공
    5. 필터 및 레이아웃: 로그 메시지를 출력하기 전 다양한 필터링 및 포맷팅을 지원
  • 차이점
특징LogbackLog4j 2
성능- Logback은 기존의 Log4j에 비해 성능 개선이 이루어짐.- Log4j 2는 기존 Log4j 1.x의 성능 문제를 해결
- 메모리 및 속도 측면에서 효율적- Logback과 유사한 수준으로 성능을 최적화
설정 파일주로 logback.xml 또는 logback-spring.xml로 설정주로 log4j2.xml, log4j2.properties, log4j2.yaml 등 다양한 형식의 설정 파일을 지원
재구성Logback은 설정 파일이 변경되면 자동으로 재로딩을 지원- Log4j 2도 설정 파일 변경 시 자동으로 재구성을 지원
- 설정 변경 시점에 대한 고급 옵션이 더 다양
비동기 로깅AsyncAppender를 통해 비동기 로깅을 지원- Log4j 2는 AsyncLogger를 통해 성능이 더 향상된 비동기 로깅을 지원
- LMAX Disruptor를 사용하여 더 빠르고 낮은 대기 시간의 비동기 로깅을 제공
커뮤니티 및 유지보수- Logback은 SLF4J의 창시자인 Ceki Gülcü에 의해 개발- Log4j 2는 Apache 재단에서 관리하며, 대규모 커뮤니티와 활발한 개발
- 꾸준한 업데이트와 유지보수 진행- Log4j 1.x와의 호환성을 유지하려고 함
프로젝트 복잡도- Logback은 Spring Boot에서 기본적으로 사용- Log4j 2는 더욱 다양한 기능을 제공
- 설정이 비교적 간단- 대규모 프로젝트나 특수 요구사항이 있는 프로젝트에 적합

Logback과 Log4j 비교

Logback과 Log4j는 둘 다 자바 애플리케이션에서 사용되는 대표적인 로깅 프레임워크이다. 두 프레임워크는 유사한 점이 많지만, 성능, 설정 방식, 비동기 로깅 지원 등에서 차이가 있다.

스프링 로그 설정

로그 설정은 application.properties 파일에서 할 수 있다. 예를 들어:

logging.level.root=INFO
logging.level.com.example=DEBUG

로그 출력 방식

1. 콘솔 출력

logback-spring.xml 파일을 사용하여 콘솔에 로그를 출력할 수 있다. 예시:

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

여기서 appender는 콘솔에 로그를 찍을지 결정한다. class="ch.qos.logback.core.ConsoleAppender"는 콘솔에 로그를 찍겠다는 뜻이다. pattern 태그는 로그의 출력 형식을 지정한다.

2. 파일 출력

로그를 파일로 저장하려면 다음과 같이 설정할 수 있다:

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/spring-boot.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/spring-boot-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>

설정 항목 요약

  • <file>: 로그 파일의 경로와 이름을 설정
  • <fileNamePattern>: 로그 파일의 롤링 패턴을 설정
  • <maxFileSize>: 각 로그 파일의 최대 크기를 설정
  • <maxHistory>: 보관할 로그 파일의 최대 개수를 설정
  • <pattern>: 로그 출력 형식을 설정
  • <appender-ref ref="FILE" />: 설정한 파일 appender를 루트 로거에 적용

코드에서의 로그 사용

실제 코드에서 로그를 사용할 때는 다음과 같이 작성한다:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    private static final Logger logger = LoggerFactory.getLogger(MyService.class);

    public void performAction() {
        logger.info("Action is being performed");
        try {
            // Some business logic
        } catch (Exception e) {
            logger.error("An error occurred", e);
        }
    }
}

로깅 성능 최적화

  • 로그를 너무 많이 출력하면 성능에 악영향을 끼칠 수 있음. 최적화 방법을 고려해야함.
    • 필요한 로그 레벨만 출력하도록 설정
    • 로그 파일 크기와 보관 기간을 제한
    • 비동기 로깅을 통해 로그 출력이 메인프로세스를 차단하지 않도록 설정 Logback의 경우 AsyncAppender 사용

새롭게 알게 된 점

  • REST의 주요 원칙들과 그 의미에 대해 자세히 알게 되었다.
  • RESTful API와 일반 REST API의 차이점을 이해하게 되었다.
  • SLF4J가 다양한 로깅 프레임워크의 추상화 계층 역할을 한다는 점을 알게 되었다.
  • Logback과 Log4j의 특징과 차이점을 비교하여 이해할 수 있었다.

오늘의 회고

REST의 개념과 원칙들을 다시한번 다질 수 있었다.
또한 스프링 프레임워크의 로깅 관리와 설정 방법에 대해 알게 되어 유익하였다.
특히 SLF4J의 역할과 Logback, Log4j의 차이점을 이해하게 되어 앞으로 프로젝트에서 로깅 웹 로그로 사용자나 서버 데이터를 트래킹하는데 도움이 많이 될 것 같다.
앞으로 실제 프로젝트에 이러한 개념들을 적용해보며 더 깊이 있는 이해를 하고 싶다.

profile
순간은 기록하고 반복은 단순화하자 🚀

0개의 댓글