Skip to content

Conversation

@devmizz
Copy link
Contributor

@devmizz devmizz commented Jan 15, 2026

📌 Related Issue

🚨 해결하려는 문제가 무엇인가요?

  • 최근 Oracle로 DB를 이관하면서, local 및 test(ci)와 배포 환경이 일치하지 않아 테스트나 CI가 제대로 진행되지 않았습니다.

⭐️ 어떻게 해결했나요?

  • Oracle의 경우 정식 도커 이미지도 없고, 경량화 된 이미지도 무거운 편입니다.
  • H2를 사용하여 로컬과 테스트 환경을 구축하였습니다.

🤔 어떤 부분에 집중하여 리뷰해야 할까요?

  • 다음의 두 가지 위주로 봐주시면 좋을 거 같습니다.
    • docker 설정 확인
    • 테스트 확인

🗒️ 참고자료

RCA 룰

  • R: 꼭 반영해 주세요. 적극적으로 고려해 주세요. (Request changes)
  • C: 웬만하면 반영해 주세요. (Comment)
  • A: 반영해도 좋고 넘어가도 좋습니다. 그냥 사소한 의견입니다. (Approve)

Summary by CodeRabbit

  • Chores (내부 개선)

    • CI에서 Docker 기반 MySQL 시작 단계를 제거해 워크플로우를 간소화했습니다.
    • 런타임에 H2 의존성을 추가하고 로컬/테스트 환경을 인메모리 H2로 전환했습니다.
    • 컨테이너 구성에서 MySQL을 Oracle로 교체하고 포트, 환경변수 및 헬스체크를 업데이트했습니다.
    • JWT 설정과 H2 콘솔, 로깅/테스트 로깅을 추가·강화했습니다.
  • Refactor (재구성)

    • 데이터베이스 스키마의 날짜 및 불리언 타입을 Oracle/H2에 맞춰 표준화하고 일부 컬럼 구조를 조정했습니다.
  • Tests (테스트)

    • MySQL 의존으로 인해 일부 테스트 시나리오를 비활성화(스킵)했습니다.

✏️ Tip: You can customize this high-level summary in your review settings.

@devmizz devmizz requested a review from eeun1225 January 15, 2026 14:36
@devmizz devmizz self-assigned this Jan 15, 2026
@coderabbitai
Copy link

coderabbitai bot commented Jan 15, 2026

📝 Walkthrough

Walkthrough

CI 워크플로우에서 Docker/MySQL 시작 단계 제거, 로컬·테스트 Compose를 MySQL→Oracle XE로 교체, 로컬/테스트 프로필을 H2 인메모리 DB로 전환, 스키마 타입을 TIMESTAMP/NUMBER(1)/VARCHAR 등으로 변경, 일부 MySQL 전용 테스트 비활성화, Generation 조회 로직을 서비스로 이동.

Changes

코호트 / 파일(s) 변경 요약
CI 워크플로우
​.github/workflows/yappu-world-ci.yaml
Docker 설치 및 Docker Compose로 MySQL 시작 관련 단계 2개 제거
빌드/테스트 설정
build.gradle.kts
runtimeOnly("com.h2database:h2") 추가; 테스트 로깅 상세화 (events, exceptions, FULL)
로컬 Docker Compose
docker/docker-compose-local.yaml
MySQL → Oracle XE(gvenzl/oracle-xe:21-slim-faststart) 전환; env/포트(3306→1521)/볼륨/헬스체크 등 업데이트
테스트 Docker Compose
docker/docker-compose-test.yaml
MySQL → Oracle XE로 교체; env/포트/헬스체크 추가 및 MySQL 전용 명령 제거
애플리케이션 프로파일
src/main/resources/application-local.yaml, src/main/resources/application-test.yaml
docker.compose 사용 비활성화(테스트), datasource MySQL→H2 인메모리(Oracle 모드) 전환, JPA(hibernate dialect/ddl-auto/show-sql)·H2 콘솔·로그·JWT 설정 추가
DB 스키마
src/main/resources/schema.sql
다수 컬럼 타입 변경: datetime(6)TIMESTAMP, tinyint(1)NUMBER(1), 일부 날짜/시간→VARCHAR(...); sign_up_application.reject_reason 추가
테스트 파일(스킵)
src/test/kotlin/.../SignUpExecutorTest.kt, src/test/kotlin/.../SignUpExecutorConcurrencyTest.kt
MySQL Named Lock 의존 테스트들을 feature()xfeature()으로 변경(테스트 비활성화)
도메인 조회 리팩터링
src/main/kotlin/co/yappuworld/operation/infrastructure/GenerationFindService.kt, src/main/kotlin/co/yappuworld/operation/infrastructure/GenerationRepository.kt, src/main/kotlin/co/yappuworld/operation/client/application/GenerationActiveStateManager.kt, src/test/.../GenerationActiveStateManagerTest.kt
GenerationRepository가 KotlinJdslJpqlExecutor를 확장하고 기존 존재/조회 메서드 제거; GenerationFindService에 existsActiveGeneration()·findAllActiveGeneration() 추가; GenerationActiveStateManager가 GenerationFindService 주입으로 생성자 변경 및 테스트 반영

