Spring Framework
-
MSA 환경에서 enum에 대한 위험성 줄여나가기Spring Framework 2024. 11. 16. 16:05
개요소프트웨어를 개발하다 보면 상수들의 집합을 관리하기 위해 enum을 활용하곤 합니다. ProductType을 enum으로 관리하게 된다면 여러 상품들을 enum으로 관리할 수 있습니다. 여러 서버에서 ProductType이라는 enum을 관리해야 한다면 어떤 일이 발생할 수 있을까요? 여러 서버에서의 불일치ProductType의 enum이 두 서버에서 관리된다면 혹은 백개의 서버에서 내부적으로 관리된다면 어떨까요? 새로운 Product가 추가되었을 때 관심사의 밖 혹은 추가하는것을 잊어서 여러 서버에서 차이가 발생하게 됩니다. 여러 서버에서의 불일치가 생기고, 신규 서버가 생성될때도 ProductType의 enum을 매번 추가해줘야 하는 불편함이 있을 것 같습니다. 공통 라이브러리로 관리하자만약 ..
-
Spring Bean 이름은 왜 소문자로 시작할까?Spring Framework 2024. 11. 3. 17:06
개요특정상황에서 Spring Bean의 이름으로 컨테이너에서 가져와서 활용하는 경우가 있었고 그 경우에 NoSuchBeanException이 발생하여 문제의 원인을 파악하고 알게 된 내용들을 정리해보고자 합니다. 스프링 컨테이너에 등록된 빈 이름은 어떻게 될까요?@Componentclass Z@Componentclass FooBar@Componentclass HTMLParser 대부분 일반적으로 앞자리가 소문자로 바뀌게 된다고 알고 있습니다.Z는 z로 FooBar는 fooBar로 HTMLParser는 hTMLParser로 바뀌게 될까요? @Componentclass BeanTest( private val applicationContext: ApplicationContext): ApplicationRunn..
-
분산시스템에서 로깅 트레이싱 전파는 어떻게 이루어질까?Spring Framework 2024. 10. 26. 20:30
대상 독자logback과 MDC를 활용하여 kafka, coroutine, async에도 트레이싱 전파를 어떻게 하는지 알고 싶으신 분들 개요 MSA 환경에서 Client가 하나의 호출을 수행했을 때 하나의 요청을 모아서 모니터링하고 싶으면 어떻게 해야 할까요? 아래 질문들에 대해 하나씩 답을 찾아가 보고자 합니다. 1. Server A에서 Spring MVC를 기반으로 여러 객체들이 협력하면서 비즈니스를 처리할텐데 어떻게 이어질 수 있을까? 2. Server A 에서 coroutine을 활용하면 어떻게 될까? 3. Server A 에서 @Async를 활용하면 어떻게 될까? 4. Server A가 kafka produce를 하고 Server B 가 consume을 수행하면 어떻게 될까? 5. Server..
-
Spring Boot Distributed SchedulingSpring Framework 2024. 6. 30. 21:25
개요최근에 Spring Batch 대신 @Scheduled 활용해 보기라는 주제로 글을 작성했던 적이 있는데 비슷한 주제로 Spring I/O 유튜브에 Spring Boot Distributed Scheduling 주제가 올라와서 이를 정리해보고자 합니다. Spring의 @Schedueld대부분의 software의 문제는 매 1분마다 실행되는 job을 통해 해결할 수 있습니다.Spring에서는 특정 주기로 반복되는 작업을 실행하기 위해 @Scheduled 어노테이션을 지원합니다. 하지만 서버 한대가 아니라 여러대에서 구동되는 환경이라면 각 서버에서 반복되는 작업이 개별적으로 수행되어 Race Condition이 발생할 수 있습니다. 위의 그림처럼 우리는 각 자원이 이상적으로 분배될 것이라고 기대되지만 여..
-
프로젝트에 Feature Flag 적용하기Spring Framework 2024. 6. 1. 15:40
Feature Flag란 무엇인가? (Feature Toggle)Feature Flag란 특정 기능을 동적으로 활성화 혹은 비활성화하기 위해 사용되는 조건부 코드 실행 메커니즘입니다.런타임 환경에서 특정 조건에 따라 코드 특정 부분을 스위치 하여 실제 사용자에게 제공되는 서비스 기능을 다르게 제어할 수 있습니다.특히 이러한 제어를 위해서 매번 코드를 수정해서 배포할 필요가 없다는 특징이 있습니다. Feature Toggle이라고도 불리며 기능을 ON / OFF 할 수 있는 게 특징입니다. 매우 다양한 활용도특정 기능을 ON / OFF 할 수 있는 만큼 매우 다양하게 활용해 볼 수 있습니다. 예를 들면 아래와 같은 활용을 수행해 볼 수 있습니다.서킷브레이커 ON/OFFA/B 테스트카나리 배포Trunked..
-
Spring Batch 대신 @Scheduled 활용해보기Spring Framework 2024. 5. 8. 00:58
Spring Batch와 SchedulerSpring Batch와 @Scheduled는 모두 스프링 프레임워크에서 시간 또는 이벤트 기반의 작업을 스케줄링하기 위해 사용됩니다. 다만 Spring Batch는 스케줄러를 대체하는 것이 아니라 스케줄러와 함께 작동하도록 고안되었습니다.예를 들어 Quartz, Jenkins, Tivoli, Control-M 등과 함께 활용해야 합니다. 주로 데이터 처리, 데이터베이스 작업, 파일 처리 등과 같은 대량의 작업을 일괄적으로 처리하는 데 Spring Batch를 활용합니다. 예를 들어 파일을 다운로드하고, 파일을 전송하고 삭제하는 기능을 구현할 때는 Spring Batch를 선택해서 활용하였습니다. 그렇다면 언제 Spring Batch 대신 @Scheduled를 ..
-
Adaptor 패턴으로 호출가능한 Local 환경 만들기Spring Framework 2024. 3. 8. 00:01
개요 FeignClient를 활용하다 보면 Local 호출 테스트를 수행하기 위해 MockServer를 띄우는 작업을 수행해야 합니다. 어떻게 하면 Dummy값으로라도 Local에서도 호출 테스트를 수행해 볼 수 있을까요? 문제 상황 @FeignClient( name = "localTestFeign", url = "http://external-service:8080", dismiss404 = true, ) interface ExternalServiceCallFeignClient { @GetMapping("/external-service-call") fun getExternalInformation(): String } feignClient url을 가상의 외부 도메인을 호출한다고 가정하겠습니다. @Rest..
-
JsonTypeInfo, JsonSubTypes 어노테이션Spring Framework 2024. 2. 27. 00:01
개요 이전 글에서 Spring에서 하나의 endpoint에 여러 개의 Request를 받기 위해 @JsonTypeInfo, @JsonSubTypes를 활용해 보았습니다. @JsonTypeInfo, @JsonSubTypes 어노테이션에 대해 조금 더 자세하게 알아보고자 합니다. @JsonTypeInfo, @JsonSubTypes 왜 사용해야 할까? interface SingleEndPointRequest { val type: String } data class DtoA( val col1: String, val col2: String, override val type: String = "DtoA", ): SingleEndPointRequest data class DtoB( val col3: String, v..