Spring & Springboot

Spring READ 관련 API에서 @Transactional(readOnly = true)는 필수인가?

Spring에서는 @Transactional(readOnly = true) 옵션을 제공합니다. 실제로 많은 사람들이 쓴 글들을 보면 조회 관련 API에서 @Transactional(readOnly = true) 옵션을 사용하면 성능 상 이점을 얻을 수 있다고 말하는데요. 이번 글에서는 @Transactional(readOnly = true)을 사용할 때 얻을 수 있는 이점에 대해 [1] 실제 소스 코드를 보며 분석해보고, [2] 그렇다면 과연 단점은 없는지에 대해서도 확인해보려고 합니다. 1. @Transactional(readOnly = true) 동작 방식과 성능 상 이점 먼저 Transactional 인터페이스에 기재되어 있는 readOnly() 옵션에 대한 설명을 읽어보겠습니다. 크게 두 가지 포..

2023.11.10 게시됨

Spring & Springboot

장애 전파 대응을 위한 Resilience4j Circuit Breaker 실습

MSA 환경에서 한 서비스에 문제가 생겼을 때 다른 서비스에 영향을 최소화하는 것은 매우 중요합니다. 서로 의존성이 있는 두 서비스 중 한 서비스에서 발생하는 네트워크 지연 장애, 캐시 노드 장애, 내부 로직의 장애는 산불처럼 결국 두 서비스 모두에 전파되어 더 큰 장애 상황을 만들기 때문입니다. 1. Resilience4j Resilience4j 라이브러리는 CircuitBreaker, RateLimiter, Retry, Bulkhead, TimeLimiter 등과 같은 다양한 장애 대응 패턴을 구현하고 제공합니다. Circuit Breaker: Circuit Breaker 패턴을 구현하며, 서비스 호출의 장애를 모니터링하고 지정된 임계값 이상의 실패가 발생하면 서비스 호출을 차단하여 더 많은 장애를 ..

2023.11.06 게시됨

Design Pattern

예제 코드로 이해해보는 디자인 패턴 - 데코레이터 패턴(Decorator Pattern)

데코레이터 패턴(Decorator Pattern)은 객체에 동적으로 추가적인 책임을 더해줄 수 있는 디자인 패턴입니다. 데코레이터 패턴을 구현할 때는 서브클래스의 상속(Inheritance)이 아닌 Composition(조합, 구성)을 활용하는데요. 서브 클래스를 활용했을 때도 부모의 역할에 더해 자식의 책임을 추가할 수 있겠지만, 모든 자식이 똑같은 부모의 역할을 상속받아야하고 기능을 확장할 때마다 상속 구조를 다시 설계해야 하는 문제가 발생하게 됩니다. 약간 추상적인 이야기이기 때문에 예제 상황과 코드를 통해 데코레이터 패턴을 이해해보도록 하겠습니다. 1. 코드로 이해하기 데코레이터 패턴을 구현해보기 위해 아래와 같은 상황을 생각해보겠습니다. 피자 가게를 운영하는데 피자에는 다양한 토핑이 존재할 수 ..

2023.11.05 게시됨

Design Pattern

예제 코드로 이해해보는 디자인 패턴 - 옵저버 패턴(Observer Pattern)

0. 옵저버 패턴(Observer Pattern)? 옵저버 패턴(Observer Pattern)은 주체(Subject)와 관찰자(Observer) 사이의 관계를 정의하고 주체의 상태(State)가 변경될 때, 이 변경사항을 관찰자에 전파하는 패턴입니다. [헤드 퍼스트 디자인 패턴(개정판) 14가지 GoF 필살 패턴! 유지 관리가 편리한 객체지향 소프트웨어를 만드는 법] 책에서는 아래와 같은 상황으로 옵저버 패턴을 설명하는데요. 신문사가 사업을 시작하고 신문을 찍어낸다. 독자가 특정 신문사에 구독 신청을 하면 매번 새로운 신문이 나올 때마다 배달을 받을 수 있다. 구독을 해지하기 까지 신문을 계속 받을 수 있다. 신문을 더 이상 보고 싶지 않으면 구독 해지 신청을 한다. 그러면 더 이상 신문이 오지 않는다..

2023.11.03 게시됨

Design Pattern

예제 코드로 이해해보는 디자인 패턴 - 전략 패턴(Strategy Pattern)

전략 패턴(Strategy Pattern)은 특정 작업에 대해 여러 가지 알고리즘을 적용해야 할 때, 사용자가 런타임에 실제로 사용할 구현체를 결정할 수 있도록 하는 패턴입니다. 전략 패턴은 여러 알고리즘을 각각의 클래스로 캡슐화하고 사용자는 특정 클래스를 런타임에 선택하여 해당 클래스가 가진 알고리즘을 동작하도록 합니다. 이번 글에서는 예제 코드를 작성해보면서 전략 패턴에 대해 이해해보고자 합니다. 1. 예제 코드 물건을 구입할 때 총 결제 금액을 계산해야 하는 상황에서 결제 수단에 따라 다른 방식의 계산법이 적용될 수 있습니다. 예를 들어, 카드로 계산할 때는 물건들의 총 금액을 합한 금액을 모두 지불해야 하지만 현금으로 결제하면 5% 할인 혜택을 받을 수 있다고 해보겠습니다. 이를 위해 아래와 같이..