Sequence Diagram(s)

sequenceDiagram
    rect rgba(200,100,100,0.5)
    participant Manager as GenerationActiveStateManager
    end
    rect rgba(100,200,100,0.5)
    participant Finder as GenerationFindService
    end
    rect rgba(100,100,200,0.5)
    participant Repo as GenerationRepository/DB
    end

    Manager->>Finder: existsActiveGeneration()
    Finder->>Repo: 쿼리 (limit 1, is_active = true)
    Repo-->>Finder: 결과 (있음/없음)
    Finder-->>Manager: Boolean

    alt 활성 generation 존재
        Manager->>Finder: findAllActiveGeneration()
        Finder->>Repo: 쿼리 (is_active = true)
        Repo-->>Finder: List<GenerationEntity>
        Finder-->>Manager: List<GenerationEntity>
        Manager->>Repo: deactivate target generation(s) (via repository)
        Repo-->>Manager: 변경 결과
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested reviewers

  • eeun1225
🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목은 주요 변경사항인 H2 데이터베이스 기반의 CI 환경 구축을 정확하게 요약하고 있습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

🧹 Recent nitpick comments
src/main/resources/application-local.yaml (1)

37-40: 로컬 JWT 시크릿은 환경 변수로 분리 권장
로컬 전용이라도 레포에 시크릿 문자열이 고정되는 것은 피하는 게 안전합니다. 기본값을 두고 환경 변수로 덮어쓰는 방식이 좋습니다.

♻️ 제안 변경
 jwt:
-    secret_key: thisisforlocalsecretkeyonlyusinginlocalenvironmentthisisforlocalsecretkeyonlyusinginlocalenvironment
+    secret_key: ${LOCAL_JWT_SECRET_KEY:changeme-local}
src/main/resources/schema.sql (1)

120-121: SQL 키워드 대소문자 일관성이 없습니다.

다른 테이블들은 DROP TABLE IF EXISTS, CREATE TABLE로 대문자를 사용하지만, attendanceslate_passes 테이블은 소문자를 사용하고 있습니다. 가독성과 유지보수성을 위해 일관된 스타일을 권장합니다.

