11장 객체-관계형 동작 패턴
2023. 3. 16. 21:01ㆍArchitecture/Enterprise Application Architecture
작업 단위
- 작업 단위는 비즈니스 트랜잭션의 영향을 받은 객체의 리스트를 유지 관리하고, 변경 내용을 기록하는 일과 동시성 문제를 해결하는 일을 조율한다.
- 객체 모델이 변경될 때마다 데이터베이스를 변경하면 잦은 빈도로 데이터베이스 호출을 해야 하기 때문에 부하가 발생할 수 있다.
- 일관성 없는 읽기를 방지하기 위해 읽은 객체를 추적해야 하는 경우 문제가 복잡해진다.
작동 원리
- 객체의 CUD (생성, 수정, 삭제)가 발생하면 데이터베이스에 기록해야한다. 작업 단위는 이러한 변경 내용을 추적하는 객체다.
- 데이터베이스에 영향을 미칠 수 있는 작업을 시작하면 작업 단위를 만들고 이러한 변경 내용을 추적해야 하며, 객체를 생성, 수정, 삭제할 때마다 이를 작업단위에 알려야 한다.
작동 방식
1. 호출자 등록
- 호출자가 직접 작업 단위에 등록하는 방식이다.
- 등록하지 않은 객체의 변경 내용은 커밋할 때 기록되지 않는다.
- 등록하는 것을 잊어버리면 내용이 손실되지만, 필요에 따라 등록하지 않을 수 있어서 유연하다.
2. 객체 등록
- 등록 메서드를 객체 메서드에 넣는 방식이다.
- 객체 개발자는 잊지 말고 적절한 위치에서 등록 메서드를 호출해야 된다.
- 관점 지향 프로그램을 활용하면 소스코드 수준에서 깔끔하게 문제를 해결할 수 있다.
- 코드 생성을 활용하면 등록 메서드를 호출하는 코드를 자동으로 생성할 수 있지만 이 기법은 생성된 코드와 생성되지 않는 코드를 명확하게 분리할 수 있는 경우에만 사용할 수 있다. -> AOP로 해결 가능
- 객체는 자신의 현재 작업 단위를 찾을 수 있어야 하며, 두 개 이상의 스레드가 하나의 작업 단위에 접근하지 못하게 해야 한다.
3. 작업단위 컨트롤러
- 읽을 때 객체 복사본을 만들고 커밋할 때 복사본과 객체를 비교한다.
작업단위를 유용하게 사용할 있는 영역
- 데이터베이스가 참조 무결성을 사용할 때 업데이트 순서를 조율해야 할 때
- 교착 상태를 최소화할 때 (순서 조율)
- 일괄 업데이트를 처리할 때
사용 시점
- 작업 단위는 우리가 조작한 다양한 객체를 추적해서 나중에 어떤 객체를 데이터베이스와 동기화해야 하는지 알 수 있게 해 준다.
- 모든 업데이트를 마지막으로 연기하면 과도한 데이터베이스 호출을 방지할 수 있다.
- 객체를 변수에 저장하는 방법 외에도 객체가 변경될 때 설정하는 더티 플래그를 각 객체에 지정하고 트랜잭션이 끝날 때 모든 더티 객체를 확인하고 기록하는 방법이 있다.
- 작업 단위의 가장 중요한 장점은 작업 단위가 모든 정보를 한 곳에 모은다는 것이다.
- 작업 단위가 작동할 수 있게 준비를 완료한 후에는 별다른 일을 하지 않아도 변경 내용을 추적할 수 있다.
- 각 비즈니스 트랜잭션은 단일 스레드 안에서 실행되므로 ThreadLocal 클래스를 사용해서 작업 단위와 현재 실행 중인 스레드를 연결할 수 있다.
식별자 맵
- 모든 객체를 한 맵에 로드해 각 객체가 한 번씩만 로드되게 한다. 객체를 참조할 때는 맵을 이용 해 객체를 조회한다.
- 단일 비즈니스 트랜잭션이 데이터베이스에 읽은 모든 객체에 대한 기록을 보관한다.
- 객체가 필요할 때마다 먼저 객체가 이미 있는지 여부를 식별자 맵에서 확인한다.
작동 원리
- 식별자 맵의 기본 개념은 데이터베이스에서 읽은 객체를 포함하는 일련의 맵을 유지 관리하는 것이다.
- 데이터베이스에서 객체를 로드할 때는 먼저 맵을 확인하고 로드하려는 객체와 일치하는 객체가 맵에 있으면 일치하는 객체를 반환한다.
- 일치하는 객체가 맵에 없으면 객체를 데이터베이스에서 읽고 향후 참조할 수 있게 맵에 저장한다.
고려해야 될 점
- 키의 선택 : 데이터베이스 테이블의 기본 키 사용
- 명시적 또는 범용
- 명시적 식별자 맵 : 각 객체에 대해 고유한 메서드로 접근 ex) findPerson(1), 컴파일 타임 검사 지원
- 범용 식별자 맵 : 단일 메서드를 통해 모든 종류의 객체에 접근 ex) find("Person", 1), 재사용 가능한 범용 맵을 지원
- 식별자 맵의 수 : 클래스당 하나씩 사용할지, 전체 세션에 하나만 사용할 지
- 식별자 맵의 위치 : 식별자 맵은 현재 작업 중인 프로세스 콘텍스트와 연결되기 때문에 각 세션은 다른 세션 인스턴스로부터 격리된 각자의 인스턴스를 가져야 한다. 즉, 식별자 맵은 세션별 객체에 배치해야 한다. 작업단위가 식별자 맵을 저장할 수 있는 최적의 위치이다.
사용 시점
- 식별자 맵은 데이터베이스에서 가져오고 수정하는 객체를 관리하는 데 사용한다.
- 객체를 관리하는 이유는 인메모리 객체 두 개가 동일한 데이터베이스 레코드와 연결되는 상황을 방지하기 위해서다.
TODO. JPA 영속성 컨텍스트와 비교하여 작성하면 더 좋을 것 같다. by 이카루스 님
엔티티 적재할 때 -> 스냅숏 트랜잭션 커밋하기 전 변경사항 추적
dirty 상태 > db에 내용 반영
[Spring JPA] 영속성 컨텍스트(Persistence Context)
영속성 컨텍스트란? 엔티티를 영구 저장하는 환경이라는 뜻으로 어플리케이션과 DB사이에서 객체를 보관하는 가상의 DB같은 역할을 한다.
velog.io
핵심용어정리
**
참고자료
영풍문고 - 서점다운 서점
서울 제외지역 외 궁동, 방배동, 역삼동, 삼각산동, 상일동, 강일동, 개화동, 과해동, 오쇠동, 오곡동, 오류동, 장지동, 현저동, 공덕동, 대방동, 충정로1가, 관철동, 여의도동, 양평동1가, 신정3동,
www.ypbooks.co.kr
'Architecture > Enterprise Application Architecture' 카테고리의 다른 글
12장 객체-관계형 구조 패턴 (0) | 2023.03.30 |
---|---|
09장 도메인 논리 패턴 (0) | 2023.02.23 |
06장 세션 상태 (0) | 2023.02.16 |
05장 동시성 (0) | 2023.02.16 |
04장 웹 프레젠테이션 (0) | 2023.02.16 |