본문 바로가기

Spring

[Springboot] RabbitMQ 적용하기 1. 의존성 추가 // build.gradle implementation 'org.springframework.boot:spring-boot-starter-amqp' 2. application.properties // application.properties # RabbitMQ spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest spring.rabbitmq.queue.name=queue spring.rabbitmq.exchange.name=exchange spring.rabbitmq.routing.key=routingkey 3. configura.. 더보기
[Springboot] 스프링부트 로그로 클라이언트IP 확인하기(Nginx를 프록시로 사용하는 경우) MDC에 클라이언트 IP를 넣는 코드로 수정을 하고 테스트중 VM에 올려서 서버 실행하는데 모든 요청이 172.17.0.3으로 IP가 찍혔음 생각해보니 백엔드 서버로 들어오기전에 Nginx를 거쳐서 들어오니까 Nginx의 IP가 남는 것을 깨닫게 되었음 그리고 검색하다가 Header에 들어오는 값들 중 X-Forwarded-For에는 실제 클라이언트 IP가 들어온 다는 것을 확인 하지만 이것도 프록시 서버에 설정을 해줘야함 일단 XFF(X-Forwarded-For) 헤더란? 프록시 서버나 로드 밸런서를 통해 웹 서버에 도달하는 HTTP 요청에서 실 클라이언트 IP 주소를 식별하는데 사용함 설정 방법 Nginx 설정파일 nginx.conf를 수정 http { # 기존 설정 내용... # 프록시 설정 se.. 더보기
[Spring boot] MDC(Mapped Diagnostic Context) 클라이언트 요청IP 넣기 기존 구현한 코드 import jakarta.servlet.*; import org.slf4j.MDC; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import java.io.IOException; import java.util.UUID; /* @Component: 스프링 컨텍스트에서 클래스를 빈으로 등록, Filter를 구현한 이 클래스를 스프링 빈으로 관리 @Order: 빈의 우선순위 설정 Ordered.HIGHEST_PRECEDENCE: 가장 높은 우선 순위 */ @Component @Order(.. 더보기
[Springboot] MockMvc를 이용해서 테스트하기 1. 용어 정리 - 목(Mock): 테스트를 위해서 만든 모형 - 모킹(Mocking): 테스트를 위해 실제 객체와 비슷한 모의 객체를 만드는 것 - 목업(Mock-Up): 모킹한 객체를 메모리에서 얻어내는 과정 2. 서블릿 컨테이너 모킹 Controller를 테스트할 때 서블릿 컨테이너를 모킹을 위해 @WebMvcTest 또는 @AutoConfigureMockMvc 사용함 스프링 3.2부터 스프링 프레임워크는 스프링 MVC를 모킹하여 웹 애플리케이션을 테스트하는 아주 유용한 기능을 제공한다. 이 기능으로 실제 서블릿 컨테이너에서 컨트롤러를 실행하지 않고도 컨트롤러에 HTTP 요청을 할 수 있다. 스프링 Mock MVC 프레임워크는 애플리케이션을 마치 서블릿 컨테이너에서 실행하는 것처럼 스프링 MVC를 .. 더보기
[Springboot] Redis 데이터 삭제 스케줄러 구현 1. @RedishHash 어노테이션을 이용하는 방법 timeToLive 속성으로 데이터 저장 시간을 설정 할 수 있음 @Getter @RedisHash(value = "fileInfo", timeToLive = 60 * 60 * 24 * 30) // 30일 (기본값 -1: 영구 저장) public class FileInfo implements Serializable { @Id private String userId; private String fileId; private String fileName; private String fileExt; private String filePath; private String hasVector; private Long uploadTime; } 2. @Schedule.. 더보기
[Springboot] Redis를 In-memory DB로 사용하기(1) 1. ReidsRepository와 RedisTemplate Spring Data Redis에서 Redis와 상호작용하는데 사용되는 컴포넌트 ReidsRepository와 RedisTemplate 1) RedisRepository 역할: RedisRepository는 Spring Data 프로젝트에서 제공하는 일종의 Repository 인터페이스로, Redis에 대한 데이터 액세스를 추상화 사용자가 Redis와 상호 작용하는데 필요한 CRUD (Create, Read, Update, Delete) 기능 제공 주요 특징: 사용자가 정의한 인터페이스를 생성하여 해당 인터페이스에 메소드를 추가함으로써 사용자 지정 Repository를 만들 수 있음 Spring Data Redis가 제공하는 일반적인 메소드들로.. 더보기
[Spring boot] MDC(Mapped Diagnostic Context) 적용 1. MDC 사용 이유 1) 스레드 별 로깅 컨텍스트 다중 스레드 환경에서 각 스레드는 독립적으로 실행되며 서로 다른 작업을 수행함 MDC를 사용하면 각 스레드에게 고유한 로깅 컨텍스트를 제공하여 스레드 간 로그를 구분할 수 있음 2) 트랜잭션 추적 웹 애플리케이션 환경에서는 하나의 요청이 여러 스레드를 통과할 수 있음 MDC를 사용하면 요청을 추적하고 해당 요청과 관련된 로그를 모아서 볼 수 있으므로 트랜잭션 춪거 및 디버깅에 유용 3) 디버깅 및 로깅 수준 설정 디버깅 시 특정 스레드나 작업에 대한 로그를 쉽게 필터링 할 수 있음 특정 작업에 대한 로그를 필요한 경우에만 출력하도록 로깅 수준을 동적으로 설정할 수 있음 4) 추가 정보 제공 로그에 정보를 쉽게 추가할 수 있음 예를 들어 요청 ID, 세.. 더보기
[Springboot] MDC(Mapped Diagnostic Context) 개념 1. MDC(Mapped Diagnostic Context) 로깅 코드에서 특정 데이터를 쉽게 사용할 수 있도록 하는 메커니즘 한 스레드에서 실행되는 작업 간에 로깅 코드를 통해 데이터를 전파할 수 있음 스프링부트에서 MDC는 주로 로깅 프레임워크에서 제공하는 기능을 활용하며 주로 SLF4J와 함께 사용됨 MDC를 사용하면 로그 메시지에 특정 컨텍스트 정보를 쉽게 추가할 수 있음 2. MDC 저장소 MDC가 실제로 사용하는 저장소, 로깅 컨텍스트 정보를 스레드 로컬 기반의 Map으로 관리 로깅 프레임워크(주로 SLF4J)에서 제공하는 자바 ThreadLocal 클래스를 사용 각 스레드는 자체적인 MDC 저장소를 가지고 있으며, 이 저장소에는 특정 작업이나 트랜잭션과 관련된 추가적인 컨텍스트 정보를 저장할.. 더보기