🔧 대문자로 통일하는 수정 제안
-drop table if exists attendances;
-create table attendances
+DROP TABLE IF EXISTS attendances;
+CREATE TABLE attendances
 (
     id                 binary(16) PRIMARY KEY,
     created_at         TIMESTAMP,
-drop table if exists late_passes;
-create table late_passes
+DROP TABLE IF EXISTS late_passes;
+CREATE TABLE late_passes
 (
     id         binary(16) PRIMARY KEY,
     created_at TIMESTAMP,

Also applies to: 132-133


📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d09e1f1 and e1f3714.

📒 Files selected for processing (7)
  • src/main/kotlin/co/yappuworld/operation/client/application/GenerationActiveStateManager.kt
  • src/main/kotlin/co/yappuworld/operation/infrastructure/GenerationFindService.kt
  • src/main/kotlin/co/yappuworld/operation/infrastructure/GenerationRepository.kt
  • src/main/resources/application-local.yaml
  • src/main/resources/application-test.yaml
  • src/main/resources/schema.sql
  • src/test/kotlin/co/yappuworld/operation/client/application/GenerationActiveStateManagerTest.kt
🚧 Files skipped from review as they are similar to previous changes (4)
  • src/main/kotlin/co/yappuworld/operation/infrastructure/GenerationFindService.kt
  • src/test/kotlin/co/yappuworld/operation/client/application/GenerationActiveStateManagerTest.kt
  • src/main/kotlin/co/yappuworld/operation/infrastructure/GenerationRepository.kt
  • src/main/kotlin/co/yappuworld/operation/client/application/GenerationActiveStateManager.kt
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (7)
src/main/resources/application-test.yaml (2)

10-21: H2 + OracleDialect 조합 호환성 확인 필요
H2를 Oracle 모드로 쓰더라도 Hibernate의 OracleDialect가 생성하는 SQL 일부가 H2에서 실패할 수 있습니다. CI에서 실제 테스트 실행으로 호환성을 확인하거나, 테스트 전용 Dialect(예: H2Dialect/커스텀)를 검토해 주세요.


15-20: 인메모리 + ddl-auto: none 조합의 스키마 초기화 경로 점검
테스트 프로필에서 ddl-auto: none이면 스키마가 schema.sql/마이그레이션으로 반드시 생성돼야 합니다. sql.init.mode: always가 실제 스키마/데이터 스크립트를 로드하는지 확인 부탁드립니다.

src/main/resources/application-local.yaml (1)

11-26: 로컬에서도 H2 + OracleDialect 호환성 확인 권장
테스트와 동일하게 로컬에서도 OracleDialect 사용 시 H2가 지원하지 않는 SQL이 나올 수 있습니다. 로컬 실행 시 핵심 쿼리들이 정상 동작하는지 확인해 주세요.

src/main/resources/schema.sql (4)

5-6: LGTM - H2/Oracle 호환 타입으로 적절히 변경되었습니다.

datetime(6)TIMESTAMP, tinyint(1)NUMBER(1) 변경은 H2와 Oracle 모두에서 호환됩니다.

Also applies to: 16-17, 24-24


84-87: 날짜/시간을 VARCHAR로 저장하는 설계 확인

start_date, end_dateVARCHAR(10), start_time, end_timeVARCHAR(32)로 변경되었습니다. DB 레벨의 날짜 유효성 검증은 없어지지만, 크로스 DB 호환성을 위한 의도적인 설계로 보입니다.

애플리케이션 레벨에서 날짜/시간 포맷 검증이 이루어지고 있는지 확인해 주세요.


159-160: LGTM - DEFAULT 값과 함께 NUMBER(1) 사용이 적절합니다.

has_app, has_web 컬럼에 NUMBER(1) NOT NULL DEFAULT 0 설정이 H2와 Oracle 모두에서 잘 동작합니다.


34-34: JSON 컬럼은 Hibernate를 통해 적절히 처리되고 있으며 테스트로 검증되었습니다.

SignUpApplicationEntityTeamServiceEntity에서 JSON 컬럼이 @Column(columnDefinition = "JSON")으로 올바르게 매핑되어 있으며, Spring Boot 기본 H2 버전(2.x)은 JSON 타입을 완벽히 지원합니다. ServiceLinksConverterTest의 테스트코드로도 JSON 직렬화/역직렬화가 정상 동작함이 확인되었으므로, 추가 검증은 불필요합니다.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (4)
src/test/kotlin/co/yappuworld/user/client/application/usecase/SignUpExecutorConcurrencyTest.kt (1)

68-92: ExecutorService 종료 누락 (현재 비활성화 상태이므로 영향 없음)

테스트가 재활성화될 경우를 대비하여, ExecutorService는 사용 후 명시적으로 종료해야 합니다.

♻️ 향후 재활성화 시 적용할 수정안
                 latch.await()
+                executorService.shutdown()
                 userRepository.count() shouldBe 1

또는 Kotlin의 use 확장 함수를 활용하여 AutoCloseable 패턴 적용을 고려해보세요.

src/main/resources/schema.sql (1)

159-160: BOOLEAN 기본값을 FALSE로 변경 권장

BOOLEAN 타입에 DEFAULT 0 대신 DEFAULT FALSE를 사용하면 가독성이 향상됩니다.

♻️ 제안된 변경
-    has_app         BOOLEAN NOT NULL DEFAULT 0,
-    has_web         BOOLEAN NOT NULL DEFAULT 0,
+    has_app         BOOLEAN NOT NULL DEFAULT FALSE,
+    has_web         BOOLEAN NOT NULL DEFAULT FALSE,
docker/docker-compose-local.yaml (1)

4-20: Oracle XE 로컬 설정은 적절하게 구성됨

start_period: 60s로 Oracle 초기화 시간을 충분히 고려한 점이 좋습니다.

다만 명확한 설명이 필요한 부분: application-local.yaml에서는 H2를 사용하고 Spring docker compose support가 비활성화(enabled: false)되어 있는 반면, docker-compose-local.yaml은 Oracle XE를 구성하고 있습니다. 이 파일이 정확히 언제/어떤 시나리오에서 사용되는지(다른 프로필용인지, 수동 설정용인지 등) 주석이나 README에 문서화하면 좋겠습니다.

src/main/resources/application-local.yaml (1)

23-26: H2 로컬 환경에서는 H2Dialect 사용을 권장합니다

현재 설정에서 OracleDialect를 사용하고 있으나, 로컬 개발 환경은 H2 데이터베이스(MODE=Oracle)를 사용하고 있습니다. 코드베이스에서 @Query로 커스텀 SQL을 사용하거나 SEQUENCE 생성 전략을 사용하는 부분이 없어 현재는 정상 동작하지만, 더 명확한 의도를 반영하기 위해 로컬 환경의 JPA 설정을 다음과 같이 변경하는 것을 권장합니다:

database-platform: org.hibernate.dialect.H2Dialect

이렇게 하면 로컬 개발 환경이 실제 데이터베이스(OracleDialect)와 다르다는 점을 명시적으로 드러낼 수 있습니다. (application-dev.yaml, application-prod.yaml 등 다른 환경에서는 실제 Oracle 설정 사용)

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d167d5d and d4cfa50.

📒 Files selected for processing (9)
  • .github/workflows/yappu-world-ci.yaml
  • build.gradle.kts
  • docker/docker-compose-local.yaml
  • docker/docker-compose-test.yaml
  • src/main/resources/application-local.yaml
  • src/main/resources/application-test.yaml
  • src/main/resources/schema.sql
  • src/test/kotlin/co/yappuworld/user/client/application/usecase/SignUpExecutorConcurrencyTest.kt
  • src/test/kotlin/co/yappuworld/user/client/application/usecase/SignUpExecutorTest.kt
💤 Files with no reviewable changes (1)
  • .github/workflows/yappu-world-ci.yaml
🔇 Additional comments (9)
src/test/kotlin/co/yappuworld/user/client/application/usecase/SignUpExecutorConcurrencyTest.kt (1)

66-66: 테스트 비활성화 이유가 명확하게 문서화되어 좋습니다.

MySQL Named Lock이 H2에서 지원되지 않아 xfeature로 비활성화한 것은 적절한 접근입니다. 향후 동시성 테스트를 위한 대안 고려를 권장합니다:

  1. Testcontainers를 사용하여 실제 MySQL/Oracle 컨테이너로 테스트
  2. H2 호환 가능한 비관적 락(Pessimistic Lock) 기반 대체 구현 테스트

향후 동시성 테스트 재활성화 계획이 있는지 확인 부탁드립니다.

src/test/kotlin/co/yappuworld/user/client/application/usecase/SignUpExecutorTest.kt (1)

19-42: LGTM!

xfeature를 사용한 테스트 비활성화와 사유 문서화가 일관되게 적용되었습니다. 테스트 코드를 삭제하지 않고 보존하여 향후 MySQL/Oracle 환경에서 재활성화할 수 있도록 한 점이 좋습니다.

build.gradle.kts (1)

36-36: LGTM!

H2 데이터베이스 의존성이 runtimeOnly로 적절하게 추가되었습니다. Spring Boot BOM이 버전을 관리하므로 버전 미지정이 적절합니다.

docker/docker-compose-test.yaml (1)

1-15: docker-compose-test.yaml 사용처 확인 필요

application-test.yaml에서 docker.compose.enabled: false로 설정되어 있고 H2 인메모리 DB를 사용합니다. 이 Oracle XE docker-compose 설정이 어디서 사용되는지 확인이 필요합니다.

CI 워크플로우에서도 Docker 설정 단계가 제거된 것으로 보이는데, 이 파일이 현재 사용되지 않는다면 삭제를 고려하거나, 사용 목적을 README나 주석으로 문서화해 주세요.

src/main/resources/application-test.yaml (1)

23-26: 테스트 환경에서 환경 변수 설정 확인 필요

JWT 관련 설정이 환경 변수(${DEV_JWT_SECRET_KEY} 등)를 참조하고 있습니다. CI 환경에서 이 환경 변수들이 올바르게 설정되어 있는지 확인해 주세요. 누락 시 테스트 실행이 실패할 수 있습니다.

src/main/resources/schema.sql (2)

34-34: H2에서 JSON 타입 호환성 확인 필요

json 타입이 sign_up_application.detailsteam_services.service_links에서 사용되고 있습니다. H2는 JSON 타입을 지원하지만 Oracle과 동작 방식이 다를 수 있습니다. 테스트 시 JSON 필드 관련 기능이 정상 동작하는지 확인해 주세요.


86-87: LocalTimeStringConverter로 자동 변환되므로 문제없음

timeend_time이 varchar(32)로 저장되지만, LocalTimeStringConverter@Converter(autoApply = true) 설정으로 인해 자동으로 LocalTime 객체로 변환됩니다. 애플리케이션 레벨에서는 LocalTime 타입으로 동작하므로 정렬, 비교, 계산이 모두 정상 작동합니다. 의도된 변경이며 JPA 매핑이 올바르게 되어 있습니다.

src/main/resources/application-local.yaml (2)

12-15: LGTM - H2 Oracle 모드 설정이 적절합니다.

MODE=Oracle과 함께 DATABASE_TO_LOWER=TRUE, NON_KEYWORDS=VALUE 옵션이 Oracle 호환성을 위해 잘 구성되어 있습니다.


28-31: H2 콘솔 설정이 적절합니다.

로컬 개발 환경에서 H2 콘솔 활성화는 디버깅에 유용하며, application-prod.yamlapplication-prod-oci.yaml에서는 H2 콘솔이 활성화되지 않아 운영 환경의 보안이 보장됩니다.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/main/kotlin/co/yappuworld/operation/client/application/GenerationActiveStateManager.kt (1)

72-75: 문자열 템플릿 내 불필요한 닫는 중괄호

Line 74에서 }}가 있는데, 문자열 템플릿 종료 }가 하나 더 있습니다. 의도된 것인지 확인해 주세요.

             logger.error {
                 "활성화 된 기수: ${
                     activeGenerations.map { it.value }.joinToString(", ")
-                }}"
+                }"
             }
