[데모]

관리자 · 전환 대장

구 시스템에서 새 시스템으로 옮기는 대장

구 시스템을 새 시스템으로 옮길 때 무엇을 어떤 순서로 옮기는지 정리하는 대장의 견본입니다. 기능·DB 객체·소스는 모두 이 데모를 위해 만든 가상 예시이며, 실제 대장은 받은 소스와 DB를 분석해 작성합니다.

실행 환경 · 지금 이 데모가 돌아가는 곳에서 읽은 값

Java
17.0.20.1 (Eclipse Adoptium)
Spring Boot
3.3.5
Thymeleaf
3.1.2.RELEASE
Flyway
10.10.0
OS
Ubuntu 26.04.1 LTS
DB
H2 2.2.224 (MySQL 호환 모드, 내장 · 재시작 시 초기화)

데모 DB는 내장 H2(MySQL 호환 모드)입니다. 실제 MySQL에 연결하지 않았습니다.


DB 객체 · 프로시저와 트리거 8개

  • 서비스로 이전 3
  • 유지 3
  • 폐기 2
이름하는 일결정이유
sp_GetBookList 프로시저
정의 보기 (실행하지 않는 텍스트)
CREATE PROCEDURE sp_GetBookList(IN p_site VARCHAR(10), IN p_keyword VARCHAR(100))
BEGIN
  SET @q = CONCAT('SELECT id, title, author_name FROM tb_book WHERE site = ''', p_site, '''');
  IF p_keyword <> '' THEN
    SET @q = CONCAT(@q, ' AND title LIKE ''%', p_keyword, '%''');
  END IF;
  PREPARE s FROM @q; EXECUTE s; DEALLOCATE PREPARE s;
END
사이트별 도서 목록과 제목 검색 서비스로 이전

CatalogService.search

검색 조건을 문자열로 이어 붙여 사이트마다 따로 돌던 쿼리입니다. 한 검색창에서 제목·작가·시리즈를 함께 찾도록 바뀌어 서비스 코드의 파라미터 쿼리로 옮깁니다.
sp_GetBookDetail 프로시저
정의 보기 (실행하지 않는 텍스트)
CREATE PROCEDURE sp_GetBookDetail(IN p_id INT)
BEGIN
  SELECT b.*, d.id AS data_id, d.title AS data_title
    FROM tb_book b LEFT JOIN tb_data d ON d.book_id = b.id
   WHERE b.id = p_id;
END
도서 상세와 자료 한 건 조회 서비스로 이전

CatalogService.book

작가가 글자 칸 하나이고 자료가 도서 한 권에만 붙는 구조를 전제로 한 결과 형식입니다. 작가·분류·자료가 여러 개로 연결되면서 조인 형태가 바뀌어 서비스로 옮깁니다.
sp_InsertData 프로시저
정의 보기 (실행하지 않는 텍스트)
CREATE PROCEDURE sp_InsertData(IN p_book INT, IN p_title VARCHAR(200), IN p_file VARCHAR(100))
BEGIN
  INSERT INTO tb_data (book_id, title, file_name, reg_date) VALUES (p_book, p_title, p_file, CURDATE());
END
자료 등록(도서 한 권에만 연결) 서비스로 이전

MaterialService.create

자료 하나를 여러 도서에 연결해야 하므로 등록과 연결을 나누어 서비스에서 처리합니다.
sp_CountDownload 프로시저
정의 보기 (실행하지 않는 텍스트)
CREATE PROCEDURE sp_CountDownload(IN p_from DATE, IN p_to DATE)
BEGIN
  SELECT data_id, COUNT(*) FROM tb_download_log WHERE log_date BETWEEN p_from AND p_to GROUP BY data_id;
END
기간별 자료 내려받기 수 집계 유지 월말 통계 작업에서만 부르는 집계입니다. 화면 로직과 얽혀 있지 않아 그대로 두고 새 앱에서 호출만 바꿉니다.
trg_tb_book_upd 트리거
정의 보기 (실행하지 않는 텍스트)
CREATE TRIGGER trg_tb_book_upd BEFORE UPDATE ON tb_book
FOR EACH ROW SET NEW.upd_date = NOW();
도서 수정 시각 자동 기록 유지 단순하고, 어느 경로로 수정해도 빠짐없이 남아야 하는 값이라 데이터베이스에 두는 편이 맞습니다.
trg_tb_data_log 트리거
정의 보기 (실행하지 않는 텍스트)
CREATE TRIGGER trg_tb_data_log AFTER UPDATE ON tb_data
FOR EACH ROW INSERT INTO tb_data_history (data_id, changed_at, old_title) VALUES (OLD.id, NOW(), OLD.title);
자료 변경 이력 기록 유지 변경 이력은 앱을 거치지 않은 수정까지 남겨야 하므로 데이터베이스에서 유지합니다.
sp_MainBanner_Rotate 프로시저
정의 보기 (실행하지 않는 텍스트)
CREATE PROCEDURE sp_MainBanner_Rotate()
BEGIN
  UPDATE tb_banner SET sort_no = FLOOR(RAND() * 100);
END
메인 배너 순서 무작위 교체 폐기 새 노출판에서 수동 고정과 자동 최신순으로 순서를 정하므로 더 이상 필요하지 않습니다.
sp_SyncTextbookSite 프로시저
정의 보기 (실행하지 않는 텍스트)
CREATE PROCEDURE sp_SyncTextbookSite()
BEGIN
  INSERT INTO trade_db.tb_book_copy SELECT * FROM edu_db.tb_book
  ON DUPLICATE KEY UPDATE title = VALUES(title);
