서비스 계층을 만드는 것이 얼마나 중요합니까?


68

3 개 계층 (DAL, BL, UI)으로 앱을 구축하기 시작했습니다. 주로 CRM, 일부 판매 보고서 및 인벤토리를 처리합니다.

동료가 서비스 계층 패턴으로 전환해야한다고 개발자가 경험을 바탕으로 서비스 패턴을 도입했으며 대부분의 애플리케이션을 설계하는 더 좋은 방법이라고 말했습니다. 그는 미래에 그런 식으로 애플리케이션을 유지하는 것이 훨씬 쉬울 것이라고 말했다.

개인적으로, 나는 그것이 단지 일을 더 복잡하게 만들고 있다는 것을 느끼고 그것을 정당화 할 수있는 이점을 많이 볼 수 없었습니다.

이 응용 프로그램에는 데스크톱 응용 프로그램 기능 중 일부 (그러나 소수는 아님)를 사용하는 작은 부분 UI가 추가되어 있으므로 코드를 많이 복제하지는 않았습니다. 코드 중복으로 인해 서비스 지향으로 변환하지는 않지만 일반적으로 매우 훌륭한 아키텍처이기 때문에 프로그래머는 왜 서비스에 대해 열정적입니까?

나는 그것에 구글을 시도했지만 여전히 혼란스러워하고 무엇을 해야할지 결정할 수 없습니다.

답변:


58

Martin Fowler의 저서 "엔터프라이즈 아키텍처 패턴"은 다음과 같이 말합니다.

대답하기 쉬운 질문은 아마 사용하지 않을 때입니다. 애플리케이션의 비즈니스 로직에 하나의 클라이언트 (예 : 사용자 인터페이스) 만 있고 서비스 사례 응답에 여러 트랜잭션 리소스가 포함되지 않는 경우 서비스 계층이 필요하지 않을 수 있습니다. [...]

그러나 두 번째 종류의 클라이언트 또는 사용 사례 응답의 두 번째 트랜잭션 리소스를 구상하자마자 처음부터 서비스 계층에서 설계 비용을 지불합니다.

서비스 계층이 제공하는 이점은 서로 다른 클라이언트가 사용할 수있는 공통 응용 프로그램 작업 집합을 정의하고 각 작업의 응답을 조정한다는 것입니다. 비즈니스 논리를 소비하고 여러 트랜잭션 리소스와 관련된 복잡한 사용 사례가있는 둘 이상의 클라이언트가있는 응용 프로그램이있는 경우 관리 트랜잭션과 함께 서비스 계층을 포함하는 것이 좋습니다.

CRM, Sales 및 Inventory를 사용하면 거의 항상 서비스 계층 작업과 일대일로 대응되는 많은 CRUD 유형 사용 사례가 있습니다. 도메인 개체의 생성, 업데이트 또는 삭제에 대한 응답은 서비스 계층 작업에 의해 원자 적으로 조정되고 처리되어야합니다.

서비스 계층의 또 다른 이점은 로컬 또는 원격 호출 또는 둘 다를 위해 설계 될 수 있으며 유연성을 제공한다는 것입니다. 이 패턴은 애플리케이션 비즈니스 로직의 캡슐화 된 구현과 다양한 클라이언트가 일관된 방식으로 해당 로직을 호출하기위한 토대를 마련합니다. 즉, 클라이언트가 동일한 공통 서비스를 공유하므로 코드 중복을 줄이거 나 제거 할 수 있습니다. 비즈니스 로직이 변경 될 때 일반적으로 각 클라이언트가 아닌 서비스 만 변경하면되므로 유지 관리 비용도 절감 할 수 있습니다.

요약하면, 서비스 계층을 사용하는 것이 좋습니다. 더 많은 예에서는 귀하가 제공 한 비즈니스 논리의 여러 클라이언트가있는 것처럼 들리므로 귀하가 제공 한 것으로 생각합니다.


2
흥미롭게도 Martin Fowler는 로컬 및 원격 호출에 대해 동일한 인터페이스를 반대하여 원격 호출의 성능 차이가 더 거칠고 거친 인터페이스를 강요한다고 주장합니다.
psr

귀하의 단락을 이해하지 못했습니다. With CRM, Sales and Inventory there will be a lot of CRUD-type use cases of which there is almost always a one-to-one correspondence with Service Layer operations여러 UI에 관한 것이라면 CRUD는 어떻게 여기에 있습니까? CRUD가 서비스와 잘 어울리더라도 여러 UI가 필요하지 않으면 서비스 계층을 만들지 않을 것입니다. 정확히 이해하면 간단합니다. 서비스 계층은 미숙 한 의견에 엉망으로)
BornToCode