🤖 Fix all issues with AI agents
In
`@src/main/kotlin/co/yappuworld/operation/infrastructure/GenerationFindService.kt`:
- Around line 33-39: Remove the unused repository method
GenerationRepository.findAllByIsActiveIsTrue() from the codebase since
GenerationFindService.findAllActiveGeneration() now provides the JDSL-based
replacement; locate and delete the method declaration in GenerationRepository
(and any related unused imports or interface references) and run a build/IDE
search to ensure no callers remain, leaving the defensive filterNotNull() in
findAllActiveGeneration() as-is.
♻️ Duplicate comments (2)
src/main/resources/application-test.yaml (1)

17-21: H2 데이터베이스에 OracleDialect 사용 시 호환성 문제 가능성

H2의 MODE=Oracle은 SQL 문법 수준의 호환성을 제공하지만, Hibernate의 OracleDialect는 Oracle 고유 기능(시퀀스 생성 구문, 락 함수, 페이징 쿼리 등)을 생성합니다. H2가 이를 완전히 지원하지 않아 런타임 오류가 발생할 수 있습니다.

이전 리뷰에서 지적된 get_lock()/release_lock() 함수 문제도 이 호환성 이슈의 일부입니다.

권장 수정안
    jpa:
-        database-platform: org.hibernate.dialect.OracleDialect
+        database-platform: org.hibernate.dialect.H2Dialect
        hibernate:
            ddl-auto: none
        show-sql: true

