Files
GW-renewal/MIGRATION_GUIDE.md
JAE SIK CHO f8427ee1d0 share job
2026-04-09 11:12:12 +09:00

9.0 KiB

그룹웨어 마이그레이션 가이드

현행 시스템 → Spring Boot + Next.js 전환


현행 시스템 개요

항목 내용
프레임워크 Grails 2.5.0
언어 Groovy / Java
ORM MyBatis (SQL XML 방식)
DB Oracle (JNDI: java:comp/env/loginsDS)
빌드 Maven
GSP + Daum Editor
버전관리 SVN

현행 주요 모듈

모듈 설명
board 게시판
tam 결재 관리
wplan 근무 계획
wtime 근무 시간 관리
envset 환경 설정 / 사용자 관리
fedex 배송 연동
common 공통 (인증, 코드, 첨부파일, 보안)

신규 기술 스택 (회사 표준)

계층 기술 버전
OS Ubuntu 24.04 LTS
Web/Proxy Nginx 1.26.x Stable
Frontend Next.js 15.x (React 19 기반)
Runtime Node.js 22 LTS
패키지 관리 pnpm 최신
API Gateway Spring Cloud Gateway 4.x (Spring Boot 3.x 기반)
Backend Spring Boot 3.4.x
JDK OpenJDK 21 LTS
빌드 도구 Gradle 8.x
DB (신규 표준) MariaDB 11.4 LTS
DB (현재 유지) Oracle 기존 그대로 유지
Cache Redis 7.x
MQ RabbitMQ 3.13.x
컨테이너 Docker / Docker Compose 최신 Stable
형상관리 GitHub -
CI/CD Jenkins LTS

신규 아키텍처

[Nginx]
   │
[Next.js 15.x]  ──→  [Spring Cloud Gateway 4.x]  ──→  [Spring Boot 3.4.x]
                                                              │
                                                        [Redis Cache]
                                                              │
                                                        [Oracle DB] ← 현재
                                                        [MariaDB]   ← 추후 전환

폴더 구조

NEW/
  backend/    ← Spring Boot 3.4.x 프로젝트 (Gradle)
  frontend/   ← Next.js 15.x 프로젝트 (pnpm)
  MIGRATION_GUIDE.md

DB 전환 전략

단계별 계획

1단계 (현재): Oracle 유지하며 신규 시스템 개발
2단계 (추후): 신규 시스템 안정화 및 검증 완료 후 MariaDB 마이그레이션

SQL 이중화 전략 (MyBatis databaseId 활용)

기존 Oracle SQL XML을 그대로 사용하면서, MariaDB 문법 버전을 병행 작성. 전환 시 application.yml의 databaseId 설정만 변경하면 즉시 교체 가능.

<!-- Oracle 전용 쿼리 -->
<select id="selectList" databaseId="oracle">
  SELECT * FROM (
    SELECT ROWNUM AS rn, t.* FROM board t WHERE ROWNUM <= #{endRow}
  ) WHERE rn > #{startRow}
</select>

<!-- MariaDB 전용 쿼리 (추후 전환용) -->
<select id="selectList" databaseId="mariadb">
  SELECT * FROM board
  LIMIT #{size} OFFSET #{offset}
</select>

Oracle → MariaDB 주요 변환 포인트

