[sw] 멀티테넌시 Multi-tenancy 개념과 github 소스 실습
2023. 12. 27. 15:15ㆍsw/architecture
멀티테넌시 Multi-tenancy
1.멀티 테넌시는 소프트웨어 애플리케이션의 단일 인스턴스가 여러 클라이언트 또는 테넌트에 서비스를 제공하는 설계 접근 방식을 나타낸다.
2.각각의 테넌트는 동일한 기본 인프라를 공유하더라도 자체적으로 격리된 애플리케이션 인스턴스가 있는 것처럼 작동한다.
3.이 접근 방식을 사용하면 여러 사용자 또는 조직이 단일 응용 프로그램을 공유하는 동시에 각각에 대한 독립성과 개인 정보 보호 수준을 유지할수 있다.
1. 멀티테넌시 사례
통상적으로 개발을 할때 RDBMS에 한개의 데이터베이스생성 또는 한개의 스키마를 생성하고 하위에 테이블을 만들어서개발을 진행한다. 멀티네넌시의 경우 논리적으로 분리되어 있다고 생각하면된다.
사용자가 탈퇴하면 일일이 데이터베이스 테이블에서 데이터를 찾아서 삭제를 하지않고 논리적 영역을 삭제하거나 별도로 이관시거 보관한다.
멀티테넌시 개념을 적용하는 사례로는 클라우드 서비스(ex. AWS처럼 특정 서용자 만의 논리적영역할당)가 해당된다.
2. 멀티테넌시 정책 및 적용방법
- DBMS 형태의 분리 - 테넌트별 물리적으로 DBMS를 분리/격리하여 운영하는 형태
- 스키마 형태의 분리 - DBMS를 논리적으로 분리/격리 운영 방식
- DB테이블 방식의 분리(테넌트별 DB 테이블 생성)
- 레코드 방식의 테넌트 분리
3. 스키마 형태의 분리예제
개인적으로 멀티테넌시를 아키텍처를 적용하기에는 ORM구조를 주로 사용한다.
Spring Boot의 Hibernate / Python / Node등의 다양한 백엔드에서 작업이 가능하다.
아래는 멀티테넌시 학습할때 참고하였던 GITHUB의 소스를 가지고 리뷰를 해보겠다.
https://github.com/sumanentc/multitenant
4. 실습하기
- 위소스는 스프링부트+PostgreSQL을 사용하고 있다.
- IDE에서 불러오기를 한다. maven 구조이므로 아래와 같이 소스를 불러온다.
- 불러오기를 하고 application.yml 파일을 수정한다.
- DB는 PostgreSQL을 사용함으로 아래와 같이 데이터 베이스 정보를 업데이트 한다.
- 참고로 본인의 DB포트는 기본포트가 아닌 5433번을 사용한다. 통상 5432번이다.
server:
port: 8080
spring:
application:
name: MultiTenant
datasource:
url: 'jdbc:postgresql://localhost:5433/erp?charSet=UTF-8&prepareThreshold=1&ApplicationName=MultiTenant'
username: '아이디입력'
password: '비밀번호입력'
driver-class-name: org.postgresql.Driver
jpa:
properties:
hibernate:
hbm2ddl:
auto: none
- 실행하기전 위소스처럼 datasource.url 의 erp 라는 이름으로 PostgreSQL에 데이베이스를 생성한다.
- 그리고 실행한다. 실행시 아래와 같은 오류의 문구가 발생한다면 다음과 조치하자.
SCRAM authentication is not supported by this driver. You need JDK >= 8 and pgjdbc >= 42.2.0 (not ".jre" vesions)
라는문구의 오류 발생시 pom.xml의 org.postgresql 버전을 업데이트 한다.
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.14</version>
</dependency>
- 소스를 실행한다.
- 8080포트로 실행중이다.
- 실행이 완료되었으면 소스상에 DDL.sql 파일이 존재한다. 해당파일의 내용을 본인의 DB정보와 일치하도록 수정하고 생성하여준다.
- 생성이 완료되면 아래와 같이 구성된다.
- erp명칭의 데이터베이스 아래에 public 공통 스키마가 존재하고, test1과 test2스키마가 추가적으로 생성된다.
- test1, test2는 추후 사용자아이디나 고객사코드 정도의 개념으로 생각하면 되겠다.
- Postman을 사용하여 테스트를 해본다.
- 헤더에 Content-Type : application/json 추가한다.
- 헤더에 X-TenantID : test1 입력한다. test1의 스키마를 테넌시로 사용한다는 의미이다.
- city테이블에 json형태로 이름을 넣어보도록 하겠다.
- 위와같이 각스키마 별로 이름을 저장해본다.
- 실행로그는 아래와 같다.
- 결과를 확인하기 위해 데이터베이스를 확인한다.
- 아래와 같이 저장되어 있다.
5. 마치며
- 소스의 프로세스는 헤더값으로 테넌시 아이디값(스키마) 값을 받아와서 public.datasourceconfig 테이블에서 정보를 찾은다음 해당 접속정보로 실행을 시키는 구조이다.
- 멀티테넌시 아키텍처를 구축하는 방법중 스키마를 활용하는 방법의 예제를 테스트 해보았다.