분류 전체보기 22

Mysql, MariaDB 그리고 MVCC의 쓰기 충돌 감지

진행하고 있는 사이트 프로젝트에서는 애플리케이션 로직을 통해 DB 데이터를 업데이트 하는 과정에서 동시성 문제가 발생하는 것을 방지하기 위해 Redis 분산락, DB 비관적락, Atomic Update를 사용하고 있습니다.흔히 접할 수 있는 예시로 상품 재고 차감, A계좌에서 B계좌로의 이체 상황 등이 있습니다. fun registerCoupon(userId: Long, couponCode: String) { lockManager.executeWithLock( generateRegisterCouponKey(userId, couponCode) ) { userCouponRegister.registerCoupon(userId, couponCode) }} 기존에는 대부분 위 코드처럼 Re..

database 2025.04.29

코루틴 맛 보기

이벤트 재발행 처리하기 - Transactional Outbox Pattern이벤트 발행으로 결제 후처리 하기점점 많아지는 결제 후 처리 과정진행중인 사이드 프로젝트는 수능 문제를 구매하는 플랫폼으로 유저는 포인트를 지불해서 수능 문제를 구매할 수 있습니다.pe4g3r.tistory.com 사이드 프로젝트에서 Transactional Outbox Pattern을 도입하였습니다.이전 포스팅에서는 발행되지 않은 이벤트를 DB로부터 1000개 단위로 조회하고 AWS SNS로 재발행하는 로직을 코루틴으로처리하였습니다. AWS SNS 발행은 AWS API를 사용하기에 1000개의 요청을 동시적으로 처리하기 위해 코루틴을 도입하였습니다.단순히 사용법 정도만 익히고 작성한 코드여서 공식문서를 다시 읽어보는 시간을 가..

kotlin 2025.04.26

코틀린 이모저모 - 5

Function Parameterfun param(a: Int, b: Int = 100, c: Int = 100): Int { return a + b + c}fun main() { param(a = 1, b = 2, c = 3) param(a = 1, c = 3)} 코틀린에서 함수의 파라미터는 default 값을 가질 수 있습니다. 위 코드에서도 param 함수를 호출할 때 default 값이 있는 파라미터를전달하지 않는 경우는 default 값이 사용되며 함수를 호출할 때 파라미터 이름을 명시해서 어떤 값을 전달할 지 정할수도 있습니다.Single-expression functionfun double(x: Int): Int = x * 2fun double(x: Int) = x * 2 코..

kotlin 2025.04.23

코틀린 이모저모 - 4

Inline Value Classclass Product( private val name: String, private val price: Int)// ------------------------------class Product( private val name: String, private val price: Price)class Price( private val price: Int) 상품을 의미하는 Product 클래스에서 가격을 보관할 때 Int 값으로 가격을 보관할 수도 있지만, 주로 DDD 관련 이론에서 볼 수 있는값을 의미있는 특정 타입으로 감싸서 보관하는 방법도 있습니다. 이런 경우 별도의 클래스를 만들어서 처리할 수 있습니다.class Product( pri..

kotlin 2025.04.16

코틀린 이모저모 - 3

확장 함수fun String.twicePrint() { println(this) println(this)}fun main() { val str = "Hello World" str.twicePrint()}// Hello World// Hello World 일반적으로 클래스, 인터페이스에 기능을 추가하고 싶다면 상속 혹은 디자인 패턴을 통해 처리를 해줘야했습니다.하지만 위 예제는 String이라는 클래스에 twicePrint라는 메서드를 추가했습니다.직접적으로 String 클래스를 수정한 것이 아닌 추가적인 선언만 했습니다. 이러한 기능을 코틀린에서는 확장 함수라고 합니다.open class Shapeclass Rectangle: Shape()fun Shape.getName() = "S..

kotlin 2025.04.12

코틀린 이모저모 - 2

Classclass Person { /*...*/ } 코틀린은 class 키워드를 통해 클래스를 정의할 수 있습니다.class Person constructor(firstName: String) { /*...*/ } // OKclass Person(firstName: String) { /*...*/ } // OK 클래스 선언부에 constructor 키워드를 사용하여 기본 생성자를 정의할 수 있습니다.기본 생성자가 가시성 수성자 private, protected, internal을 필요로 하지 않는다면 constructor 키워드는 생략 가능합니다.(Java - 접근 제어자)class Car(color: String, weight: Int, speed: Int, storage: Int) { val ..

kotlin 2025.04.11

코틀린 이모저모 - 1

Kotlin Docs | Kotlin kotlinlang.org 프로젝트를 코틀린으로 전환한 이후 문법 공부를 위해 코틀린의 공식문서를 쭉 읽으면서 자바와는 달랐던 것, 코틀린의 신기한 것들을위주로 정리하기로 하였습니다.Smart casts코틀린에서는 is 키워드를 통해 객체가 특정 타입인지 확인할 수 있습니다.if (obj is String) { println("obj is String")} if문을 만족한다면 obj라는 객체는 String 타입이란게 확실하다는 것이죠.fun demo(x: Any) { if (x is String) { print(x.length) // x is automatically cast to String }} 위 코드처럼 컴파일러가 특정 객체의 타입..

kotlin 2025.04.10

이벤트 재발행 처리하기 - Transactional Outbox Pattern

이벤트 발행으로 결제 후처리 하기점점 많아지는 결제 후 처리 과정진행중인 사이드 프로젝트는 수능 문제를 구매하는 플랫폼으로 유저는 포인트를 지불해서 수능 문제를 구매할 수 있습니다.public void payment(Long userId, List questionIe4g3r.tistory.com위 포스팅에서는 Transactional Outbox Pattern을 도입하여 이벤트 발행 실패로 발생할 수 있는 데이터 정합성 문제를 방지하였습니다.해당 포스팅을 작성한 시점에는 OutBox 테이블만 구현하였고 재발행하는 로직을 작성하지 않았습니다.Transactional Outbox Pattern을 마무리하기 위해 이번에는 이벤트 재발행을 처리해보았습니다.class QuestionPaymentEvent( ..

spring 2025.04.08

Spring Security 들여다보기 (2)

Spring Security 들여다보기 (1)Spring / Spring Security filter chain 들여다보기Spring 혹은 Spring Security를 사용하면 filter라는 키워드를 종종 듣게 됩니다.단순히 Http 요청이 Spring Application 영역으로 전달되기 전에 Servlet단에서 chain 형식e4g3r.tistory.com 지난 포스팅에서는 Spring Security Filter Chain의 흐름을 살펴보았습니다.작성한 포스팅을 다시 읽어보니 인가 과정에 좀 치우쳐져 있는 것 같아 이번에는 인증 과정을 좀 더 살펴보았습니다.SecurityContextHolder, SecurityContext, Authentication 지난 포스팅에서도 언급 되었던 Sprin..

spring 2025.04.05

Spring Security 들여다보기 (1)

Spring / Spring Security filter chain 들여다보기Spring 혹은 Spring Security를 사용하면 filter라는 키워드를 종종 듣게 됩니다.단순히 Http 요청이 Spring Application 영역으로 전달되기 전에 Servlet단에서 chain 형식으로 연결되어 있는 filter들을 하나씩실e4g3r.tistory.com 지난 포스팅에서 Servlet Filter가 어떻게 처리되는지 확인해보면서 간단하게 Spring Security Filter Chain을 간단하게 살펴보았습니다.이번에는 Spring Security Filter Chain 내부를 좀 더 자세히 보면서 정리하는 시간을 가져보았습니다. 제가 진행중인 프로젝트는 모든 URL을 permitAll 해주고..

spring 2025.04.02