ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 기술지원 관련 사이드 프로젝트 진행상황
    Side Project 2026. 1. 5. 10:18

    Tech Support Scheduler 구조 요약 (Controller → Service → Dao → MyBatis XML)

     

    0) 한 장 구조도 (요청 흐름)

    [Browser]
       ↓ HTTP 요청
    [Controller]  (URL 매핑 / Model 세팅 / view 또는 redirect)
       ↓
    [Service]     (비즈니스 로직 / 검증 / 페이징 계산 / 트랜잭션 단위)
       ↓
    [Dao @Mapper] (DB 호출 인터페이스)
       ↓
    [MyBatis XML] (SQL 본체 / 동적쿼리 / LIMIT-OFFSET)
       ↓
    [MariaDB]

    1) 폴더/파일 구조 (레이어별)

    src/main/java/com/boot/techsupportscheduler
     ├─ config/WebMvcConfig.java
     └─ support
        ├─ controller : HomeCon, LoginCon, JoinCon, NoticeCon, ProjectCon, SupportCon
        ├─ service    : LoginSvc, JoinSvc, NoticeSvc, ProjectSvc, SupportSvc
        ├─ dao        : LoginDao, UserDao, NoticeDao, ProjectDao, SupportDao
        ├─ interceptor: LoginInterceptor, RoleActionInterceptor
        └─ vo         : Notice, Project, Support, User, SessionUser, PageInfo, *PageResult
    src/main/resources/sqlmapper
     ├─ Login.xml
     ├─ User.xml
     ├─ notice.xml
     ├─ project.xml
     └─ support.xml

    2) URL 라우팅 맵 (한눈에 보는 엔드포인트)

    Auth

    기능MethodURLController
    로그인 폼 GET /login LoginCon.loginForm()
    로그인 처리 POST /login LoginCon.loginExe()
    로그아웃 GET /logout LoginCon.logout()
    회원가입 폼 GET /join JoinCon.joinForm()
    회원가입 처리 POST /join JoinCon.joinExe()
    권한 거절 페이지 GET /support/forbidden LoginCon.forbidden()

    Home/Notice (공지)

    기능MethodURLController
    홈(공지로 리다이렉트) GET /support/home HomeCon.doHome()
    공지 목록(페이징) GET /support/notice NoticeCon.list()
    공지 검색(페이징) POST /support/notice_search NoticeCon.noticeSearch()
    공지 상세(+조회수) GET /support/notice/detail NoticeCon.detail()
    공지 등록 폼 GET /support/notice/new NoticeCon.getForm()
    공지 등록 POST /support/notice/new NoticeCon.postForm()
    공지 수정 폼 GET /support/notice/edit NoticeCon.getEdit()
    공지 수정 POST /support/notice/edit NoticeCon.postEdit()
    공지 삭제(소프트) POST /support/notice/delete NoticeCon.doDelete()

    Project (프로젝트)

    기능MethodURLController
    목록(페이징) GET /support/project/list ProjectCon.list()
    검색(페이징) POST /support/project/search ProjectCon.search()
    상세 GET /support/project/detail ProjectCon.detail()
    등록 폼 GET /support/project/new ProjectCon.getNew()
    등록(코드 자동생성) POST /support/project/new ProjectCon.postNew()
    수정 폼 GET /support/project/edit ProjectCon.getEdit()
    수정 POST /support/project/edit ProjectCon.postUpdate()
    삭제(현재 하드삭제) POST /support/project/delete ProjectCon.doDelete()

    Support (기술지원 티켓)

    기능MethodURLController
    목록 GET /support/support/list SupportCon.list()
    상세 GET /support/support/detail SupportCon.detail()
    등록 폼 GET /support/support/new SupportCon.getForm()
    등록 POST /support/support/new SupportCon.postForm()
    수정 폼 GET /support/support/edit SupportCon.editForm()
    수정 POST /support/support/update SupportCon.doUpdate()
    삭제(소프트) POST /support/support/delete SupportCon.doDelete()

    3) 보안/권한 규칙 (Interceptor 한눈 요약)

    LoginInterceptor (로그인 없이 허용되는 GET)

    PUBLIC GET 허용:
    - /support/home
    - /support/notice
    - /support/notice/detail/**
    - /support/project/list
    - /support/project/detail/**
    - /support/support/list
    - /support/support/detail/**
    - /support/forbidden
    그 외 요청은 세션 LOGIN_USER 없으면 /login?redirect=... 로 튕김

    RoleActionInterceptor (POST 권한 분리)

    GET: 전부 허용
    POST:
    - ROLE_ADMIN   : 전부 허용
    - ROLE_SALES   : /support/project... 만 허용
    - ROLE_SUPPORT : /support/support... 만 허용
    그 외: 403 + alert + 이전페이지(or /support/home)

    4) 모듈별 “기능 흐름” 요약 (Controller→Service→Dao→XML)

    A. 회원가입(Join)

    POST /join
    → JoinCon.joinExe()
    → JoinSvc.join()
       - 입력검증 / role 화이트리스트
       - UserDao.findByLoginId() 로 중복체크
       - BCrypt.hashpw()로 password_hash 생성
       - UserDao.insertUser()
    → User.xml (INSERT)
    → redirect:/login

    B. 로그인(Login)

    POST /login
    → LoginCon.loginExe()
    → LoginSvc.login(loginId, rawPw)
       - LoginDao.findByLoginId()
       - BCrypt.checkpw()
       - 성공 시 SessionUser 생성
    → 세션 LOGIN_USER 저장
    → redirect:/support/project/list

    C. 공지(Notice) - 목록/검색/상세/CRUD

    C-1) 목록(페이징)

    GET /support/notice?page&size
    → NoticeCon.list()
    → NoticeSvc.doSearchPaged(field=all, q=null, topOnly="", sort=new, page, size)
       - NoticeDao.countSearch(p)
       - PageInfo(page,size,totalCount) → offset 계산
       - NoticeDao.searchPaged(p + limit/offset)
    → notice.xml : countSearch / searchPaged
    → home/home.html 렌더링

    C-2) 상세(+조회수 증가 + prev/next)

    GET /support/notice/detail?noticeId
    → NoticeCon.detail()
    → NoticeSvc.doDetail()
       - NoticeDao.increaseViews(noticeId)
       - NoticeDao.doDetail(noticeId)
    → notice.xml : increaseViews / doDetail
    + doPrev / doNext로 이전글/다음글 조회

    C-3) 등록/수정/삭제

    POST /support/notice/new
    → NoticeSvc.doInsert()
    → notice.xml : doInsert

    POST /support/notice/edit
    → NoticeSvc.doUpdate()
    → notice.xml : doUpdate

    POST /support/notice/delete
    → NoticeSvc.doDelete()
    → notice.xml : doDelete (deleted_yn='Y' 소프트 삭제)

    D. 프로젝트(Project) - 검색/정렬/상태필터 + 페이징 + 코드 자동생성

    D-1) 목록/검색(페이징)

    GET /support/project/list
    POST /support/project/search
    → ProjectSvc.doSearchPaged(field,q,status,sort,page,size)
       - ProjectDao.countSearch()
       - PageInfo로 offset 계산
       - ProjectDao.searchPaged(limit/offset)
    → project.xml : countSearch / searchPaged (동적 where + 정렬 choose)

    D-2) 등록(프로젝트 코드 생성)

    POST /support/project/new
    → ProjectCon.postNew()
       - projectCode = "TS-YYYYMM-XXXXXXXX(UUID8)"
    → ProjectSvc.doInsert()
    → project.xml : doInsert (useGeneratedKeys로 projectId 주입)

    D-3) 삭제 주의

    POST /support/project/delete
    → project.xml : doDelete 가 현재 DELETE FROM project (하드 삭제)
    ※ 다른 테이블들은 deleted_yn 기반 소프트 삭제라, 여기만 튀는 상태.

    E. 기술지원(Support) - 티켓 CRUD + 프로젝트 연동

    E-1) 등록 폼(프로젝트/영업담당자 옵션 구성)

    GET /support/support/new
    → SupportCon.getForm()
       - ProjectSvc.doList()로 프로젝트 목록
       - salesManager distinct 뽑아서 드롭다운 구성
    → support/form.html

    E-2) 등록/수정/삭제

    POST /support/support/new
    → 기본값 방어: deletedYn='N', status='OPEN'
    → SupportSvc.doInsert()
    → support.xml : doInsert

    POST /support/support/update
    → SupportSvc.doUpdate()
    → support.xml : doUpdate

    POST /support/support/delete
    → SupportSvc.doDelete()
    → support.xml : doDelete (소프트 삭제)

     

Designed by Tistory.