전체 글 132

낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)

동시에 여러 트랜잭션이 같은 데이터를 수정하려고 할 때, 데이터의 정합성(Consistency)이 깨질 수 있다.이를 방지하기 위해, 트랜잭션 간의 충돌을 제어하는 동시성 제어(Concurrency Control) 기법이 필요하다.세마포어(Semaphore)와 뮤텍스(Mutex)는 운영체제(OS) 수준에서 스레드 간 자원 접근을 제어하기 위해시스템 락을 거는 방법이다.반면, 낙관적 락과 비관적 락은 서버 애플리케이션 혹은 데이터베이스(DB) 레벨에서 적용되는 동시성 제어방식이다.즉, 단일 프로세스 내의 스레드 동기화가 아니라,여러 트랜잭션이 같은 데이터를 수정하려 할 때 데이터의 정합성(Consistency)을 유지하기 위한 방법이라 할 수 있다. 비관적 락 (Pessimistic Lock)비관적 ..

DB 2025.10.17

분산 락(distributed lock) 이란?

동시성 문제를 해결하기 위해 뮤텍스(Mutex), 세마포어(Semaphore)나 데이터베이스의 비관적/낙관적 락을 떠올리게 된다.하지만 이 기법들은 모두 모놀리식(Monolithic) 아키텍처와 같이 하나의 시스템 경계(Boundary) 안에서만 동작한다. 뮤텍스와 세마포어는 단일 서버, 즉 하나의 프로세스 내부에서 스레드 간의 충돌을 막는 OS 수준의 기법이다.비관적/낙관적 락 역시 단일 데이터베이스 인스턴스 내에서 트랜잭션 간의 데이터 정합성을 보장하는 방식이다.하지만 MSA 환경에서는 각 서비스가 독립된 서버와 데이터베이스를 사용하는 것이 일반적이다.프로세스 간에는 메모리를 공유하지 않기 때문에 서로의 락 상태를 확인하거나 제어할 수 없다.즉, 한 서버에서 설정한 락을 다른 서버가 인식할 방법이 없..

DB 2025.10.16

Spring Batch를 활용한 쿠폰발급 및 메일전송

중고물품 거래 플랫폼을 개발하면서, 마케팅 측면에서 유저가 이메일 수신을 허용하도록 유도하기 위해 생일인 유저에게 생일 쿠폰을 자동으로 발송하는 기능을 구현했다. 이 기능을 어떤 방식으로 구현할지 고민하던 중, 확장성과 유지보수성을 고려하여 Spring Batch를 도입하기로 결정했다. Spring Batch란? Spring Batch는 대용량 데이터를 효율적으로 처리하기 위한 Java 기반 배치 프레임워크다. 주로 청크(Chunk) 단위로 데이터를 나누어 처리함으로써, 상황에 따라 메모리를 유연하게 사용할 수 있다는 장점이 있다. Spring Batch의 청크 처리 구조는 다음과 같은 구성요소로 이루어진다. 1. Scheduler → 배치 실행을 트리거(JobLauncher 실행) 한다.2..

Java 2025.10.15

DDD, 헥사고날 아키텍처, 멀티모듈 — 개념 및 흐름

들어가며현대 애플리케이션은 복잡한 비즈니스 규칙과 빠른 기술 교체 요구를 동시에 맞닥뜨린다.이를 잘못 설계하면 코드가 외부 라이브러리·프레임워크에 묶여 변경이 어렵고, 여러 팀이 동시에 작업할 때 충돌이 잦아진다. DDD, 헥사고날, 멀티모듈은 이러한 문제를 해결하는 실용적인 조합이다. 이 글은 DDD → 헥사고날 → 멀티모듈 순으로 설명할 예정이다. 도메인 주도 설계 (DDD; Domain-Driven Design)도메인 주도 설계.. 알듯 말듯한 단어이다. 도메인 중심으로 설계를 한다는 것 같은데.. 과연 DDD에서 말하는 도메인은 무엇일까? 🤔DDD에서 도메인은 현실 세계에서 해결해야 하는 비즈니스 문제 영역을 정의하는 것이라 볼 수 있다.예를들어 티켓 예매 프로그램을 만든다고 가정할 경우예..

CS 2025.09.14

동기 / 비동기 (Sync / Async) 와 블로킹 / 논블로킹 (Blocking / Non-Blocking)

CS를 진행하며 동기 / 비동기와 블로킹 / 논블로킹이 헷갈려 찾아봤다.찾아보면 볼수록 헷갈렸지만, 알고보니 동기와 블로킹은 단지 조합하여 사용되는 것 뿐 전혀 다른 개념이었다. 1. 핵심 요약동기 / 비동기 (Sync / Async) : 결과를 누가 확인하는가?동기: 호출한 쪽(A)이 계속 결과를 확인해야 함비동기: 호출받은 쪽(B)이 결과가 끝났을 때 알려줌 블로킹 / 논블로킹 (Blocking / Non-Blocking) : 제어권(실행 흐름)을 누가 갖고 있나?블로킹: 호출받은 쪽(B)이 끝날 때까지 호출한 쪽(A)은 멈춤 (제어권을 B가 가짐)논블로킹: 호출받은 쪽(B)은 실행되지만 호출한 쪽(A)은 멈추지 않고 자기 할 일 함 (제어권 A가 계속 가짐) 2. 일상 비유카페에 코딩을 하기..

