Backend/Spring 24

[Spring] WebClient vs RestTemplate 차이점 정리

평소 외부 API나 클라이언트와 연동할 때 WebClient와 RestTemplate을 자주 사용해 왔습니다.하지만 문득 "정확하게 어떤 차이가 있고, 언제 어떤 걸 써야 할까?"라는 생각이 들어 이번 기회에 정리해보려고 합니다.☁️ 🔍 RestTemplate이란?RestTemplate은 Spring 3부터 지원된 동기 방식의 HTTP 클라이언트입니다.가장 널리 쓰이는 getForObject(), postForEntity() 같은 메서드들을 통해 API를 쉽게 호출할 수 있어, 직관적이고 익숙한 방식이에요!RestTemplate restTemplate = new RestTemplate();String response = restTemplate.getForObject("https://api.exampl..

Backend/Spring 2025.06.29

JPA + AttributeConverter 사용 시 equals/hashCode가 필요한 이유

프로젝트에서 다음과 같은 Hibernate 경고 메시지를 마주쳤습니다. 😨HHH000481: Encountered Java type [...] which does not appear to implement equals and/or hashCode. This can lead to significant performance problems [...]처음 보면 당황스럽지만, 핵심은 간단합니다.equals/hashCode가 구현되어 있지 않아서 Hibernate의 Dirty Checking이 제대로 동작하지 않는다!이 글에서는 왜 이런 일이 생기는지, @AttributeConverter를 쓸 때 왜 equals/hashCode가 꼭 필요한지, 그리고 실제 코드로 어떻게 해결하는지를 정리해 보겠습니다. 왜 eq..

Backend/Spring 2025.06.02

[Spring] RestTemplate에서 PATCH가 안 된다면? 원인과 해결 방법 정리

RestTemplate를 사용하던 도중 PATCH 메서드를 호출할 때 아래와 같은 오류가 발생했습니다. 👀org.springframework.web.client.ResourceAccessException: I/O error on PATCH request for “https://api.example.com/resource/1”: Invalid HTTP method: PATCH; nested exception is java.net.ProtocolException: Invalid HTTP method: PATCH나는 위와 같은 오류를 경험했지만, PATCH 요청을 보낼 때 다음과 같은 다른 오류가 발생할 수도 있다고 합니다.org.springframework.web.client.HttpClientErrorE..

Backend/Spring 2025.03.01

[Spring] @Component vs @Bean

스프링 프레임워크에서 애플리케이션의 구성 요소를 관리할 때, `@Compnent`와 `@Bean`은 빈(Bean)을 등록하는 주요 방법입니다.두 어노테이션은 비슷해 보이지만 실제 사용 목적과 방법은 다릅니다. 이번 글을 통해서 적재적소에 맞게 스프링 빈을 등록하는 방법을 알아보겠습니다.✍️ @Component란?`@Component`는 개발자가 정의한 클래스(주로 도메인 계층 또는 애플리케이션의 주요 기능을 담당하는 클래스)를 스프링 컨테이너로 등록하기 위해 사용됩니다.자동 스캔- `@Component`는 클래스패스 스캔(ComponentScan)을 통해 스프링이 자동으로 탐지하고 빈으로 등록합니다.- 별도의 설정 없이 클래스에 어노테이션만 추가하면 빈으로 관리됩니다.어노테이션 타깃- 클래스, 인터페이스..

Backend/Spring 2024.11.16

[Spring]고성능 비동기 웹 개발의 시작: Spring WebFlux 알아보기

최근 고성능 비동기 API를 구현해야 할 필요가 생기면서 기존의 Spring MVC로는 처리 성능에 한계가 있음을 느꼈다..🤔더 많은 요청을 효율적으로 처리할 방법을 찾던 중, Spring이 기존 MVC 외에 논블로킹 비동기 웹 애플리케이션을 지원하는 Spring WebFlux를 제공한다는 것을 알게 되었습니다. 이글에서는 Spring WebFlux의 개념에 대해 알아보겠습니다. Spring WebFlux 개요Spring WebFlux는 비동기 및 논블로킹 I/O를 기반으로 한 웹 프레임워크입니다.전통적인 Spring MVC의 동기적 구조와 달리 WebFlux는 Reactive Streams API를 기반으로 논블로킹 방식의 고성능 비동기 웹 애플리케이션을 구축할 수 있습니다. 전통적인 Servlet ..

Backend/Spring 2024.11.11

[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