()붕붕영화 시스템 개발부가 만든 기본적인 기능만있는 기본 데이타베이스로는 붕붕영화

예매 시스템에 사용하기에는 여러모로 부족합니다.

최소한 레코드를 검색하는 기능과 경쟁하는 Thread가 데이터베이스의 레코드를 동시에

추가 혹은 수정,삭제,조회를 하더라도 데이타베이스의 무결성이 지켜질 수 있도록 데이타

베이스에는 레코드 Lock기능이 구현되어야 합니다.

이제 ()붕붕영화 시스템 개발부가 만든 기본 데이타베이스인 Movie 클래스를 확장시켜,

레코드 검색기능과 레코드 Lock 기능을 추가로 구현하고자 합니다.

 

붕붕영화 예매시스템의 기본 데이타베이스를 확장하는 것은 기본 데이터베이스인 Movie

클래스가 이미 존재하고 있고, 여기에 추가적으로 가치있는 기능을 더하는 구조이므로,

이를 설계할때는 기본기능은 상속으로 사용하고, 추가기능만 새롭게 구현하는 것이 좋은

선택이 됩니다.

일반적으로 계층구조의 성격을 갖고 있을때, 계층구조 상위의 클래스는 보편적이며 기본적

인 기능을 구현하고, 계층구조 하위의 구체적인 클래스는 추가 세세한 기능을 구현하여,

체계적이고, 재활용성을 높여 시스템 개발 및 유지비용이 낮추는 것이 보통입니다.

이런 이유로 레코드 검색기능과 레코드 Lock 기능을 추가 구현할 확장 데이타베이스

MovieDatabase 클래스는 기본 데이타베이스 Movie 클래스를 상속하고자 합니다.

 

기본 데이타베이스 Movie 클래스를 상속한 MovieDatabase 클래스는 예제 18 - 7에서

선언한 메소드와 같이 레코드 검색기능과 레코드 Lock 기능,영화를 예매할 수 있는 기능을

갖도록 다음의 메소드를 구현합니다.

 

/**

* 검색 조건 query을 분석해서 조건에 만족하는 레코드들을 java.util.List에 담아서

* 돌려줍니다.

*/

public List finds(String query) throws DatabaseException

/**

* Thread가 데이터베이스 recno 레코드에 대해서 배타적,독점적인 권리를 얻습니다.

*/

public void lock(int recno) throws IOException

/**

* Thread가 데이터베이스 recno 레코드에 대해서 배타적,독점적인 권리를 반납합니다.

*/

public void unlock(int recno)

 

/**

* recno 레코드(붕붕영화관에서 상영하는 영화) seats 만큼 예매합니다.

*/

public void book(int recno,int seats) throws DatabaseException

예제 18 - 8

 

 

public void lock(int recno) public void unlock(int recno)의 경우는 항상 쌍으로 사용되는

메소드로서 Thread가 데이터베이스 레코드에 대해서 배타적,독점적으로 레코드를 읽고,

고치고,삭제 할 수 있는 권리를 얻고,그 권리를 반환합니다.

 

데이테베이스의 무결성을 보장하기 위해서 레코드를 읽거나,고치거나,삭제하기 전에 반드시

데이타베이스를 이용하는 모든 Thread는 해당 레코드에 대한 Lock을 얻어야만 합니다.

만약 레코드에 대한 Lock Thread B가 얻었다면 Thread A는 그 레코드를 읽고,쓰고,

고치려면 해당 레코드에 대한 배타적 권리인 Lock을 얻을때까지 반드시 기다려야합니다.

 

붕붕뉴스 데이타베이스를 이용하는 Thread A public void lock(int recno)를 호출했다면

Thread B가 이미 해당 레코드에 대한 Lock을 갖고 있으므로 Thread A가 호출한 public

void lock(int recno) 메소드는 리턴되지 않아야합니다.

만약 public void lock(int recno)가 리턴되었다면 레코드에 대한 배타적 권리인 Lock을 얻은 상태입니다.

 

public void unlock(int recno) Thread가 레코드에 대한 Lock을 해제하는데 사용됩니다.

만약 레코드에 대한 Lock을 가지고 있는 Thread public void unlock(int recno)를 호출해

주지 않으면 데이터베이스에 존재하는 recno번째 레코드를 제 3 Thread는 절대로 읽거나,

고치거나,삭제할 수 없습니다. 위의 예에서 레코드의 Lock을 가진 Thread B Lock

해제하지 않으면 Thread A가 호출한 public void lock(int recno)는 리턴되지 않습니다.

 

이런 이유로 레코드를 Lock Thread는 자신이 필요한 행동을 한후에는 반드시 Lock

해제해 주어야 합니다. 이를 구현하는 가장 간명한 방법은 public void lock(int recno)

메소드와 public void unlock(int recno)를 같은 메소드에서 함께 사용합니다. ,try 문에서

Lock을 얻고(public void lock(int recno)를 호출하고) finally 문에서 Lock

해제합니다.(public void unlock(int recno)를 호출합니다.)

'자바 SCJD Projects' 카테고리의 다른 글

SCJD-6.리모트 인터페이스  (0) 2008.01.21
SCJD-5.검색과 레코드 Locking  (0) 2007.12.24
SCJD-3. 기본 클래스  (0) 2007.12.13
SCJD-2. SCJD 대비 연습 프로젝트 개요  (0) 2007.12.11
SCJD-1. 자격증소개  (6) 2007.12.11
Posted by
,