본문 바로가기

Design Patterns

식별자 맵 패턴

이 포스팅은 어플리케이션 아키텍쳐 패턴 11장을 요약한 내용입니다.

 

모든 객체를 한 맵에 로드해 각 객체가 한 번씩만 로드되게 한다. 객체를 참조할 때는 맵을 이용해 객체를 조회한다.

 

식별자 맵(Identity Map)은 단일 비즈니스 트랜잭션이 데이터베이스에서 읽은 모든 객체에 대한 기록을 보관한다. 객체가 필요할 때마다 먼저 객체가 이미 있는지 여부를 식별자 맵에서 확인한다.

작동 원리

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

 

고려해야할 점

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

 

사용 시점

일반적으로 식별자 맵은 데이터베이스에서 가져오고 수정하는 객체를 관리하는 데 사용한다.

 

객체를 관리하는 이유

  1. 레코드 일관성 : 인메모리 객체 두 개가 동일한 데이터베이스 레코드와 연결되는 상황을 방지하기 위해서다. 이러한 상황에서는 두 레코드가 일관성이 없이 수정되고 데이터베이스 매핑에 혼란이 발생할 수 있다.
  2. 캐시를 통한 성능 향상

 

예제 : 식별자 맵의 메서드(자바)

//각 식별자 맵에는 맵 필드와 접근자가 있다.

private Map people = new HashMap();

public static void addPerson(Person arg){
	soleInstance.people.put(arg.getID(), arg);
}

public static Person getPerson(Long key){
	return (Person) soleInstance.people.get(key);
}

 

'Design Patterns' 카테고리의 다른 글

게이트웨이 패턴, 서비스 스텁 패턴  (0) 2020.10.08
지연로드(Lazy Load) 패턴  (0) 2020.10.04
작업단위 패턴  (0) 2020.10.03
애그리거트 트랜잭션관리  (0) 2020.09.20
애그리거트  (0) 2020.09.12