항목 Oracle MariaDB
페이징 ROWNUM LIMIT / OFFSET
시퀀스 sequence.NEXTVAL AUTO_INCREMENT
날짜 함수 SYSDATE, TO_DATE NOW(), STR_TO_DATE
문자열 연결 `
NVL NVL() IFNULL() / COALESCE()
DECODE DECODE() CASE WHEN
가상 테이블 FROM DUAL FROM DUAL (지원) 또는 생략

Phase 1. 분석 및 설계

1-1. 현행 파악 체크리스트

  • 각 컨트롤러의 URL 매핑 목록화 (UrlMappings.groovy + 각 컨트롤러)
  • 세션/인증 방식 파악 (SecurityFilter, AuthService)
  • 공통 유틸 파악 (CommonUtil, ReqUtil, FormatUtil 등)
  • SQL XML의 쿼리별 입출력 파라미터 파악
  • 파일 첨부 저장 방식 파악 (AttachService)
  • 메뉴/권한 구조 파악 (MenuService, SecurityService)

1-2. 인증 구조 전환 설계

기존: 세션 기반 (SecurityFilter.groovy)
신규: JWT 기반
  - POST /api/auth/login → JWT 발급
  - 모든 요청 헤더: Authorization: Bearer {token}
  - Spring Security Filter Chain 구성
  - Redis를 활용한 토큰 블랙리스트/Refresh Token 관리

Phase 2. Spring Boot 백엔드 구성

2-1. 주요 의존성 (build.gradle)

dependencies {
    // Web
    implementation 'org.springframework.boot:spring-boot-starter-web'

    // Security & JWT
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'io.jsonwebtoken:jjwt-api:0.12.x'

    // MyBatis
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.x'

    // Oracle JDBC
    implementation 'com.oracle.database.jdbc:ojdbc11'

    // MariaDB JDBC (추후 전환용)
    runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'

    // Redis
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'

    // Validation
    implementation 'org.springframework.boot:spring-boot-starter-validation'

    // Lombok
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'

    // Excel (Apache POI)
    implementation 'org.apache.poi:poi-ooxml:5.x'
}

2-2. MyBatis 마이그레이션 (기존 SQL XML 재사용)

기존 src/java/sql/ 의 XML 파일을 Spring Boot 프로젝트로 복사 후 경미한 수정만 필요.

작업 내용
Mapper XML 이동 src/main/resources/mapper/ 로 복사
Mapper Interface 생성 XML의 각 쿼리 ID에 대응하는 Java Interface 작성
VO/DTO 클래스 Groovy VO → Java POJO (Lombok 활용)
SqlSessionFactory MyBatis Spring Boot Starter 자동 설정
databaseId 설정 Oracle/MariaDB 구분을 위한 DatabaseIdProvider 등록

2-3. 모듈별 변환 순서

1. common  → 인증(JWT + Redis), 코드, 공통 유틸
2. envset  → 사용자/권한/메뉴 관리
3. board   → 게시판 (전형적인 CRUD로 패턴 확립)
4. tam     → 결재 워크플로우
5. wplan   → 근무 계획
6. wtime   → 근무 시간
7. fedex   → 외부 연동

2-4. API 응답 공통 형식

{
  "success": true,
  "data": { ... },
  "message": "",
  "pagination": {
    "page": 1,
    "size": 20,
    "total": 100
  }
}

Phase 3. Next.js 프론트엔드 구성

3-1. 주요 의존성

- Next.js 15.x (App Router, React 19)
- TypeScript
- Tailwind CSS
- shadcn/ui (UI 컴포넌트)
- TanStack Query v5 (서버 상태 관리)
- Zustand (클라이언트 상태 관리)
- react-hook-form + zod (폼 검증)
- axios (API 호출)
- Toast UI Editor 또는 Tiptap (WYSIWYG - Daum Editor 대체)

3-2. 페이지 구조

/app
  /login
  /(main)
    /dashboard
    /board/[boardType]
    /tam              ← 결재
    /wplan            ← 근무계획
    /wtime            ← 근무시간
    /envset           ← 환경설정
      /users
      /codes
      /menus

3-3. GSP → Next.js 화면 변환

Daum Editor       → Toast UI Editor 또는 Tiptap
GSP 페이징 태그   → 커스텀 Pagination 컴포넌트
GSP 공통 레이아웃 → app/layout.tsx
세션 체크         → JWT 기반 Next.js Middleware

Phase 4. 인프라 구성 (Docker)

docker-compose.yml 구성 예시

services:
  nginx:
    image: nginx:1.26
  frontend:
    build: ./frontend   # Next.js
  gateway:
    build: ./gateway    # Spring Cloud Gateway
  backend:
    build: ./backend    # Spring Boot
  redis:
    image: redis:7
  rabbitmq:
    image: rabbitmq:3.13-management

Phase 5. 통합 및 검증

5-1. 모듈별 검증 체크리스트

  • 기존 SQL 결과와 신규 API 응답값 동일 여부 확인
  • 페이징, 검색 조건 동작 확인
  • 파일 첨부/다운로드 동작 확인
  • 결재 워크플로우 흐름 검증
  • 권한/메뉴 제어 동작 확인
  • Excel 다운로드 동작 확인

5-2. 병행 운영 전략

1단계: 기존 Grails 운영 유지
2단계: 신규 시스템 완성 모듈부터 부분 교체
3단계: 전체 전환 후 기존 시스템 종료
4단계: DB를 Oracle → MariaDB 마이그레이션

작업량 예상

영역 난이도 이유
MyBatis SQL 재사용 낮음 XML 거의 그대로 사용 가능
SQL 이중화 (Oracle+MariaDB) 중간 databaseId로 병행 관리
Spring Boot API 변환 중간 서비스 로직 Groovy → Java 변환
JWT + Redis 인증 중간 세션 → Stateless 구조 변경
결재(tam) 로직 높음 워크플로우 복잡도
Next.js 화면 재작성 높음 전체 UI 새로 작성 필요
파일 첨부 처리 중간 저장 경로/방식 재설계 필요
Docker 인프라 구성 중간 서비스별 컨테이너화

진행 현황

  • NEW 폴더 및 하위 구조 생성
  • 마이그레이션 가이드 문서 작성 (기술 스택 확정)
  • Spring Boot 백엔드 프로젝트 초기 세팅
  • Next.js 프론트엔드 프로젝트 초기 세팅
  • Phase 1: 현행 분석
  • Phase 2: 백엔드 구축
  • Phase 3: 프론트엔드 구축
  • Phase 4: 인프라(Docker) 구성
  • Phase 5: 통합 및 검증
  • DB 마이그레이션 (Oracle → MariaDB)