개발자가 DB에 직접 연결하는 대신 웹 서비스를 사용해야하는 이유는 무엇입니까? [닫은]


94

DB에 직접 연결하는 대신 웹 서비스를 통해 원격 데이터베이스에 연결해야하는 이유에 대한 "상위 10"목록을 찾고 있습니다. 이것은 현재 내부 논쟁이며 나는 프로 웹 서비스이지만 논쟁을 잃고 있습니다. 나는 WCF / 웹 서비스에 대한 기본적인 이해를 가지고 있지만 다른 사람은 없습니다. 우리는 앞으로 나아가고 싶은 것은 무엇이든 할 수 있지만 지금 우리가 선택한 것은 무엇이든 고수해야합니다.

여기에 제가 생각 해낸 것이 있습니다. 더 있나요?

  1. WCF 웹 서비스는 올바르게 구성된 경우 더 안전 할 수 있습니다.
  2. DB 변경은 서비스 수준 (구성 파일 또는 재 컴파일 서비스)에서만 수행하면됩니다.
  3. 일단 설정 및 호스팅되면 웹 서비스를 더 쉽게 사용할 수 있습니다.

답변:


120
  1. 보안. 웹 서버 / 앱 사용자를 제외한 누구에게도 DB 액세스 권한을 부여하지 않습니다.

    이는 사용자가 많을 때 더욱 중요합니다. DB 측에서 사용자 / 역할 유지 관리의 고통을 피할 수 있습니다.

  2. DB 부하 감소. 웹 서비스는 DB에서 검색 한 데이터를 캐시 할 수 있습니다.

  3. 데이터베이스 연결 풀링 (hat / tip @Dogs).

    웹 서비스는 영구적으로 열린 DB 연결의 작은 풀을 사용할 수 있습니다. 다양한 방법으로 도움이됩니다.

    • DB 연결 풀은 데이터베이스 서버 측에서 제한됩니다.

    • 새 DB 연결을 여는 것은 매우 비용이 많이 듭니다 (특히 데이터베이스 서버).

  4. 내결함성 기능-서비스 소비자가 장애 조치에 대한 세부 사항을 구현하지 않고도 서비스가 기본 / DR 데이터 소스간에 전환 할 수 있습니다.

  5. 확장 성-서비스는 서비스 소비자가 리소스 선택에 대한 세부 정보를 구현하지 않고도 여러 병렬 데이터 소스간에 요청을 분산 할 수 있습니다.

  6. 캡슐화. 서비스 사용자에게 영향을주지 않고 기본 DB 구현을 변경할 수 있습니다.

  7. 데이터 보강 (여기에는 클라이언트 사용자 정의에서 현지화, 내재화에 이르는 모든 것이 포함됩니다). 기본적으로 이들 중 어느 것이 든 유용 할 수 있지만 이들 중 어느 것이 든 데이터베이스에 큰 부하가되고 종종 DB 내부에서 구현하기가 매우 어렵습니다.

  8. 귀하에게 적용되거나 적용되지 않을 수 있습니다. 특정 아키텍처 결정은 DB 액세스 친화적이지 않습니다. 예를 들어, Unix에서 실행되는 Java 서버는 데이터베이스에 쉽게 액세스 할 수있는 반면 Windows PC에서 실행되는 Java 클라이언트는 데이터베이스를 인식하지 못하며이를 원하지도 않습니다.

  9. 휴대 성. 클라이언트가 모두 동일한 플랫폼 / 아키텍처 / 언어에 있지 않을 수 있습니다. 이들 각각에서 좋은 데이터 액세스 계층을 다시 만드는 것은 웹 서비스를위한 소비자 계층을 구축하는 것보다 더 어렵습니다 (위에서 언급 한 장애 조치 등의 문제를 고려해야하기 때문입니다).

  10. 성능 조정. 대안이 클라이언트가 자체 쿼리 (미리 준비된 저장 프로 시저가 아님)를 실행한다고 가정하면 최적보다 적은 쿼리를 사용하기 시작할 것이라고 100 % 확신 할 수 있습니다. 또한 웹 서비스가 허용 가능한 쿼리 집합을 제한하는 경우 데이터베이스 조정에 크게 도움이 될 수 있습니다. 이 논리는 웹 서비스에 고유하지 않고 저장 프로 시저에 동일하게 적용된다는 점을 추가해야합니다.

이 페이지 에서도 좋은 목록을 찾을 수 있습니다 . '데이터베이스 액세스 캡슐화 : 민첩한 "최상의"사례 "

