Backend 76

[Spring] 프록시 패턴(Proxy Pattern)

스프링 프레임워크에서 프록시 패턴은 다양한 기능을 제공하는 핵심 매커니즘 중 하나입니다.스프링에서는 프록시 객체를 통해 AOP(Aspect-Oriented Programming), 트랜잭션, 보안, 비동기 작업 등 다양한 부가 기능을 비즈니스 로직과 분리하여 쉽게 적용할 수 있습니다. 스프링의 프록시 패턴에 대해 알아보겠습니다. ✍️ 프록시 패턴의 개념프록시 패턴은 대리 객체(프록시)를 통해 실제 객체에 대한 접근을 제어하는 디자인 패턴입니다.클라이언트는 실제 객체를 직접 호출하지 않고, 프록시 객체를 통해 호출합니다.프록시 객체는 실제 객체에 대한 접근을 제어하며 중간에서 부가적인 작업(ex: 로깅, 권한 확인 등)을 수행할 수 있습니다.스프링에서는 이 프록시를 통해 공통 기능을 실제 객체에 투명하게 ..

Backend/Spring 2024.11.09

[Spring] @Async로 비동기 작업 최적화하기

`@Async`는 스프링에서 비동기 작업을 처리할 때 사용하는 강력한 도구입니다.비동기 작업을 통해 여러 작업을 동시에 실행하여 I/O가 오래 걸리거나 사용자 응답에 민감하지 않은 작업을 백그라운드에서 수행하게 함으로써, 시스템의 성능과 응답 속도를 향상할 수 있습니다. 이 글에서는 `@Async`와 스레드 풀 설정을 통해 비동기 작업을 어떻게 최적화할 수 있는지 알아보겠습니다.👩🏻‍💻  @Async란?`@Async`는 스프링에서 메서드를 비동기적으로 실행하도록 지정할 때 사용하는 어노테이션입니다.이 어노테이션을 적용하면 스프링은 별도의 스레드에서 해당 메서드를 실행하여 호출한 코드의 흐름이 메서드가 끝날 때까지 기다리지 않고 바로 다음 작업을 진행할 수 있습니다. @Async 어노테이션 적용 방법..

Backend/Spring 2024.11.08

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

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

Backend/Spring 2024.11.02

[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

[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

[Spring] HikariCP 동작 방식

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

Backend/Spring 2024.09.29

[Spring] HikariCP란?

HikariCP는 자바 애플리케이션에서 데이터베이스와 연결을 효율적으로 관리하기 위한 JDBC Connection Pool 라이브러리입니다.HikariCP의 기본 개념과 왜 필요한지를 살펴보도록 하겠습니다. 😽 HikariCP란?데이터베이스와 애플리케이션을 연결하는 방법인 JDBC는 요청이 많아지면 비효율적일 수 있습니다!그 이유는 요청마다 새로운 커넥션을 열고 닫는 비용이 크기 때문입니다.이 문제를 해결하기 위해 커넥션 풀(Connetion Pool)이라는 개념이 생겼습니다. 미리 여러 개의 커넥션을 만들어두고, 필요할 때 그 커넥션을 사용한 후 반환하는 방식입니다.HikariCP는 그중에서도 성능이 뛰어난 커넥션 풀(Connetion Pool) 라이브러리입니다.  왜 HikariCP를 사용하는가?일..

Backend/Spring 2024.09.27