MVC 패턴 기반의 스마트폰 전문 쇼핑몰. 회계 실무의 월초·분기초·연초 개념을 그대로 코드로 옮긴 매출 집계 시스템이 핵심이며, 관리자 기능과 리뷰·문의 페이지를 단독으로 구현했습니다.
JSP/Servlet 기반의 전통적 MVC 구조로, Spring을 도입하지 않은 상태에서 요청 처리·비즈니스 로직·뷰 렌더링의 책임 분리를 직접 구현하며 웹 애플리케이션의 기반 원리를 익혔습니다.
4인 팀에서 관리자 영역 전체(상품등록 제외)와 리뷰·문의 페이지를 단독으로 설계·구현했습니다. 특히 회계 도메인을 가장 직접적으로 코드에 옮긴 매출 집계 모듈이 핵심 작업입니다.
"회계에서 익숙하던 기간 개념을 그대로 코드로 옮겼습니다."
6년간 회계 실무에서 기간 단위로 매출과 비용을 들여다보는 일이 일상이었습니다. "이번 달 매출은 얼마인지", "분기 누적은", "연초부터 지금까지는" 같은 질문들을 매일 다뤘습니다.
ShopMall의 매출 집계 화면을 만들 때, 이 익숙한 기간 개념을 그대로
DateRange
enum으로 옮겼습니다. 사용자가 "이번 달까지", "이번 분기까지"를
한 번의 클릭으로 선택할 수 있도록 설계했습니다.
집계 자체는 Oracle WITH절 CTE로 구현했습니다. 주문 건수, 판매 수량, 할인 전·후 매출을 한 번의 쿼리로 산출해 중복 조회를 제거하고, 3개월 이상 조회 시에는 일별 → 월별로 자동 전환되도록 했습니다.
DateRange enum과 WITH절 CTE의 핵심 부분을 발췌했습니다.
// AccountingDataController.java public enum DateRange { TODAY, YESTERDAY, THIS_WEEK, LAST_WEEK, // 회계 실무 핵심 개념 MTD, // 월초~오늘 QTD, // 분기초~오늘 YTD, // 연초~오늘 LAST_MONTH, LAST_QUARTER, LAST_YEAR, CUSTOM; }
-- AccountingDAO.xml · WITH 절 CTE WITH base AS ( SELECT order_date, qty, price, discount FROM tbl_order_item WHERE order_date BETWEEN #{from} AND #{to} ), daily AS ( SELECT TRUNC(order_date) AS d, COUNT(*) AS orders, SUM(qty) AS qty, SUM(price) AS gross, SUM(price - discount) AS net FROM base GROUP BY TRUNC(order_date) ) SELECT * FROM daily ORDER BY d;
gross) / 할인 후(net)를 별도 컬럼으로 분리. 회계 실무에서 매출을 두 단계로 보는 방식 그대로TRUNC(date, 'MM')로 월별 집계 쿼리 전환 → 차트 데이터량 적정 유지Spring 같은 프레임워크 없이 MVC 패턴을 직접 구현해봤습니다. 이후 파이널 프로젝트에서 Spring Boot를 처음 접했을 때, 객체 생성과 의존성 연결을 직접 작성하던 부분이 어떻게 자동화되는지 자연스럽게 이해할 수 있었습니다.
회계에서 다루던 기간 개념을 그대로 코드로 옮겨본 작업이었습니다. 익숙한 도메인의 어휘가 실제 설계에 그대로 쓰일 수 있다는 것을 처음 경험해봤습니다.
WITH절 CTE, ROWNUM 페이징, 집계 함수를 활용한 매출 집계 쿼리를 직접 작성해보며 복잡한 SQL 작성에 익숙해졌습니다.
아래에서 더 자세히 확인하실 수 있습니다.