H2Dialect를 사용하고, H2의 Oracle 모드가 JDBC 레벨에서 Oracle 호환 SQL을 처리하도록 하는 것이 더 안정적입니다. 단, 이 경우에도 Oracle 전용 네이티브 쿼리(락 함수 등)는 별도 처리가 필요합니다.

src/main/resources/schema.sql (1)

162-162: JSON 타입 사용 (team_services)

sign_up_application.details와 마찬가지로 service_links 컬럼도 json 타입을 사용합니다. H2 버전 호환성 확인 시 함께 검증해 주세요.

🧹 Nitpick comments (1)
src/main/resources/schema.sql (1)

84-87: 날짜/시간 컬럼에 VARCHAR 사용에 대한 검토

start_date, end_datevarchar(10)으로, start_time, end_timevarchar(32)로 정의되어 있습니다. H2와 Oracle 모두 DATE, TIME, TIMESTAMP 타입을 지원하므로, 문자열 대신 네이티브 타입 사용을 고려해 보세요.

VARCHAR 사용 시 고려사항:

  • 데이터베이스 레벨에서 날짜/시간 유효성 검증 불가
  • 날짜 비교 연산 시 문자열 정렬 문제 발생 가능
  • varchar(32)는 시간 표현에 과도하게 큼 (HH:MM:SS는 8자)

