분류 전체보기 174

동시성 문제 해결을 위한 ThreadLocal 이해하기

Spring 웹 애플리케이션은 요청마다 새로운 스레드를 생성하여 처리합니다.이 멀티스레드 환경에서 각 요청이 독립적이어야 하지만, 공용 데이터에 동시에 접근하면 동시성 문제가 발생할 수 있습니다.ThreadLocal은 이러한 문제를 해결하는 데 유용한 도구로, 각 스레드에 독립된 저장 공간을 제공하여 안전하게 데이터를 관리할 수 있게 합니다. 이번 글에서는 ThreadLocal의 개념과 Spring 프레임워크에서의 활용 방법을 살펴보겠습니다.😽 ThreadLocal이란?📝 `ThreadLocal`은 각각의 스레드가 독립적으로 변수 값을 저장할 수 있도록 하는 클래스멀티스레드 환경에서는 여러 스레드가 하나의 자원을 동시에 접근하는 경우가 많은데 이때 발생하는 동시성 문제를 해결하기 위해 각 스레드에 고..

Backend/Spring 2024.11.02

MongoDB 인덱스와 인덱싱 전략 이해하기

데이터가 많아질수록 찾고자 하는 특정 데이터를 빠르게 조회하는 것이 중요해집니다.만약 인덱스가 없다면, 데이터베이스는 모든 문서를 처음부터 끝까지 읽어가며 일일이 비교해야 합니다. 이렇게 되면 데이터가 많을 때는 조회 속도가 매우 느려지겠죠?🤔 인덱스가 있으면 지정한 필드에 대한 위치를 미리 알고 있기 때문에 빠르게 찾을 수 있습니다.이 글에서 MongoDB의 인덱스에 대해 알아보겠습니다.  동작 원리MongoDB의 인덱스는 B-트리 구조로 만들어집니다.이는 데이터가 오름차순이나 내림차순으로 정렬된 트리 구조로 특정 값에 접근할 때 트리의 높이에 비례하여 빠르게 이동할 수 있습니다. 이렇게 만들어진 인덱스 덕분에 특정 값을 탐색하거나 범위 조회가 가능해지며 이 과정에서 많은 시간을 절약할 수 있습니다...

Data/MongoDB 2024.10.31

[Spring] @EventListener VS @TransactionEventListener

@EventListener와 @TransactionEventListener는 둘 다 Spring에서 이벤트 리스닝을 위해 사용되지만 트랜잭션 처리 여부에 따라 다르게 작동합니다. 각 어노테이션의 차이와 사용 사례를 통해 자세히 비교해 볼게요.🤔 @EventListener기능: 특정 이벤트를 구독하여 이벤트 발생 시 해당 메서드를 실행하도록 합니다.트랜잭션 의존성: 트랜잭션 상태에 관계없이 이벤트가 발생할 때마다 실행됩니다.사용 사례: 트랜잭션과 무관하게 즉시 실행해야 하는 작업이 있는 경우에 적합합니다.예를 들어, 간단한 로그 남기기, 로그 남기기, 알림 전송 등입니다.장점: 트랜잭션 상태와 상관없이 빠르게 이벤트 처리할 수 있습니다.단점: 트랜잭션이 취소되더라도 이벤트는 이미 발생했기 때문에 롤백된 ..

Backend/Spring 2024.10.26

[Spring] 스프링에서 이벤트 발행과 구독 @EventListener

Spring에서 ApplicationEvent 객체를 사용하여 특정 이벤트를 발생시키고 이를 구독하는 방식으로 서로 다른 컴포넌트 간 느슨한 결합을 제공할 수 있는 @EventListener에 대해 알아보겠습니다. 👩🏻‍💻  @EventListener특정 이벤트가 발생했을 때 이를 구독하고 정의된 메서드를 호출하는 역할을 합니다.예를 들어, 특정 조건이 발생했을 때 자동으로 알림을 보내거나 데이터를 갱신하는 작업을 비동기 방식으로 처리할 수 있습니다.이를 통해 모듈 간 결합도를 낮추고 이벤트가 발생하는 시점에만 필요한 작업을 수행할 수 있어 효율적입니다.  사용 예시예를 들어, 사용자가 가입할 때 가입 성공 후 환영 이메일을 전송하는 이벤트 핸들러를 작성할 수 있습니다. 이벤트 클래스public c..

Backend/Spring 2024.10.25

[Spring] 트랜잭션 상태에 맞춘 이벤트 처리 @TransactionalEventListener

@EventListener는 트랜잭션의 상태와 무관하게 이벤트를 수신하지만, @TransactionalEventListener는 이벤트 리스너가 트랜잭션 내에서 특정한 조건에 따라 동작하도록 합니다. 이를 통해, 예를 들어 트랜잭션이 성공적으로 커밋된 이후에만 이벤트를 처리하게 할 수 있습니다.이 글에서 트랜잭션 상태에 따라 이벤트를 처리할 수 있는 @TransactionalEventListener 대해 알아보겠습니다. 🙂  @TransactionalEventListenerSpring이 제공하는 트랜잭션 이벤트 리스너입니다.이 어노테이션을 사용하면 이벤트 리스너가 트랜잭션의 상태를 모니터링하며 이벤트를 처리할 수 있습니다.@TransactionalEventListener 어노테이션은 다음과 같은 옵션들..