명확하게하기 위해 이러한 문제 중 일부는 모든 상황에 적용되지 않을 수 있습니다. 어떤 사람들은 이식성에 관심이 없습니다. 어떤 사람들은 DB 보안에 대해 걱정할 필요가 없습니다. 어떤 사람들은 DB 확장성에 대해 걱정할 필요가 없습니다.


26
죄송합니다. 동의하지 않습니다. 1. 따라서 단일 보안 주체 대신 그룹에 DB 액세스 권한을 부여합니다. 차이는 없습니다. 2. 모든 앱이 데이터를 캐시 할 수 있습니다. 여러 사용자에 걸쳐 캐시 할 수있는 데이터의 종류는 일반적으로 어떤 경우에도 저용량 데이터입니다. 3. FT는 어떤 경우에도 데이터베이스에서 처리해야합니다. 4. 이것은 즉시 사용 가능한 기능이 아니므로 프로그래밍해야합니다. 5. 데이터 액세스 계층이 캡슐화를 수행해야합니다. 6. 똑같습니다. 7. 정말요? JDBC가 클라이언트에서 실행되지 않습니까? 8. 중요한 점은 드뭅니다. 9. 쿼리 대 SP는 질문의 일부가 아닙니다.
John Saunders

7
1. 수많은 역할을 가진 5000 명의 사용자를 관리해보십시오. 더 이상 확장되지 않습니다. 2. 전적으로 앱에 의존합니다. 현재 사례에는 uber 최적화 사례에서 실행하는 데 20 분이 걸리고 적어도 다른 앱에서 하루에 수백 번 실행해야하는 쿼리 결과를 캐싱하는 인스턴스가 있습니다. 3. FT는 여러 수준에서 처리됩니다. "데이터베이스에 의해 처리되어야한다"는 의미는 무엇입니까?
DVK

4
4. 물론 프로그래밍해야합니다. 하지만 서비스에 한 번만 프로그래밍하거나 다양한 기능을 가진 다양한 플랫폼의 수많은 클라이언트 앱으로 프로그래밍 할 수 있습니다. 큰 차이가 있습니다. 부하 분산을위한 구성 관리 문제는 신경 쓰지 마십시오. 5. 같은 추론. DAL을 다시 구현할 필요가 없습니다. 사실 웹 서비스는 마음을 편하게하는 휴대용 DAL로 생각할 수 있습니다. 7. 우리는 모든 클라이언트가 DB 연결을 여는 것을 원하지 않습니다. 그게 그렇게 큰 질문인가요? 다시 말하지만, 1-5 점을 잊고 있습니다.
DVK

2
8.> 1 클라이언트 아키텍처는 매우 자주 발생합니다. 사실 저는 제 인생에서 그런 상황없이 프로젝트를 한 적은 없었지만 저는 금융 세계에 집중되어 있습니다. 9. 그렇지 않았습니다. 나는 기본적으로 악마의 옹호자 역할을했습니다.
DVK

2
이 답변이 마음에 들지만 가장 중요한 점 중 하나 인 연결 풀링을 건너 뛴 것 같습니다. 1,000,000 개의 클라이언트가있는 경우 1,000,000 개의 열린 연결이 있거나 수백만 개의 연결이 지속적으로 열리고 닫힙니다. 컴퓨터 구성에 대한 기본적인 직관은 수백 개의 장기 연결 풀이 100 만 개의 장기 연결 또는 수백만 개의 단기 연결을 갖는 것보다 천문학적으로 더 효율적이라고 말합니다. 이 아이디어를 정교화의 큰 일에 HikariCP 워드 프로세서 : github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing

15

제 생각에는 데이터베이스를 웹 서비스로 자동으로 노출해서는 안됩니다. 데이터를 노출 할 서비스가 필요하다고 판명되면 하나를 작성하지만 모든 데이터베이스 액세스가 웹 서비스를 통해 수행되어야하는 것은 아닙니다.

  1. 데이터베이스 연결이 안전하지 않아야 할 이유가 없습니다.
  2. 데이터 액세스 계층 (아마도 Entity Framework)에서 데이터베이스를 캡슐화 할 수 있습니다.
  3. 웹 서비스는 잘 작성된 데이터 액세스 계층보다 사용하기가 쉽지 않습니다.

왜 XML이 필요합니까? 또한 JSON, 단순 플랫 데이터를위한 CSV 등을 구문 분석하는 데 훨씬 더 가볍습니다.
DVK

"합당한 이유없이"가 아닙니다. 앞서 언급했듯이 요구 사항과 향후 개발에 대한 요구에 따라 프로젝트에 필요할 수 있습니다.
Chris Stewart

DAL을 사용하기 위해 WS를 작성합니다. DAL 노출을 제안하는 포트는 무엇입니까?
samis

