Home / Projects / ShopMall

ShopMall

○ Semi Project

MVC 패턴 기반의 스마트폰 전문 쇼핑몰. 회계 실무의 월초·분기초·연초 개념을 그대로 코드로 옮긴 매출 집계 시스템이 핵심이며, 관리자 기능과 리뷰·문의 페이지를 단독으로 구현했습니다.

Period 2025.11 — 2025.12 · 4주
Team 4인 팀 프로젝트
Role 관리자 파트 + 리뷰/문의
Type Semi Project · 쌍용교육센터
01 — Stack

기술 스택

JSP/Servlet 기반의 전통적 MVC 구조로, Spring을 도입하지 않은 상태에서 요청 처리·비즈니스 로직·뷰 렌더링의 책임 분리를 직접 구현하며 웹 애플리케이션의 기반 원리를 익혔습니다.

Backend
Java 17 JSP / Servlet MVC Pattern Apache Tomcat 10
Frontend
HTML5 CSS3 JavaScript jQuery AJAX
Database
Oracle 18c WITH (CTE) ROWNUM 페이징
Tools
Git / GitHub Eclipse
02 — Role

담당 기능 · 관리자 파트 전반

4인 팀에서 관리자 영역 전체(상품등록 제외)와 리뷰·문의 페이지를 단독으로 설계·구현했습니다. 특히 회계 도메인을 가장 직접적으로 코드에 옮긴 매출 집계 모듈이 핵심 작업입니다.

F-01
관리자 대시보드
실시간 통계 4종(주문수·매출·품절·가입) + 최근 주문 5건 + 품절 임박 + 오늘 가입 회원
F-02 ★
매출 집계 (회계)
11종 기간 프리셋 · WITH절 CTE 활용 일별/월별 집계 · MTD/QTD/YTD 대응
F-03
회원 관리
목록 · 상세 · 검색 · 가입자 통계
F-04
쿠폰 관리
쿠폰 등록 · 활성화/비활성화 · 회원별 발급
F-05
주문 / 배송 관리
주문 상태 변경 · 배송 정보 · 운송장 등록
F-06
리뷰 / 문의 페이지
사용자 CRUD + 관리자 답변 처리
Spotlight · 회계 도메인 응용

월초·분기초·연초.
회계 실무의 시간을
코드로 옮기다

"회계에서 익숙하던 기간 개념을 그대로 코드로 옮겼습니다."

6년간 회계 실무에서 기간 단위로 매출과 비용을 들여다보는 일이 일상이었습니다. "이번 달 매출은 얼마인지", "분기 누적은", "연초부터 지금까지는" 같은 질문들을 매일 다뤘습니다.

ShopMall의 매출 집계 화면을 만들 때, 이 익숙한 기간 개념을 그대로 DateRange enum으로 옮겼습니다. 사용자가 "이번 달까지", "이번 분기까지"를 한 번의 클릭으로 선택할 수 있도록 설계했습니다.

집계 자체는 Oracle WITH절 CTE로 구현했습니다. 주문 건수, 판매 수량, 할인 전·후 매출을 한 번의 쿼리로 산출해 중복 조회를 제거하고, 3개월 이상 조회 시에는 일별 → 월별로 자동 전환되도록 했습니다.

04 — Code

매출 집계 구현 코드

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;
}
  • 기간 프리셋 — 관리자가 자주 조회하는 기간 단위를 enum으로 정의
  • MTD / QTD / YTD — 회계 실무에서 다루던 월초·분기초·연초 누계 개념을 그대로 옮긴 항목
  • 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;
  • WITH 절 CTE — base / daily 두 단계로 쿼리를 정리해 가독성 확보
  • 한 번에 집계 — 주문건수, 수량, 매출(gross), 순매출(net)을 단일 쿼리로 산출. 같은 데이터를 여러 번 조회하는 비효율 제거
  • 총매출 / 순매출 분리 — 할인 전(gross) / 할인 후(net)를 별도 컬럼으로 분리. 회계 실무에서 매출을 두 단계로 보는 방식 그대로
  • 자동 단위 전환 — 3개월 이상 조회 시 컨트롤러 단에서 TRUNC(date, 'MM')로 월별 집계 쿼리 전환 → 차트 데이터량 적정 유지
05 — Takeaways

이 프로젝트가 남긴 것

01
MVC의 기반 원리

Spring 같은 프레임워크 없이 MVC 패턴을 직접 구현해봤습니다. 이후 파이널 프로젝트에서 Spring Boot를 처음 접했을 때, 객체 생성과 의존성 연결을 직접 작성하던 부분이 어떻게 자동화되는지 자연스럽게 이해할 수 있었습니다.

02
회계 실무 → 코드 연결

회계에서 다루던 기간 개념을 그대로 코드로 옮겨본 작업이었습니다. 익숙한 도메인의 어휘가 실제 설계에 그대로 쓰일 수 있다는 것을 처음 경험해봤습니다.

03
SQL을 다루는 감각

WITH절 CTE, ROWNUM 페이징, 집계 함수를 활용한 매출 집계 쿼리를 직접 작성해보며 복잡한 SQL 작성에 익숙해졌습니다.

06 — Explore

관련 링크

아래에서 더 자세히 확인하실 수 있습니다.