직장인 도시락 구독 배달 서비스의 백엔드 시스템
- 동시 접속 처리 능력이 요구되는 주문 관리 시스템 개발 가이드입니다.
- 실무에서 마주칠 법한 문제 해결 과정과 기술적 선택을 강조하고, 개인 포트폴리오 작성에 참고할 수 있도록 구성되었습니다.
- 저와 비슷한 고민을 하는 누군가가 있다면 작으나마 도움이 되기를 기대합니다.
version: '3.8'
services:
mariadb:
image: mariadb:10.5
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: orders_db
ports:
- "3306:3306"
volumes:
- mariadb_data:/var/lib/mysql
redis:
image: redis:6.2
ports:
- "6379:6379"
volumes:
mariadb_data:
주문 도메인 설계
• Order 엔티티, Repository, Service, Controller 계층 구현.
• TDD를 기반으로 서비스 레이어부터 개발.
Redis 캐싱 적용
• @Cacheable 어노테이션과 RedisConfig로 TTL(Time-to-Live) 설정.
• RedisConfig 예제:
@Configuration
@EnableCaching
public class RedisConfig {
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(10));
return RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(config)
.build();
}
}
QOrder order = QOrder.order;
JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
List<Order> results = queryFactory.selectFrom(order)
.where(order.status.eq("COMPLETED"))
.fetch();
import http from 'k6/http';
import { check } from 'k6';
export let options = {
vus: 50,
duration: '10s',
};
export default function () {
let res = http.get('http://localhost:8080/orders/1');
check(res, { 'status is 200': (r) => r.status === 200 });
}
주요 문제 해결
배운 점
docker-compose up -d
./gradlew bootRun
nano load-test.js
import { check, sleep } from 'k6';
export const options = {
vus: 50, // 동시 접속 사용자 수
duration: '5s', // 테스트 실행 시간
};
export default function () {
const res = http.get('http://localhost:8080/orders/1'); // API 엔드포인트
check(res, { 'status is 200': (r) => r.status === 200 });
sleep(1);
}
k6 run load-test.js