Backend/Spring 24

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

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

Backend/Spring 2024.10.25

[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

[Spring] Bean Scope(빈 스코프) 란?

스프링에서 다양한 객체(Bean)를 관리하고, 그 생명주기와 사용 범위를 제어할 수 있습니다.이번 글에서는 스프링의 Bean Scope(빈 스코프)에 대해 알아보겠습니다.🧐  Bean이란?스프링에서 Bean이란 스프링 IoC(Inversion of Control) 컨테이너에 의해 관리되는 객체를 말합니다.스프링 애플리케이션에서는 대부분의 객체가 Bean으로 등록되고, 이를 통해 객체의 생명주기나 사용 범위를 쉽게 관리할 수 있습니다. Bean Scope란?Bean Scope는 말 그대로 Bean의 사용 범위를 의미합니다.예를 들어, 어떤 Bean은 애플리케이션 내에서 딱 하나만 생성되어야 하고, 어떤 Bean은 매번 새롭게 생성되어야 할 수도 있습니다.이런 필요에 따라 스프링에서는 다양한 스코프를 제공..

Backend/Spring 2024.09.21

[Spring] @NotNull, @NotEmpty, @NotBlank 차이점

@NotEmpty, @NotNull, @NotBlank는 Spring Boot에서 빈 값이나 null 값에 대한 유효성 검사를 할 때 사용하는 제약 조건 어노테이션입니다. 각각의 차이점을 이해하기 위해 어떤 값을 허용하고, 허용하지 않는지 살펴보겠습니다. 🙂 @NotNull@NotNull은 필드 값이 null이 아니어야 하는 어노테이션입니다.허용되지 않는 값null허용되는 값"" 빈 문자열, [] 빈 컬렉션 등적용대상모든 객체 타입(String, List, Map 등)사용 예시는 아래와 같습니다.@NotNull private String name; @NotEmpty@NotEmpty는 필드 값이 null이 아니면서, 길이가 0이 아니어야 하는 어노테이션입니다.허용되지 않는 값null, "" 빈 문자열, ..

Backend/Spring 2024.09.21

[Spring] AOP에 @EnableAspectJAutoProxy는 왜 필요할까?

Spring 프레임워크는 애플리케이션에서 횡단 관심사(Cross-Cutting Concern)를 분리하기 위해 AOP(Aspect-Oriented Programming)를 제공합니다. AOP는 로깅, 보안, 트랜잭션 관리와 같은 횡단 관심사를 비즈니스 로직과 분리하여 더 모듈화 된 코드를 작성할 수 있게 해 줍니다.그런데, 우리는 무심코 사용하고 있는 `@EnableAspectJAutoProxy`에 대해 알고 있을까요? 이 어노테이션은 어떻게 AOP 기능을 활성화하고, 어떤 역할을 할까요? 이번 글에서는 `@EnableAspectJAutoProxy`를 중심으로 Spring의 AOP에 대해 알아보겠습니다. 🫠 @EnableAspectJAutoProxy란?횡단 관심사란 무엇일까요?로깅, 보안, 트랜잭션 관..

Backend/Spring 2024.09.07

Spring Boot에서 WireMock을 사용해서 테스트하기

API를 호출하는 로직을 테스트할 때, 어떻게 외부 서비스에 대한 의존성을 제거하고 신뢰성 있는 테스트를 만들 수 있을까요? 🚀WireMock은 HTTP 요청과 응답을 시뮬레이션할 수 있는 강력한 도구입니다.실제 외부 API 없이도 자체적으로 제어된 환경에서 테스트를 수행할 수 있게 해 줍니다. WireMockWireMock은 주로 HTTP 기반의 API를 모킹하기 위한 강력한 도구입니다.Spring Boot와 쉽게 통합할 수 있어 REST 클라이언트나 외부 API와 상호작용하는 코드를 테스트하는 데 매우 적합합니다.WireMock을 사용하면 외부 API에 대한 의존성을 제거하여 더 독립적이고 신뢰성 있는 테스트 환경을 만들 수 있습니다. WireMock을 사용하는 이유독립성 유지실제 외부 API와의 ..

Backend/Spring 2024.08.30

Failed to validate connection 해결하기

애플리케이션 실행 중에 warning 센트리 알림이 울리기 시작했다..😅오류 메시지의 원인 및 해결 방안을 알아보도록 하겠습니다.이 오류 메시지는 HikariCP에서 MySQL 데이터베이스를 연결을 관리하는 동안 발생한 문제를 나타냅니다.구체적으로 MySQL 연결이 이미 닫힌 상태에서 HikariCP가 해당 연결을 사용하려고 시도했기 때문에 발생한 문제입니다.이 문제는 주로 연결 수명이 다한 후에도 HikariCP가 그 연결을 풀에서 사용하려고 시도하는 경우 발생합니다. 원인연결 수명이 만료됨MySQL 서버에서 연결이 유효 기간이 지나서 닫히면, HikariCP는 해당 연결을 사용하려고 할 때 문제가 발생합니다. MySQL 서버의 wait_timeout 설정이 짧게 설정되어 있는 경우 이 문제가 발생할..

Backend/Spring 2024.08.17

[Spring] @Scheduled 주기적인 작업 처리하기

Spring Framework는 다양한 기능을 제공하지만, 그중에서도 주기적인 작업을 관리하는 기능인 @Scheduled 어노테이션에 대해 알아보겠습니다. 🤓이 어노테이션을 사용하면 정해진 주기마다 특정 작업을 자동으로 실행할 수 있습니다. @Scheduled 란?@Scheduled를 Spring 스케줄링 기능을 제공하는 어노테이션입니다.메서드에 붙여서 주기적으로 실행될 작업을 정의할 수 있게 해 줍니다.예를 들어, 매일 자정에 특정 작업을 실행하거나 매주 월요일에 백업을 자동으로 수행할 수 있습니다. @Scheduled 어노테이션 기본 사용법@Sheduled를 사용하려면 Spring의 스케줄링 기능을 활성화해야 합니다.이를 위해 @EnableScheduling 어노테이션을 사용하여 스케줄링 기능을 활..

Backend/Spring 2024.07.27

[Spring] ArgumentResolver 사용하기

ArgumentResolver는 Spring MVC에서 컨트롤러 메서드의 매개변수를 해석하고 주입하는 기능입니다.컨트롤러에서 @RequestParam, @PathVariable를 사용하여 쿼리 파라미터나 경로 변수를 바인딩할 수 있고, 요청 본문을 바인딩하려면 @RequestBody를 사용합니다.하지만 Header, Session, Cookie 등의 방식의 데이터를 바인딩해야 할 때는 어떻게 해야 할까요? 🧐이때, ArgumentResolver를 사용하면 이러한 직접적이지 않은 방식의 데이터도 간편하게 가져올 수 있습니다.  ArgumentResolver 구현하기Custom ArgumentResolver를 구현해 보며 개념을 살펴보겠습니다.예를 들어, 클라이언트 요청에서 특정 헤더 값을 읽어와서 컨트롤..

Backend/Spring 2024.07.20