응용 프로그램 서비스 계층 호출 데이터베이스 기능. 나쁜 건축?


11

대본:

  • 스택 : Java, Spring, Hibernate.
  • 모델 : 클라이언트 서버 응용 프로그램
  • 패턴 : MVC (Model-View-Controller).

서비스 계층 클래스에는 세 가지 동작이 있습니다.

  1. 일부 서비스는 메소드 내에 비즈니스 규칙이 있으며 지속성을 애플리케이션에 위임합니다. 처럼:

    EntityManager.save (entity);

  2. 일부 서비스는 단순히 데이터베이스 함수를 호출합니다 (매개 변수 전달).

    CallableStatement cls = con.prepareCall ( "{call databaseFunction (args)}");

  3. 일부 서비스에는 두 가지 동작 이 모두 있는 방법이 있습니다.

내 질문 :

  1. 응용 프로그램 서비스에서 직접 데이터베이스 기능을 호출하는 데 문제가 있습니까? 이것이 나쁜 습관으로 간주되지 않습니까? 이와 같은 프로젝트에 적용 가능한 아키텍처 모델은 무엇입니까?
  2. 동일한 서비스에서 동작을 혼합하는 데 문제가 있습니까? 거래 및 일관성과 같은?
  3. 유지 관리의 경우이 캡슐화가 개발자에게 데이터베이스의 기능도 변경해야한다는 것을 모호하게합니까? 이것을 피하는 방법?
  4. 이 시나리오는 전 세계의 다른 응용 프로그램에서 발생합니까 아니면 건축 오류일까요?

이 질문은 비슷하지만 정확히 같은 것은 아닙니다 .. softwareengineering.stackexchange.com/questions/180012/…
Jon Raynor

답변:


7

응용 프로그램 서비스에서 직접 데이터베이스 기능을 호출하는 데 문제가 있습니까? 이것이 나쁜 습관으로 간주되지 않습니까?

나는 생각합니다. 데이터베이스 내부에 대한 지식을 응용 프로그램 서비스에 배치하고 있습니다. 스토리지 엔진을 변경하거나 필드 이름을 바꾸거나 색인을 생성하는 방식으로 데이터베이스를 변경하면 응용 프로그램 서비스를 변경해야하고 SRP 를 위반하는 경우가 있습니다.

이와 같은 프로젝트에 적용 가능한 아키텍처 모델은 무엇입니까?

아래의 의견을 참조하십시오.

동일한 서비스에서 동작을 혼합하는 데 문제가 있습니까? 거래 및 일관성과 같은?

기술적 인 문제는 없다고 생각하지만 논리적 문제가 있습니다. 응용 프로그램에서 두 가지 접근 방식을 혼합하여 모호하고 덜 구조적이며 변경에 적응하기가 어렵습니다. SRP 위반에 대한 위의 의견도 참조하십시오.

유지 관리의 경우이 캡슐화가 개발자에게 데이터베이스의 기능도 변경해야한다는 것을 모호하게합니까?

물론입니다.

이것을 피하는 방법?

데이터베이스와 직접 작업하는 별도의 추상화 수준으로 DAO 계층 또는 간단한 리포지토리 패턴으로 작업하는 메서드 및 함수를 배치합니다 (응용 프로그램의 복잡성에 따라 다름)

이 시나리오는 전 세계의 다른 응용 프로그램에서 발생합니까 아니면 건축 오류일까요?

나는 세상에서 모든 일이 일어난다 고 생각합니다.)


올바르게 이해하면 함수 / 저장 프로 시저 및 ORM을 통해 업데이트가 발생하면 주어진 트랜잭션의 상태를 추론하기가 매우 어렵다는 기술적 문제가있을 수 있습니다. 응용 프로그램이 현재 상태에서 작동 할 수 있지만 약간의 변경만으로도 큰 문제가 발생할 수 있습니다. Hibernate에 대한 나의 경험은 그것이 작동하는 전체 테이블 세트를 관리하지 못하게하면 많은 성가신 문제가 있다는 것입니다.
JimmyJames

좋고 간결한 답변. SRP는 코드를 처음 보았을 때 가장 먼저 떠 올랐습니다. 일부 동료들은이 메소드가 데이터베이스 기능 만 호출한다는 사실 때문에 SRP를 위반하지 않는다고 말합니다. 그러나 이러한 기능 중 일부는 선택, 삽입 및 업데이트를 수행합니다. SRP를 위반하지 않습니까? (아마도 이것 자체가 별도로 논의해야 할 또 다른 질문일까요?)
linuxunil

1
그 줄에 +1 나는 세상에서 모든 것이 일어난다 고 생각한다;)
linuxunil

@linuxunil SRP는 모든 수준의 아키텍처에서 존중되어야합니다. 필자의 경우 메소드 수준이 아니라 서비스 수준에서 SRP를 의미했습니다. @ JimmyJames Yep. 대부분의 ORM은 저장 프로 시저에서 제대로 작동하지 않습니다. 그러나 때때로 저장된 절차가 필요합니다.
Vladislav Rastrusny

3

당신이 말한 것에 따르면 서비스 계층이 있으므로 적합한 아키텍처 패턴은 계층 구조입니다. 추가 참조

예. 비즈니스 계층이 데이터베이스 추상화에만 액세스하는 방식으로 데이터 액세스 계층 이외의 데이터베이스에서 직접 데이터베이스 호출을 수행하는 것은 일반적으로 좋지 않습니다.

믹싱 비헤이비어와 관련하여 DAO 패턴 또는 리포지토리 패턴으로 일부 디자인 패턴을 사용하면 해당 책임을 위임하여 해당 코드를 개선하는 데 도움이 될 수 있습니다.

디자인 패턴과 ORM을 사용하면 얻을 수있는 이점 중 일부는 코드를 쉽게 읽을 수있게되어 책임을 캡슐화하므로 데이터베이스 액세스가 변경되면 비즈니스 계층이 크게 바뀌지 않아야한다는 것입니다.


왜 이것이 투표에 실패했는지 확실하지 않습니다. 이 답변 은 다른 문제 를 다루는 코드를 분리 하는 것이 좋습니다 . 여기 프로그래밍의 주체처럼 느껴집니다 ... 그것이 무엇인지 잘 모르겠습니다 ... 남자. 이름 만 생각하면 +1 BTW
Greg Burghardt 2016

그것은 견고한 원칙 중 하나가 아닙니까?
J. Pichardo

3
제 SOLID에서 "S"는 인 S 책임 주체 (SRP) 화롯불. 그러나 권장하는 분리 문제는 데이터 액세스 로직에서 서비스 로직을 분리하는 데 유효한 이유입니다. Vladislav의 다른 대답은 단일 책임 교장을 언급합니다. 솔직히, SRP와 우려의 분리는 와인과 치즈처럼 잘 어울립니다.
Greg Burghardt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.