본문 바로가기

전체 글

(82)
매퍼 패턴, 계층 상위 형식패턴 매퍼 독립적인 두 객체 간의 통신을 설정하는 객체 작동원리 두 하위 시스템을 격리한다. 작동 방법은 매퍼가 매핑하는 계층의 종류에 따라 다르다. 사용시점 하위 시스템간의 상호작용에 대한 의존성이 없어야 하는경우 상호작용이 두 시스템의 주요 용도와는 다소 거리가 있을 때 엔터프라이즈 애플리케이션 매퍼는 데이터베이스와의 상호작용을 위한 데이터 매퍼*로 주로 사용된다. (*10장 데이터원본 아키텍처 패턴 참조) 계층 상위 형식(Layer SuperType) 해당 계층에서 모든 형식의 상위 형식 역할을 하는 형식, 공통 부분을 부모 클래스에서 상속받아 사용하자 작동원리 한 계층 내의 모든 객체에 대한 상위 클래스를 만드는 것이다. 사용시점 모든 객체에 적용되는 공통적인 기능이 있을 때 예제: BaseEntity.. 더보기
게이트웨이 패턴, 서비스 스텁 패턴 이 포스팅은 엔터프라이즈 어플리케이션 아키텍처 패턴 18장을 요약했습니다. 게이트 웨이 외부 시스템이나 자원에 대한 접근을 캡슐화하는 객체 aka, 갖다 쓸 때 만들어서 사용하는 API 외부 자원에 접근할 때는 해당 자원의 API를 사용해야 한다. (전용 API) 예를들어, 외부 이메일 시스템을 연동한다고 할때 EmailSender.send(id, emailformat, title, content ...) 와 같이 제공하는 형식을 맞춰서 사용해야 한다. 모든 특수한 API 코드를 일반 객체처럼 보이는 인터페이스를 포함하는 클래스로 래핑하면 이 문제를 간단하게 해결할 수 있다. 작동 원리 외부 자원에 대해 어떤 작업을 수행해야 하는지 고려해서 용도에 맞는 API를 만든 다음 사용하면 끝 주요 용도 서비스 .. 더보기
지연로드(Lazy Load) 패턴 이 포스팅은 어플리케이션 아키텍쳐 패턴 11장을 요약한 내용입니다. 필요한 데이터를 모두 포함하지는 않지만 데이터가 필요할 때 가져오는 방법을 아는 객체 데이터베이스에서 메모리로 데이터를 로드하는 기능을 만들 때 원하는 객체를 로드하면서 연관된 객체를 함께 로드하도록 설계하는 것이 좋다. 이렇게 하면 객체를 사용하는 개발자가 직접 필요한 객체를 모두 로드할 필요 없이 로드 기능을 더 편리하게 사용할 수 있다. 그런데 한 객체를 로드 할 때 연관된 객체가 지나치게 많이 로드되고, 실제로는 소수의 객체만 필요한 상황에서 오히려 성능이 저하되는 경우가 발생할 수 있다. 지연 로드(Lazy Load)는 이 로딩 프로세스를 일시적으로 중단하고 객체 구조에 표시를 남겨서 나중에 데이터가 필요할 때 로드할 수 있게 .. 더보기
식별자 맵 패턴 이 포스팅은 어플리케이션 아키텍쳐 패턴 11장을 요약한 내용입니다. 모든 객체를 한 맵에 로드해 각 객체가 한 번씩만 로드되게 한다. 객체를 참조할 때는 맵을 이용해 객체를 조회한다. 식별자 맵(Identity Map)은 단일 비즈니스 트랜잭션이 데이터베이스에서 읽은 모든 객체에 대한 기록을 보관한다. 객체가 필요할 때마다 먼저 객체가 이미 있는지 여부를 식별자 맵에서 확인한다. 작동 원리 식별자 맵의 기본 개념은 데이터베이스에서 읽은 객체를 포함하는 일련의 맵을 유지 관리하는 것이다. 데이터베이스에서 객체를 로드할 때는 먼저 맵을 확인하고 로드하려는 객체와 일치하는 객체가 맵에 있으면 일치하는 객체를 반환한다. 일치하는 객체가 맵에 없으면 객체를 데이터베이스에서 읽고 향후 참조할 수 있게 맵에 저장한다.. 더보기
작업단위 패턴 이 포스팅은 어플리케이션 아키텍쳐 패턴 11장을 요약한 내용입니다. 작업단위 - 트랜잭션 관리 비즈니스 트랜잭션의 영향을 받은 객체의 리스트를 유지 관리하고, 변경 내용을 기록하는 일과 동시성 문제를 해결하는 일을 조율한다. 작동원리 객체의 CUD (생성, 수정, 삭제)가 발생하면 데이터베이스에 기록해야한다. 작업 단위는 이러한 변경 내용을 추적하는 객체다. 데이터베이스에 영향을 미칠 수 있는 작업을 시작하면 작업 단위를 만들고 이러한 변경 내용을 추적해야 하며, 객체를 생성, 수정, 삭제할 때마다 이를 작업단위에 알려야 한다. 장점 어플리케이션 프로그래머는 데이터베이스를 업데이트하는 메서드를 직접 실행할 필요가 없다. 어플리케이션 프로그래머는 변경 내용을 직접 추적하거나 참조 무결성을 고려해 작업 순서.. 더보기
동시성 이 포스팅은 엔터프라이즈 애플리케이션 아키텍쳐 패턴 5장 동시성을 요약한 내용이다. 동시성이란? -> 동시성 제어, 동시성 문제 구글에서 동시성이라고 검색하면 보통 동시성에 대한 용어를 정의하기 보다는 동시성 제어, 동시성 문제에 대한 내용이 먼저 나온다. 그만큼 동시성이라는 용어를 생각할 때 제어와 문제를 다루는게 중요해서 그런것 같다. 동시성 문제란 여러 프로세스나 스레드가 동일한 데이터를 조작하는 경우에 동시성 문제가 발생한다. 다중 사용자 환경의 데이터베이스 시스템에서 동시에 실행되는 여러 트랜잭션 간의 간섭으로 인해 동시성 문제가 발생한다. 대표적인 동시성 문제 - 정확성을 깎고 활동성을 높여서 발생한다. 손실된 업데이트(lost update) - A유저가 test.java 파일에서 특정 함수를.. 더보기
Java 8, 9, 10, 11 무슨 일이 일어나고 있는가? 이 포스팅은 Modern Java In Action 의 CH1을 정리한 내용입니다. Java는 거듭 변화해오고 있다. 이러한 변화중에서 가장 획기적이고 생산성이 바뀌는 변화는 언제였을까? 바로 Java 8이 등장했을 때다. Java 8에서 제공하는 새로운 기술을 간단하게 살펴보자. 스트림 API 메서드에 코드를 전달하는 기법 인터페이스의 디폴트 메서드 스트림 API 자바 8은 데이터베이스 질의 언어에서 표현식을 처리하는 것처럼 병렬 연산을 지원하는 스트림이라는 새로운 API를 제공한다. 데이터베이스 질의 언어에서 고수준 언어로 원하는 동작을 표현하면, 구현(자바에서는 스트림 라이브러리가 이 역할을 수행)에서 최적의 저수준 실행 방법을 선택하는 방식으로 동작한다. 즉, 스트림을 이용하면 에러를 자주 일으키.. 더보기
애그리거트 트랜잭션관리 문제상황 - Transaction의 충돌 예시 : 커머스의 주문 시스템에서 아래의 두 요청이 동시에 발생하면 어떤 문제가 발생할까? 운영자가 배송준비중 에서 배송으로 주문상태를 변경하려고 한다. 고객은 배송지 정보를 변경하려고 한다. 위의 예시를 순차적으로 살펴보면 이렇다. 운영자가 주문 애그리거트를 가져온다. 고객이 주문 애그리거트를 가져온다. 운영자가 주문 상태를 변경한다. 고객이 배송지를 변경한다. 위의 상황에서는 애그리거트의 일관성이 깨지게 된다. 이를 해결하려면 두 가지 중 하나를 선택해야한다. 운영자가 배송지 정보를 조회하고 상태를 변경하는 동안 고객이 애그리거트를 수정하지 못하게 막는다. (선점 잠금 Pessimistic Lock) 운영자가 배송지 정보를 조회한 이후에 고객이 정보를 변경하면.. 더보기