Spring

Spring에서 Micrometer를 활용하여 Trace ID와 Span ID 로깅하기

디버깅을 위해 로깅을 하다보면, 특히나 분산 시스템에서는 로깅을 통해 트랜잭션의 흐름을 파악하기 어려울 수 있다. 특히나 프로덕션 환경에서는 디버깅을 위해 여러 단계에 정상 요청에 대한 파라미터나, 리턴에 대한 정보를 로깅하기도 하는데, 이런 로그들의 특징은 동시에 여러 요청이 들어올 경우, 로그들이 섞이게 되어 특정 로그가 어떤 요청에 대한 로그인지 파악하기 어려울 수 있다. 또한 에러 발생 시 에러가 발생된 요청에 대한 로그들을 파악하기 어려울 수 있다. 이런 경우 Trace ID와 Span ID를 활용하여 로깅을 하면 로그의 구분 및 검색 면에서 트랜잭션의 흐름을 파악하기 좀 더 용이해질 수 있다.

Read more →

June 24, 2024

Spring Boot에서 Logback을 이용한 Pattern 로그 및 JSON 로그 출력하기

API 서버를 운영하다 보면 운영 사항에 대해 로그를 남기거나, 디버그를 위해 로그를 남기는 경우가 많다. 전통적으로 스프링에서는 Log를 남길 때 포맷이 존재하긴 하나, Raw Text 형태로 남기는 경우가 많고, 이와 같은 경우 필자의 경우 가시성에 있어서는 JSON 형태로 로그를 남기는 것 보다 더 좋다고 생각한다. 다만 로그를 검색하고, 필터링 하는 경우에는 이야기가 다른데, AWS CloudWatch 와 같이 로그를 검색할 수 있는 플랫폼의 경우 Raw Text 형태로 로깅하면 어떤 함수에서 어떤 데이터가 나왔는지 필터링이 어렵다.

Read more →

June 17, 2024

(JAVA) Spring 에서 서비스 내에서 static 메소드 Mocking 하기

일반적으로 Spring은 Layered Architecture 를 따르고 있으며, 서비스에서 주로 비즈니스 로직을 처리하게 된다. 이 때 종종 static 메소드를 사용하는 경우가 있는데, 일반적인 컴포넌트의 경우 런타임 시점에 동적으로 바인딩되기 때문에 Mocking 시점에 해당 인터페이스를 구현한 객체를 Mocking 객체로 대체하여 테스트를 진행할 수 있다. static 메서드의 경우, 컴파일 시점에 메서드가 정적으로 바인딩되기 때문에 Mocking 이 어렵다. 그럼 어떻게 해야할까? 1. Wrapper 클래스 전통적인 방식으로는 Static 메서드를 컴포넌트화 할 수 있다. static 메서드를 일반 메서드 내에서 활용해서 한번 Wrapper 클래스로 감싸는 것이다.

Read more →

June 15, 2024

(JAVA) Spring에서 같은 서비스 내의 메소드 Mocking 하기

일반적으로 Spring은 Layered Architecture 를 따르고 있으며, 서비스에서 주로 비즈니스 로직을 처리하게 된다. 서비스의 코드가 많아지면 많아질 수록 비슷한 코드가 많아지게 되는데, 이런 경우 공통 로직을 처리하는 별도 레이어를 두어 분리하는 경우도 있지만, 대개 서비스 내에 공통 메서드를 선언해서 처리하는 경우도 많을 것이다. 예를 들어 다음을 보자 @Service public class SomeService { public void methodA() { // do something } public void methodB() { methodA(); // do something } public void methodC() { methodA(); // do something } } 위의 코드에서 methodA는 methodB, methodC에서 공통적으로 사용되는 메소드이다.

Read more →

May 30, 2024

의존성 주입 (Dependency Injection, DI)에 대해 알아보자

이번 포스팅에서는 Spring Framework의 중요한 개념중 하나인 의존성 주입(Dependency Injection): DI에 대해 다루겠어요. DI는 Spring의 가장 중요한 개념이고 회사 면접에서도 단골로 나오는 개념이니 꼭 알고있는게 좋아요. 먼저 의존성에 대해 알아볼까요? 의존성 A객체가 B객체에 의존하고 있다는 것의 뜻은 포함관계와 매우 밀접한 관련이 있어요. 한번 코드로 보도록 하죠! Korean.javaclass Korean { int score; // 과목 점수 string content; // 과목 내용 } Student.javaclass Student { private Korean korean; public Student() { korean = new Korean(); } } 위와 같이 Student 클래스의 경우 국어 점수 score와 과목의 내용content이 담긴 Korean클래스를 포함하고 있어요.

Read more →

February 24, 2022

Spring Bean에 대해 알아보자

오늘은 Spring MVC에 대해서 설명을 드릴까 하다가 그 전에 MVC를 이해하기 위한 Spring 알아야 할 기본 지식들을 먼저 소개할까 합니다. Spring Bean? Spring Bean은 Spring Container에서 관리하는 객체를 말합니다. 근데 이상합니다. Spring에서 관리하는 객체? 라이브러리 속 Spring이 정의한 객체일까요? 정답을 말하자면, 아닙니다. 물론 라이브러리 속에서도 Bean으로 정의되어있는 객체가 있을 수 있으나, 사용자가 작성하지만 Spring에서 관리하는 객체를 우리는 Bean이라고 정의합니다. 원래는 사용자가 객체를 관리해야 하나, 이렇게 프레임워크에서 관리하게 되는 것을 우리는 제어의 역전 IOC라고 표현합니다.

Read more →

February 24, 2022

Autowired 어노테이션에 대해 알아보자

저번시간에는 Spring의 DI 에 대해서 알아보았죠? “의존성 주입” 포스팅 보러가기 오늘은 DI과 밀접한 관련이 있는 어노테이션 @Autowired에 대해서 알아볼까 합니다. 우선 어떤 메서드나 어노테이션이건 간에 이름에 굉장히 중요한 의미가 있어요 Autowired? 어떤 느낌인가요? “자동으로 연결된” 뭐 이런 느낌이지 않나요? 뭔지는 모르겠지만 한번 보도록 해요. @Autowired? 자동으로 연결되어있다는 뜻을 가진 이 친구는 Spring에서 의존성을 주입시켜주는 역할을 담당해요. 개념적으로 배운 의존성 주입을 실제로 실현하고 있는 친구라고 봐도 돼요 위의 주석을 통해 정의를 확인해보도록 하죠

Read more →

February 24, 2022