2023.10.29 게시됨

Java & Kotlin

ThreadLocal을 사용할 때 주의할 점

이번 글에서는 Java ThreadLocal 클래스에 대해 소개합니다. ThreadLocal 클래스는 어떻게 구현되어 있는지 코드를 분석해보고, 간단한 사용법과 주의해야 할 점에 대해 정리해보겠습니다. 1. ThreadLocal? Java ThreadLocal 클래스를 확인해보면 아래와 같이 ThreadLocal에 대한 전반적인 소개로 시작합니다. 요약하면, ThreadLocal 클래스는 쓰레드 단위로 로컬 변수를 관리할 수 있는 방법을 제공하고 각 변수는 쓰레드별로 get/set 메서드로 접근할 수 있다는 것인데요. user ID, Transaction ID와 같이 쓰레드와 관련된 상태를 연관해서 저장해야 하는 상황에서 ThreadLocal 인스턴스를 사용할 수 있다고 예시를 들어주고 있습니다. 즉, ..

2023.10.22 게시됨

Spring & Springboot

JPA 트랜잭션 격리 수준과 낙관적 락 동작을 테스트해보자.

이전에 작성한 글에서는 트랜잭션이 보장해야 할 ACID 개념과 MySQL에서의 트랜잭션 격리 수준에 대해 살펴보고 직접 테스트해봄으로써 각 격리수준에서 어떤 문제가 발생할 수 있는지 살펴봤습니다. MySQL의 트랜잭션 격리 수준 실습해보기 트랜잭션은 ACID라는 아래 네 가지 조건을 만족해야 합니다. 원자성(Atomicity) : 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하든, 모두 실패해야 한다. 일관성(Consistency) studyandwrite.tistory.com 위 글에서 이야기했던 내용을 간단하게 요약해보면 아래와 같이 정리할 수 있을 것 같은데요. [1] READ UNCOMMITTED 격리 수준에서는 커밋하지 않은 데이터를 읽을 수 있어서 DIRTY READ 라..

2023.10.15 게시됨

Spring & Springboot

@SpringBootApplication과 AutoConfiguration 들여다보기

SpringBoot 프로젝트를 생성하면 @SpringBootApplication 어노테이션이 붙은 Application 클래스가 생성됩니다. 그리고 @SpringBootApplication은 크게 세 가지 어노테이션(@SpringBootConfiguration, @EnableAutoConfiguration, @ComponentScan)을 포함하고 있는데요. 이번 글에서는 SpringBoot 애플리케이션의 동작의 가장 시작점에 있는 각 어노테이션이 하는 역할을 살펴보고, SpringBoot의 AutoConfiguration 기능의 동작 원리에 알아보겠습니다. 1. @SpringBootConfiguration @SpringBootConfiguration 어노테이션을 들여다보면 아래처럼 @Configurati..

2023.10.07 게시됨

MySQL

MySQL의 트랜잭션 격리 수준 실습해보기

트랜잭션은 ACID라는 아래 네 가지 조건을 만족해야 합니다. 원자성(Atomicity) : 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하든, 모두 실패해야 한다. 일관성(Consistency) : 모든 트랜잭션은 일관성있는 DB 상태를 유지해야 한다. 가령, 트랜잭션의 결과는 DB에서 정한 무결성 제약 조건을 항상 만족해야 한다. 격리성(Isolation) : 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리해야 한다. 지속성(Durability) : 트랜잭션이 성공적으로 끝나면 그 결과가 항상 기록되어야 한다. 그리고 이 네 가지 조건 중에서 격리성을 완벽히 보장하기 위해서는 사실 상 개별 트랜잭션이 동시에 처리되지 않고 순서대로 처리되어야 하는데요. 문제는 이..

2023.09.14 게시됨

Thinking

입사 1년, 회고

9월 5일, 입사한 지 벌써 일 년이 지났다. 지난 매 순간들에는 1년 회고를 작성할 때가 되면 많은 이야기들을 쓸 것 같다는 생각을 했지만, 막상 1년 회고를 쓰는 시점이 오니 아직은 수확철이 되지 않은 생각들을 미리 내놓아야 하는 것 같은 느낌이 든다. 그래도 계속 미루다 보면 2023년 회고와 같이 쓰게 될 것 같아서, 지금 드는 생각들을 짧게 몇 가지만 적어보려고 한다. 그냥 나로서 기술적인 것에 관한 느낀점이나 성장에 대한 일기는 뒤로 하고, 먼저 그냥 나에 대한 회고를 해보려고 한다. 동경 2022년 8월에 작성한 회고를 다시 읽어봤다. 2020년 여름부터 지금까지 0. 들어가기 전에 원래 한참 전부터 지난 날들을 회고하는 글을 써보려고 했는데, 계속 미루다가 지금에서야 쓰게 됐다. 사실 회고..

2023.09.09 게시됨