본문 바로가기

분류 전체보기101

nginx에서 서버로 도메인 전달하기 😥 배경 클라이언트로부터 받은 요청의 도메인 정보를 바탕으로 특정 처리를 해야 하는 요구사항이 추가되었다. 필자는 도메인 값은 Request에서 getServerName()을 통해 쉽게 확인할 수 있다는 걸 알고 있어서 이를 바탕으로 요구사항을 빠르게 처리하려고 했다. 하지만 getServerName()에는 서버의 ip 주소(172.xxx.xxx.xxx)만 받는 것을 확인하게 되었고, 결국 요청을 보내는 클라이언트 웹 서버(nginx) 설정 까지 확인하게 되었다. ✂️ 서비스 구성도 서비스는 외부에서 도메인 뒤에 /api ... 로 시작하는 요청이 들어오는 경우, nginx에서 proxy_pass 설정을 통해 내부 IP 백엔드 서버(172.xxx.xxx.xxx:8080)로 요청을 보내는 구조를 가지고 있.. 2023. 8. 26.
@Transactional 특징, 사용방법, 주의점 😤 배경 스프링에서 트랜잭션 처리가 필요한 경우, 나는 간단하게 JPA와 함께 @Transactional 어노테이션을 클래스 혹은 메서드에 설정해 왔다. 그러던 중 최근 운영 중인 서비스에서 Transaction Lock 이슈가 발생하면서 문득 이렇게 막 사용하는 게 옳은 일인가를 고민하게 되었고, 조사 및 정리 차원에서 해당 내용에 대해 작성하게 되었다. 해당 포스팅에서는 @Transactional 개념과 원리보다는 특징, 사용 방법, 주의점에 대해서 간단하게 설명하고자 한다. 1. 특징 @Transactional은 다음과 같은 특징을 가지고 있다. - AOP를 통해 구현되었다. - 어노테이션이 선언된 클래스에 트랜잭션이 적용된 프록시 객체가 생성된다. - CheckedException 또는 예외가 없.. 2023. 8. 15.
Spring Batch + Quartz를 활용한 스케줄러 구현하기 Spring 배치 작업을 실행하도록 Quartz를 활용해 스케줄러를 구성하는 방법에 대해 알아본다. 해당 포스팅은 스프링 배치나 Quartz에 대해서 깊게 다루지는 않는다. 스프링 배치를 활용해서 스케줄링을 구현할 때 어떻게 구현하는지 참고 용도로 활용하길 바란다. 0. 개발 환경 - JDK 17 - Spring Boot 3.0.1 - Spring Batch 5 - Quartz 2.3.2 1. Dependency(Maven) spring-boot-starter-batch, spring-boot-starter-quartz 의존성을 추가한다. org.springframework.boot spring-boot-starter-batch org.springframework.boot spring-boot-start.. 2023. 8. 6.
MariaDB decimal 타입과 Java BigDecimal 동일하게 처리하기 😂 배경 정확한 실수 값 계산이 필요해 Java의 BigDecimal을 사용해 구현한 특정 비즈니스 로직이 있었다. 해당 로직은 조회 기능이 두 가지가 있는데, 하나는 DB 값을 조회하는 현재 조회, 다른 하나는 미래 날짜를 선택하면 예상된 값을 계산해서 보여주는 미래 조회가 있다. 어느 날 기획자가 해당 비즈니스 로직과 관련된 화면을 캡처해서 보여주며, 조회와 계산된 값이 맞지 않는다고 하며 의문을 제기했다. 해당 문제를 해결하고 나서 알게 된 부분에 대해서 공유하고자 한다. 🔎 문제 현재 조회(DB 조회)를 하면 100.0 값이 출력되고, 미래 날짜를 입력하고 계산해서 조회하면 99.9가 뜨는 문제가 발생했다. 해당 문제는 100을 3으로 나누는 경우 발생했는데, 100을 3으로 나누면 33.3333.. 2023. 8. 5.
Spring Batch 5 사용해보기 😢 배경 토이 프로젝트 Spring Boot 3 환경에서 Spring Batch 5를 사용하려고 했는데, 기존에 Spring Boot 2에서 사용했던 Job, Step 선언 방식으로는 실행되지 않는다는 걸 알게 되었다. 0. 기본 조건 Spring Batch 5는 Spring framework 6, Spring Boot 3 환경에서 사용하므로 최소 Jdk 17을 필요로 한다. 1. StepBuilderFactory, JobBuilderFactory = Deprecated 기존 Spring Batch 4에서는 JobBuilderFactory, StepBuilderFactory를 사용해 Job과 Step 구성하는 방식으로 사용했었다. 하지만 Spring Batch 5에서는 BuilderFactory가 Dep.. 2023. 7. 30.
Spring message ChannelInterceptor 메서드 특징 🙄 배경 프로젝트에서 Websocket + STOMP를 활용하여 접속자 여러 명이 동시에 작업하는 기능을 추가해야 하는 과정이 있었다. 메시징을 전송하기 전과 후에 특정 처리를 해야하는 과정이 있었는데, 그때 ChannelInterceptor 인터페이스에 대해 알게 되었다. ChannelInterceptor 해당 인터페이스를 구현하고 등록하여, 메시지가 송/수신되기 전 메시지의 데이터 검증 및 변환을 할 수 있다. 해당 인터페이스는 총 6개의 메서드를 가지고 있으며 기능은 다음과 같은 특징을 가지고 있다. 1. preSend() - 모든 유형의 채널에 대해 호출된다. - 메시지가 실제로 채널로 전송되기 전에 호출된다. - 메시지(Message)와 MessageChannel에 대한 참조는 인터셉터 메서드의.. 2023. 7. 23.
ObjectMapper readValue 다형성 적용하기 (+ Jackson2JsonRedisSerializer) 😵 배경 ObjectMapper의 readValue(InputStream in, Class valueType)를 사용하기 위해서는 Class가 필요하다. 일반적인 경우 구체적인 POJO 클래스 타입을 명시해서 사용하면 된다. 하지만 Bean으로 등록한 RestTeamplte에 Jackson2JsonRedisSerializer를 추가하는 것처럼 클래스 타입을 초기 설정한 이후 변경이 어려운 경우, 인터페이스 또는 추상 클래스를 활용한 다형성이 필요할 수 있다. 이런 경우 일반적인 상속 방식으로는 적용되지 않으며 별도의 설정이 필요하다. 해당 방법에 대해서 알아보자. 1. 하나의 구현체만 있는 경우 오직 하나의 구현체만 있는 경우, @JsonDeserialze 어노테이션을 통해서 Jackson에게 역직렬화 .. 2023. 7. 16.
Spring RedisSerializer 종류와 특징 🤔 배경 프로젝트 진행 중에 Redis Queue와 WebSocket을 활용해서 서비스를 개발하는 과정이 있었다. Spring Data Redis를 사용하기 위해 Config 파일에 RedistTemplate을 Bean으로 등록하게 되었고, 관련해서 Key와 Value에 Serializer도 설정하게 되었다. 해당 과정에서 알게 된 RedisSerializer 종류와 특징에 대해 소개해보려고 한다. Redis는 인 메모리 데이터베이스 이므로 Redis에 데이터를 저장/조회하는 동안에 직렬화/역직렬화가 필요하다. 직렬화는 데이터를 메모리에 저장하기 위해 바이트 스트림으로 변환하는 것을 의미한다. RedisTemplate 설정 Spring Data Redis 의존성을 추가하면 RedisTemplate 객체를.. 2023. 7. 15.