개발 가이드
Lumie 백엔드 로컬 개발 환경 설정, 빌드·실행 방법, 새 도메인 모듈을 추가하는 절차를 안내합니다.
사전 요구사항
| 도구 | 버전 | 설치 방법 |
|---|---|---|
| JDK | 21 이상 | Eclipse Temurin 권장 |
| Gradle | 8.12 (Wrapper 사용) | 별도 설치 불필요 |
| Docker | 최신 | 로컬 인프라 실행용 |
| kubectl | 최신 | Tilt 워크플로우 사용 시 |
JDK 버전 확인:
java -version
# openjdk version "21.0.x" ...
로컬 인프라 실행
백엔드를 로컬에서 실행하려면 PostgreSQL, Redis, RabbitMQ, MinIO가 필요합니다. Docker Compose로 한 번에 시작합니다.
# lumie-backend 루트에서
docker compose -f docker-compose.dev.yml up -d
빌드
전체 빌드
# 루트에서 전체 모듈 빌드 (테스트 포함)
./gradlew build
# 테스트 제외 빌드 (빠른 빌드)
./gradlew build -x test
배포용 JAR 빌드
# app 모듈의 bootJar 태스크 실행 → app/build/libs/lumie-backend.jar 생성
./gradlew :app:bootJar
빌드 결과물 위치: app/build/libs/lumie-backend.jar
특정 모듈만 빌드
# exam 모듈만 컴파일 확인
./gradlew :modules:exam:compileJava
# 특정 모듈 테스트만 실행
./gradlew :modules:exam:test
로컬 실행
# dev 프로필로 전체 애플리케이션 실행
./gradlew :app:bootRun --args='--spring.profiles.active=dev'
서버 시작 후 http://localhost:8080/actuator/health 에서 상태를 확인할 수 있습니다.
테스트
전체 테스트 실행
./gradlew test
통합 테스트 실행
@Tag("integration") 테스트는 기본 test 태스크에서 제외됩니다. TestContainers (Postgres)가 필요합니다.
./gradlew :app:integrationTest
테스트 전략
| 레이어 | 도구 | 특징 |
|---|---|---|
| 도메인 단위 테스트 | JUnit 5 | 순수 Java, 의존성 없음 |
| 유스케이스 테스트 | JUnit 5 + Mockito | 포트를 Mock으로 교체 |
| JPA 어댑터 테스트 | @DataJpaTest + Testcontainers | 실제 PostgreSQL 컨테이너 |
| REST 통합 테스트 | @SpringBootTest + MockMvc | 전체 컨텍스트 로드 |
// 유스케이스 테스트 예시
@ExtendWith(MockitoExtension.class)
class ExamServiceTest {
@Mock LoadExamPort loadExamPort;
@Mock SaveExamPort saveExamPort;
@InjectMocks ExamService examService;
@Test
void 시험_생성_성공() {
// given
CreateExamCommand command = new CreateExamCommand("3월 모의고사", 30);
given(saveExamPort.saveExam(any())).willAnswer(inv -> inv.getArgument(0));
// when
ExamResponse response = examService.createExam(command);
// then
assertThat(response.name()).isEqualTo("3월 모의고사");
verify(saveExamPort).saveExam(any(Exam.class));
}
}
OpenAPI 스냅샷 갱신
BE 컨트롤러/DTO 변경이 FE 계약에 영향을 준다면, 스냅샷을 재생성하고 diff를 검토한 후 커밋합니다.
./gradlew :app:test --tests '*OpenApiSnapshotTest' -DupdateOpenApiSnapshot=true
# → app/src/test/resources/openapi/api-docs.json 갱신됨
# → 이 파일을 커밋하면 FE orval 코드젠이 새 계약을 반영
자세한 내용은 아키텍처 — OpenAPI / orval 계약을 참고하세요.