Spring

Spring Boot에서 Redis Cache 적용하기

조금 지났지만, Locust라는 도구를 통해 API 부하테스트를 진행한 적이 있다. 그 때 발생했던 특정 API의 응답 지연을 해결하기 위해 Redis Cache를 적용한 경험을 공유하려고 한다. Cache란? Cache는 데이터나 값을 미리 복사해두어서 빠르게 접근할 수 있도록 하는 메모리 영역을 말한다. 기본적으로 RDB는 디스크에 저장되어 있기 때문에, 단순히 메모리에 저장되어 있는 Redis와는 비교도 안되게 빠른 속도로 가져올 수 있다. 물론 캐시의 전략에 따라 세부적인 흐름은 흐름은 다를 수 있지만 일반적인 캐시 전략인 Look-Aside Cache를 기준으로 설명하면 아래와 같다

Read more →

January 19, 2025

Spring에서 Testcontainer를 이용해 QueryDSL을 테스트 해보자

실무에서 QueryDSL을 사용하다보면 실제 해당 쿼리가 정상적으로 동작하는지 알기 어려울 때가 있다. 이 때 Testcontainer를 이용하면 컨테이너 환경에서 실제 환경과 동일한 DB를 띄우고, 해당 쿼리를 실행하고 결과를 대조해 봄으로써 테스트를 진행해 볼 수 있다. 왜 QueryDSL 테스트를 하는가? 사실 DB에 접근하여 쿼리를 실행하는 것은 QueryDSL 뿐 아니라, JPA, MyBatis 등 다양한 ORM 프레임워크에서도 가능하다. 다만 JPA의 Query Method의 경우 워낙 사용법이 간단할 뿐 더러, 이미 테스트가 되어있다고 가정하기에 실제 SQL을 다루는 QueryDSL 이나, MyBatis에서 테스트를 진행하는 편이 더 많다.

Read more →

August 19, 2024

Spring @Configuration vs @Component 어노테이션 차이에 대해 알아보기

Spring에서 의존성(Bean 클래스라고도 한다)을 등록 하는 방식은 크게 2가지가 있다. 바로 아래에서 설명할 @Configuration과 @Component이다. Bean은 이전 포스팅에서 설명한 것과 같이 Spring IoC Container에서 관리하는 객체를 말한다. @Configuration과 @Component는 바로 그 Bean을 등록하는 방식이다. 이 둘의 차이점에 대해 알아보자. @Component 사용하기 @Component는 Spring IoC Container에 Bean을 등록하는 방식 중 하나이다. 아래 3가지의 컴포넌트를 등록하는 방식을 보자 Computer.java@Component public class Computer { MainBoard mainBoard; CPU cpu; public Computer(MainBoard mainboard, CPU cpu) { this.

Read more →

July 9, 2024

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