서버사이드에서 어떤식으로 서버를 운영할까?
아무런 방법론 없이 서버를 운영한다면 초기 요구사항같이 변동이 없는 경우에는 아무 상관이 없을 것이다. 하지만 현실세계는 변화가 많기때문에 막무가내로 개발하게 된다면 복잡도가 엄청나고 유지보수가 정말 힘들것이다. 이에 대한 방법론을 말하고자 한다.
DDD(Domain Driven Design)
도메인 주도 설계 라는 용어이다. 도메인 설계나 개발 작업의 중심에 도메인 모델을 두고 반복적으로 변경 및 진화시켜서 프로그램을 구현하는 개발방법론이다. 이게 무슨말이지...?
비즈니스 도메인
기업의 주요 활동 영역을 정의하고, 회사가 고객에게 제공하는 서비스를 의미한다.
이걸 세분화 시킨걸 하위 도메인이라고 한다.
ex. 스타벅스의 커피 판매 -> 비즈니스 도메인
ex. 커피 판매를위한 가게 부동산 구매/임대 + 직원 고용 등 -> 하위 도메인
소프트웨어적으로 적용시켜보자
티켓 판매 및 유통회사 예시
가상의 소프트웨어 서비스를 생각해봤다.
- 비즈니스 도메인 : 티켓 판매 및 유통
- 핵심 하위 도메인
- 추천 엔진
- 데이터 익명화
- 모바일 앱
- 일반 하위 도메인 (오픈소스, 웹 소프트웨어)
- 암호화
- 회계
- 정산
- 인증 및 권한 부여
- 지원 하위 도메인 (외주, 이미 만들어진 프로그램)
- 음악 스트리밍 서비스와 연동
- 소셜 네트워크와 연동
- 참석 공연 모듈
이런식으로 세분화 시켜서 핵심 하위 도메인을 도와주는 일반/지원 하위 도메인이 있다. 그러면 이건 누가 어떻게 구분??
-> 도메인 전문가 가 이런 작업을 해준다.
유비쿼터스 언어
도메인 전문가가 있다면 프로젝트 소유자, 개발자, 디자이너, 프로젝트 매니저 등등 여러사람들과 함께 얽혀서 협업을 하게되는데 이 또한 통합된 관리 방법이 필요하다. 나의 경우 일반적으로 개발을 진행할때 user를 사용자라고 지칭한다.
하지만 user를 유저 or 고객 or 계정 or 사용자 등등 각각 다른 단어로 부를수도 있다. -> 복잡하다. -> 단일화된 유비쿼터스 언어를 사용한다.
바운디드 컨텍스트
각 도메인을 섞이지 않도록 경계를 갖는 컨텍스트를 바운디드 컨텍스트라고 한다. 쉽게 말해서 서로 다른 팀에서 개발을 진행하면, 서로 다른 바운디드 컨텍스트로 분리된다는 의미이다. 개발적 측면에서 보면 MSA의 구분 기준점이 된다.
MSA(Micro Service Architecture)
옛날의 개발 방식을 보면 정말 단순히 하나의 프로그램에 전부 몰아 넣는 Monolithic Architecture로 운영했다고 한다.
요즘은 많은 변화가 일어나고 있고, 자주 배포하는 어플리케이션의 특성상 로직들을 전부 분리해줘야한다. UI, 비즈니스로직, 데이터 접근 Layer 등등 으로 서비스를 분리 시켜줘야한다. 이렇게 분리 시키고 각각의 기능을 작게 나누고, 각각 독립적이다. 이러한 특징 때문에 Micro라고 불린다.
이렇게 설계/개발을 한다면 어플리케이션 사용자의 변화하는 니즈에 맞춰서 진행이 용이해지고, 부분 스케일링, 잦은 배포가 가능해진다.
위에서 설명했던 바운디드 컨텍스트 하나가 바로 MSA환경에서 하나의 서비스에 대응된다고 본다.
장점
- 빠른 배포 : 서비스별 개별 배포 가능
- 확장성 : 독립적으로 어플리케이션 분리 -> 클라우드 기반 서비스 사용에 적합
- 장애 최소화
- 유연성
- 간단한 구조
단점
- 설계의 어려움 : 어디까지 잘게 나눌지 기준잡기 어려움
- 성능적 이슈 : 서비스간의 API 호출시 Latency
- 트랜잭션
- 통합 테스트 어려움
- 데이터 관리
멀티모듈
- 모듈 : 독립적으로 배포될 수 있는 코드의 단위
- 멀티 모듈 : 상호 연결된 여러 개의 모듈로 구성된 프로젝트(각 모듈은 독립적으로 빌드)
하나의 어플리케이션이 완성되기 위해서는 그것들을 구성하는 여러개의 모듈이 합쳐져야한다.
- batch-server : 반복적으로 처리하는 루틴한 서비스
- api-server : REST API(CRUD)를 구현하는 서비스
- core : batch-server, api-server에서 공통적으로 사용하는 코드
규모가 큰 프로젝트는 멀티모듈이 필수이나, 규모가 작은 프로젝트에서는 장점을 살릴수 없다.
프로젝트 코드
먼저 디렉토리 구조를 살펴보겠다.
위의 사진을 기반으로 한다면 최상위 폴더(최종 어플리케이션) - MSA 구성요소(프로젝트 관리 ...) - 멀티모듈 식으로 계층이 구성되어있다.
하나의 모듈은 쉽게 말해서 인텔리제이에서 하나의 프로젝트라고 보면 된다. MSA계층에서 다음과 같은 설정을 해줘야한다.
- settings.gradle : 프로젝트 루트와 멀티 모듈안에 있는 프로젝트명을 include 해줘야한다.
rootProject.name = 'todolist'
include 'todolist-core'
include 'todolist-api-server'
include 'todolist-batch-server'
- build.gradle : 디테일한 설정을 여기서 해준다.
// 하위 모든 프로젝트 공통 세팅
subProject{
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group 'com.todolist'
version '1.0-SNAPSHOT'
sourceCompatibillity = '17'
targetCompatibillity = '17'
complieJava.options.encoding = 'UTF-8'
repositories{
mavenCentral()
}
// 하위 모듈에서 공통으로 사용하는 세팅 추가
dependencies{
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}
test{
useJUnitPlatform()
}
}
project(':todolist-core') {
// 공통 코드
bootJar { enabled = false } // core 은 bootJar 로 패키징 할 필요 없음
jar { enabled = true }
dependencies {
}
}
project(':todolist-api-server') {
bootJar { enabled = true }
jar { enabled = false }
dependencies {
// compileOnly project(':todolist-core') // 개발시 사용!! 컴파일 시 todolist-core project 로딩
implementation project(':todolist-core') // docker로 사용시 사용
implementation 'org.springframework.boot:spring-boot-starter-web'
}
}
project(':todolist-batch-server') {
bootJar { enabled = true }
jar { enabled = false }
dependencies {
implementation project(':todolist-core') // 컴파일 시 todolist-core project 로딩
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-batch'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.h2database:h2'
implementation group: 'org.postgresql', name: 'postgresql', version: '42.2.23' // 추가
}
}
이렇게 MSA에서 멀티모듈로 프로젝트를 세팅하는 기초를 알아봤다.
'DevOps > AWS' 카테고리의 다른 글
[AWS] Amazon EC2 원격 로그인 (0) | 2024.08.16 |
---|---|
[AWS] Amazon EC2 인스턴스 만들기 (3) | 2024.08.15 |
[AWS] Amazon 네트워크 운영하기 (0) | 2024.08.15 |
[AWS] Amazon 클라우드 시작하기 (0) | 2024.08.15 |
Spring + AWS S3 사용해서 사진 올리기 (0) | 2024.07.05 |