Backend/Spring 2024.10.25

[DataBase] 샤딩(Sharding), 파티셔닝(Partitiong), 레플리케이션(Replication)

데이터베이스에서 대량의 데이터를 효율적으로 관리하고 성능을 최적화하기 위한 기법들에 대해 알아보겠습니다. 🤗 샤딩(Sharding)샤딩은 데이터 베이스를 수평으로 나누어 여러 서버에 분산 저장하는 기법입니다.데이터가 여러 서버에 분산되어 저장되므로, 시스템의 부하를 줄이고 성능을 향상할 수 있습니다. 샤딩의 장점부하 분산여러 서버에 데이터가 분산되어 요청을 병렬로 처리할 수 있습니다.확장성데이터가 늘어날 때 서버를 추가하여 쉽게 확장할 수 있습니다.장애 대응특정 서버에 장애가 발생해도 다른 서버가 계속 작동하므로 시스템의 가용성이 높아집니다.샤딩의 단점복잡성 증가샤딩을 구현하면 데이터 관리와 쿼리 로직이 복잡해질 수 있습니다.특히 데이터가 여러 샤드에 분산되어 있기 때문에 데이터 조회 시 여러 샤드를 ..

Data/DataBase 2024.10.20

[Java] @SuperBuilder란?

상속 구조에서 @Builder를 어떻게 사용할 수 있을지 고민하던 중, 더 유연한 방식으로 객체 생성 패턴을 지원하는 @SuperBuilder 어노테이션을 알게 되었습니다.이 글에서는 @SuperBuilder의 개념, 사용 예시, 그리고 이를 사용함으로써 얻을 수 있는 장점에 대해 알아보도록 하겠습니다.🧐 @SuperBuilder란?@SuperBuilder는 Lombok 라이브러리에서 제공하는 어노테이션으로 상속 구조에서 빌더 패턴을 간편하게 사용할 수 있도록 도와줍니다. 기본적으로 Lombok의 @Builder는 상속 구조를 지원하지 않기 때문에 상속된 클래스들에서 객체를 생성할 때는 여러 문제점이 발생할 수 있습니다. 이 문제를 해결하기 위해 등장한 것이 @SuperBuilder입니다.@SuperB..

Backend/Java 2024.10.17

[Java] String.valueOf()와 toString() 차이점

Java에서 사용하고 있는 String.valueOf()와 toString()은 객체를 문자열로 변환하는 데 사용되지만 약간의 차이가 있습니다.각각의 특징과 차이를 알아보겠습니다. 😺 String.valueOf()String.valueOf() 메서드는 다양한 타입(기본 타입과 객체 모두)을 받아서 이를 문자열로 변환합니다.이 메서드는 null 처리를 포함한 안전한 변환을 제공합니다.null 안전String.valueOf()는 인자로 전달된 객체가 null일 경우 "null"이라는 문자열을 반환합니다.다양한 타입 지원boolean, char, int, long, float, double 등의 기본 타입과 객체 타입을 처리할 수 있습니다.Object obj1 = null;System.out.println(..

Backend/Java 2024.10.14

[MySQL] 트리거(Trigger) 활용하기

MySQL 트리거는 데이터베이스 관리에서 매우 유용한 도구지만 활용법을 잘 알지 못하거나 지나치기 쉽습니다!트리거의 개념과 실제로 어떻게 활용할 수 있는지 확인해 보겠습니다.🧐 트리거(Trigger)란?MySQL 트리거는 데이터베이스 테이블 변경(INSERT, UPDATE, DELETE)이 일어날 때 자동으로 실행되는 SQL 코드입니다.이를 통해 데이터 무결성을 유지하거나 특정 이벤트가 발생했을 때 추가 작업을 자동화할 수 있습니다. 트리거는 다음 두 가지 조건에 따라 실행됩니다.DML 이벤트데이터 조작 이벤트, 즉 INSERT, UPDATE, DELETE 등이 발생할 때타이밍트리거가 발생하는 시점, 즉 BEFORE 또는 AFTER트리거의 유형BEFORE 트리거트리거가 테이블에 대한 조작이 일어나기 전..

Data/MySQL 2024.10.09

[Spring] HikariCP 동작 방식

HikariCP의 성능과 효율성을 구체적으로 이해하고 이를 실제로 어떻게 구현했는지 파악해 보겠습니다.👀 HikariCP의 아키텍처HikariCP는 간단한 설정을 통해 고성능 커넥션 풀링을 지원합니다. 내부적으로는 커넥션을 풀에 저장해 놓고 필요할 때마다 커넥션을 효율적으로 관리합니다. 그 과정을 관리하는 주요 클래스들은 다음과 같습니다.HikariDataSourceHikariCP의 시작점으로 기본 설정을 통해 커넥션 풀을 초기화하고 관리합니다.HikariPool실제 커넥션 풀을 관리하며 커넥션을 빌려주고 반환하는 과정을 처리합니다.PoolEntry풀내의 각각 커넥션을 표현하는 클래스입니다.ProxyConnection데이터베이스와의 실제 커넥션을 감싸서 풀에 반환할 때 사용하는 래퍼 클래스입니다. Hi..

Backend/Spring 2024.09.29