4
이러한 경우,이를 활용할 수있는 클라이언트가 하나만있는 경우는 거의 없습니다. UI가 하나 뿐인 경우 여전히 서비스 계층을 원할 수있는 두 가지 이유, 보안 및 재사용 가능성을 생각할 수 있습니다. 일반적인 엔터프라이즈 설정에는 외부 클라이언트가 UI 앱을 사용할 수 있고 서비스 계층은 네트워크에서만 사용할 수 있습니다. 따라서 웹 서버는 네트워크의 잠긴 부분으로 작업을 지연시킵니다. 판매 예제에서 웹 사이트에서 판매를 가져와 eBay 또는 Amazon으로 확장하면 재사용 할 수 있습니다. 이제 하나의 UI와 여러 개의 클라이언트가 있습니다.
Phil Patterson

5
@PhilPatterson의 의견에 추가하십시오. 여러 클라이언트가 UI 기반 일 필요는 없습니다. 웹 서비스 나 라이브러리를 생각해보십시오. 클라이언트 일 수도 있습니다. 프론트 엔드 UI는 서비스 계층과 패키지 소프트웨어 서비스를 사용하여 다른 사람이 사용할 수 있도록합니다.
Deco

서비스 계층의 예를 제공 할 수 있습니까?
user962206

34

당신이 아이디어를 평가하고 가장 좋은 방법을 체결했기 때문에 서비스 레이어를 추가 : 좋은

모든 멋진 아이들이하는 일이기 때문에 서비스 계층 추가 : 나쁜

장이 필요 없다고 말하면 만들지 마십시오.

지난 10 년 동안 프로그래밍 세계에서 가장 실망스러운 발전 중 하나는 사람들이 마치 이번 시즌의 신발처럼 트렌드와 악 대차를 따르는 성가신 '패션'지향이되었다는 것입니다. 함정에 빠지지 마십시오. 다음 시즌 '모두'는 다른 방법으로 디자인해야한다고 말할 것입니다.

서비스 계층에는 아무런 문제가 없습니다. 이는 현재 프로젝트의 기술적 장점에 대한 적합성을 평가해야하는 특별한 접근 방식입니다. 다른 사람들의 의견을 자신의 판단으로 대체하도록 강요받지 마십시오.


27
이것은 주제를 전혀 다루지 않고 단지 몇 마디로 대체 한 후이 사이트의 모든 질문에 적용 할 수있는 개발 관행에 대한 포괄적 인 진술 / 보증을합니다. 이 답변을 읽음으로써 서비스 계층 무엇인지 정확하게 알고 있다고 확신조차하지 못합니다 .
Aaronaught

12
확실히 다른 질문에 적용될 수 있습니다 ... 덜 사실적이지는 않습니다. 사실은 자신이나 프로젝트에 필요한 것을 언급하기 위해 필요한 맥락 근처에있는 사람이 아니므로 그가 필요하다고 대답하거나 그렇지 않다고 말하는 것은 단순한 추측과 비전문가입니다. OP가 여기에 필요한 것은 그가 알고있는 결정이 올바른 결정을 내리는 데 약간의 도덕적 지원입니다.
GrandmasterB

5
@Aaronaught 대답의 정확성에 관계없이 그는 여전히 "서비스 계층이 얼마나 필수적인가?"라는 주요 질문에 대답하고 있습니다. 그는 전혀 필수적이지 않다고 주장하며 그것은 단지 유행 일 뿐이라고 주장합니다. 답변에 동의하지 않으면 공감하십시오.
maple_shaft

2
@GrandmasterB 저는 패션이 소프트웨어 개발에 좋다고 주장합니다. 대부분의 개발자는 정보에 입각 한 디자인 및 아키텍처 결정을하기에는 너무 신선하거나 능력이 없습니다. 우리는 여전히 일하는 소프트웨어의 유사성을 드러 낼 것으로 기대합니다. 따라서 악 대차를 뛰어 넘고 열악한 디자인 선택과 일관성 을 유지하는 것은 몇 년 전에 카우보이 코드를 모든 곳에서 카우보이 코드로 수행했던 방식보다 훨씬 선호되고 유지 관리가 쉽습니다. 이해하지 못하거나 감사하지 않았다.
maple_shaft

10
@maple_shaft 명확히하기 위해 서비스 계층이 유행하지 않는다고 말하고 있지 않습니다. 나는 질문이 제기 된 방식 에 따라 그의 동료가 자신의 프로젝트에서 warrented라고 생각하지 않는 아키텍처를 사용하도록 강요하는 유행 / 유행 / 악대 행동 이 보인다고 말합니다. 나는 내 대답에서 서비스 계층 (또는 다른 개념)을 개별 프로젝트에 대한 자체 장점에 대한 적합성을 평가 해야하는 중립적 개념이라고 생각합니다. 그들 스스로 판단 할 때 필요하지 않다고 말하면 적용 / 사용되어서는 안됩니다.
GrandmasterB

