
[Spring] JPA OptimisticLock은 락을 잡지 않는가?
2025. 3. 9. 13:20
Spring/JPA
0. 들어가며JPA를 활용하여 애플리케이션을 개발하다 보면 동시성 문제를 해결하기 위해 낙관적 락(Optimistic Lock)을 적용하는 경우가 있습니다. @Version 애노테이션을 사용하면 간단하게 해결되는 것처럼 보이지만, 흔히 낙관적 락을 "락을 걸지 않는다"고 표현하기 때문에 실제로 MySQL에서 어떻게 동작하는지 궁금해졌습니다. MySQL에서 UPDATE 문을 실행할 때는 반드시 락을 획득해야 하는데, 그렇다면 JPA의 낙관적 락은 어떻게 "락 없이" 동작하는 것일까요? 이에 대한 궁금증을 해결하기 위해 찾아본 내용을 정리해보았습니다. 결론적으로, JPA의 낙관적 락은 애플리케이션 차원에서 제공하는 충돌 감지 메커니즘이며, MySQL에서는 UPDATE 수행 시 실제로 락을 거는 것이 맞습니다..

[Redis] Redis RedLock에 대하여.
2025. 3. 3. 23:38
Dev.
0. 들어가며분산 시스템을 운영하다 보면 여러 서버가 동시에 동일한 자원(데이터베이스, 캐시, 파일 등)에 접근해야 하는 상황이 자주 발생합니다. 이때 동시성 문제를 해결하지 않으면 데이터 불일치나 충돌이 발생할 수 있습니다. 이를 방지하기 위해 우리는 락(Lock)을 사용합니다. 분산 환경에서는 Redis를 이용한 분산락을 사용할 수 있는데요. 이때 주의할 점들이 있습니다. 예를 들어, 하나의 Redis 인스턴스를 이용해 락을 관리한다고 가정해 봅시다. 만약 이 Redis 서버가 다운되면 어떻게 될까요? 현재 락이 유지되고 있는지 확인할 수 없게 되고, 여러 개의 클라이언트가 동시에 동일한 자원에 접근하거나 모두가 접근하지 못할 위험이 생깁니다. 이 문제를 해결하기 위해 Redis 기반의 Redlock..

[Dev.] SPF, DKIM, DMARC: 이메일 보안을 위한 개념 정리
2025. 3. 2. 23:57
Dev.
0. 들어가며이메일은 기업과 개인 모두에게 핵심적인 커뮤니케이션 도구입니다. 중요한 비즈니스 거래, 개인 정보, 금융 거래 등이 이메일을 통해 주고받아지며, 이 과정에서 이메일의 무결성과 신뢰성이 보장되어야 합니다. 그러나 이메일은 오랜 시간 동안 스팸, 피싱, 도메인 위변조, 스푸핑 등 다양한 보안 위협에 노출되어 왔습니다. 예를 들어, 악의적인 공격자가 실제 도메인 소유자를 가장하여 이메일을 발송하면, 수신자는 이를 진짜 이메일로 오인하여 민감한 정보를 노출할 수 있습니다. 이러한 보안 위협을 막기 위해 이메일 인증 기술인 SPF, DKIM, DMARC가 도입되었습니다. 이 글에서는 이메일 도메인 보안의 핵심 기술인 SPF, DKIM, DMARC의 기본 개념, 동작 원리, 그리고 각각의 기술이 악의적..

[Java] JVM -XX: +AlwaysPreTouch 옵션 알아보기
2025. 3. 1. 17:44
Java & Kotlin
0. 들어가며자바 애플리케이션을 운영하면서 JVM의 다양한 옵션을 접하게 됩니다. 그 중 성능 튜닝에 유용한 옵션으로 -XX:+AlwaysPreTouch가 있습니다.이번 글에서는 JVM 메모리 구조와 운영 체제의 메모리 관리 기초를 살펴본 뒤, -XX:+AlwaysPreTouch 옵션이 무엇을 하는지, 활성화/비활성화 시의 차이는 무엇인지, 어떤 상황에서 유용한지와 성능 영향, 그리고 간단한 실험 결과까지 알아보겠습니다. 1. JVM 메모리 구조와 메모리 관리 기초1.1 JVM 메모리 구조JVM은 실행 시 여러 메모리 영역을 사용합니다. 그 중 힙(heap)은 보통 가장 큰 영역으로, 애플리케이션이 동적으로 할당한 객체들이 저장되는 공간입니다.-Xmx 옵션으로 설정한 최대 힙 크기까지 객체를 저장할 수..

[Spring] Cache Stampede 문제를 해결하는 Two-Level-TTL-Cache 구현
2025. 1. 11. 14:28
Spring
들어가며.캐시 만료 시점에 모든 요청이 DB를 찌르게되어 부하가 발생하는 문제인 Cache Stampede는 개발을 할 때 주의해야하는 사항 중 하나이다. 관련 내용은 아래 글에 잘 나와있다. 캐시 문제 해결 가이드 - DB 과부하 방지 실전 팁대용량 트래픽 환경에서 캐시를 사용할 때 주의해야할 위험 상황과 예방법을 소개합니다.toss.tech Cache Stampede를 해결하는 방식 중 분산락을 사용하는 방식이 있고, 그 중 가장 쉽게 생각할 수 있는 방식은 다음과 같다.캐시가 만료되면 캐시 갱신에 대한 Lock을 획득한 요청이 캐시를 갱신하고 다른 요청들은 대기하는 구조로 만든다.Lock을 획득한 요청이 캐시를 갱신하면 다른 요청들이 캐시를 읽는다.하지만 이렇게 만들게 되면 Lock을 획득한 요청..

