11장 객체-관계형 동작 패턴

2023. 3. 16. 21:01Architecture/Enterprise Application Architecture

작업 단위

  • 작업 단위는 비즈니스 트랜잭션의 영향을 받은 객체의 리스트를 유지 관리하고, 변경 내용을 기록하는 일과 동시성 문제를 해결하는 일을 조율한다.
  • 객체 모델이 변경될 때마다 데이터베이스를 변경하면 잦은 빈도로 데이터베이스 호출을 해야 하기 때문에 부하가 발생할 수 있다.
  • 일관성 없는 읽기를 방지하기 위해 읽은 객체를 추적해야 하는 경우 문제가 복잡해진다.

작동 원리

  • 객체의 CUD (생성, 수정, 삭제)가 발생하면 데이터베이스에 기록해야한다. 작업 단위는 이러한 변경 내용을 추적하는 객체다.
  • 데이터베이스에 영향을 미칠 수 있는 작업을 시작하면 작업 단위를 만들고 이러한 변경 내용을 추적해야 하며, 객체를 생성, 수정, 삭제할 때마다 이를 작업단위에 알려야 한다.

 

작동 방식

1. 호출자 등록

  • 호출자가 직접 작업 단위에 등록하는 방식이다.
  • 등록하지 않은 객체의 변경 내용은 커밋할 때 기록되지 않는다.
  • 등록하는 것을 잊어버리면 내용이 손실되지만, 필요에 따라 등록하지 않을 수 있어서 유연하다.

2. 객체 등록 

  • 등록 메서드를 객체 메서드에 넣는 방식이다.
  • 객체 개발자는 잊지 말고 적절한 위치에서 등록 메서드를 호출해야 된다.
  • 관점 지향 프로그램을 활용하면 소스코드 수준에서 깔끔하게 문제를 해결할 수 있다.
  • 코드 생성을 활용하면 등록 메서드를 호출하는 코드를 자동으로 생성할 수 있지만 이 기법은 생성된 코드와 생성되지 않는 코드를 명확하게 분리할 수 있는 경우에만 사용할 수 있다. -> AOP로 해결 가능
  • 객체는 자신의 현재 작업 단위를 찾을 수 있어야 하며, 두 개 이상의 스레드가 하나의 작업 단위에 접근하지 못하게 해야 한다.

3.  작업단위 컨트롤러

  • 읽을 때 객체 복사본을 만들고 커밋할 때 복사본과 객체를 비교한다.

 

작업단위를 유용하게 사용할 있는 영역

  • 데이터베이스가 참조 무결성을 사용할 때 업데이트 순서를 조율해야 할 때
  • 교착 상태를 최소화할 때 (순서 조율)
  • 일괄 업데이트를 처리할 때

 

사용 시점

  • 작업 단위는 우리가 조작한 다양한 객체를 추적해서 나중에 어떤 객체를 데이터베이스와 동기화해야 하는지 알 수 있게 해 준다.
  • 모든 업데이트를 마지막으로 연기하면 과도한 데이터베이스 호출을 방지할 수 있다.
  • 객체를 변수에 저장하는 방법 외에도 객체가 변경될 때 설정하는 더티 플래그를 각 객체에 지정하고 트랜잭션이 끝날 때 모든 더티 객체를 확인하고 기록하는 방법이 있다.
  • 작업 단위의 가장 중요한 장점은 작업 단위가 모든 정보를 한 곳에 모은다는 것이다.
  • 작업 단위가 작동할 수 있게 준비를 완료한 후에는 별다른 일을 하지 않아도 변경 내용을 추적할 수 있다.
  • 각 비즈니스 트랜잭션은 단일 스레드 안에서 실행되므로 ThreadLocal 클래스를 사용해서 작업 단위와 현재 실행 중인 스레드를 연결할 수 있다.

 

식별자 맵

  • 모든 객체를 한 맵에 로드해 각 객체가 한 번씩만 로드되게 한다. 객체를 참조할 때는 맵을 이용 해 객체를 조회한다.
  • 단일 비즈니스 트랜잭션이 데이터베이스에 읽은 모든 객체에 대한 기록을 보관한다.
  • 객체가 필요할 때마다 먼저 객체가 이미 있는지 여부를 식별자 맵에서 확인한다.

 

작동 원리

  • 식별자 맵의 기본 개념은 데이터베이스에서 읽은 객체를 포함하는 일련의 맵을 유지 관리하는 것이다.
  • 데이터베이스에서 객체를 로드할 때는 먼저 맵을 확인하고 로드하려는 객체와 일치하는 객체가 맵에 있으면 일치하는 객체를 반환한다. 
  • 일치하는 객체가 맵에 없으면 객체를 데이터베이스에서 읽고 향후 참조할 수 있게 맵에 저장한다.

고려해야 될 점

  • 키의 선택 : 데이터베이스 테이블의 기본 키 사용
  • 명시적 또는 범용
    • 명시적 식별자 맵 : 각 객체에 대해 고유한 메서드로 접근 ex) findPerson(1), 컴파일 타임 검사 지원
    • 범용 식별자 맵 : 단일 메서드를 통해 모든 종류의 객체에 접근 ex) find("Person", 1), 재사용 가능한 범용 맵을 지원
  • 식별자 맵의 수 : 클래스당 하나씩 사용할지, 전체 세션에 하나만 사용할 지
  • 식별자 맵의 위치 : 식별자 맵은 현재 작업 중인 프로세스 콘텍스트와 연결되기 때문에 각 세션은 다른 세션 인스턴스로부터 격리된 각자의 인스턴스를 가져야 한다. 즉, 식별자 맵은 세션별 객체에 배치해야 한다. 작업단위가 식별자 맵을 저장할 수 있는 최적의 위치이다.

사용 시점 

  • 식별자 맵은 데이터베이스에서 가져오고 수정하는 객체를 관리하는 데 사용한다.
  • 객체를 관리하는 이유는 인메모리 객체 두 개가 동일한 데이터베이스 레코드와 연결되는 상황을 방지하기 위해서다.

 

TODO.  JPA 영속성 컨텍스트와 비교하여 작성하면 더 좋을 것 같다.  by 이카루스 님

엔티티 적재할 때 -> 스냅숏 트랜잭션 커밋하기 전 변경사항 추적 

dirty 상태 > db에 내용 반영

https://velog.io/@seongwon97/Spring-Boot-%EC%98%81% EC%86% 8D% EC%84% B1-%EC% BB% A8% ED%85% 8D% EC% 8A% A4% ED% 8A% B8 Persistence-Context

 

[Spring JPA] 영속성 컨텍스트(Persistence Context)

영속성 컨텍스트란? 엔티티를 영구 저장하는 환경이라는 뜻으로 어플리케이션과 DB사이에서 객체를 보관하는 가상의 DB같은 역할을 한다.

velog.io


핵심용어정리

 

** 


참고자료

https://www.ypbooks.co.kr/book.yp?bookcd=100640948&gubun=NV&NaPm=ct%3Dldwj6stc%7Cci%3D8251fe3a560ebe2484e609d1e6279a7f7ec452ab%7Ctr%3Dboksl1%7Csn%3D5295494%7Chk%3Da517eb77dacef8bd533983ee170a 3599fbba8bb6

 

영풍문고 - 서점다운 서점

서울 제외지역 외 궁동, 방배동, 역삼동, 삼각산동, 상일동, 강일동, 개화동, 과해동, 오쇠동, 오곡동, 오류동, 장지동, 현저동, 공덕동, 대방동, 충정로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