안녕하세요. 이번 글에서는 '대규모 트래픽 게시판' 프로젝트의 초기 설정과 기술 스택 선택에 대해 상세히 알아보겠습니다.
1. 프로젝트 개요
'대규모 트래픽 게시판'은 Spring Boot 기반의 확장 가능한 포럼 시스템입니다. 대규모 트래픽을 효과적으로 처리하고, 유연한 확장성을 제공하는 것을 목표로 합니다.
2. 주요 기술 스택 및 라이브러리
2.1 Spring Boot 3.1.4
- 소개: 자바 기반의 애플리케이션 개발을 위한 프레임워크
- 대안: Quarkus, Micronaut
- 선택 이유: 풍부한 생태계, 광범위한 커뮤니티 지원, 쉬운 설정과 개발 환경
2.2 Java 17
- 소개: 여러 실험적 기능과 스프링 부트3.0부터 적용가능한 버전
- 대안: Kotlin, Scala
- 선택 이유: 자바 21버전을 아직 현업에서 많은 기업이 적용하지 않고 있음.
2.3 Gradle 8.5
- 소개: 빌드 자동화 도구
- 대안: Maven
- 선택 이유: 유연한 빌드 스크립트, 더 빠른 빌드 속도
2.4 MySQL 8.0.31
- 소개: 오픈소스 관계형 데이터베이스
- 대안: PostgreSQL, Oracle
- 선택 이유: 안정성, 성능, 광범위한 사용
2.5 MyBatis 3.0.1
- 소개: SQL 매핑 프레임워크
- 대안: Spring Data JPA, Hibernate
- 선택 이유: SQL에 대한 직접적인 제어, 성능 최적화 용이성
2.6 Redis
- 소개: 인메모리 데이터 구조 저장소
- 대안: Memcached, Hazelcast
- 선택 이유: 다양한 데이터 구조 지원, 높은 성능, 영속성 옵션
2.7 AWS SNS
- 소개: 분산 발행-구독 시스템
- 대안: Apache Kafka, RabbitMQ
- 선택 이유: AWS 생태계와의 통합, 관리 용이성
2.8 Docker
- 소개: 컨테이너화 플랫폼
- 대안: Kubernetes (for orchestration)
- 선택 이유: 일관된 개발 및 배포 환경, 쉬운 확장성
3. build.gradle 설정
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.4'
id 'io.spring.dependency-management' version '1.1.3'
}
group = 'com.fastcampus'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
all {
exclude group : 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'me.paulschwarz:spring-dotenv:4.0.0' // 환경 변수 관리
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.1'
implementation 'org.springframework.boot:spring-boot-starter-aop'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-log4j2'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'software.amazon.awssdk:sns'
implementation platform('software.amazon.awssdk:bom:2.5.29')
implementation 'com.slack.api:bolt:1.18.0'
implementation 'com.slack.api:bolt-servlet:1.18.0'
implementation 'com.slack.api:bolt-jetty:1.18.0'
runtimeOnly 'com.mysql:mysql-connector-j'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
1.spring-dotenv (4.0.0)
- 설명: .env 파일을 사용하여 환경 변수를 관리하는 라이브러리
- 용도: 개발 환경에서 환경 변수를 쉽게 설정하고 관리할 수 있게 해줍니다.
- 선택 이유: 보안에 민감한 정보를 소스 코드에서 분리하고, 환경별 설정을 용이하게 합니다.
2.spring-boot-starter-web
- 설명: Spring MVC를 사용한 웹 애플리케이션 개발을 위한 스타터
- 용도: RESTful 웹 서비스 개발에 필요한 의존성들을 포함합니다.
- 선택 이유: Spring Boot의 자동 구성 기능을 활용하여 웹 애플리케이션 개발을 간소화합니다.
3.mybatis-spring-boot-starter (3.0.1)
- 설명: MyBatis와 Spring Boot를 통합하는 스타터
- 용도: 데이터베이스 작업을 위한 SQL 매핑 프레임워크를 제공합니다.
- 선택 이유: SQL에 대한 직접적인 제어가 가능하며, 복잡한 쿼리 처리에 유리합니다.
4.spring-boot-starter-aop
- 설명: 관점 지향 프로그래밍(AOP)을 위한 스타터
- 용도: 로깅, 보안, 트랜잭션 관리 등 횡단 관심사를 분리하여 구현할 수 있게 합니다.
- 선택 이유: 코드의 모듈성을 높이고, 반복적인 코드를 줄일 수 있습니다.
5.spring-boot-starter-data-redis
- 설명: Redis를 Spring 애플리케이션에 통합하기 위한 스타터
- 용도: 캐싱, 세션 관리, 메시지 브로커 등에 사용됩니다.
- 선택 이유: 고성능의 인메모리 데이터 처리가 가능하여 대규모 트래픽 처리에 유용합니다.
6.spring-boot-starter-log4j2
- 설명: Log4j2 로깅 프레임워크를 위한 스타터
- 용도: 애플리케이션의 로깅을 관리합니다.
- 선택 이유: 높은 성능과 다양한 로깅 옵션을 제공하여 대규모 시스템의 모니터링에 적합합니다.
7.spring-boot-starter-validation
- 설명: Java Bean Validation을 위한 스타터
- 용도: 데이터 유효성 검사를 쉽게 구현할 수 있게 해줍니다.
- 선택 이유: 입력 데이터의 안정성을 보장하고, 서버 측 유효성 검사를 간소화합니다.
8.software.amazon.awssdk:sns
- 설명: Amazon Simple Notification Service(SNS)를 사용하기 위한 SDK
- 용도: 푸시 알림, 이메일, SMS 등의 메시징 서비스를 구현합니다.
- 선택 이유: 확장 가능한 알림 시스템을 구축하는 데 유용합니다.
9.com.slack.api:bolt, bolt-servlet, bolt-jetty
- 설명: Slack 애플리케이션 개발을 위한 Java 라이브러리
- 용도: Slack과의 통합 기능을 구현합니다.
- 선택 이유: 팀 커뮤니케이션 도구와의 연동을 통해 알림 및 모니터링 기능을 강화합니다.
10.mysql-connector-j
- 설명: MySQL 데이터베이스와의 연결을 위한 JDBC 드라이버
- 용도: Java 애플리케이션에서 MySQL 데이터베이스에 접근할 수 있게 합니다.
- 선택 이유: MySQL 데이터베이스와의 안정적인 연결을 제공합니다.
11.lombok
- 설명: 자바 코드 생성을 자동화하는 라이브러리
- 용도: Getter, Setter, 생성자 등의 반복적인 코드를 줄여줍니다.
- 선택 이유: 코드의 가독성을 높이고 개발 생산성을 향상시킵니다.
12.spring-boot-starter-test
- 설명: Spring Boot 애플리케이션의 테스트를 위한 스타터
- 용도: 단위 테스트 및 통합 테스트를 작성하는 데 필요한 의존성을 제공합니다.
- 선택 이유: 테스트 주도 개발(TDD)을 지원하고, 애플리케이션의 품질을 보장합니다.
4. MyBatis vs Spring Data JPA
MyBatis
- SQL 매핑 기반의 ORM 프레임워크
- 개발자가 직접 SQL을 작성하여 세밀한 제어 가능
- 복잡한 쿼리나 성능 최적화에 유리
- 학습 곡선이 상대적으로 완만
Spring Data JPA
- 객체 중심의 ORM 프레임워크
- 대부분의 CRUD 작업을 자동으로 생성
- 데이터베이스 독립적인 개발 가능
- 복잡한 도메인 모델에 적합
선택 이유
'대규모 트래픽 게시판' 프로젝트에서 MyBatis를 선택한 주요 이유:
- SQL에 대한 세밀한 제어: 대규모 트래픽 처리를 위해 쿼리 최적화가 중요
- 성능: 복잡한 쿼리 실행 시 MyBatis가 더 나은 성능을 보일 수 있음
- 기존 레거시 시스템과의 통합 용이성
- 팀의 기술 스택 선호도
5. application.properties 설정
spring.application.name=${SPRING_APPLICATION_NAME}
# MySQL
spring.datasource.driver-class-name=${SPRING_DATASOURCE_DRIVER_CLASS_NAME}
spring.datasource.jdbc-url=${SPRING_DATASOURCE_JDBC_URL}
spring.datasource.username=${SPRING_DATASOURCE_USERNAME}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD}
spring.datasource.hikari.maxLifetime=${SPRING_DATASOURCE_HIKARI_MAX_LIFETIME}
mybatis.mapper-locations=${MYBATIS_MAPPER_LOCATIONS}
# Redis
spring.cache.type=${SPRING_CACHE_TYPE}
spring.data.redis.host=${SPRING_DATA_REDIS_HOST}
spring.data.redis.port=${SPRING_DATA_REDIS_PORT}
spring.data.redis.password=${SPRING_DATA_REDIS_PASSWORD}
spring.data.redis.repositories.enabled=${SPRING_DATA_REDIS_REPOSITORIES_ENABLED}
expire.defaultTime=${EXPIRE_DEFAULT_TIME}
# AWS SNS
sns.topic.arn=${SNS_TOPIC_ARN}
aws.accessKey=${AWS_ACCESS_KEY}
aws.secretKey=${AWS_SECRET_KEY}
aws.region=${AWS_REGION}
cloud.aws.region.static=${CLOUD_AWS_REGION_STATIC}
cloud.aws.stack.auto=${CLOUD_AWS_STACK_AUTO}
# Slack
slack.token=${SLACK_TOKEN}
slack.webhook.url=${SLACK_WEBHOOK_URL}
이 설정 파일은 환경 변수를 사용하여 각종 설정값을 관리합니다. 이는 다음과 같은 이점이 있습니다:
- 보안: 민감한 정보를 소스 코드에 직접 포함시키지 않음
- 환경별 설정: 개발, 테스트, 운영 환경에 따라 쉽게 설정 변경 가능
- 컨테이너화 지원: Docker 등의 컨테이너 환경에서 쉽게 설정 주입 가능
6. 프로젝트 구조
.
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── example
│ │ │ └── boardserver
│ │ │ ├── aop
│ │ │ ├── config
│ │ │ ├── controller
│ │ │ ├── dto
│ │ │ ├── exception
│ │ │ ├── mapper
│ │ │ ├── service
│ │ │ └── utils
│ │ └── resources
│ │ ├── mappers
│ │ └── application.properties
│ └── test
├── build.gradle
└── README.md
이 구조는 관심사의 분리와 모듈화를 고려하여 설계되었습니다.
결론
이번 글에서는 '대규모 트래픽 게시판' 프로젝트의 초기 설정과 주요 기술 선택에 대해 알아보았습니다. 각 기술과 라이브러리의 선택 이유와 대안들을 살펴보았고, 프로젝트 구조에 대해 설명했습니다. 이러한 기술 스택은 대규모 트래픽을 효과적으로 처리하고 확장성 있는 시스템을 구축하는 데 도움이 될 것입니다. 다음 글에서는 이러한 설정을 바탕으로 실제 기능 구현을 시작하겠습니다.
'프레임워크 > 자바 스프링' 카테고리의 다른 글
대규모 트래픽 게시판 구축 시리즈 #6: 유저 API (1) | 2024.09.05 |
---|---|
대규모 트래픽 게시판 구축 시리즈 #5: MySQL 데이터베이스 연결 설정 (1) | 2024.09.05 |
대규모 트래픽 게시판 구축 시리즈 #3: 도커를 이용한 데이터베이스 구축 (5) | 2024.09.05 |
대규모 트래픽 게시판 구축 시리즈 #2: 프로젝트 기획 및 요구 사항 (0) | 2024.09.05 |
대규모 트래픽 게시판 구축 시리즈 #1: 프로젝트 기획 및 요구 사항 (0) | 2024.09.05 |