22

서비스 계층 생성 결정에는 여러 가지 요소가 있습니다. 다음과 같은 이유로 과거에 서비스 계층을 만들었습니다.

  1. 여러 클라이언트가 재사용해야하는 코드입니다.
  2. 라이센스가 제한된 타사 라이브러리.
  3. 시스템에 통합 지점이 필요한 타사
  4. 중복 된 비즈니스 로직을 중앙 집중화합니다.

사례 1 : 수많은 다른 클라이언트가 사용해야하는 기본 기능을 작성 중입니다. 서비스 계층은 다른 클라이언트가 제공하는 기능을 즉시 사용할 수 있도록 기능을 빌드합니다.

사례 2 : 일반적으로 앱 공간에서 코드를 호스팅하지만 라이센스가 제한된 타사 라이브러리를 사용하고 있습니다. 이 경우 어디에서나 사용하려는 리소스가 있지만 제한된 수의 리소스 만 있습니다. 서비스 뒤에 호스팅하면 전체 조직이 각 개별 호스팅에 대한 라이센스를 구매하지 않고도 응용 프로그램에서 서비스를 사용할 수 있습니다.

사례 3 : 귀하는 제 3자가 귀하에게 연락 할 수있는 기능을 구축하고 있습니다. 예를 들어 공급 업체가 들어오는 제품 발송물에 대한 메시지를 전달할 수 있도록 재고 엔드 포인트를 설정할 수 있습니다.

사례 4 : 코드 전체를 분석 한 결과, 별도의 팀이 동일한 것을 만들었습니다 (약간 다르게 구현 됨). 서비스 계층을 사용하면 최상의 접근 방식을 선택할 수 있으며 이제 모든 팀에서 서비스를 호출하여 프로세스를 동일하게 구현할 수 있습니다. 중앙 집중식 논리의 또 다른 이점은 버그가 발견 된 경우입니다. 이제 수정 사항을 한 번 배치하면 모든 클라이언트가 동시에 혜택을 누릴 수 있습니다.

이 모든 것은 서비스 계층에 부정적인 영향을 미칠 수 있다고합니다.

  1. 시스템 복잡성을 추가합니다. 이전에 디버깅 할 응용 프로그램이 하나 밖에 없었던 곳은 지금 두 개입니다. 프로덕션 문제는 클라이언트 앱 설정, 서비스 앱 설정 또는 올바르게 설정 한 클라이언트 및 서버 앱 간의 통신 문제를 확인해야합니다. 전에 한 번도 해본 적이 없다면 까다로울 수 있습니다.
  2. 한 가지 실패 지점. 서비스 중단이 발생하면 모든 클라이언트가 영향을받습니다. 이러한 방식으로 코드를 배포하지 않으면 위험을 줄일 수 있습니다 (이를 완화 할 수있는 방법이 있음).
  3. 버전 관리가 더 어려울 수 있습니다. 서비스를 사용하는 하나의 앱이있는 경우 두 애플리케이션 사이에서 인터페이스 변경을 동시에 수행 할 수 있습니다. 여러 클라이언트가있는 경우 V1에있는 사람, V2에있는 사람 및 V1 제거를 조정해야합니다 (모든 사람이 V2로 업데이트 한 것을 알고 있음).

요점은 시스템 서비스 지향을 만드는 것이 항상 슬램 덩크가 아니라는 것입니다. 내 경험상 일반적으로 좋은 생각이지만 (이 방법으로 응용 프로그램을 구성하는 경향이 있음) 자동 결정은 아닙니다. 하루가 끝나면 장단점을 평가하고 상황에 맞는 결정을 내려야합니다.


2
+1 유익한 답변에 감사드립니다. 나는 당신의 답변이나 데코의 답변을 받아 들일 날씨가 의심 스럽습니다. 결국 나는 너무 경험이 많지 않아서 가장 많이 찬성하는 답변을 선택하기로 결정했습니다. 나는 아직도 당신의 대답이 더 많은지지를받을 가치가 있다고 생각합니다. 어쨌든 나는 당신이 당신의 지식과 경험을 공유 한 것에 대해 정말로 감사합니다. 감사합니다!
BornToCode

1
천만에요! 두 가지 대답에서 벗어나는 주요 요점은 (주로) 동일한 작업을 수행해야하는 여러 클라이언트가있는 유지 관리 문제를 해결하는 것입니다. 서비스를 사용하는 클라이언트 수가 많을수록 유지 관리 이익이 커집니다.
Phil Patterson

