[Spring] @Transactional의 구조와 Retry 정책 구현
·
Backend/Spring
Transaction 트랜젝션은 쪼개질 수 없는 업무의 최소 단위입니다. 여기서 모두 성공하던가, 아니면 완전히 없던 일로 하든가 (All or Nothing)의 규칙을 지키는 작업 단위임을 기억해야합니다. ACID 원칙에서의 Atomic도 바로 이런 규칙을 말하는데 이런 서비스 업무의 단위를 스프링 프레임워크에서는 어떤 식으로 구현돼있는지 확인해보겠습니다.@Transactional Spring으로 서비스 코드를 작성할 때 항상 붙이면서도 잘 알고 사용해야만 하는 이 @Transactional이 어떤 구조와 원리로 설계되어 있는지 확인해보겠습니다. @Transactional은 Spring AOP (Aspect Oriented Programming)을 기반으로 동작합니다. 이때 동작의 흐름은 다음과..
[Spring] Spring에서의 Tomcat과 비교한 Netty의 구조
·
Backend/Spring
What is Netty? Netty는 기존의 톰캣에서 제공하는 처리 방식 중의 일부를 개선하기 위해서 등장한 네트워크 프레임워크입니다. 전통적인 톰캣은 1 Request 1 Thread 모델이었습니다. 여기서 요청을 스레드가 도맡아서 처리하게 되며, 이는 thread 1개가 담당하게 됩니다. 이때 Blocking time이라는, I/O가 발생하면 스레드가 아무것도 하지 않고 기다리는 시간이 필연적으로 발생합니다. 이를 해결하기 위해서 NIO가 등장했습니다. Selector라는 개념을 도입해서 스레드 1개가 요청 100개를 관리할 수 있도록 한 것입니다. 톰캣도 8.0부터 기본적으로 NIO Connector를 사용해서 Acceptor와 Poller라는 구조를 이용해서 Multiplexing을 수..
[Spring] In memory에서 관리하는 SSE Emitter 메모리 최적화
·
Backend/Spring
Server Sent Event SSE는 클라이언트에서 최초에 구독 요청을 보내면 서버가 연결을 끊지 않고 계속 열어둔 채로 데이터를 필요할 때마다 단방향으로 내려보내는 HTTP 표준 프로토콜을 이용하는 실시간 웹 기술입니다. 인메모리에서 서버의 SSE 이벤트를 구독하는 Emitter를 ConcurrentHashMap으로 관리할 경우, 어떤 점에서 메모리 누수가 발생할 수 있고, 동시성을 관리하며 효율을 올릴 수 있을까요? Java 코드로 해당 부분을 살펴보겠습니다.콜백 함수private final Map emitters = new ConcurrentHashMap(); 이렇게 Emitter들을 ConcurrentHashMap으로 관리하게 되면 GC는 사용되지 않는 Emitter를 할당 해제하..