소프트웨어 디자인, 설계
아키텍쳐 설계 원리
아키텍쳐 설계 기술합니다. 설계라기 보단 상용적으로 많이 사용하는 툴들과 각 개념별 정의를 공유합니다.
1. OS (Operating System)
정의
운영체제(OS)는 컴퓨터 하드웨어와 소프트웨어 리소스를 관리하는 시스템 소프트웨어입니다. 서버 인프라에서는 운영체제가 클라우드 서버 또는 물리적 서버에서 동작하며, 다양한 서비스를 지원합니다.
주요 툴
- Linux (Ubuntu, CentOS, Debian 등): 대부분의 서버 환경에서 사용
- Windows Server: 주로 Windows 기반 시스템에서 사용
셋업 방법
- Linux: apt-get 또는 yum으로 필요한 패키지 설치
- Windows Server: GUI 환경에서 설치, 설정
2. Version Control Systems (VCS)
정의
버전 관리 시스템(VCS)은 소프트웨어 개발 시 파일들의 변경 이력을 관리하는 시스템입니다. 이는 팀 협업과 코드 변경 관리에 중요한 역할을 합니다.
주요 툴
- Git: 분산형 버전 관리 시스템
- SVN: 중앙 집중형 버전 관리 시스템
셋업 방법
- Git: git init, git clone으로 저장소 설정, git push, git pull로 코드 관리
- SVN: svn checkout, svn commit으로 코드 관리
3. VCS Hosting
정의
VCS 호스팅은 코드 저장소를 클라우드에서 관리할 수 있게 해주는 서비스입니다. 주로 팀 협업을 위한 코드 저장소를 호스팅합니다.
주요 툴
- GitHub: 공개/비공개 Git 저장소 호스팅
- GitLab: Git 저장소 호스팅 및 CI/CD 통합 제공
- Bitbucket: Atlassian에서 제공하는 Git 저장소 서비스
셋업 방법
GitHub에서 저장소 생성 후 로컬에서 git remote add origin <repository-url>로 연결
4. Containers
정의
컨테이너는 애플리케이션과 그 종속성들을 하나의 패키지로 묶어 실행할 수 있게 해주는 가상화 기술입니다. 이를 통해 애플리케이션은 환경에 독립적으로 실행됩니다.
주요 툴
- Docker: 가장 인기 있는 컨테이너화 툴
- Kubernetes: 컨테이너 오케스트레이션 툴
셋업 방법
- Docker: docker build, docker run으로 이미지 생성 및 실행
- Kubernetes: kubectl 명령어로 Pods, Services, Deployments 등을 관리
5. Proxy Servers
정의
프록시 서버는 클라이언트와 서버 사이에 위치해 요청을 중계하거나 차단하는 서버입니다.
종류
- Forward Proxy: 클라이언트의 요청을 중계하는 프록시 서버
- Reverse Proxy: 서버의 요청을 클라이언트 대신 처리하는 프록시 서버
- Caching Server: 자주 요청되는 데이터를 캐싱하여 빠르게 제공하는 서버
주요 툴
- Nginx: 리버스 프록시, 로드 밸런서, 캐싱 서버로 사용
- HAProxy: 고성능 리버스 프록시 및 로드 밸런서
셋업 방법
Nginx Reverse Proxy:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_server;
}
}
6. Web Servers
정의
웹 서버는 클라이언트로부터 HTTP 요청을 받아들여 웹 페이지를 반환하는 서버입니다.
주요 툴
Nginx: 경량화된 웹 서버 및 리버스 프록시 Apache: 확장성과 모듈화가 뛰어난 웹 서버 Tomcat: 자바 기반 웹 애플리케이션 서버
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
}
Apache: httpd.conf 파일에서 서버 설정
7. Networking & Protocols
정의
네트워킹은 서버들이 서로 통신할 수 있도록 해주는 기술적 연결망입니다. 여러 프로토콜들이 이 통신을 지원합니다.
주요 프로토콜
HTTP/HTTPS: 웹 애플리케이션을 위한 프로토콜
TCP/IP: 전송 계층과 인터넷 계층에서 사용되는 기본 프로토콜
DNS: 도메인 이름을 IP 주소로 변환하는 시스템
셋업 방법
Firewall: ufw 명령어를 사용해 포트 차단
DNS 설정: bind9 또는 Cloud DNS 서비스
8. Cloud Providers
정의
클라우드 서비스 제공자는 서버, 스토리지, 데이터베이스 등을 인터넷을 통해 제공하는 서비스입니다.
주요 툴
AWS (Amazon Web Services): EC2, S3, RDS 등을 제공
Google Cloud: Compute Engine, Cloud Storage, BigQuery
Azure: 가상 머신, Blob Storage, SQL Database
셋업 방법
AWS EC2: EC2 인스턴스를 생성하고, ssh를 통해 연결
Google Cloud: GCP 콘솔에서 VM 인스턴스 생성 후, gcloud CLI로 연결
9. Serverless
정의
서버리스를 사용하면 서버를 직접 관리하지 않고도 애플리케이션을 실행할 수 있습니다. 코드 실행에 필요한 자원을 자동으로 할당해줍니다.
주요 툴
AWS Lambda: 서버리스 컴퓨팅 서비스
Google Cloud Functions: Google의 서버리스 컴퓨팅 서비스
Azure Functions: Microsoft의 서버리스 서비스
셋업 방법
AWS Lambda: AWS Management Console에서 함수 생성 후, API Gateway와 연동
10. Provisioning
정의
서버 및 인프라 리소스를 자동화하여 설정하고 배포하는 작업입니다.
주요 툴
Terraform: 인프라를 코드로 정의하고 관리할 수 있게 해주는 툴
Ansible: 자동화된 서버 설정 및 관리 도구
Chef: 서버 인프라를 코드로 관리
셋업 방법
Terraform: .tf 파일을 작성하여 인프라 정의 후 terraform apply 명령어로 배포 Ansible: Playbook을 작성하여 서버에 설정 적용
11. CI/CD Tools
정의
CI/CD는 Continuous Integration/Continuous Deployment로, 코드의 변경을 자동화하여 빌드, 테스트, 배포하는 프로세스입니다.
주요 툴
Jenkins: 오픈 소스 CI/CD 툴
GitLab CI: GitLab의 내장 CI/CD 툴
CircleCI: 클라우드 기반 CI/CD 서비스
셋업 방법
Jenkins: Jenkinsfile을 작성하여 자동화된 파이프라인 설정
GitLab CI: .gitlab-ci.yml 파일을 작성하여 CI/CD 파이프라인 설정
12. Monitoring
정의
모니터링은 시스템, 애플리케이션, 네트워크 등의 상태를 지속적으로 추적하는 작업입니다.
12.1 Sentry
개념
- Sentry는 오류 추적 및 모니터링 플랫폼으로, 실시간으로 오류를 감지하고 알림을 보내줍니다.
- 스택 트레이스, 사용자 정보, 환경 정보 등을 포함한 에러 리포트를 제공합니다.
역할
- 예외 발생 시 자동으로 캡처
- 버그 추적 및 성능 모니터링
- Slack, Discord, 이메일 등 다양한 채널로 알림 연동
Express에서 설정 및 사용 예시
npm install @sentry/node @sentry/tracing
// sentry.ts
import * as Sentry from "@sentry/node";
import { Integrations } from "@sentry/tracing";
export const initSentry = (app: any) => {
Sentry.init({
dsn: "<YOUR_SENTRY_DSN>",
integrations: [
new Integrations.Express({ app }),
],
tracesSampleRate: 1.0, // 성능 추적 비율
});
app.use(Sentry.Handlers.requestHandler());
app.use(Sentry.Handlers.tracingHandler());
};
// app.ts or server.ts
import express from 'express';
import { initSentry } from './sentry';
const app = express();
initSentry(app);
app.get('/', function mainHandler(req, res) {
throw new Error("My first Sentry error!");
});
app.use(Sentry.Handlers.errorHandler());
12.2 Winston
개념
- Winston은 Node.js에서 가장 널리 사용되는 로깅 라이브러리 중 하나입니다.
- 로그 수준(
info
,warn
,error
)에 따라 콘솔 또는 파일로 로깅 가능
역할
- 로그 관리 및 추적
- 운영 환경에서 로그 수집 및 분석용으로 사용됨
Express에서 설정 및 사용 예시
npm install winston
// logger.ts
import { createLogger, transports, format } from 'winston';
export const logger = createLogger({
level: 'info',
format: format.combine(
format.timestamp(),
format.printf(({ timestamp, level, message }) => {
return `[${timestamp}] ${level}: ${message}`;
})
),
transports: [
new transports.Console(),
new transports.File({ filename: 'error.log', level: 'error' }),
new transports.File({ filename: 'combined.log' }),
],
});
// app.ts
import express from 'express';
import { logger } from './logger';
const app = express();
app.use((req, res, next) => {
logger.info(`${req.method} ${req.url}`);
next();
});
app.get('/', (req, res) => {
logger.info("Main page visited");
res.send("Hello World");
});
app.use((err, req, res, next) => {
logger.error(err.stack);
res.status(500).send('Something broke!');
});
12.3 APM (Application Performance Monitoring)
개념
- APM은 애플리케이션의 성능과 가용성을 모니터링하는 도구입니다.
- 대표적인 APM: Elastic APM, New Relic, Datadog
역할
- API 응답 시간, 트랜잭션 추적
- 오류 발생 지점, DB 쿼리 속도 등을 시각화하여 제공
Elastic APM Express 셋업 예시
npm install elastic-apm-node
// apm.ts
const apm = require('elastic-apm-node').start({
serviceName: 'your-service-name',
serverUrl: 'http://localhost:8200',
});
export default apm;
// app.ts
import express from 'express';
import apm from './apm';
const app = express();
app.get('/', (req, res) => {
res.send('APM is working');
});
app.listen(3000);
APM은 서비스 시작 시 가장 먼저 초기화해야 합니다 (최상단 import).
정리
도구 | 역할 | 주요 기능 |
---|---|---|
Sentry | 에러 추적 | 스택 트레이스, 사용자 정보, 알림 연동 |
Winston | 로깅 | 로그 레벨별 파일/콘솔 기록 |
APM | 성능 모니터링 | 응답 시간, 트랜잭션 분석, DB 지표 등 |
각 도구는 함께 조합해서 사용할 수 있으며, Sentry + Winston 조합은 에러 추적 + 로깅 분석을 동시에 제공하고, APM까지 도입하면 성능까지 모니터링할 수 있어 현업에서 자주 사용됩니다.