END
두 사이트 도서 테이블 동기화 폐기 한 도메인, 한 데이터베이스로 합치면 사이트 사이의 복사 자체가 사라집니다.

스키마 변경 이력 · 실행 중인 DB에서 읽음

구 테이블은 지우지 않고 남긴 채 새 테이블을 더하고(V3), 구 칸의 값을 새 연결 테이블로 옮겨 담았습니다(V4).

버전설명적용 시각체크섬걸린 시간
V1 legacy baseline 2026-11-03 23:42:45 390851048 1 ms
V2 legacy seed 2026-11-03 23:42:45 -1563540433 1 ms
V3 unified schema 2026-11-03 23:42:45 -230313805 5 ms
V4 backfill nm 2026-11-03 23:42:45 -1909336604 6 ms
V5 seed unified 2026-11-03 23:42:45 38469511 3 ms

관계도가 화면보다 넓어 옆으로 밀어 전체를 봅니다.

tb_book 72행 tb_data 30행 tb_board 4행 book 72행 material 30행 board 4행 book_author 98행 book_category 126행 book_material 59행 legacy_id_map 72행 author 36행 category 18행 qr_url 50행 redirect_rule 10행
테이블 관계도 · 왼쪽 회색 점선은 남겨 둔 구 테이블, 점선 화살은 V4에서 옮겨 담은 길, 강조한 세 테이블은 도서와 작가·분류·자료를 여러 개씩 잇는 연결 테이블입니다. 행 수는 지금 DB에서 읽었습니다. 테이블에 마우스를 올리면 이어진 선과 테이블이 강조됩니다.

기능 목록 · 18개

  • 구 시스템 5
  • 전환 중 6
  • 신 시스템 7
구 기능옮겨 간 새 화면전환 단계상태
단행본 도서 검색 · 단행본 사이트 S1 통합 검색 1차 단행본 신 시스템
단행본 도서 상세 · 단행본 사이트 S2 도서 상세 1차 단행본 신 시스템
독서 교육 안내 페이지 · 단행본 사이트 S3 독서 교육 제안 1차 단행본 신 시스템
작가 소개 (도서마다 글로 기재) · 단행본 사이트 S4 작가·카테고리 1차 단행본 신 시스템
도서 등록·수정 · 단행본 사이트 S4 작가·카테고리 1차 단행본 신 시스템
메인 배너·노출 관리 · 단행본 사이트 S5 자료·노출 1차 단행본 신 시스템
단행본 구 주소 이동 · 단행본 사이트 S6 리다이렉트 1차 단행본 신 시스템
교과서·참고서 도서 검색 · 교과서·참고서 사이트 S1 통합 검색 2차 교과서·참고서 전환 중
교과서·참고서 상세 · 교과서·참고서 사이트 S2 도서 상세 2차 교과서·참고서 전환 중
자료 내려받기 · 교과서·참고서 사이트 S2 도서 상세 2차 교과서·참고서 전환 중
수업 자료실 목록 · 교과서·참고서 사이트 S3 독서 교육 제안 2차 교과서·참고서 전환 중
작가 목록 일괄 등록 · 교과서·참고서 사이트 S4 작가·카테고리 2차 교과서·참고서 전환 중
자료 등록 · 교과서·참고서 사이트 S5 자료·노출 2차 교과서·참고서 구 시스템
공지사항 게시판 · 교과서·참고서 사이트 S5 자료·노출 2차 교과서·참고서 구 시스템
활동 사진 게시판 · 교과서·참고서 사이트 S5 자료·노출 2차 교과서·참고서 구 시스템
서식 자료 게시판 · 교과서·참고서 사이트 S5 자료·노출 2차 교과서·참고서 구 시스템
교과서·참고서 구 주소 이동 · 교과서·참고서 사이트 S6 리다이렉트 2차 교과서·참고서 전환 중
지난 이벤트 페이지 · 교과서·참고서 사이트 S6 리다이렉트 2차 교과서·참고서 구 시스템

컨트롤러 대응 견본 · 도서 상세

같은 일을 하는 구 C# MVC 액션과 새 Spring 컨트롤러를 줄 단위로 맞대어 봅니다. 두 코드 모두 이 데모를 위해 만든 견본입니다.

C# (구)

public ActionResult Detail(int id)

Spring (새)

@GetMapping("/books/{id}")
public String book(@PathVariable int id, Model model)

주소 모양이 바뀌므로 구 주소는 리다이렉트 맵이 새 주소로 보냅니다.

C# (구)

var book = db.Books.Find(id);
if (book == null) return HttpNotFound();

Spring (새)

BookDetail d = catalog.detail(id);
if (d == null) throw new ResponseStatusException(NOT_FOUND);

조회는 서비스로 옮기고, SQL은 JdbcTemplate에 그대로 보이게 둡니다.

C# (구)

ViewBag.Authors = book.AuthorName.Split(',');

Spring (새)

// d.authors(): book_author 연결 테이블에서 순서대로
model.addAttribute("d", d);

쉼표로 이어 쓴 작가 칸 대신 연결 테이블에서 역할과 순서를 읽습니다.

C# (구)

return View(book);

Spring (새)

return "book";   // templates/book.html (Thymeleaf)

Razor 뷰는 Thymeleaf 템플릿으로 다시 씁니다.