전체 글 25

(Spring Boot) 다중 데이터베이스 + JPA 환경에서의 트랜잭션 관리에 대하여

개요Spring Boot 애플리케이션에서 다중 데이터베이스 환경(Primary, Replication DB 여러대)을 운영하면서 스케줄러를 통해 데이터를 INSERT, UPDATE, DELETE하는 과정에서 실제 데이터베이스에 변경사항이 반영되지 않는 문제를 경험했습니다. 이는 트랜잭션 관리 방식의 차이에서 기인한 문제일 수 있습니다.해당 포스트에서는 제가 주로 사용한 두 가지 트랜잭션 관리자 DataSourceTransactionManager와 JpaTransactionManager에 대해 비교해보고 어떻게 위 문제를 해결했는지 기록합니다.  트랜잭션 관리자 비교DataSourceTransactionManager- 이 트랜잭션 관리자는 주로 JDBC API를 사용할 때 적합하며, 각 트랜잭션은 단일 데..

Java & Spring Boot 2024.05.08

(Redis) AWS ElastiCache for Redis를 활용한 데이터 캐싱 설정

현재 다니는 회사에서 프로젝트 요구에 따라 Redis와 같은 인메모리 DB를 도입할 필요성을 느꼈습니다.과거 Redis를 EC2에 설치해서 사용한 경험을 통해, 이번에도 Redis를 사용하기로 결정했고 관련 정보를 찾던 도중 AWS에서 2023년 12월에 ElastiCache for Redis Serverless를 출시했다는 따끈따끈한 소식을 접하게 되었습니다.서버리스의 장점은 개발자가 인프라 관리에 들이는 노력을 대폭 줄일 수 있다는 것입니다. 하지만, 종종 성능 대비 높은 가격과 낮은 설정 자유도가 단점으로 작용합니다. 예시로 AWS Aurora MySQL Serverless v2는 기존 RDS MySQL보다 거의 두배 가까운 비용이 듭니다. 이에 Redis의 서버리스 버전도 비슷한 비용 문제가 있지..

Infra & AWS 2024.04.13

(Java) Generic 동작 원리 및 용도

해당 포스트는 JAVA의 Generic에 대한 동작 원리와 용도에 대한 내용을 포함하고 있습니다. Java에서 제네릭(Generic)은 다양한 타입의 객체를 다루는 메소드나 컬렉션 클래스에 타입 체크와 타입 캐스팅을 컴파일 시간에 처리할 수 있게 도와주는 프로그래밍 기법입니다. 제네릭을 사용하면 코드의 재사용성을 높이고, 타입 안정성을 강화할 수 있습니다. 제네릭의 동작 원리와 용도에 대해 쉽게 설명해 보겠습니다. 동작 원리 제네릭을 사용하면 클래스, 인터페이스, 메소드를 정의할 때 타입(Type)을 파라미터로 사용할 수 있습니다. 이 타입 파라미터는 실제 클래스 타입이 사용될 때까지 구체적인 타입을 지정하지 않고, 코드 작성 시점에는 추상적인 '타입 변수'로서 사용됩니다. 컴파일 시, 컴파일러는 이 타..

Java & Spring Boot 2024.02.12

(Java) .stream() 동작 원리 및 용도

해당 포스트는 JAVA의 .stream()에 대한 동작 원리와 용도에 대한 내용을 포함하고 있습니다. .stream()을 자주 사용하지만 해당 메소드의 동작 원리에 대한 막연한 궁금증이 생겨 글을 작성하게되었습니다. 동작 원리 1. 스트림 생성 : 스트림은 Collection 인터페이스의 stream() 메소드 호출, Arrays.stream(T array), 또는 Stream 인터페이스의 of(), generate(), iterate() 등의 메소드를 통해 생성됩니다. 스트림 생성 시 데이터 소스는 변경되지 않으며, 데이터의 추상적인 뷰만을 제공합니다. 2. 중간 연산(Intermediate Operations) : 필터링(filtering), 매핑(mapping), 정렬(sorting) 등 데이터 스..

Java & Spring Boot 2024.02.12

Elasticsearch 다운로드 및 실행

해당 문서에서는 ElasticSearch를 Linux VM에 설치하고 운영하는 기본적인 방법에 대한 내용을 포함합니다. 주로 다루는 내용은 아래와 같습니다. ElasticSearch 다운로드 및 압축 해제 :9200(http), :9300(tcp) 사용 포트 설명 bin/elasticsearch를 이용한 실행 config/elasticsearch.yml 설정 파일 설명 curl 명령을 통한 프로세스 실행 상태 확인 start.sh, stop.sh 시작&종료 스크립트 파일 만들기 * wget 설치 sudo yum install wget * elasticsearch 다운로드 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.1..

Etc. 2024.01.27

[GCP] Vision API Product Search를 이용한 유사 상품&컨텐츠 검색 기능 개발

GCP Vision API와 Vertax AI를 이용하여 유사 이미지 검색 기능을 개발하게 되었습니다. 그 중 개발된 기능 소개와 GCP Vision API Product Search를 빠르게 이용해볼 수 있는 방법을 소개합니다. 해당 기술을 이용할 경우 사용자가 업로드한 패션 이미지와 유사한 상품이나 컨텐츠를 score에 따라 추천할 수 있습니다. 빠른 시작 GCP의 Vision API 중 Product Search를 이용해 유사 상품 검색 기능을 개발하면서 GCP Console에서 사용한 터미널 명령어를 정리해본다. 1. 먼저 일괄 등록할 csv 파일을 GCS에 등록한다. csv 파일은 image_url, image_id, product_set_id, product_id, category, produ..

기능 구현 2024.01.27

[Infra] Container 개념

### 예시 : 웹 애플리케이션 호스팅 #### 컨테이너 설정 : **Node.js 앱 1** : 회원가입, 사용자 인증을 관리하는 웹 서비스이며, 사용자 데이터를 관리하는 데이터베이스와 통신한다. **Node.js 앱 2** : 앱 1과 독립적으로 작동하는 상태 관리 및 메시징 서비스를 제공할 수 있다. 예를 들어, 실시간으로 사용자 간 메시지를 교환하는 기능을 담당할 수 있다. #### 실행 흐름 : 1. **프로세스 격리** : 앱 1과 앱 2는 각각 독립적인 프로세스로 실행된다. 이는 두 애플리케이션이 서로의 작업에 영향을 주지 않는다는 것을 의미한다. 2. **리눅스 커널** : 컨테이너는 호스트 시스템의 리눅스 커널과 동일한 커널을 공유하지만, 각기 다른 네임스페이스와 cgroups를 사용하여..

Infra & AWS 2024.01.27

[Test] MockBean을 통한 테스트

@MockBean private JavaMailSender mailSender; ... BDDMockito.doNothing().when(mailSender).send(any(SimpleMailMessage.class)); mailSender의 send 메서드가 SimpleMailMessage 유형의 인자로 호출될 때 아무런 행동도 수행하지 않아야 함을 명시한다. 다시 말해서, 테스트 중에는 실제 이메일 전송과 같은 로직이 실제 동작되어 발생하는 부작용을 피하기 위해 send 메서드 호출을 무시하도록 설정한다.

Java & Spring Boot 2024.01.27