CS 2025.08.18

[Troubleshooting]JSON_TABLE과 LEFT JOIN으로 인한 카테시안 곱

문제프로젝트를 진행하며 MBTI 기반 매칭 시스템을 작업하던 중 문제가 발생했다.사용자의 기술 스택 정보를 조회하는 쿼리에서 한 사용자의 기술 스택이 계속 중복되어 나타나는 것이다.예를 들어 '춘식이'라는 사용자의 기술 스택이 4번씩 반복되고 있었다. 똑같은 기술 스택이 4번씩 반복되고 있었다. 원인 분석문제의 원인을 찾기 위해 쿼리를 자세히 살펴봤다. LEFT JOIN JSON_TABLE( #{companyMbti}, "$[*]" COLUMNS(company_mbti CHAR(4) PATH "$") ) jt ON JSON_VALID(#{companyMbti}) AND jt.company_mbti IS NOT NULLLEFT JOIN mbti_compat compat ON compat...

TroubleShooting 2025.07.23

[Redis] 레디스 자료형

요즘 Redis를 공부하면서, 단순한 Key-Value 저장소가 아니라는 걸 새삼 깨달았다.처음에는 단순히 문자열만 저장하는 줄 알았는데, 실제로는 다양한 자료형을 지원하고 있었다.📚 기본 자료형 5가지1. String> SET mykey "안녕하세요!"OK> GET mykey"안녕하세요!"> SET counter 100OK> INCR counter(integer) 101 가장 기본적이고 많이 사용되는 자료형텍스트, 숫자, 이진 데이터 모두 저장 가능최대 512MB까지 저장 가능숫자라면 INCR, DECR 같은 연산 가능사용하기 유용한 상황간단한 캐싱할 때세션 정보 저장할 때카운터 (조회수, 좋아요 수 등)API 토큰 저장할 때2. List - 순서가 중요한 데이터들> LPUSH mylist "첫번째"..

DB 2025.06.24

TransientDataAccessResourceException

문제 Spring batch 사용 시 Read 방식을 List로 구현하였을 때에는 정상적으로 동작이 수행되었다이후, read방식을 paging 으로 변경 후 quartz가 실행되었을 때, TransientDataAccessResourceException 발생하였다. org.springframework.dao.TransientDataAccessResourceException: Cannot change the ExecutorType when there is an existing transaction 문제의 본질mybatis는 내부적으로 3가지 실행자(executor)를 지원한다.SIMPLE (디폴트) : 구문 실행마다 새로운 PreparedStatement를 생성REUSE : PreparedStateme..

TroubleShooting 2025.06.02

Github, Jenkins, Docker를 활용한 CI/CD - 3

이전 글에서 CI를 통해 Docker-compose.xml, dockerfiles 및 .jar file 이 jenkins 아카이브에 저장되었었다. 아카이브에 저장된 데이터들을 토대로 CD를 구현하기 위해 새로운 pipeline을 만든다. 1. 배포할 .jar 파일명2. public IP 명과금문제로 인해 IP가 바뀌게 되므로 이 두가지 값을 매개변수로 지정하여 사용할 예정이다. .jar 매개변수 명 : 이후에 작성할 script에서 호출하기 위한 이름Default Value : 초기 파라미터 값을 지정해준다. 잦은 변경이 일어나지 않을경우 유용하다설명 : 해당 파라미터가 어떤 파라미터인지 알아볼 수 있도록 설명하기 위한 부분 위와 동일하지만 public IP는 자주 바뀌기 때문에 default Value..

CI\CD 2025.05.19

Github, Jenkins, Docker를 활용한 CI/CD - 2

CI를 위한 pipeline 구성 젠킨스에서 하나의 CI/CD 프로젝트를 구축하기 위해서는 아이템(Item)을 생성하여야 한다.하나의 젠킨스 서버에 여러개의 아이템을 만들 수 있고 각각의 아이템들은 개발자가 설정하는 것에 따라 다르게 동작한다.젠킨스에서 아이템을 만드는 방법은 대표적으로 FreeStyle과 Pipeline이 존재한다.Freestyle장점웹 기반의 GUI를 통해 여러 플러그인을 쉽게 사용할 수 있다.단점:CI 파이프라인에 변경 사항을 만들기 위해서는 젠킨스에 로그인해 각각의 프리스타일 잡의 설정을 변경해야만 한다.CI/CD의 과정을 콘솔을 통해서만 확인할 수 있다.각각의 과정들을 한번에 보기 어렵다.Pipeline장점:파이프라인은 코드로 프로젝트 설정을 할 수 있어 프리스타일과 다르게 젠킨..

CI\CD 2025.05.17