그룹웨어 마이그레이션 작업 목록
범례: ✅ 완료 | 🔄 진행중 | ⬜ 미착수
원칙: 각 모듈은 백엔드(SQL → Mapper → Service → Controller) → 프론트엔드(API → Types → Page) 순서로 진행
0. 프로젝트 기반 구성
| # |
작업 |
상태 |
비고 |
| 0-1 |
NEW 폴더 구조 생성 |
✅ |
backend/, frontend/ |
| 0-2 |
MIGRATION_GUIDE.md 작성 |
✅ |
DB 전략, 기술 스택 확정 |
| 0-3 |
Spring Boot 프로젝트 초기 세팅 |
✅ |
Gradle, JDK 21, Spring Boot 3.4.x |
| 0-4 |
Next.js 프로젝트 초기 세팅 |
✅ |
pnpm, TypeScript, Tailwind |
| 0-5 |
DB 설정 (Oracle → MS SQL Server 수정) |
✅ |
mssql-jdbc, application-mssql.yml |
| 0-6 |
docker-compose.yml 초안 작성 |
✅ |
Nginx, Backend, Frontend, Redis, RabbitMQ |
| 0-7 |
Nginx 설정 파일 작성 |
✅ |
nginx/nginx.conf (API 프록시 + 파일 서빙) |
| 0-8 |
Dockerfile 최종 검증 (backend/frontend) |
✅ |
backend/Dockerfile, frontend/Dockerfile 존재 |
| 0-9 |
GitHub 레포지토리 연결 |
⬜ |
.gitignore, 초기 커밋 |
| 0-10 |
Jenkins CI/CD 파이프라인 작성 |
✅ |
Jenkinsfile (parallel build + deploy) |
1. 공통 기반 (Common)
1-1. 백엔드 공통
| # |
작업 |
상태 |
대상 파일 (원본) |
| 1-1-1 |
JWT 유틸 (corpNo 포함) |
✅ |
JwtUtil.java |
| 1-1-2 |
JWT 인증 필터 |
✅ |
JwtAuthenticationFilter.java |
| 1-1-3 |
Spring Security 설정 |
✅ |
SecurityConfig.java |
| 1-1-4 |
Redis 설정 |
✅ |
RedisConfig.java |
| 1-1-5 |
MyBatis 설정 (DatabaseId 포함) |
✅ |
MyBatisConfig.java |
| 1-1-6 |
공통 응답 포맷 (ApiResponse) |
✅ |
ApiResponse.java |
| 1-1-7 |
공통 예외 처리 |
✅ |
GlobalExceptionHandler.java, BizException.java |
| 1-1-8 |
CurrentUser 유틸 + SecurityUtil |
✅ |
CurrentUser.java, SecurityUtil.java |
| 1-1-9 |
시퀀스 서비스 |
✅ |
SequenceService.java (SX_CO0060) |
| 1-1-10 |
파일 첨부 서비스 |
✅ |
AttachService.java, AttachController.java |
| 1-1-11 |
코드 조회 서비스 (공통코드 캐시) |
✅ |
CodeService.java (@Cacheable Redis, TTL 6h) |
| 1-1-12 |
이메일 서비스 |
⬜ |
EmailService.groovy → EmailService.java |
| 1-1-13 |
공통 SQL XML 이식 |
✅ |
common_sql.xml (시퀀스) |
| 1-1-14 |
attach SQL XML 이식 |
✅ |
attach_sql.xml (MSSQL + MariaDB) |
| 1-1-15 |
code SQL XML 이식 |
✅ |
code_sql.xml (getCodeList, searchUser, getWorkCdList) |
1-2. 프론트엔드 공통
| # |
작업 |
상태 |
비고 |
| 1-2-1 |
Axios 클라이언트 + 401 자동 갱신 |
✅ |
lib/api/client.ts |
| 1-2-2 |
Zustand 인증 스토어 |
✅ |
lib/store/authStore.ts |
| 1-2-3 |
TanStack Query Provider |
✅ |
components/common/Providers.tsx |
| 1-2-4 |
JWT 미들웨어 (라우트 보호) |
✅ |
middleware.ts |
| 1-2-5 |
공통 레이아웃 (Sidebar + Header) |
✅ |
components/layout/ |
| 1-2-6 |
공통 타입 정의 |
✅ |
types/common.ts, types/auth.ts |
| 1-2-7 |
공통 UI 컴포넌트 (Modal, Pagination, Table) |
✅ |
Modal.tsx, Pagination.tsx 완성 |
| 1-2-8 |
파일 첨부 컴포넌트 |
✅ |
components/common/FileUpload.tsx |
| 1-2-9 |
Toast 알림 컴포넌트 |
✅ |
Toast.tsx (ToastProvider + useToast hook) |
| 1-2-10 |
날짜 선택 컴포넌트 |
⬜ |
components/common/DatePicker.tsx |
2. 인증 (Auth / Index)
원본: IndexController, SecurityFilter, AuthService, SecurityService, UserService
2-1. 백엔드
| # |
작업 |
상태 |
비고 |
| 2-1-1 |
user_sql.xml 이식 |
✅ |
getUserInfo, getUserInfoWithPwd |
| 2-1-2 |
security_sql.xml 이식 |
✅ |
getUserRoleList |
| 2-1-3 |
menu_sql.xml 이식 |
✅ |
getMenuList, getControllerRoleList |
| 2-1-4 |
UserMapper / SecurityMapper / MenuMapper |
✅ |
|
| 2-1-5 |
PasswordUtil (SHA-256 + Base64) |
✅ |
기존 DB 비밀번호 호환 |
| 2-1-6 |
AuthService (로그인/로그아웃/토큰재발급) |
✅ |
Redis RefreshToken |
| 2-1-7 |
CustomUserDetailsService |
✅ |
|
| 2-1-8 |
AuthController (login/logout/refresh/me) |
✅ |
|
2-2. 프론트엔드
| # |
작업 |
상태 |
비고 |
| 2-2-1 |
authApi (login/logout/refresh) |
✅ |
lib/api/auth.ts |
| 2-2-2 |
로그인 페이지 + LoginForm |
✅ |
app/login/page.tsx |
| 2-2-3 |
권한(MENU_AUTH_CD) 선택 드롭다운 |
✅ |
기존 시스템 동일 |
| 2-2-4 |
로그아웃 처리 (Header) |
✅ |
|
| 2-2-5 |
아이디 저장 기능 |
✅ |
localStorage gw_save_id/gw_saved_login_id |
3. 환경설정 (Envset)
3-1. 직원정보 (Envset0010 / SX_GW0010)
| # |
작업 |
상태 |
비고 |
| 3-1-1 |
envset0010_sql.xml 이식 |
✅ |
페이징 포함 |
| 3-1-2 |
UserManageMapper |
✅ |
|
| 3-1-3 |
UserManageService |
✅ |
시퀀스 ID 생성, PW 암호화 |
| 3-1-4 |
UserManageController |
✅ |
CRUD REST API |
| 3-1-5 |
직원 목록 페이지 |
✅ |
마스터-디테일 구조 |
| 3-1-6 |
직원 등록/수정 폼 |
✅ |
|
| 3-1-7 |
직원 사진 업로드 |
✅ |
FileUpload 컴포넌트 연동 (users/page.tsx) |
| 3-1-8 |
근무코드 관리 (Envset0040, SX_CO0070) |
✅ |
envset0040_sql.xml + WorkCdMapper/Service/Controller + workcd/page.tsx |
3-2. 공통코드 관리 (Envset0020/0030 / SX_CO0030, SX_CO0040)
| # |
작업 |
상태 |
비고 |
| 3-2-1 |
envset0020_sql.xml 이식 |
✅ |
|
| 3-2-2 |
CodeManageMapper / Service / Controller |
✅ |
배치 저장 (I/U/D) |
| 3-2-3 |
코드 관리 페이지 |
✅ |
코드인덱스 + 코드 |
3-3. 메뉴/권한 관리 (Envset0050 / SX_CO0080, SX_CO0090, SX_GW0130)
| # |
작업 |
상태 |
비고 |
| 3-3-1 |
envset0050_sql.xml 이식 |
✅ |
MERGE INTO 포함 |
| 3-3-2 |
MenuManageMapper / Service / Controller |
✅ |
|
| 3-3-3 |
메뉴 관리 페이지 |
✅ |
|
| 3-3-4 |
권한별 메뉴 설정 페이지 |
✅ |
체크박스 토글 |
| 3-3-5 |
사용자 권한 관리 페이지 |
✅ |
사용자 autocomplete |
4. 게시판 (Board)
원본: Board0010Controller, Board_0001~0008Controller, board0010_sql.xml
8개 게시판 유형을 하나의 Controller로 통합 (boardType 파라미터로 구분)
4-1. 백엔드
| # |
작업 |
상태 |
비고 |
| 4-1-1 |
board0010_sql.xml 분석 및 이식 |
✅ |
MSSQL + MariaDB 이중 작성 |
| 4-1-2 |
BoardMapper 인터페이스 |
✅ |
|
| 4-1-3 |
BoardService |
✅ |
목록/상세/등록/수정/삭제/조회수/댓글 |
| 4-1-4 |
BoardController |
✅ |
/api/board/{boardType} REST |
| 4-1-5 |
파일 첨부 연동 |
✅ |
AttachService 연동 완료 |
4-2. 프론트엔드
| # |
작업 |
상태 |
비고 |
| 4-2-1 |
boardApi 정의 |
✅ |
lib/api/board.ts |
| 4-2-2 |
게시판 목록 페이지 |
✅ |
app/(main)/board/[boardType]/page.tsx |
| 4-2-3 |
게시물 상세 페이지 |
✅ |
댓글 포함 |
| 4-2-4 |
게시물 등록/수정 페이지 |
✅ |
PostForm 컴포넌트 |
| 4-2-5 |
파일 첨부 UI |
✅ |
FileUpload 컴포넌트 연동 |
5. 결재 (TAM)
원본: Tam0010~0040Controller, tam0010~0040_sql.xml, ApvdocService, apvdoc_sql.xml
가장 복잡한 모듈 - 워크플로우 로직 포함
5-1. 백엔드
| # |
작업 |
상태 |
비고 |
| 5-1-1 |
tam_sql.xml 분석 및 이식 (0010~0040 통합) |
✅ |
MSSQL + MariaDB 이중 작성 |
| 5-1-2 |
apvdoc_sql.xml 분석 및 이식 |
✅ |
결재 문서 공통, DECLARE @var → subquery |
| 5-1-3 |
TamMapper / ApvdocMapper |
✅ |
|
| 5-1-4 |
ApvdocService (워크플로우 로직) |
✅ |
결재선, 승인/반려, 상태 변경 |
| 5-1-5 |
TamService |
✅ |
TAM0010~0040 서비스 |
| 5-1-6 |
TamController |
✅ |
/api/tam/ REST |
5-2. 프론트엔드
| # |
작업 |
상태 |
비고 |
| 5-2-1 |
tamApi 정의 |
✅ |
lib/api/tam.ts |
| 5-2-2 |
연차 관리 페이지 (TAM0010) |
✅ |
인라인 편집 |
| 5-2-3 |
결재 신청 목록 페이지 (TAM0020) |
✅ |
상태/종류 필터 |
| 5-2-4 |
결재 신청 등록/상세 페이지 |
✅ |
ApvreqForm + ApproverSection 컴포넌트 |
| 5-2-5 |
결재 처리 목록/상세 페이지 (TAM0030) |
✅ |
승인/반려 처리 |
| 5-2-6 |
근태 현황 페이지 (TAM0040) |
✅ |
종류별 집계 |
6. 근무계획 (Wplan)
원본: Wplan0010~0030Controller, wplan0010~0030_sql.xml
6-1. 백엔드
| # |
작업 |
상태 |
비고 |
| 6-1-1 |
wplan_sql.xml 분석 및 이식 (0010~0030 통합) |
✅ |
MSSQL + MariaDB 이중 작성 |
| 6-1-2 |
WplanMapper / Service / Controller |
✅ |
/api/wplan/ |
6-2. 프론트엔드
| # |
작업 |
상태 |
비고 |
| 6-2-1 |
wplanApi 정의 |
✅ |
lib/api/wplan.ts |
| 6-2-2 |
근무계획 관리 페이지 (Wplan0010) |
✅ |
월별 피벗 테이블 + 인라인 편집 |
| 6-2-3 |
나의근무계획 페이지 (Wplan0020) |
✅ |
월 달력 뷰 |
| 6-2-4 |
전체근무계획 페이지 (Wplan0030) |
✅ |
근무코드 필터 |
7. 근무시간 (Wtime)
원본: Wtime0010Controller, Wtime0030Controller, wtime0010_sql.xml, wtime0030_sql.xml, work_sql.xml
7-1. 백엔드
| # |
작업 |
상태 |
비고 |
| 7-1-1 |
wtime_sql.xml 분석 및 이식 (0010+0030 통합) |
✅ |
MSSQL + MariaDB 이중 작성 |
| 7-1-2 |
WtimeMapper / Service / Controller |
✅ |
/api/wtime/ |
| 7-1-3 |
WorkService (근무시간 재계산 로직) |
⬜ |
추후 필요 시 추가 |
7-2. 프론트엔드
| # |
작업 |
상태 |
비고 |
| 7-2-1 |
wtimeApi 정의 |
✅ |
lib/api/wtime.ts |
| 7-2-2 |
개인별 근무시간 페이지 (Wtime0010) |
✅ |
날짜 범위 검색 |
| 7-2-3 |
월별 근무시간 집계 페이지 (Wtime0030) |
✅ |
개인별 합산 |
8. FedEx 배송 (Fedex)
원본: Fedex0010Controller, fedex0010_sql.xml
8-1. 백엔드
| # |
작업 |
상태 |
비고 |
| 8-1-1 |
fedex0010_sql.xml 분석 및 이식 |
✅ |
MSSQL + MariaDB, errorMng 테이블 |
| 8-1-2 |
FedexMapper / Service / Controller |
✅ |
/api/fedex/ |
8-2. 프론트엔드
| # |
작업 |
상태 |
비고 |
| 8-2-1 |
fedexApi 정의 |
✅ |
lib/api/fedex.ts |
| 8-2-2 |
FedEx 수입정정 목록 페이지 |
✅ |
fedex/0010/page.tsx |
| 8-2-3 |
FedEx 수입정정 등록/상세 페이지 |
✅ |
write + [sq] 페이지 |
9. 메인/대시보드 (Main)
원본: Main0010Controller, Main0020Controller, main0010_sql.xml, main0020_sql.xml
9-1. 백엔드
| # |
작업 |
상태 |
비고 |
| 9-1-1 |
main0010_sql.xml 분석 및 이식 |
✅ |
main_sql.xml (직접 SQL, stored proc 불사용) |
| 9-1-2 |
main0020_sql.xml 분석 및 이식 |
✅ |
main_sql.xml 통합 |
| 9-1-3 |
MainMapper / Service / Controller |
✅ |
/api/main/dashboard |
9-2. 프론트엔드
| # |
작업 |
상태 |
비고 |
| 9-2-1 |
mainApi 정의 |
✅ |
lib/api/main.ts |
| 9-2-2 |
대시보드 페이지 |
✅ |
결재 대기 배너, 공지/게시판/근무 위젯 |
| 9-2-3 |
메인 레이아웃 완성 |
✅ |
Sidebar 동적 메뉴 |
10. 공통 기능 (파일첨부 / 이메일)
10-1. 파일 첨부 (AttachService)
원본: AttachController, AttachService, attach_sql.xml
모든 모듈(게시판, 결재, 직원사진)에서 사용
| # |
작업 |
상태 |
비고 |
| 10-1-1 |
attach_sql.xml 분석 및 이식 |
✅ |
attach_sql.xml (MSSQL + MariaDB) |
| 10-1-2 |
AttachMapper |
✅ |
AttachMapper.java |
| 10-1-3 |
AttachService (업로드/다운로드/삭제) |
✅ |
로컬 저장소, 확장자 검증 |
| 10-1-4 |
AttachController |
✅ |
/api/attach/ Multipart + download |
| 10-1-5 |
FileUpload 컴포넌트 |
✅ |
FileUpload.tsx (드래그앤드롭) |
| 10-1-6 |
파일 다운로드 처리 |
✅ |
Content-Disposition URLEncoder |
10-2. 이메일 서비스
| # |
작업 |
상태 |
비고 |
| 10-2-1 |
EmailService 이식 |
⬜ |
Spring Mail (SMTP) |
| 10-2-2 |
결재 알림 이메일 연동 |
⬜ |
TAM 모듈 완성 후 |
11. 인프라 및 배포
| # |
작업 |
상태 |
비고 |
| 11-1 |
Nginx 설정 (nginx.conf) |
✅ |
API 프록시 + 파일 서빙 |
| 11-2 |
docker-compose.yml 최종 완성 |
✅ |
env_file, healthcheck, volumes |
| 11-3 |
.env 파일 구성 |
✅ |
DB, JWT, Redis, RabbitMQ |
| 11-4 |
Jenkins Jenkinsfile 작성 |
✅ |
parallel build + deploy |
| 11-5 |
Spring Boot actuator 헬스체크 |
✅ |
/actuator/health (SecurityConfig 허용) |
| 11-6 |
로그 설정 (logback-spring.xml) |
✅ |
프로파일별 콘솔/파일 분리 |
12. DB 마이그레이션 준비 (SQL Server → MariaDB)
| # |
작업 |
상태 |
비고 |
| 12-1 |
전체 SQL XML MariaDB 버전 작성 |
✅ |
전체 17개 XML 파일 완료 |
| 12-2 |
GETDATE() → NOW() 변환 |
✅ |
모든 DML 문 MariaDB 버전에 반영 |
| 12-3 |
ISNULL() → IFNULL() 변환 |
✅ |
MariaDB databaseId 버전에 반영 |
| 12-4 |
MERGE INTO → INSERT ON DUPLICATE KEY |
✅ |
common_sql, envset0050_sql 반영 |
| 12-5 |
SELECT TOP N → LIMIT N 변환 |
✅ |
MariaDB 버전에 LIMIT 적용 |
| 12-6 |
OFFSET...FETCH NEXT → LIMIT...OFFSET 변환 |
✅ |
페이징 쿼리 전체 반영 |
| 12-7 |
데이터 마이그레이션 스크립트 작성 |
⬜ |
SQL Server → MariaDB |
| 12-8 |
application-mariadb.yml 완성 |
⬜ |
|
| 12-9 |
MariaDB 환경에서 전체 기능 검증 |
⬜ |
|
13. 검증 및 완료
| # |
작업 |
상태 |
비고 |
| 13-1 |
API 전체 목록 문서화 (Swagger) |
⬜ |
springdoc-openapi |
| 13-2 |
기존 시스템 대비 기능 동등성 검증 |
⬜ |
모듈별 체크리스트 |
| 13-3 |
성능 테스트 (페이징, 대용량 조회) |
⬜ |
|
| 13-4 |
보안 점검 (SQL Injection, XSS, CSRF) |
⬜ |
|
| 13-5 |
병행 운영 계획 수립 |
⬜ |
기존 Grails 유지 기간 결정 |
| 13-6 |
운영 전환 (Cut-over) |
⬜ |
|
진행 현황 요약
권장 다음 작업 순서
- 1-1-10 파일 첨부 서비스 → 게시판, 결재, 직원사진 모두 필요
- 4 게시판 → 가장 단순한 CRUD, 패턴 확립용
- 5 결재 → 핵심 업무 기능 (복잡도 높음)
- 6, 7 근무계획/근무시간
- 8 FedEx
- 9 대시보드
- 11 인프라
- 12 MariaDB 전환 준비