1
보안이 있습니다-서비스 계층은 해커가 DB의 보물을 얻기 위해 침입 할 수있는 또 다른 벽을 제공 할 수 있습니다. 서비스 계층이 없기 때문에 많은 웹 사이트가 막대한 보안 침해를당하는 이유 일 수 있습니다.
gbjbaanb

6

내가 본 대부분의 서비스 계층은 완전한 혼란입니다. 서비스는 다양한 방법을 사용하는 경향이 있으며 1500 LOC는 드물지 않습니다. 다른 방법은 공통점이 없지만 코드를 공유합니다. 이로 인해 높은 커플 링 과 낮은 응집력이 발생 합니다. 새 작업이 필요할 때마다 코드베이스를 확장하는 대신 코드를 수정해야하기 때문에 OCP 도 위반 합니다. 잘 구성된 서비스 계층은 이론적으로 가능하지만 실제로는 본 적이 없습니다.

CQRS 는 이러한 문제를 해결하고 해당 절차 서비스 계층 중 하나를 생성하지 않아도됩니다.


2
그래도 누구의 표준으로 구성 되었습니까? 확실히 OO 표준에 따르면 서비스 계층 인터페이스는 혼란의 완전한 난파선입니다. 기능적 또는 절차 적 관점에서 볼 때 그것은 아름다운 계층 적 설계 접근을 장려합니다. 서비스 계층에 대한 사람들의 최대 불만은 상태 비 저장 트랜잭션 기반 응용 프로그램을 장려하고 순수한 객체 지향 접근 방식을 권장하지 않는다는 것입니다. 나는 논쟁의 양쪽을 이해할 수있다.
maple_shaft

6

인터페이스 (서비스 계층은 인터페이스 유형 임)를 추가하는 데 시간이 걸립니다. 좋은 것은 디자인하고 테스트하는 데 많은 시간이 걸립니다. 나중에 변경하면 모든 클라이언트가 중단되므로 첫 번째 시도에서 바로 얻는 것이 매우 중요합니다. 또한 약간 다른 요구를 가진 두 번째 클라이언트가있을 때까지 해당 인터페이스에 무엇이 필요한지 알지 못할 것입니다. 서비스 유지는 그 자체로 끝나지 않는 프로젝트입니다.

대부분의 조직에서 비즈니스 스폰서에게 가서 "다른 예산 부서에서 예산으로 개발중인이 시스템의 이점을 다른 부서에서 활용하기를 원하십니까?" 그들은 당신을 비웃을 것입니다. 먼저 비즈니스 스폰서에게 도움을 요청한 다음 부서의 시간에 해당 코드를 재사용하여 문제를 해결하십시오.

사실 오늘날 작성중인 기능이 여러 다른 서비스 클라이언트에서 재사용 될 것임을 알고 있다면 첫 번째 날부터 서비스 계층을 설계하는 것이 좋습니다. 확실하지 않거나 이미 프로젝트에 미지수가 많은 경우 먼저 간단한 작업을 수행하고 시간과 예산이있는 경우 나중에 서비스와 클라이언트로 분리하십시오. 작업 시스템을 시작할 때 첫 번째 시도에서 서비스 인터페이스를 얻는 것이 훨씬 쉽습니다.

PS Java로 작업하는 경우 Joshua Bloch는 그의 저서 인 Effective Java에서 환상적인 인터페이스 조언을 많이받습니다.


멸균 이론이없는 훌륭한 답변.
danilo

2

동의합니다. 단일 UI를 사용하는 경우 하나 이상의 레이어를 포함 할 필요가 없습니다.

DAL, BL 및 UI / Controller는 응용 프로그램을 디자인하기에 적합합니다. 단일 UI를 사용하려는 경우 추가 레이어를 준비 할 필요가 없습니다. 응용 프로그램에 1 개 이상의 계층을 포함하면 개발 노력 / 시간 만 증가합니다.

또 다른 schenerio는 응용 프로그램에서 여러 UI를 사용하는 것입니다.이 경우 UI를 처리 할 서비스 계층이있는 것이 좋습니다.

스택 오버플로 : 서비스 계층 패턴에 대한 토론


따라서 모든 복잡한 응용 프로그램에서 개발 계층이 DAL, BL, UI 계층에만 정착하는 것이 아니라 서비스 계층을 사용해야한다고 제안합니까?
BornToCode

UI가 여러 개인 경우 서비스 계층을 포함해야합니다. 귀하의 경우 새 레이어를 준비해야한다고 생각하지 않습니다. 단지 응용 프로그램의 복잡성을 증가시킵니다.
사티 펜디 교수

0

귀하의 BL이 서비스 계층이라고 주장합니다. 비즈니스 로직이있는 중앙 장소. 논리가 필요한 모든 것이 사용할 수있는 DLL이어야합니다. 그런 다음 앱에 다른 UI가있는 경우 웹 API 레이어를 그 위에 놓을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.