사실 @Transactional 은 Spring Boot 로 진행한 첫 프로젝트부터 지금까지 정말 많이 써온 어노테이션이다. 지금까지 사용하면서 이해하고 있었던 바를 먼저 정리해보면 아래와 같다. 1. DB 에 접근하는 서비스 로직에 Transaction 을 적용하고 싶을 때 사용한다. 2. AOP 를 이용한 선언적 트랜잭션 방식이다. 3. Aspect 에서 PlatformTransactionManager 가 트랜잭션의 Commit, Rollback 을 처리한다. 이번에 회사에서 진행하고 있는 프로젝트에 @Transactional 의 propagation 속성을 이용해 Transaction 전파를 하는 과정에서 조금 더 제대로 알고 사용하고 싶은 마음에 정리해보려고 한다. 늘 회사 프로젝트에 새로운 기술..
개인적으로 스터디를 진행하는게 있는데 거기서 스터디 홈페이지를 개발하는 토이 프로젝트를 진행하고 있다. 그 과정에서 내가 고민한 부분과 그 것을 어떻게 해결했는지에 대한 경험을 이야기해보려 한다. 문제 내가 경험한 문제는 캘린더를 개발하는 과정에서 생긴 데이터 동기화 문제였다. 클라이언트 A가 캘린더 화면에 들어오면서 최초 로딩된 데이터를 가지고 온다. 그 상태에서 클라이언트 B가 데이터를 수정할 경우 클라이언트 A가 새로고침을 하거나 Polling 하는 등 새로 데이터를 받아오지 않는한 데이터를 동기화되지 않는다. 물론 사용자가 많지 않고 실시간 데이터 동기화가 중요하지 않은 곳이긴 했지만, "이게 실시간 서비스였다면 어땠을까?", "사용자가 많은 서비스라면 어땠을까?" 라는 생각으로 이 부분을 개선해..
회사에서 캐시 구조에 대해서 리팩토링을 진행하는 과정에서 EhCache Self-Invocation 문제로 인해 캐시가 정상적으로 동작하지 않았던 사례에 대해서 포스팅하려고 한다. 이 문제가 무엇인지 예제를 통해서 간단하게 살펴보려고 한다. @Cacheable(value = "testCache") public String cache() { log.error("[Info] Create Data!!!"); return "hello, ch4njun"; } public String test() { log.error("[Info] test call!"); return cache(); } 위와 같은 구성이 있을 때 test() 의 내부에서 @Cacheable 어노테이션이 붙어있는 cache() 메서드를 호출한다. ..
Servlet 3.0 이전 Servlet 3.0 에는 Servlet Thread 만 존재했다. 예를들어 Thread per Request Model 을 사용하는 Tomcat 의 경우에는 기본적으로 200개의 Servlet Thread 를 가졌고 내부적으로 Blocking 되는 코드가 있다면 서버의 Latency 가 길어지게 된다. 왜냐하면 하나의 Request 에 대해서 하나의 Servlet Thread 를 할당하게 되는데, 해당 Servlet Thread 가 Blocking 상태에 빠지게 된다면 더 이상 Servlet Thread Pool 에는 남아있는 Thread 가 없게되고 Request 는 Servlet Thread 가 반환될 때까지 기다리게 되는 것이다. 이러한 문제를 해결하기 위해 Servle..