2010-01-20 2 views
38

JPA를 찾았거나 비슷하게 DAO 패턴을 권장하지 않습니다. 나도 잘 모르지만, 특히 서버 관리 JTA 관리자와 같은 느낌.JPA가 비슷하게 DAO 패턴을 권장하지 않습니다.

DAO 패턴을 사용한 적절한 실습을 통해 필자는 그 패턴을 중심으로 JPA 기반 응용 프로그램을 디자인하기 시작했습니다. 그러나 그것은 IMO에 적합하지 않습니다. JPA와 모든 기능을 상당히 잃어 버리는 경향이 있습니다.

음, 비관적 잠금을 사용하여 쿼리를 실행하고 DAO 메서드에서 쿼리 목록을 반환했다고 가정합니다. 반환시 트랜잭션은 끝나고 잠금은 사라집니다 (서버 관리 JTA 관리자의 경우). 그래서, 아무 의미, 느슨하게 말하기. 그러나 유효한 경우가 있습니다.

또 다른 예는 훨씬 더 사소합니다. 쿼리를 실행하여 일부 엔티티를 가져오고, 다른 엔티티와의 게으름로드 일대 다 연관이 있다고 가정 해보십시오. DAO 메소드를 반환하면 트랜잭션이 종료됩니다. 게으른 로딩은 더 이상 작동하지 않으며, 당신은 단순히 null 또는 뭔가를 얻을. 이를 극복하기 위해 우리는 그것을 수동으로 열심히로드합니다. 우리는 a.getBList().size() 같은 것을합니다.

따라서 IMO는 DAO를 독점적으로 만들지 않고 비즈니스 빈에서 수행하는 것이 좋습니다. 이렇게하면 유용한 기능을 활용할 수 있습니다. 또는 ORM API는 아마도 DAO/데이터 계층 자체로 간주 될 수 있습니다. 그래서, 우리는 다른 것을 만들 필요가 없습니다.

여러분의 의견을 생각해보십시오.

참고 : 나는 DAO 패턴이 더 이상 사용되지 않는다고 말하지 않습니다. 실제로 경우에 따라 다릅니다.

답변

46

간단한 응용 프로그램의 경우 EntityManager을 EJB에서 직접 사용하고 DAO 패턴을 건너 뛰는 데 아무런 문제가 없습니다 (너무 많은 코드 작성에 지쳐 있습니다). JPA와 Java EE API가 장려하는 것입니다.그러나 더 복잡한 응용 프로그램 (저장 프로 시저, 플랫 파일의 데이터 액세스 ...)에 대해서는 여전히 정당화 될 수 있습니다. 따라서 당신이 맞습니다. 의존적입니다.

Has JPA Killed the DAO?에서 InfoQ에 대한 다른 깨달음을 얻은 점을 발견하게 될 것입니다. 그렇지만 다음과 같이 요약 할 수있는 내용과 결론에 놀라지 않을 것입니다. 표준 데이터 액세스를 위해 DAO 패턴을 더 필요로하지만, 좀 더 복잡한 상황에서는 DAO 패턴이 필요할 수도 있습니다.

+0

(+1) 나는 마음에 특별한 것이 없다면, dao 계층을 만들 이유가 없다는 것에 동의하는 경향이있다.심지어 일반적인 DAO, 엔티티를위한 별도의 DAO 클래스는 물론입니다. – Bozho

+0

Java EE JAX-RS/JPA 코드를 테스트하는 좋은 방법을 찾는데 어려움을 겪었습니다. 실행 가능한 "container-in-the-tests"솔루션을 얻으려고 악몽이었습니다. 주요 측면은 테스트에서 @ Context PersistenceContext를 주입하는 것입니다. 나는 Dao를 테스트에서 불러내 어 생성자와 함께 @ EJB Dao를 사용하여 Dao를 깨끗하게 만들 것이라고 생각합니다. –

31

DAO 자체를 트랜잭션으로 정의하지 않으면 이러한 문제가 발생하지 않습니다.

트랜잭션이 여러 작업에 걸쳐 있기 때문에 서비스 계층은 트랜잭션이어야합니다. 각 삽입/업데이트를 트랜잭션에 넣는 것이 가장 좋은 시나리오는 아닙니다.

봄에는 매우 쉽게 달성 할 수 있습니다. 이를 사용하지 않으면 DAO에 거래 논리를 다시 포함 할 수 있습니다 (예 : dao.beginTransaction()dao.commitTransaction()). 대신 서비스 계층에서 사용하십시오.