스프링 부트는 어떻게 라이브러리 버전 관리를 자동으로 하지?
2024. 12. 12. 20:55
Spring
0. 들어가며스프링부트로 개발을 하다보면 다양한 외부 라이브러리를 활용하게 됩니다. 예를 들어, 웹 애플리케이션을 위해 spring-boot-starter-web을, DB 연동을 위해 spring-boot-starter-data-jpa를, JSON 처리를 위해 jackson 계열 라이브러리를 사용하죠.그런데 스프링부트를 사용하면 특정 라이브러리의 버전을 적지 않아도 프로젝트가 잘 빌드되고 동작합니다. 스프링부트는 의존성을 관리해주는 기능을 제공하는데, 어떻게 라이브러리 버전을 자동으로 관리하는지 궁금하여 알아본 내용을 글로 정리합니다. 1. 스프링 부트와 의존성 관리1.1 의존성 관리의 필요성프로젝트를 진행하다보면 수많은 라이브러리를 가져다 쓰게됩니다. 하나의 웹 애플리케이션을 개발한다고 해도 적어도 다..

Private Method를 테스트를 하고싶으면 어떡하지?
2024. 12. 4. 21:40
Spring
0. 서론NEXT STEP TDD 수업을 들으며 기능을 구현하던 와중 private method를 테스트하고 싶다는 생각이 들었는데요. private method를 테스트하면 좋지 않다고 들어왔기 때문에 멈칫하게 되었고, 이에 정말 private method 는 테스트하면 안좋은걸까라는 의문이 생겨서 이 글로 제 개인적인 의견을 정리해봅니다. 1. private method를 테스트하는 것이 왜 좋지 않은가?여러 자료를 살펴보면 private method를 테스트하는 것이 변경에 취약한 구조를 만든다고 합니다. 이에 대한 이해를 위해 public method와 private method의 변경 가능성에 대한 전제 하나를 만들고 가야하는데요. public method는 클래스 외부에 공개된 계약으로 간주됩..

BloomFilter에 대하여.
2024. 5. 29. 21:55
CS/자료구조
0. 들어가며 BloomFilter에 대해 알아보게 된 계기대규모 사용자 기반을 가진 서비스에서 사용자들에게 개인화된 정보를 제공하는 경우, 개인화된 정보를 효율적으로 저장하고 이를 빠르게 처리해야하는 것이 중요합니다. 하지만 DB만을 저장소로 사용하다보면 데이터가 쌓일수록 저장공간도 많이 사용해야하고, 트래픽이 많아질 수록 성능 저하가 생길 수 있습니다. 이러한 문제를 해결하기 위해 메모리를 효율적으로 사용하면서도 빠르게 특정 원소가 집합에 포함되어있는지 확인이 가능한 BloomFilter라는 자료구조를 도입해보았고, 도입하는 과정에서 BloomFilter에 대해 알아본 내용들을 정리해보려합니다.이번 글에서 다룰 내용 소개이번 글에서는 다음과 같은 내용을 다룹니다.BloomFilter가 무엇인지Bloo..

[Database] 인덱스(index)에 대하여.
2023. 12. 23. 02:28
CS/데이터베이스
0. 들어가며 데이터베이스의 쿼리 성능 향상을 위해 빼놓을 수 없는 것이 바로 인덱스입니다. 무지성으로 인덱스를 where 절에 있는 컬럼에 맞춰걸지 않지 않기 위해 공부한 내용을 정리해보려 합니다. 인덱스는 어떻게 동작하고, 인덱스를 걸었더니 왜 성능이 빨라진거지에 대한 물음을 얻는 것이 목표이며, 본 글의 내용은 Real MySQL 8.0을 주로 참고한 내용입니다. 따라서 MySQL과 InnoDB 스토리지 엔진을 기반으로 된 설명임을 알립니다. 이 글을 읽기 전 알고 있어야할 배경지식은 다음과 같습니다. B-Tree가 무엇인지 DB에 대한 간단한 지식 1. 데이터베이스의 디스크 읽기 HDD는 SSD에 비해 500배 느리고, SSD는 DRAM에 비해 1,000배 가량 느립니다. 또 DRAM은 CPU에 ..

[Kotlin] 코틀린에서의 제네릭에 대하여.
2023. 8. 31. 01:09
Java & Kotlin
0. 들어가며 🏃🏻♂️ 이번 글은 코틀린에서의 제네릭과 관련된 내용을 정리해보려합니다. 제네릭과 공변에 대한 내용은 한번 제대로 정리해보고 싶었는데 마침 코틀린 인 액션을 읽고 코틀린의 제네릭에 대해 배우게 되었습니다. 자바와 비슷하면서도 다른 기능들을 제공해주는데 제네릭 개념과 함께 이를 정리해보겠습니다. 본 글은 자바 혹은 코틀린 제네릭에 대한 문법정도는 알고 읽어야 도움이 되실 것 같습니다. 1. 들어가기 전 코드 베이스 설명 제네릭과 공변 관련 개념을 설명하기위해 본 글에서는 아래와 같은 코드를 예시로 사용하려 합니다. 간단한 코드이니 한번 살펴봐주세요! // 동물 open class Animal(val name: String) // 포유류 open class Mammal(name: String..