아키텍처 패턴
1. 도메인 논리가 데이터베이스와 상호작용하는 방법을 좌우하는 아키텍처 패턴
이러한 패턴을 선택할 때는 충분한 주의를 기울여야 한다. 왜냐면 전체 설계에 미치는 파급효과가 크고 리팩터링하기 어렵기 때문이다.
이러한 이유로 SQL 접근을 도메인 논리와는 별도로 분리하고 개별 클래스에 배치하는 것이 좋다.
데이터베이스 테이블당 클래스 하나를 가지도록 구성하는 방법이 좋다. 이러한 클래스는 테이블에 대한 게이트웨이가 된다.
게이트웨이를 사용하는 두 가지 방법
1. 행 데이터 게이트웨이 - 쿼리가 반환하는 각 행마다 인스턴스 하나를 만드는 것
2. 테이블 데이터 게이트웨이 - 레코드 집합 - 테이블식 특성을 흉내 낸 테이블과 행의 범용 자료구조이다, 각 테이블마다 클래스가 하나만 있으면 된다.
중간 내용이 읽어도 이해가 가지 않는다.. 다시 읽어봐야지
동작 문제
O/R 매핑을 활용할 때 어려운 측면은 O/R 매핑의 아키텍쳐와 동작 측면이다. 동작 문제는 객체가 데이터베이스에 저장 및 로드되는 방법에 대한 것이다. 다수의 객체를 메모리로 로드하고 수정할 때는 객체를 데이터베이스에 올바르게 기록하기 위해 수정한 객체를 모두 추적해야 한다.
행을 만들고 다른 행을 수정하는 작업을 함께 할 때는 생성된 행을 참조하는 다른 행을 수정하려면 생성된 행의 키가 필요하므로 문제가 복잡해진다.
객체를 읽고 수정하는 동안에는 사용하는 데이터베이스의 상태를 일관되게 유지해야 한다. 객체를 읽고 이를 대상으로 작업할 때는 다른 프로세스가 이 객체를 변경하지 못하도록 읽기를 격리해야 한다. 그렇지 않으면 일관성 문제가 발생하고 잘못된 데이터가 저장될 수 있다.
작업 단위는 이러한 두 가지 문제를 해결하는 데 꼭 필요한 패턴이다. 데이터베이스에서 읽은 객체와 함께 이후 다양한 방법으로 수정한 객체를 추적하고 데이터베이스를 업데이트한다. 프로그래머는 저장 메서드를 직접 호출하지 않고 작업 단위에 커밋을 요청하면 된다. 그러면 작업 단위는 데이터베이스에 수행할 모든 동작을 적절한 순서로 정리한 다음, 커밋을 위한 복잔한 모든 작업을 한곳에서 처리한다.
객체를 로드할 때는 같은 객체를 두 번 로드하지 않게 주의해야 한다. 같은 객체를 두 번 로드하면 같은 데이터베이스 행과 연결된 인메모리 객체가 두 개가 되며, 이후 두 객체를 모두 업데이트하면 예기치 못한 결과가 발생한다. 읽은 모든 행의 기록을 식별자 맥을 이용해 추적하면 이 문제를 예방할 수 있다. 식별자 맵을 이용해 이미 읽은 데이터인지 확인할 수 있다. 이미 읽은 데이터인 경우 이 데이터에 대한 참조를 반환하면 된다. 이 방법으로 업데이트를 올바르게 조율할 수 있다. 식별자 맵은 캐시를 두 배로 늘려서 불필요한 데이터베이스 호출을 줄이는 효과도 있다. 그러나 식별자 맵의 주요 용도는 식별자를 올바르게 유지하는 것임을 기억해야 한다.
지연 로드는 객체 참조 대신 자리표시자를 이용하는 기법으로서, 한번에 읽는 양을 줄이면서도 나중에 필요할 때 손쉽게 추가 데이터를 가져올 수 있게 여지를 남겨두는 방법이다.
'Study > 엔터프라이즈 애플리케이션 아키텍처 패턴' 카테고리의 다른 글
05장 - 동시성 (0) | 2023.02.14 |
---|---|
03장 - 관계형 데이터베이스 매핑 02 - 데이터 읽기 / 구조적 매핑 패턴 (0) | 2023.02.08 |
02장 - 도메인 논리 구성 (0) | 2023.02.07 |
01장 - 계층화 02 : 계층의 발전과 주요 계층 (0) | 2023.02.01 |
01장 - 계층화 : 계층화의 이점과 단점 (0) | 2023.01.31 |