전체 글
-
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..
-
하이버네이트 flush 순서에 주의하자JPA 2024. 10. 19. 20:20
대상독자하이버네이트 동작원리를 잘 모르고 사용했을 때 어떤 일이 발생할 수 있는지 궁금하신 분들 개요애플리케이션을 개발하던 중 하이버네이트의 동작원리를 잘 몰랐기 때문에 버그가 발생하게 되었습니다. 하이버네이트의 동작원리를 알아보면서 버그를 재현해보고 어떻게 해결할 수 있는지 정리해보고자 합니다. 하이버네이트란?하이버네이트(Hibernate)는 자바 애플리케이션과 관계형 데이터베이스 간의 상호작용을 간소화하기 위한 객체-관계 매핑(ORM) 도구입니다. 자바 클래스와 데이터베이스 테이블을 매핑하여, 자바 객체를 데이터베이스의 레코드로 변환하고 그 반대의 작업도 처리합니다. 이를 통해 개발자는 직접 SQL 코드를 작성할 필요 없이 데이터베이스와의 복잡한 상호작용을 처리할 수 있습니다. 하이버네이트를 ..
-
spring kafka auto-commit 동작원리 : 데이터 유실과 중복처리프로젝트/kafka 2024. 10. 13. 14:52
대상 독자spring kafka의 auto-commit 동작원리를 알고 싶으신 분들 auto-commit을 활용할 때 데이터 유실과 중복처리를 제어할 수 있는 방법을 알고 싶으신 분들 개요많은 블로그들을 살펴보면 kafka consumer의 옵션 중 하나인 auto-commit은 일정주기로 commit을 수행하기 때문에 메시지의 중복 및 유실이 발생할 수 있다고 설명합니다. 일정주기로 자동으로 commit을 수행한다는 것은 메시지가 처리되는 중간에도 commit이 일어날 수 있을 것 같습니다. 만약 auto-commit을 활성화한다면 내부적으로는 어떤 일이 일어날까요? 이번 글에서는 spring kafka에서 auto-commit이 어떻게 동작하는지 알아보고 이 과정에서 데이터 유실과 중복처리를 어떻게..
-
spin lock은 cpu에 얼마나 부하를 줄까?성능테스트 2024. 10. 7. 01:00
대상 독자spin lock에 대해서 알고 싶으신 분들 spin lock이 실제 cpu에 얼마나 부하를 주는지 궁금하신 분들 개요소프트웨어를 개발하거나, 외부 라이브러리들을 활용하다 보면 종종 spin lock으로 구현되어 있는 경우를 발견할 수 있습니다. 이런 경우 while 등의 반복문을 활용해서 매번 체크하는 로직이 포함되는데 spin lock은 cpu에 부하를 주지 않을까? 라는 궁금즘이 생겼습니다. 만약 spin lock 방식을 소프트웨어에 활용하면 cpu에 얼마나 부하를 줄게 될까요? Spin Lock이란 무엇인가?fun getLock() { while(true){ if(락 획득) return else 반복하면서 락 획득 시도 }} spin lock은 임..
-
kotlin enum 상태 관리 구현하기Kotlin/Kotlin 2024. 9. 27. 21:20
개요 소프트웨어를 개발하다 보면 내부적인 상태를 관리해야 합니다. 이때 상태는 5가지 이내로 간단하게 표현될 수도 있고 50가지 혹은 그 이상으로 표현될 수도 있습니다. 어떻게 하면 수많은 상태가 존재할 때 안정적으로 상태를 관리하고 가독성 및 유지보수성을 챙길 수 있을까요? 유한상태기계(Finite State Machine)상태에 대해 공부하다 보면 유한상태기계 (FSM)이라는 개념이 종종 보입니다. 유한상태기계란 결국 한정되어 있는 개수의 복잡한 상태를 설계하는 데 사용하는 수학적 기법입니다. 이러한 기계는 한 번에 오로지 하나의 상태만을 가지게 됩니다. 이러한 기계는 어떠한 사건(Event)에 의해 한 상태에서 다른 상태로 변화할 수 있으며, 이를 전이(Transition)이라 합니다. 결국 중요..
-
Redis Cluster + Spring Boot + Lettuce client 이론과 세팅프로젝트/redis 2024. 8. 5. 00:00
Redis Sentinel이란? Redis Cluster를 알아보기 전에 간략하게 Redis Sentinel에 대해서도 알아보겠습니다.만약 Redis Cluster를 활용하지 않는다면 대안으로 자동으로 failover를 지원하는 Redis Sentinel을 활용해 볼 수 있습니다.마스터가 더 이상 사용할 수 없다는 사실에 여러 Sentinel이 합의하여 Slave 중 하나를 Master로 승격시키고 기존의 Master는 Slave로 강등시킵니다. 단순히 하나의 Sentinel에서 네트워크 문제로 Master와 연결되지 않을 수 있으므로 특정 quorum 이상에서 다운되었다고 인지한 경우 장애 조치를 진행합니다. Redis Cluster란 무엇일까?Redis Cluster는 N개의 마스터 노드를 활용하여 ..
-
분산락을 위한 Redis RedLock 톺아보기프로젝트/redis 2024. 7. 20. 20:42
분산락이란?분산락은 여러 개의 분산된 서버가 존재할 때 동일한 데이터에 대한 동기화를 보장하기 위해 사용하는 락의 종류 중 하나입니다. 분산락을 활용하면 서로 다른 서버들이 critical section 실행을 동시에 하지 못하도록 방지할 수 있습니다. 이때 MySQL의 네임드락, Zookeeper 등을 활용해서 분산락을 구현할 수 있는데 Redis의 RedLock 알고리즘을 활용하여 분산락을 구현할 수 있습니다. Redis가 다운되는 경우?단일 인스턴스를 활용하여 분산락을 구현할 수 있지만 이는 단일 실패점이 될 수 있습니다. 단일 실패점을 극복하기 위해서는 Master - Slave구조를 선택할 수 있습니다. 하지만 Slave로의 복제는 비동기이므로 아래와 같은 상황에서 race condition이..