애플리케이션 레벨에서 의도적으로 문자열 처리를 하는 것이라면 현재 구현도 괜찮습니다.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b1b0d29 and d09e1f1.

📒 Files selected for processing (7)
  • src/main/kotlin/co/yappuworld/operation/client/application/GenerationActiveStateManager.kt
  • src/main/kotlin/co/yappuworld/operation/infrastructure/GenerationFindService.kt
  • src/main/kotlin/co/yappuworld/operation/infrastructure/GenerationRepository.kt
  • src/main/resources/application-local.yaml
  • src/main/resources/application-test.yaml
  • src/main/resources/schema.sql
  • src/test/kotlin/co/yappuworld/operation/client/application/GenerationActiveStateManagerTest.kt
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/main/resources/application-local.yaml
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (9)
src/main/resources/application-test.yaml (1)

6-13: Docker Compose 비활성화 및 H2 설정 확인

H2 인메모리 데이터베이스로 전환하면서 Docker Compose를 비활성화한 것은 적절합니다. MODE=OracleDATABASE_TO_LOWER=TRUE 옵션으로 Oracle 호환성을 확보한 설정이 잘 되어 있습니다.

src/main/kotlin/co/yappuworld/operation/infrastructure/GenerationRepository.kt (1)

7-9: LGTM!

KotlinJdslJpqlExecutor 확장을 통해 JDSL 기반 타입 안전 쿼리가 가능해졌습니다. H2 호환성을 위한 적절한 접근 방식입니다.

src/main/kotlin/co/yappuworld/operation/infrastructure/GenerationFindService.kt (1)

23-29: LGTM!

limit = 1intLiteral(1)을 사용한 존재 여부 확인은 효율적인 패턴입니다. 전체 데이터를 로드하지 않고 빠르게 확인할 수 있습니다.

src/main/kotlin/co/yappuworld/operation/client/application/GenerationActiveStateManager.kt (2)

17-19: LGTM!

서비스 계층으로 활성 기수 조회 로직을 위임한 것은 적절한 리팩토링입니다. 관심사 분리가 잘 되어 있습니다.


43-54: 로직 흐름 적절함

existsActiveGeneration() 조기 반환으로 빈 리스트 시나리오를 방지하고, checkDeactivatingConsistency()에서 복수 활성 기수를 검증한 후 .single()을 호출하는 흐름이 안전합니다.

src/test/kotlin/co/yappuworld/operation/client/application/GenerationActiveStateManagerTest.kt (1)

21-22: LGTM!

GenerationFindService를 수동으로 생성하여 주입하는 방식은 테스트에서 의존성을 명시적으로 제어할 수 있어 적절합니다. 새로운 생성자 시그니처와 일치하게 잘 업데이트되었습니다.

src/main/resources/schema.sql (3)

115-117: generations 테이블도 동일한 VARCHAR 날짜 패턴 사용

schedules 테이블과 동일하게 start_date, end_datevarchar(10)으로 정의되어 있습니다. 일관성 측면에서는 좋으나, 위에서 언급한 타입 안전성 고려사항이 동일하게 적용됩니다.


5-6: TIMESTAMP 및 NUMBER(1) 타입 변환 승인

전체 스키마에 걸쳐 일관되게 적용된 타입 변환이 잘 되어 있습니다:

  • datetime(6)TIMESTAMP: H2와 Oracle 모두 호환
  • tinyint(1)NUMBER(1): Oracle 스타일이지만 H2도 지원

H2 테스트 환경과 Oracle 운영 환경 간의 호환성을 유지하면서 일관된 스키마 정의가 되었습니다.

Also applies to: 16-17, 24-24, 31-32, 43-44, 54-58


34-34: JSON 타입이 현재 환경에서 완벽하게 지원됩니다.

H2 2.1.214 및 Oracle 23.5.0.24.07 모두 JSON 타입을 완벽하게 지원합니다. H2는 Oracle 호환 모드(MODE=Oracle)로 구성되어 있어 로컬/테스트 환경에서도 JSON 타입이 정상 작동합니다.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

@devmizz devmizz merged commit 66d87e1 into dev Jan 16, 2026
2 checks passed
@devmizz devmizz deleted the infra/ci branch January 16, 2026 16:31
devmizz added a commit that referenced this pull request Jan 25, 2026
* infra: h2 기반으로 ci 환경 구축

* infra: 테스트 스택트레이스 추가

* test: 테스트 수정
@coderabbitai coderabbitai bot mentioned this pull request Jan 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants