개발은 재밌어야 한다
반응형
article thumbnail
[Spring] @Async로 비동기 프로그래밍 구현하기
Spring 2024. 11. 27. 22:44

Spring에서 제공하는 @Async는 비동기 작업을 간단히 구현할 수 있도록 해줍니다. 이 글에서는 @Async에 대해 포스팅하려고 합니다.1. @Async란 무엇인가?@Async는 메서드를 별도의 스레드에서 실행시켜 비동기 처리를 가능하게 하는 Spring 어노테이션입니다. 이를 통해 메인 스레드의 작업 흐름을 차단하지 않고도, 병렬로 작업을 수행할 수 있습니다.왜 @Async를 사용할까?응답 시간 단축: 백그라운드 작업 처리 중에도 빠르게 응답 반환.리소스 효율화: 스레드 풀을 사용해 리소스를 효과적으로 관리.코드 간소화: 복잡한 스레드 관리 없이 비동기 작업 구현.2. @Async 설정@Async를 사용하려면 설정이 필요합니다.Step 1. @EnableAsync 활성화Spring 애플리케이션에서..

article thumbnail
@NotNull, @NotEmpty, @NotBlank의 차이점과 사용법
Spring/Spring 2024. 11. 22. 16:17

Spring Boot 애플리케이션을 개발할 때 입력 값의 유효성을 검증하는 것은 중요한 과정입니다. 이를 위해 자주 사용하는 어노테이션 중 하나가 Bean Validation에서 제공하는 @NotNull, @NotEmpty, @NotBlank입니다. 이 글에서는 각 어노테이션의 차이점과 사용법을 예제와 함께 알아보겠습니다.@NotNull, @NotEmpty, @NotBlank란?이 세 가지 어노테이션은 Java Bean Validation API(javax.validation.constraints)에서 제공되며, 주로 Spring Boot의 유효성 검사 과정에서 사용됩니다.각각의 동작 방식은 다음과 같습니다.어노테이션설명대상 타입@NotNull값이 null이 아니어야 합니다.모든 객체 타입@NotEmpt..

article thumbnail
Spring Retry로 안전한 Feign 호출 처리하기
Spring/Spring 2024. 11. 20. 12:44

비즈니스 로직을 처리하다 보면 비동기적으로 데이터가 생성되거나, 외부 API 호출 시 타이밍 이슈로 데이터가 준비되지 않아 실패하는 상황을 자주 겪게 됩니다. 특히, Feign 클라이언트를 사용할 때 외부 API가 아직 데이터 준비를 마치지 않은 상태라면 null 값이나 예외가 발생할 수 있습니다.최근 저 역시 이런 문제를 경험했는데, 이를 해결하기 위해 Spring Retry를 활용해 재시도 로직을 도입했고, 최종적으로 실패한 경우에만 알림을 전송하는 구조로 개선했습니다. 이 과정을 공유하고자 합니다.문제 상황Feign 호출 실패외부 API 호출 시 데이터가 아직 생성되지 않아 예외(null)가 발생.재시도 필요외부 시스템이 데이터를 생성하는 데 약간의 지연 시간이 필요하므로, 요청을 일정 시간 간격으..

article thumbnail
Spring에서 동일한 타입의 Bean 충돌 문제 해결하기
Spring/Spring 2024. 11. 19. 15:45

Spring 애플리케이션을 개발하다 보면, 의존성 주입 중 동일한 타입의 Bean 충돌 문제를 경험할 수 있습니다. 이번 포스팅에서는 이 문제의 원인과 이를 해결하기 위한 다양한 방법을 소개합니다.에러 상황: 동일한 타입의 Bean 주입 충돌Spring 컨테이너가 특정 Bean을 주입하려 할 때, 동일한 타입의 Bean이 여러 개 정의되어 있다면 다음과 같은 에러가 발생할 수 있습니다.에러 메시지 예시Parameter 3 of constructor in com.example.controller.MyController required a single bean, but 2 were found: - userServiceImpl1: defined in [com.example.service.UserServi..

article thumbnail
스프링에서 Bean 등록 및 관리: 어노테이션을 통한 의존성 주입
Spring/Spring 2024. 11. 11. 01:47

스프링 프레임워크에서는 객체를 관리하고, 필요한 곳에 자동으로 주입하는 의존성 주입(Dependency Injection, DI) 을 통해 의존성을 주입할 수 있습니다. 이 글에서는 스프링에서 @Configuration, @Bean, @Component, @Service, @Repository와 같은 어노테이션을 활용하여 Bean을 등록하고 관리하는 방법에 대해 설명하겠습니다.스프링에서 Bean이란?스프링에서 Bean은 스프링 컨테이너가 관리하는 객체를 의미합니다. 이러한 Bean은 스프링의 DI(Dependency Injection)를 통해 의존 관계를 해결하고, 객체 간의 연결을 관리합니다. 스프링에서 Bean 등록 방법@Configuration@Configuration 어노테이션은 스프링 프레임워크..

article thumbnail
Lombok 어노테이션 정리
Spring/Spring 2024. 10. 17. 01:49

Lombok은 자바(Java) 개발에서 반복되는 코드를 자동으로 생성해주는 매우 유용한 라이브러리입니다. 주로 자바 모델 클래스(POJO)에서 자주 쓰이는 Getter, Setter, toString(), Equals와 같은 메서드들을 어노테이션으로 간단하게 처리할 수 있어 코드의 가독성과 생산성을 크게 높여줍니다. Lombok은 코드의 중복을 줄이고 유지보수를 쉽게 만들어주는 라이브러리로, 특히 엔터프라이즈급 애플리케이션을 개발할 때 많은 이점을 제공합니다. 이번 포스팅에서는 Lombok에서 자주 사용되는 어노테이션을 정리해보겠습니다. @Getter / @Setter@Getter: 클래스의 모든 필드에 대해 getter 메서드를 자동으로 생성합니다.@Setter: 클래스의 모든 필드에 대해 setter..

article thumbnail
Spring Boot에서 @Value로 주입된 값을 Static 변수로 사용하기
Spring/Spring 2024. 10. 11. 17:56

Spring Boot에서 애플리케이션 설정 파일(application.yml 또는 application.properties)의 값을 주입받기 위해 우리는 흔히 @Value 어노테이션을 사용합니다. 그러나 주입받은 값을 static 변수로 사용하려고 할 때는 몇 가지 제한 사항이 있습니다. 이번 포스팅에서는 @Value로 주입된 값을 static 변수에 저장하고 전역적으로 사용하는 방법을 알아보겠습니다.문제 상황: @Value와 static 변수의 사용Spring에서는 @Value 어노테이션을 통해 yml 또는 properties 파일의 값을 필드에 주입할 수 있습니다. 하지만 이 어노테이션은 인스턴스 필드에만 사용할 수 있으며, static 필드에는 직접 주입할 수 없습니다. @Component publ..

article thumbnail
스프링에서 DI(Dependency Injection)를 활용한 서비스 계층 설계 및 @Autowired와 생성자 주입의 차이점
Spring/Spring 2024. 10. 8. 02:28

스프링 프레임워크는 객체 지향 프로그래밍에서 핵심적인 디자인 패턴인 의존성 주입(DI, Dependency Injection)을 지원합니다.DI는 객체 간의 의존 관계를 개발자가 아닌 프레임워크가 자동으로 주입해주는 방식으로, 코드의 결합도를 낮추고, 유연성과 테스트 용이성을 높여줍니다.이번 글에서는 서비스 계층(Service Layer)을 DI를 활용해 설계하는 방법과, DI의 주요 방식인 @Autowired 필드 주입과 생성자 주입의 차이점을 알아보겠습니다. 의존성 주입 DI(Dependency Injection)란?의존성 주입(Dependency Injection)은 클래스가 다른 클래스에 의존할 때, 직접 생성하지 않고 외부에서 필요한 객체를 주입받는 방식입니다.이를 통해 객체 간의 결합도를 낮추..

article thumbnail
[MSA] Hystrix 와 resilience4j를 통한 circuit breaker
Spring/Spring 2023. 8. 30. 10:22

MSA 환경에서의 장애 양상MSA에서 더 위험한(빈번한) 실패 시나리오는 서버가 완전히 뻗어버리는게 아니라,버벅거리지만 동작하는 서버가 더 위험할 수 있다. Feign Client와 같이 호출하는 쪽에서는 다른 서비스로 호출을 동기식으로 하기 때문에 응답에 오랜 시간이 걸리더라도 호출을 중단하지 않기 때문입니다. 위 처럼 A,B,C의 서비스가 MSA를 구성하고 있다고 했을때. 서비스 C는 DB를 읽어오는 역할을 하고 있습니다. 지속적으로 DB에서 응답 지연이 발생하고 있는 상황에서 서비스 B가 지속적으로 C를 호출하게 된다면 C에서는 DB에 붙는 커넥션 풀이 고갈되고, B는 C를 반복 호출하면서 C의 스레드 풀을 모두 소진하게 된다.서버 A 역시 B의 스레드 풀이 소진되면 장애가 발생할 가능성이 높습니다..

article thumbnail
엑셀 다운로드 에러 발생 해결 - FontConfiguration에서 NullPointerException 발생
Spring/Spring 2023. 4. 5. 19:19

엑셀 다운로드 기능이 갑자기 안되는 일이 생겨났다에러 로그를 살펴보니 FontConfiguration쪽에서 NPE(NullPointerException)가 발생했다발생로그더보기org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.InternalError: java.lang.reflect.InvocationTargetException org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.InternalError: java.lang...

article thumbnail
스프링 부트 config 사용법
Spring/Spring 2022. 7. 12. 14:01

스프링 부트에서 컨피그 서비스 사용법 1 Spring에서 제공하는 Environment를 활용하는 방법이다.Legacy( Spring3.x) 에서 사용한 방법과 동일하다.사용법 2가 스프링 부트에서 권장하는 방법이다.@Slf4j@Servicepublic class TempService { @Autowired private ConfigurableEnvironment environment; public void test() { environment.getProperty("gateway.test"); }}  스프링 부트에서 컨피그 서비스 사용법 2 스프링부트에서 지원하는 @ConfigurationProperties를 활용하는 방법이다.스프링 부트에서 설정이 편리해진 이유 ..

article thumbnail
@RequiredArgsConstructor란?
Spring/Spring 2022. 6. 10. 19:08

Lombok으로 스프링에서 DI(의존성 주입)의 방법 중에 생성자 주입을 임의의 코드없이 자동으로 설정해주는 어노테이션이다. @RequiredArgsConstructor는 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성해 줍니다. 새로운 필드를 추가할 때 다시 생성자를 만들어서 관리해야하는 번거로움을 없애준다. (@Autowired를 사용하지 않고 의존성 주입)  예시)@RequiredArgsConstructor 를 사용한 예시@RestController@RequiredArgsConstructor@RequestMapping("/example")public class RequiredArgsConstructorControllerExample { private fina..

반응형