비즈니스 로직을 저장 프로 시저에 넣을지 여부 때문에 Stack Overflow에서 마이그레이션 되었습니다.

“비즈니스 로직을 저장 프로 시저에 넣을지 말지?”라는 주제에 대해 항상 논쟁이 있습니다. ORM 도구를 사용하지 않고 Business Logic을 저장 프로 시저에 넣지 않기로 결정한 경우 Business Logic을 어디에 배치합니까?

이전 응용 프로그램에서는 항상 모든 비즈니스 논리를 저장 프로 시저에만 배치하는 것을 선호했습니다. 그런 다음 .NET 코드에서 데이터 액세스 응용 프로그램 블록을 사용하여 이러한 저장 프로 시저를 호출합니다. SQLHelper 등. 그러나 이것은 항상 시나리오가 될 수는 없습니다. 그래서 나는 인터넷 검색을했지만 혼란에 빠졌습니다 …….

어떤 제안 …?



답변

실용적인 접근 방식을 채택하겠습니다. 역사적으로 비즈니스 로직을 저장된 프로세스에 유지하는 주요 이점은 성능상의 이유로 (2.5 계층 아키텍처), 비즈니스 로직을 BLL 계층 (3 / N 계층)으로 분리하는 것이 일반적으로 유지 관리 관점 및 테스트 용이 (데이터 액세스를 모의 / 스텁 아웃).

그러나 LINQ2SQL, EF 및 NHibernate와 같은 LINQ 지원 .NET ORMS가 이제 매개 변수화 된 SQL 쿼리를 생성하므로 쿼리 계획을 캐시하고 SQL 주입을 위해 이스케이프 처리하는 등 3 / N 계층 아키텍처로의 전환은 그 어느 때보 다 강력 해졌으며 대부분의 SPROC (특히 쿼리 중심)는 피할 수 있습니다. .NET의 리포지토리 패턴은 일반적으로 IQueryable / accept Expression 트리 매개 변수를 노출하므로 형식에 안전하면서도 유연한 테이블 액세스가 가능합니다. (개인적으로 SOA 유형 아키텍처에서는 BLL 이외의 IQueryable을 공개하지 않을 것입니다. 즉, 서비스 및 프리젠 테이션 계층이 잘 정의 된 메소드 세트와 함께 작동해야합니다. 그렇지 않으면 시스템을 완전히 테스트 할 수 없기 때문에 ‘

그러나 적절한 크기의 시스템에서는 성능상의 이유로 실제로 데이터 집약적 코드 조각을 여전히 Stored Proc로 작성해야하는 몇 가지 예외가 있습니다. 이 경우 SPROC를 유지하고 ORM을 통해 SPROC를 공개하지만 여전히 함수를 BLL에서 통과 메소드로 공개합니다.


답변

Java 개발자이기 때문에 BLL에 비즈니스 로직을 배치하는 것이 좋았습니다 (좋은 소스 제어, 친숙성 등).

그러나 서로 다른 기술 (C #, Java, Pick (요청하지 않음))을 사용하는 많은 분산 응용 프로그램이있는 대기업에서 근무한 후 저장 프로 시저를 사용하면 얻을 수있는 중요한 이점이 분명해졌습니다.

저장 프로시 저는 다른 응용 프로그램간에 공유 할 수 있습니다 .


답변

우리 팀은 여기에 부드러운 규칙이 있습니다. 때로는 T-SQL에서 비즈니스 로직을 해결하는 것이 좋으며 c # (비즈니스 계층)에서 수행하는 것이 더 쉽습니다.

실용적인 해결책이 있습니다. 나는 이론이 때로는 그것에 대해 매우 엄격하다는 것을 알고 있습니다 … 그러나 그것은 이론입니다 🙂


답변

(제 생각에) 두 가지 장점과 단점이 있습니다.

저장 프로시 저는 일종의 SQL 소스 제어를 사용하지 않고 (많은 장소에서 사용하지 않는) 여러 개발자가 작업하는 경우 악몽이 될 수 있습니다. 누군가 저장 프로 시저를 변경하고 해당 프로 시저를 호출하는 코드를 업데이트하는 것을 잊어 버릴 수 있으며이를 알기 전에 처리되지 않은 예외 (매개 변수 수 불일치 등)를 발생시키는 사이트를 구축하고 배포했습니다.

반면에 저장 프로시 저는 특정 상황에서 더 빠른 버그 수정을 허용합니다. 저장 프로 시저에 버그가있는 경우이를 수정하면됩니다. ORM의 버그 수정에는 재구성이 필요합니다. 빌드 프로세스에 따라 시간이 오래 걸리고 성 가실 수 있습니다.


답변

우리는 항상 비즈니스 로직을 비즈니스 로직 레이어에 넣습니다. 저장 프로시 듀어에 넣으면 RDBMS를 변경하면 손실됩니다.


답변

“비즈니스 로직”은 약간 모호한 용어입니다. 단일 정의가 없다는 의미입니다. 경험상 가능한 계층 간의 통신을 최소화하는 것이 좋습니다. 따라서 행을 삽입하기 전에 빈 고객 이름을 서버로 보내서 확인할 필요가 없습니다.

규칙이 데이터베이스 읽기를 기반으로하는 경우가 있습니다. 계정 1에서 계정 2로 돈을 이체한다고 가정합니다. 두 계정을 모두 읽고 상태가 양호하고 계정 1의 금액이 충분한 지 확인해야합니다. 이 경우 클라이언트 (여기서는 BL 임)가이 프로세스를 위해 데이터베이스 계층에 대해 3 번의 호출을 실행할 필요가 없기 때문에 서버는이 규칙에 더 적합한 후보입니다.

물론, 데이터베이스에 독립적 인 솔루션이 필요한 경우 CRUD에 대해서만 저장 프로 시저를 작성하십시오 (사용 된 경우).


답변

논리는 항상 다음과 같은 이유로 BLL에 있어야합니다.

  • 제대로 테스트 할 수 있습니다
  • SQL 20XX가 더 이상 사용되지 않고 최신 버전으로 변경해야하는 경우 코드를 다시 작성할 필요가 없습니다.
  • 사람들은 즉시 변경하려고 유혹하지 않습니다 (SP에 대한 논쟁으로 제시되고있는 것 같습니다)
  • 내 경험상 SP는 특히 몇 세대의 유지 관리 / 변경 후 개발자 오류의 가장 큰 지점입니다.

SP가 X 줄보다 길면 의도 한대로 작동하지 않는다는 법률이 있어야한다고 생각합니다.