@samus는 중요하지 않습니다.
John Saunders

"데이터베이스 연결이 안전하지 않아야 할 이유가 없습니다."예를 들어 Windows 클라이언트와 데이터베이스 간의 연결을 보호하기가 어렵습니다. 보안 연결을 구현하기가 정말 어렵습니다!
NoChance

12
  • 웹 서비스는 API를 형성하여 외부 시스템과 애플리케이션 데이터 간의 허용되는 상호 작용을 정의합니다.
  • 웹 서비스는 데이터베이스를 외부 상호 작용에서 분리하고 데이터 계층을 외부 영향과 독립적으로 관리 할 수 ​​있도록합니다.
  • 웹 서비스에 의한 액세스 만 허용하면 애플리케이션 로직이 실행될 수있는 기회를 확보하여 데이터 무결성을 보호합니다.
  • 웹 서비스를 사용하면 사용자 이름과 암호 / 테이블 수준 권한이 필요한 데이터베이스와 달리 가장 적절한 인증 / 권한 부여 조치를 취할 수 있습니다.
  • 웹 서비스는 자동 서비스 검색 및 구성을 사용할 수있는 기회를 제공합니다.
  • 웹 서비스 트래픽은 보안되지 않은 네트워크를 통한 전송을 위해 암호화 될 수 있습니다. 이를 가능하게하는 직접 DB 연결 솔루션을 모르십니까 ...?

이러한 포인트의 대부분은 웹 서비스가 아닌 공식 API에 적용됩니다.


1
예, 그것이 제가 말하려고했던 것입니다. 데이터베이스에 액세스하는 단일 애플리케이션이있는 경우 일반 API에서도 모든 포인트를 사용할 수 있습니다.
Ignacio Soler Garcia

"웹 서비스는 API를 형성하여 외부 시스템과 애플리케이션 데이터 간의 허용 된 상호 작용을 정의합니다." 데이터베이스에서도 그렇게 할 수 있습니다.
신발

"웹 서비스에 의한 액세스 만 허용하면 응용 프로그램 논리가 실행될 기회가 주어지고 데이터 무결성이 보호됩니다." -데이터 무결성은 DBMS에만 포함되어야한다고 주장합니다.
신발

@Shoe DB에 의해 가능한 한 많은 무결성을 적용하는 것이 좋지만 데이터가 입력 유효성 검사의 필요성과 같은 단점을 채우고 노출하기 시작하면 응용 프로그램 수준에서이를 적용하는 것이 좋습니다. 클라이언트 측에서 유효성 검사 규칙이 서버에만 알려진 데이터 (클라이언트 앱에서 보관 됨)에 의존하는 경우 서버 측에서 처리해야하는 경우가 있습니다. DB의 무결성 규칙 집합을 변경하는 것이 큰 문제입니까? 사소한 문제가 아니라고 생각합니다.
samis

2

저장 프로 시저에 대한 호출을 단순히 래핑하는 웹 서비스를 작성하는 것은 좋은 DAL을 설계하는 데 잘못된 접근 방식 인 것 같습니다. 아마도 저장 프로시 저는 이전 클라이언트-서버 시스템에서 남겨진 레거시 코드입니다. 즉 비즈니스 규칙이 SP에 묻혀 있습니다. 만약 그렇다면, 당신은 정말로 모돈의 귀에서 실크 지갑을 만드는 것을 시도하고 있습니다.

또한이 '돼지'의 연대를 '강제'한 웹 앱에 성능 저하를 추가하는 SOAP 메시지 프로토콜 레이어를 추가합니다. 저는 지금 우리의 새로운 MVC-4 앱이 그러한 DAL을 사용하도록 지시받은 프로젝트를 진행하고 있습니다. 이러한 변경을 필요로하는 새 사용자 스토리가 올 때마다 WebMethod 서명과 SP 서명을 모두 변경해야하는 부담이 있습니다. 우리에게는 모든 스프린트입니다. 이러한 패스 스루 접근 방식에는 밀접하게 연결된 두 계층이 내재되어 있습니다.


1
Web API는 WCF / SOAP 팽창 문제를 해결했습니다. 그것은 이제 가볍고, 적합하고, 민첩한 고양이와 같습니다. RESTfully 서비스에 필요한 것입니다.
samis

이론적으로 웹 서비스를 사용하여 저장된 procs를 호출하는 것은 잘못이 아닙니다.
NoChance

2

1) 개발자 측에서 데이터베이스 유지 관리의 부담을 줄여 개발에만 집중할 수 있습니다.