제가 알고 있듯이 EntityManager을 서비스 클래스에서 직접 사용하는 것이 래퍼 DAO 클래스를 사용하는 것보다 낫습니다. 나는 한 가지 이유에 동의하지 않는다. 서비스 클래스에서 DAO 클래스 (최상의 인터페이스)를 사용하면 JPA API에 대한 의존성이 전혀 없습니다. Query 등의 객체를 만들 필요가 없습니다. 이것은 큰 장점이 될 수는 없겠지만 그것이 최선의 방법이라고 동의 할 것입니다. 그리고 나중에 DAO 만 변경하여 일반 JDBC, 일반 텍스트, XML 등으로 전환 할 수 있습니다.

다른 레이어에서 무언가를 추상화해야하는 이유의 예로 광범위하게 사용되었지만 대부분 단순히 지나치게 디자인되었습니다. 그러나 때로는 모든 데이터베이스 액세스 작업이 한 곳을 통과한다는 사실은 로깅, 액세스 수준 검사 등을 추가 할 수 있음을 의미합니다 (예, 때때로 DAO가이 작업을 수행하는 데 특히 적합한 방법은 아닙니다).

궁극적으로, 귀하의 요점으로 돌아가려면 - 그것이 달려 있습니다.

+0

감사합니다. Bozho. 트랜잭션 논리가 비즈니스 규칙에 의존한다는 것을 알았습니다. 우리가 DAO를 준수하도록 만들면, 우리가 비즈니스 규칙으로 그것을 오염시키고 있음을 의미합니다. 그렇지 않으면 DAO가 제공 한 데이터를 가져와 비즈니스 로직에서 일해야 할 필요가 있음을 의미합니다. 후자의 경우, 이전에 언급 한 게으른 로딩 문제가 있습니다. 또한,이 게시물을 참조하십시오 http://stackoverflow.com/questions/1748238/pros-and-cons-of-the-use-of-dao-pattern/1748282#1748282 –

+0

나는 당신의 편집 내용을 보았습니다. 예, Hibernate/JPA가있는 Spring은 잘 작동합니다. 센트 퍼센트 합의. 그러나 서버에 대한 강조는 JTA 트랜잭션을 관리했습니다. 여기서는 트랜잭션 가져 오기의 자유가 없습니다. –

+7

* 서비스 클래스에서 DAO 클래스 (...)를 사용하면 JPA API에 전혀 의존하지 않아도됩니다. "* 좋아, EJB 3에 종속되어 있지만 그래서? 진지하게, 문제는 무엇입니까? 나는 표준 API에 의존하지 않는다. –

3

DAO는 디자인 관점에서 사용되는 반면 JPA는 데이터 액세스 기능을위한 "공식적인"래퍼입니다. JPA가 DAO를 죽이려는 방법이 없습니다. DAO를 쉽게 구현할 수 있습니다. DAO가 너무 단순 해 보이기 때문에 쉽게 무시할 수 있습니다. 그러나 DAO 레이어가 없으면 설계상의 이점은 더 이상 존재하지 않습니다.

물론 "간단한"프로젝트의 경우 무시할 수 있습니다. 프로젝트가 "간단하다"면 많은 것들이 "무시"될 수 있습니다.

+0

Elton : 나는 당신이 의미하는 것에 전적으로 동의합니다. 그러나 필자는 겹겹이 만드는 것이 좋은 디자인을 얻는 유일한 방법은 아니라고 강조하고 싶습니다. 그러므로 나는이 말을 절대적으로 받아 들일 수 없다. "그 층이 없으면 모든 설계상의 이점이 더 이상 존재하지 않는다는 의미입니다." 나는 당신이 내 요점을 알고 있기를 바랍니다. –

+0

확인. Dao 층은 오랜 시간 동안 존재합니다. 설계상의 이점을 가져옵니다. DAO가 없으면 설계상의 이점이 없어집니다. 어쩌면 당신 상황에서 당신은 그것이 당신이 쓸모 없다고 생각하는 이유인지 신경 쓰지 않을 것입니다. 나는 당신의 질문이 실제로 dao가 가져 오는 것에 관한 것이라고 생각하지만, dao가 가져올 것이 필요한지 여부를 생각합니다. 나에게 "Dao"층은 결코 사라지지 않았다. 비즈니스 계층에 EntityManager를 삽입하면 비즈니스 계층도 Dao 계층의 작업을 수행합니다. 당신은 그 이유 때문에 그 층들을 함께 결합합니다. 그것은 귀하의 경우에 더 나은 해결책이 될 수 있습니다. 반복해서, 그것은 절대적이지 않습니다. – Elton

+0

Elton : 여기 도착하기 전에도 결론은 같았습니다. 나는 DAO가 쓸데없는 패턴이라는 것을 결코 느끼지 못했고, 질문을주의 깊게 읽으십시오. 나는 그 점을 매우 명백하게하려고 노력했다. –