2013-05-01 3 views
1

데이터베이스 액세스 권한이있는 프로젝트에서 작업하고 있습니다. 여기에 내가 데이터베이스 액세스 권한이있는 OOP 프로그래밍

public class Foo { 

    private String id; 
    private String name; 
    private int x; 
    private String y; 
    private String z; 
    ... 

    public Foo(String id) throws SQLException { 
     this.id=id; 
     try (Statement stmt = MyConnectionManager().getConnection().createStatement()) { 
      ResultSet rs = stmt.executeQuery("SELECT * FROM " + TABLE_NAME 
       + " WHERE(id='" + this.id + "')"); 
      if (!rs.next()) { 
      throw new NoExistException(); 
      } 
      this.name = rs.getString("Name"); 
      this.x = ... 
      ... 
     } catch (SQLException ex) { 
      throw ex; 
     } 
    } 
    public int getId() { 
     return this.id; 
    } 

    public String getName() { 
    . 
    . 
    . 

를 구현 한 클래스의 개요입니다하지만 대부분의 OOP 샘플에서 보았을 때 나는 대부분의 사람들이 데이터베이스 액세스를위한 추가 클래스를 사용하는 것으로 나타났습니다. 나는 무슨 말을하려고 하는지를 모르는 척한다. 이러한 코드는 각 멤버 변수를 초기화하기 위해 데이터베이스에 액세스합니다. 하지만 내 코드 데이터베이스 내 개체를 초기화하는 데 한 번만 액세스 할 수 있습니다. 이 접근 방식을 변경해야합니까? 내가 을 변경하면 더 많은 객체를 함께 초기화하려고 할 때 (즉, 수백 개일 수 있음) 내 응용 프로그램의 속도에 영향을 미칩니다. 나는 이것이 중복 질문일지도 모른다고 생각한다. 그러나 나는 나의 특별한 문제에 대한 만족스러운 대답을 찾지 못했습니다.

+0

'3-tier'라는 질문을 표시 했으므로 데이터베이스 액세스를 전용 레이어에 넣어야합니다. – Aubin

답변

2

Single Responsibility PrincipleSeparation of Concerns에 위배됩니다. 기본적으로 클래스는 도메인 클래스가 아니며 데이터베이스에 액세스 할 수 없습니다.

각 멤버 변수가 독립적으로 초기화되고 데이터베이스 호출과 관련된 초기화가 더욱 악화되어 이전에 언급 한 Single Responsibility PrincipleSeparation of Concerns을 위반하는 것뿐만 아니라 작동하지 않을 수도 있습니다.

가장 일반적인 방법은 data access layer입니다. 데이터베이스 액세스를 수행하고 결과 집합을 도메인 클래스의 새 인스턴스에 매핑하는 클래스가 있습니다. 인터페이스는 표준 기반 메커니즘의 일종을 얻는 방법의 일련하거나 노출 될 수

public interface FooDao 
{ 
    public Collection<Foo> getAll() throws DaoException; 

    public Foo getByIdentity(String id) throws DaoException; 

    public Collection<Foo> getByName(String name) throws DaoException; 

    public void save(Collection<Foo> foos) throws DaoException; 
} 

:이 귀하의 경우 의미

는 다음과 같이 보일 수있는 그 DAO 인터페이스로 끝날 것입니다 좀 더 정교한 쿼리를 구성 할 수있게 해준다. (내가이 코드를 사용하여 코드를 작성하면 here이된다.) 중요한 것은 모든 코드에서 사용하는 모든 인터페이스이다. 그런 다음이 인터페이스를 원하는대로 구현할 수 있습니다 (객체 모델이 단순한 경우 직접 JDBC를 사용하거나 고급 기능이 필요한 경우 최대 절전 모드로 전환). 단원 테스트에서 조롱하십시오.

Bar 클래스를 도입하면 BarDao을 정의하고 필요에 따라 다시 구현하는 패턴을 반복합니다.

+0

대단히 감사합니다. 데이터베이스 액세스 레이어에서 한 번에 전체 클래스를 인스턴스화해야합니까? 도메인 클래스가 많습니다. 각 클래스를 초기화하기 위해 데이터베이스 레이어에서 별도의 함수를 작성해야합니다. – Jasir

+0

@ Jaz - 내 대답을 확장 해 보겠습니다. –

+0

고마워요. 나는 나의 코드의 패턴을 바꾸기로 결정했다. 이제 저는 DAO가 무엇인지 압니다. [tutorialspoint] (http://www.tutorialspoint.com/design_pattern/data_access_object_pattern.htm)에서 예제를 보았습니다. 다시 한번 감사드립니다. – Jasir

3

디자인 선택의 일환으로 프로그램을 모듈화하는 사람이 있지만 수정 및 유지 관리가 다른 클래스에 영향을 미치지 않으므로 좋은 연습으로 간주됩니다.

데이터베이스 액세스 (리팩토링)를 위해 새 클래스를 만드는 경우 데이터베이스 액세스가 필요한 경우 다른 클래스가이 클래스에도 액세스 할 수 있습니다.