
최근 많은 기업들이 복잡한 시스템을 보다 유연하고 관리하기 쉬운 방식으로 전환하기 위해 마이크로서비스 아키텍처를 채택하고 있습니다.
MSA는 각 기능을 독립적인 서비스로 나누어 개발, 배포, 확장을 용이하게 합니다.
이 글에서는 Kotlin과 Spring Boot, TypeScript와 Next.js를 기반으로
구축한 구인사이트 예제를 통해 MSA의 장점과 단점을 살펴보겠습니다.
각 서비스가 독립적으로 배포될 수 있어, 특정 기능의 변경이나 버그 수정이
전체 애플리케이션에 영향을 미치지 않습니다.
예를 들어, 채팅 기능에 버그가 발생해도 다른 기능에는 영향을 주지 않습니다.
각 마이크로서비스를 독립적으로 확장할 수 있습니다.
예를 들어, 채팅 서비스의 트래픽이 급증할 경우 해당 서비스만 스케일 아웃하면 됩니다.
각 서비스가 독립적으로 구현되므로 다양한 기술 스택을 사용할 수 있습니다.
예를 들어, 채팅 서비스는 Node.js로 개발하고,
나머지 서비스는 Kotlin과 Spring Boot를 사용하여 개발할 수 있습니다.
이번에 개발한 구인사이트는 다음과 같은 기능을 갖춘 마이크로서비스 아키텍처를 기반으로 합니다
이 사이트는 Kotlin과 Spring Boot를 기반으로 구축되었으며,
프론트엔드는 TypeScript와 Next.js를 사용하여 개발했습니다.
Jenkins를 이용한 CI/CD, Grafana와 Prometheus를 통한 모니터링,
그리고 서비스 디스커버리는 Eureka를 사용했습니다.
##코드 설명
먼저, 채팅 서비스는 다음과 같이 Kotlin과 Spring Boot를 사용하여 구현합니다.
이 서비스는 Eureka를 통해 서비스 디스커버리를 합니다.
// ChatServiceApplication.kt
@SpringBootApplication
@EnableEurekaClient
class ChatServiceApplication
fun main(args: Array<String>) {
runApplication<ChatServiceApplication>(*args)
}
블로그 글을 작성하면서 마이크로서비스 아키텍처(MSA)의 장점과 단점, 그리고 이를 구인사이트에 적용한 사례를 상세히 설명하는 것이 좋았습니다.
특정 기능(예: 채팅 서비스)에 트래픽이 집중될 수 있습니다.
로드 밸런싱과 캐싱 전략을 통해 성능 저하를 방지할 수 있습니다.
데이터베이스 쿼리가 비효율적일 경우 성능이 저하될 수 있습니다.
인덱스를 적절히 설정하고, 쿼리 성능을 분석하여 최적화합니다.
여러 서비스 간의 데이터 일관성을 유지하기 어려웠습니다.
SAGA 패턴이나 2PC(2-Phase Commit)를 고려하여 데이터 일관성을 보장하는것을 배웠습니다.
서비스 간의 데이터 동기화 문제가 발생할 수 있습니다.
데이터 중복을 최소화하고, 동기화 전략을 설계합니다.
서비스 간의 네트워크 통신이 지연될 수 되었습니다.
적절한 API 설계와 성능 모니터링을 통해 해결하는방법을 학습하였습니다.
API 버전 관리를 통해 구 버전의 클라이언트와 호환성을 유지하였습니다.
Grafana와 Prometheus를 사용하여 시스템의 상태를 실시간으로 모니터링 하게 되었습니다.
ELK 스택이나 Fluentd를 활용하여 로그를 중앙에서 수집하고 분석합니다.
Jenkins와 같은 CI/CD 도구를 사용하여 자동화된 배포를 설정하고, 배포 시 테스트 자동화를 통해 리스크를 줄입니다.
배포 실패 시 롤백할 수 있는 전략을 마련합니다.
Canary 배포나 Blue-Green 배포를 고려하여 배포 리스크를 줄였습니다.
OAuth2, JWT 등 인증 및 권한 관리 시스템을 구현하여 보안을 강화 하였습니다.
데이터 암호화 및 보안 정책을 적용하여 사용자 데이터를 보호하게 되었습니다.
마이크로서비스 아키텍처는 복잡한 시스템을 보다 관리하기 쉽게 만들어 주지만,
다양한 도전 과제를 동반합니다.
구인사이트 예제를 통해 MSA의 장점과 단점을 살펴보았으며,
트러블슈팅 및 주의사항에 대한 통찰을 제공했습니다.
적절한 도구와 전략을 사용하여 MSA를 효과적으로 관리하고 성공적인 시스템 구축을
이루기 위해 학습이 좀더 필요하다는것을 배웠습니다.