2) 웹 서비스는 매우 쉽고 효과적인 방법으로 다양한 플랫폼 (Windows, iOS, Android 등의 운영 체제)의 통신을 지원합니다. 예를 들어 안드로이드 애플리케이션과 iOS 애플리케이션이 자바 기반의 웹 사이트와 통신하기를 원하는 상황을 생각 해보자. 따라서 세 가지 다른 데이터베이스를 유지하는 대신 웹 서비스가 가장 좋은 솔루션이다.


1

일반적으로

  1. 웹 서비스 수준은 여러 응용 프로그램에 대한 공통 데이터 요청의 재사용을 촉진합니다.
  2. 웹 서비스는 애플리케이션 레벨 개발에서 발생하는 많은 문제를 완화하는 버전 관리로 설정할 수 있습니다. 예를 들어 기존 애플리케이션을 처음 사용하는 경우 기존 데이터베이스 소스를 사용하도록 애플리케이션을 구성하는 데 좋은 모델로 사용합니다.
  3. 웹 서비스는 간단한 URI를 사용하여 요청을 보내고 응답 결과를 JSON과 같은 일반적인 형식으로 되 돌리는 유연한 옵션을 허용하도록 발전했습니다. 즉, 신뢰할 수있는 균일 한 인터페이스를 장려하는보다 일반적인 표준을 사용하여 클라이언트 응용 프로그램을 개발할 수 있습니다.

ASP.NET Web Api에 관심이 많고 데이터 서비스를 먼저 만들 계획입니다.

저는 최근 엔터티 프레임 워크를 사용하여 .NET MVC 웹 응용 프로그램에 집중하고 있습니다.

  1. 이미 MVC를 사용하고 있다면 Web Api는 Api 컨트롤러와 함께 MVC도 사용하므로 서비스 구축을위한 학습 곡선이 상당히 어렵지 않습니다.

저는 최근에 Oracle 저장 프로 시저를 기반으로 구축하고 있던 MVC 웹 앱으로 인해 좌절감을 느꼈습니다. 웹 구성 연결 및 TNS 이름을 기반으로 사용할 올바른 dll 파일을 찾는로드 시간 어셈블리를 사용하여보다 현대적인 연결 팩토리 접근 방식을 추진하는 Visual Studio 2012의 또 다른 문제를 제시 한 Oracle 9 또는 이전 버전의 원래 버전.

데이터베이스에 대한 연결 시도가 '더 이상 지원되지 않음'오류 메시지와 함께 실패했습니다. 호기심으로 Oracle 12c를 다운로드하고 TNS 이름과로드 어셈블리 dll과 잘 작동하는 애플리케이션 수준 연결을 만들었고 문제없이 Oracle과 작업 할 수있었습니다.

이전 Oracle 버전에 대한 연결로 작동하는 일부 웹 서비스가 구축되었습니다. 그러나 실망스럽게도 선택된 테이블에 특별히 매핑 된 방법으로 구축되었습니다. 나는 직접 써야 할 것입니다.

Oracle 데이터베이스를 유지 관리하는 그룹은 클라이언트 인터페이스와 비즈니스 논리 계층을 추상화하는 데 사용하던 이전 저장 프로 시저를 대체하기 위해 새 저장 프로 시저를 작성할 것이라고 들었습니다.

그래서 첫 번째 생각은 드롭 다운 목록 채우기 또는 엔터프라이즈 급 데이터로 자동 완성과 같은 모든 일반적인 데이터 요청이 Oracle 저장 프로 시저를 호출하는 데이터 서비스를 통해 수행된다는 것입니다. 각 애플리케이션에 대해이 프로세스를 반복하고 각 개발자가 구성 및 버전 /로드 어셈블리, TNS 문제로 어려움을 겪게하는 이유는 무엇입니까?

그래서....

  1. 일반적으로 SQL Server 데이터 사용을 위해 EF를 사용하는 .NET MVC 애플리케이션에서 Oracle 저장 프로 시저를 사용하는 것과 같은 여러 데이터베이스 서버 문제의 경우 이러한 문제를 이러한 구성 문제를 격리 할 수있는 Web Api 서비스 방법으로 밀어 넣는 것이 좋습니다.
  2. 클라이언트 인터페이스는 Web Api를 사용하여 SQL Server 데이터를 요청하는 경우 이미 사용중인 JavaScript, JQuery 및 JSON을 사용하여 수행 할 수 있습니다.

저는 DBA가 아닌 응용 프로그램 개발자 / 분석가이므로 데이터베이스 도구가 발전 할 때 응용 프로그램을 지속적으로 수정해야하는 끊임없는 좌절감을 경험 한 경험에서 비롯된 것입니다.

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