이야기에 앞서서... Spring Framework에서 제공하는 @Autowired나 @Qualifier를 이용해서 객체를 찾아서 DI(Dependency Injection)해왔습니다. 물론 Java에서도 @Inject, @Resource를 제공해주어서 DI(Dependency Injection)를 할 수 있었습니다. 우선, DI는 IoC(Inversion of Control)의 핵심 원리를 구현하는 개념이라고 할 수 있습니다. 간단하게 IoC(Inversion of Control)란? : IoC의 핵심은 기존의 Programing code 안에 들어가 있던 객체의 생성/관리를 Spring Container에게 위임하여 객체의 생명주기를 관리하게 하는 것입니다. 관리하는 객체의 단위를 Bean이라고 명명..
애플리케이션을 개발하다 보면, 보통 @Transactional을 사용해서 Transaction을 사용합니다. 관습적으로 사용하다 보니, 내부적으로 어떻게 돌아가는지 원리에 대해서만 관심을 가졌습니다. 하지만 여기에서는 조금 더 들어가서 살펴보려고 합니다. Transaction은 두 가지 형태로 구현할 수 있습니다. Programmatic Transaction 방식 : 직접 코드에서 Transaction을 구현하는 방식 Declarative Transaction 방식 : 원하는 Scope에서 Annotation을 선언하는 방식 여기서 이야기하려고 하는 주제는 2.Declarative Transaction방식입니다. 여기서 다시 "2.Declarative Transaction"의 종류는 다음 두 가지로 나뉩..
스프링을 사용하면서 많은 서비스들이 트랜잭션을 단위로 하는 비즈니스 로직을 구현합니다. 저는 비즈니스 로직을 구현하는 과정에서 많이들 놓치는 Exception이 발생 상황에 대해서 살펴보려고 합니다. 가장 중요한 것은 Exception 타입에 따라서 어떻게 비즈니스 로직이 진행될지 판단하고, 처리하는 것입니다. 쿠팡 사용자 회원가입 기능을 예로 들겠습니다. 가입 시에 사용자에게 쿠폰을 발급하는 경우가 존재할 수 있습니다. 사용자가 가입하는 도중에 원인 모를 상황이 발생할 수 있습니다. 시스템이 셧다운 되거나, 메모리를 초과할 수도 있고, 또는 개발 단계에서 잘못된 구현으로 트랜잭션이 완료되지 못할 수 있습니다. 여기서 우리가 구분해야 하는 부분이 있습니다. Error와 Exception의 구분입니다. -..
MethodSorters 옵션 MethodSorters.DEFAULT class에 속한 모든 method를 hashcode()를 호출하여, hashCode를 기반으로 순서가 결정한다. 일일히 hashCode를 찾아보지 않는 이상 실행 순서를 예측하기 힘들다. MethodSorters.JVM class에 속한 모든 method를 가져오는 getDeclaredMethods()에서 가져온 method의 순서대로 Test Case를 실행합니다. 단, JVM은 getDeclaredMethods()는 시스템의 리소스 상황에 따라 다른 순서로 결과를 보낸다. MethodSorters.NAME_ASCENDING 메소드 명을 오름차순으로 정렬한 순서대로 실행됩니다. 보통 Test 순서를 보장할 때, 많이 쓰는 어트리뷰트..
일단은 어쩔 수 없는 과부하가 발생하기 전에 사전 모니터링을 해서 과부하를 줄여야합니다. 과부하가 발생하면, 서비스의 속도가 저하되거나 서비스가 접속 불가능한 상황이 됩니다. 두 가지 측면으로 서비스 병목 지점을 찾을 수 있습니다. 다음으로 설명을 시작하겠습니다. Infra 측면에서 서비스의 병목 지점을 일단 찾아야한다. 예를 들어, 3-tier 구조인 Client-Server-DB에서 Server와 DB 중에 어느 부분이 지금 높은 시스템 자원을 사용하고 있는지 확인합니다. 대부분은 Server나 DB 둘 중 한 부분에서 병목지점을 확인할 수 있습니다. WAS에서 병목현상이 발생할 경우에는 WAS 자체를 Scale-Up 또는 Scale-Out을 고려해야합니다. 일시적인 트래픽 증가로 인한 과부하는 Sc..