분산 트랜잭션(JTA)기반의 회원 시스템 개발오랫동안 농익은 레거시 시스템은 현재 시점에서 뜯어볼수록 의문이 많은 설계와 코드들이 참 많습니다.제가 속한 서비스의 회원 시스템도 마찬가지였습니다. 서비스를 이용하는 회원의 정보가 서로 다른 3개의 DB에 나뉘어 관리되고 있었습니다. 한명의 회원 정보가 여러 DB에 나뉘어 저장되는 것도 아니고, 유입된 채널에 따라 저장되는 DB가 물리적으로 분리되어 있었습니다.즉 온라인에서 가입한 고객은 오프라인에서 확인할 수 없고, 오프라인에서 가입한 고객은 온라인 서비스에서 접근할 수 없는 구조였습니다.이는 당연히 마케팅 측면이나 서비스의 확장성 측면에서 많은 어려움을 만들고 있었고, 이를 통합하기 위한 자칭 '통합회원 프로젝트'를 진행하게 되었습니다. 분리되어 있는 D..
문제 발생‘어느날 갑자기’ Jenkins 배포중 빌드가 실패, Jenkins 실패 원인을 보니 테스트가 깨지고 있었음현상 재현을 위해 로컬에서 테스트를 돌렸으나 모든 테스트는 PassJenkins의 간헐적 이슈 인가 싶어 다시 Jenkins 빌드를 진행하니 성공후 정상 배포되었음(이때까지만 해도 Jenkins의 버그로 인한 단순 해프닝으로 생각)2주뒤 다시 정기배포일자가 다가왔고, 배포를 진행했으나 이전과 동일하게 다시 Jenkins 빌드가 실패함로컬에서도 마찬가지로 테스트가 깨지고 있었고 로그에서는 아래와 같이 Atomikos 에러가 출력 수 차례 재시도 하니 정상적으로 배포됨...나를 더욱 헷갈리게 하는 상황들Jenkins 배포시에도 매번 실패하는 것이 아닌 여러번 시도하면 그 중 한번은 성공함로컬에..
트랜잭션 격리 수준(Isolation Level)이란?트랜잭션의 격리 수준은 여러 트랜잭션이 혼재되어 있는 상태에서, 하나의 트랜잭션이 다른 트랜잭션의 데이터에 접근 할 수 있는 '정도'를 의미한다. 트랜잭션 격리 수준은 4단계로 나뉘어 진다.0 - Read Uncommitted1 - Read Committed2 - Repeatable Read3 - Serializable 격리 수준이 높아질 수록 트랜잭션의 고립 강도가 높아지는 반면, 성능저하도 야기된다.일반적인 서비스에서는 Read Committed 혹은 Repeatable Read 수준을 사용하며, 서비스의 요구사항에 따라 적절한 격리 수준을 정해 사용해야 한다. 여러 트랜잭션이 존재하는 상황에서 트랜잭션들의 경합으로 발생하는 문제는 격리수준별 다음..
1. 팩토리 메서드 패턴이란?- 객체 생성을 위한 패턴- 객체 생성에 필요한 과정을 템플릿처럼 정해 놓고 각 과정을 다양하게 구현이 가능- 객체 생성에 대한 인터페이스와 구현의 분리- 구체적으로 생성할 클래스를 유연하게 정할 수 있음 팩토리 메서드 패턴은 객체 생성을 Factory 클래스로 캡슐화하여 대신 생성하게 하는 '생성' 디자인 패턴이다. 클라이언트가 직접 new 연산자를 통해 객체를 생성하는 것이 아닌 객체 생성을 도맡는 Factory 클래스를 만들고, 이를 상속하는 서브 Factory 클래스에서 여러 타입의 객체 생성을 책임지는 것이다. 또한 Factory에서 객체 생성시의 전처리 혹은 후처리를 통해 생성 과정을 유연하게 처리 할 수 있다. 위키피디아에 나와 있는 UML 다이어그램으로는 팩토..
1. 빌더 패턴이란? 빌더 (Builder) 패턴은 복잡한 구성의 객체를 효과적으로 생성하는 패턴 빌더 패턴의 종류는 2가지 - 생성시 지정해야 할 인자가 많을 때 사용하는 패턴 - 객체 생성 시 여러 단계를 순차적으로 거칠 때, 이 단계의 순서를 결정해 두고 각 단계를 다양하게 구현할 수 있도록 하는 패턴 대부분 빌더 패턴은 첫번째 종류로만 이해하는 경우가 대부분 빌더 패턴외에 객체 생성 패턴은 대표적으로 점층적 생성자 패턴, 자바 빈즈 패턴이 존재 점층적 생성자 패턴 - 생성자를 매개변수에 갯수만큼 구성하는 패턴 자바 빈즈 패턴 - 별도의 생성자를 구성하지 않고 객체를 생성한 후, Setter를 이용하여 객체를 구성하는 형태를 의미 2. 생성시 지정해야 할 인자가 많을 때 사용하는 패턴 public ..
1. 트랜잭션(Transaction) 이란? - 논리적인 여러 작업을 하나로 묶는 단위 - 하나의 일련된 작업 예시 - 손님이 카페에서 음료를 주문 했을 경우, 손님의 주문 그리고 음료가 제조 및 준비되어 손님에게 전달되기까지의 모든 과정을 하나의 트랜잭션으로 볼 수 있다. 트랜잭션의 특징은 모두 성공하거나, 하나라도 실패하면 전체가 실패한다는 특징을 가지고 있다. 만약 손님의 음료가 완성되어 전달되는 과정에서 음료가 엎어지게 되면, 손님의 주문은 전체가 실패하게 되는 것과 동일하다. 2. 트랜잭션의 ACID란? 트랜잭션에는 4가지의 핵심 속성이 있으며, 해당 속성이 하나라도 충족되지 않으면 해당 트랜잭션은 보장되지 않는다. 즉 ACID는 트랜잭션이 안정적으로 수행되기 위해 보장되어야할 4가지 핵심 속..
1. Adapter란? '사전적 의미 - 기계, 기구 등을 다목적으로 사용하기 위한 부가 기구' 어댑터는 우리 주변에서도 많이 볼수 있다, 대표적으로 110V 가전제품에 220V 어댑터를 끼워 사용하는걸 예로 들 수 있다. 다시 말해 서로 호환되지 않는 기능을 어댑터를 통해 호환시켜 작동하다록 하는 역할을 한다. 위 내용을 객체지향 프로그래밍에 적용시켜 보면 어댑터 패턴은 아래와 같은 내용으로 설명할 수 있다. '어댑터 패턴은 호환되지 않는 인터페이스를 가진 객체들이 협업할 수 있도록 하는 구조적 디자인 패턴' 2. Adapter 패턴의 구현 요구사항 두 수에 대한 다음 연산을 수행하는 객체 구현 수의 두 배의 수를 반환 twiceOf(float):float 수의 반(1/2)의 수를 반환 halfOf(f..
1. 인터페이스란? - 키보드나 디스플레이 따위처럼 사람과 컴퓨터를 연결하는 장치 - 기능에 대한 선언과 구현을 분리해주는 기능 역할 - 기능을 사용하는데 있어서 통로 역할 2. 델리게이트(Delegate)란? - 사전적 의미에서는 어떤 사람이나 그룹을 대신하는 사람, 즉 대리인 혹은 대표로 해석 - 특정 기능의 동작을 다른 객체에게 위임하여 동작하도록 함 public class AService { //has a 관계 BRepository bRepository; public void save() { // save 동작을 bRepository에게 위임하여 처리 bRepository.save(); } } 3. 전략(Strategy) 패턴 - 여러 알고리즘을 하나의 추상적인 접근점(인터페이스)을 만들어 접근점..