# CLAUDE.md
이 파일은 이 저장소에서 코드 작업을 할 때 Claude Code (claude.ai/code)에게 제공하는 가이드입니다.
# ⚠️ 최우선 규칙 - 반드시 준수 ⚠️
## 🚨 패턴 통일화 필수 프로세스 (MANDATORY)
**모든 코드 작성 전 반드시 아래 프로세스를 따를 것. 이 프로세스를 건너뛰면 작업을 시작하지 말 것.**
### 1단계: 패턴 분석 (ALWAYS FIRST)
새로운 코드를 작성하기 전, **반드시** 유사한 기존 코드의 패턴을 먼저 분석 (참고대상 CRDN-단속 하위 디렉토리 or 패키지 or xml query):
- **Controller 작성 시**:
- 동일 패키지 내 다른 Controller 파일을 최소 2개 이상 Read로 읽고 분석
- 메서드 구조, 어노테이션 패턴, 파라미터 처리 방식, 응답 구조 확인
- **JSP/JavaScript 작성 시**:
- 동일 디렉토리 내 유사한 JSP 파일을 Read로 읽고 분석
- JavaScript 함수 네이밍, AJAX 호출 패턴, 에러 처리 방식 확인
- HTML 구조, CSS 클래스명, 폼 구조 확인
- **Service/Mapper 작성 시**:
- 동일 패키지의 기존 Service/Mapper 파일 읽고 분석
- 메서드 네이밍, 트랜잭션 처리, 예외 처리 패턴 확인
### 2단계: 패턴 적용 검증 (BEFORE WRITING)
코드를 작성하기 전, 다음을 확인:
1. ✅ 기존 파일을 Read 도구로 읽었는가?
2. ✅ 해당 파일의 코딩 스타일(들여쓰기, 주석, 네이밍)을 파악했는가?
3. ✅ 유사한 기능이 어떻게 구현되어 있는지 확인했는가?
4. ✅ 내가 작성할 코드가 기존 패턴과 100% 일치하는가?
**위 4가지 중 하나라도 NO면 코드를 작성하지 말고, 먼저 패턴 분석으로 돌아갈 것.**
### 3단계: 작성 후 자체 검증 (AFTER WRITING)
코드 작성 후 제출 전, 다음을 점검:
1. ✅ 들여쓰기(탭/스페이스)가 기존 파일과 동일한가?
2. ✅ 변수/함수 네이밍 규칙이 기존과 동일한가?
3. ✅ 주석 스타일(한글/영문, 위치)이 기존과 동일한가?
4. ✅ 에러 처리 방식이 기존과 동일한가?
5. ✅ API 응답 구조가 기존과 동일한가?
6. ✅ **[필수] VO 파일을 Read 도구로 다시 읽어서 필드가 정상 추가되었는지 확인했는가?** (Edit 결과를 믿지 말고 반드시 Read로 재확인)
7. ✅ **[필수] XML 쿼리를 Read 도구로 다시 읽어서 수정이 정상 반영되었는지 확인했는가?**
### 🔴 절대 금지 사항
- ❌ 기존 코드를 읽지 않고 "추측"으로 작성
- ❌ 기존 파일의 들여쓰기/포맷팅 변경
- ❌ 기존과 다른 스타일의 주석 추가
- ❌ 새로운 패턴이나 "더 나은 방법" 제안 (명시적 요청이 없는 한)
- ❌ 임의로 코드 리팩토링
### 📋 체크리스트 (모든 작업 전 필수 확인)
```
[ ] 1. 유사 기능의 기존 코드를 Read로 읽었는가?
[ ] 2. 기존 코드의 패턴(네이밍, 구조, 스타일)을 분석했는가?
[ ] 3. 내 코드가 기존 패턴과 100% 일치하는가?
[ ] 4. 들여쓰기, 주석, 변수명이 기존과 동일한가?
[ ] 5. [작업 후] VO 파일 변경 시 Read로 재확인했는가?
[ ] 6. [작업 후] XML 쿼리 변경 시 Read로 재확인했는가?
[ ] 7. [작업 후] Service/Mapper 변경 시 Read로 재확인했는가?
```
**이 체크리스트를 모두 완료하지 않으면 코드를 작성하지 말 것.**
**특히 Edit 도구 사용 후에는 반드시 Read 도구로 재확인할 것. Edit 결과를 절대 믿지 말 것.**
## 프로젝트 개요
일산 동구 건축물 위법행위 통합관리시스템 - 공무원이 불법 건축물 관련 위반사항을 관리하기 위한 Spring Boot 웹 애플리케이션입니다.
## 빌드 및 개발 명령어
### 빌드 명령어
```bash
# 프로젝트 빌드
./gradlew build
# 클린 빌드
./gradlew clean build
# 애플리케이션 실행 (기본 포트: 8080)
./gradlew bootRun
# 배포용 WAR 파일 빌드
./gradlew bootWar
```
### 테스트
이 프로젝트에서는 프로젝트 가이드라인에 따라 테스트가 명시적으로 비활성화되어 있습니다. 테스트 파일을 생성하지 마세요.
## 고수준 아키텍처
### 기술 스택
- **JDK**: JDK1.8만 사용
- **프레임워크**: Spring Boot 2.7.18 with eGovFrame 4.3.0 (한국 정부 표준 프레임워크)
- **데이터베이스**: MariaDB with MyBatis 2.3.1 for ORM
- **프론트엔드**: JSP with Apache Tiles 3.0.8 (레이아웃), TOAST UI Grid 4.19.2 (데이터 그리드)
- **빌드 도구**: Gradle
### MVC 아키텍처 패턴
프로젝트는 엄격한 MVC 패턴을 따릅니다:
- **Model**: `model/` 패키지에 `PagingVO`를 확장한 VO 클래스들 포함
- **View**: Apache Tiles 레이아웃을 사용하는 `src/main/webapp/WEB-INF/views/`의 JSP 파일들
- **Controller**: Swagger 어노테이션을 사용하는 Spring MVC 컨트롤러가 있는 `controller/` 패키지들
### 비즈니스 도메인별 패키지 구조
```
go.kr.project/
├── system/ # 시스템 관리 (사용자, 역할, 메뉴, 코드)
├── login/ # 인증
├── common/ # 공통 컴포넌트 및 유틸리티
├── baseData/ # 마스터 데이터 관리 (건축물 지수, 위반 법령)
├── crdn/ # 핵심 비즈니스: 위반 관리
│ ├── crndRegistAndView/ # 위반 등록 및 조회
│ │ ├── main/ # 주요 위반 프로세스
│ │ ├── crdnActInfo/ # 위반 행위 정보
│ │ ├── crdnPstnInfo/ # 위치 정보
│ │ └── crdnOwnrInfo/ # 소유자 정보
│ └── ownac/ # 소유자 조치 관리
└── noti/ # 알림 시스템
```
### 데이터베이스 레이어 (MyBatis)
- **매퍼**: `mapper/` 패키지의 인터페이스 클래스들
- **SQL**: 동일한 패키지 구조를 따르는 `src/main/resources/mybatis/mapper/`의 XML 파일들
- **시퀀스**: 모든 기본 키는 10자리 LPAD 시퀀스 사용: `SELECT LPAD(NEXTVAL(seq_table_id), 10, '0')`
- **네이밍**: camelCase 변환 자동 사용, `DB-DDL/maria/dictionary/`의 컬럼 단어 사전 따름
### 서비스 레이어 패턴
각 비즈니스 도메인은 다음을 포함합니다:
- **Service Interface**: 비즈니스 오퍼레이션 정의
- **ServiceImpl**: 비즈니스 로직 구현, `@RequiredArgsConstructor` 사용하고 매퍼 호출
- **표준 메서드**: 일관된 네이밍을 따르는 `select*`, `insert*`, `update*`, `delete*`
### 프론트엔드 아키텍처
#### 레이아웃 (Apache Tiles)
- **base**: 헤더, 메뉴, 콘텐츠 영역을 가진 메인 관리자 레이아웃
- **login**: 로그인 페이지 레이아웃
- **popup**: 팝업 윈도우 레이아웃 (접미사 `TilesConstants.POPUP`)
#### UI 컴포넌트
- **모달**: JavaScript로 제어되는 `.modalz` CSS 클래스를 가진 JSP에 임베드
- **팝업**: 팝업 레이아웃을 사용하는 별도 JSP 페이지, `window.open()`으로 열림
- **그리드**: 구성을 위한 `XitTuiGridConfig` 헬퍼 클래스를 가진 TOAST UI Grid
#### JavaScript 패턴
- `setTimeout` 사용 피하기 (문제 야기)
- 모든 URL에 `` 태그 사용
- `dataSource.api.readData`를 통한 AJAX로 그리드 데이터 로딩
-
#### CSS, JavaScript 위치
src/main/webapp/resources/xit
src/main/webapp/resources/css
#### TUI Grid 는 아래 패턴을 이용
```javascript
/**
* 단속 목록 관리 네임스페이스
*/
var CrdnRegistAndViewList = {
/**
* 선택된 행 정보
*/
selectedRow: null,
/**
* 그리드 관련 객체
*/
grid: {
/**
* 그리드 인스턴스
*/
instance: null,
```
tui grid 선언 규칙
CrdnRegistAndViewList.grid.instance
해당페이지명명규칙.그리드객체.그리드인스턴스
## 중요한 개발 가이드라인
### 모드 표준화
모든 CRUD 작업은 일관된 모드 값을 사용합니다:
- `mode: C` = Create (등록)
- `mode: U` = Update (수정)
- `mode: V` = View (보기)
- `mode: D` = Delete (삭제)
### 페이지네이션 패턴 (중요한 순서)
```java
// 1. 먼저 총 개수 가져오기
int totalCount = service.selectTotalCount(paramVO);
// 2. 총 개수 설정
paramVO.setTotalCount(totalCount);
// 3. 페이징 활성화 (선택사항)
paramVO.setPagingYn("Y");
```
### 보안 및 세션
- 감사 필드에 `SessionUtil.getUserId()` 사용
- 모든 폼에 CSRF 보호 필요
- 하드코딩된 자격증명이나 민감한 데이터 금지
### 코드 품질 요구사항
- **한글 주석**: 모든 비즈니스 로직은 한글 주석 필수 (중요로직 주석)
- **Swagger**: 모든 컨트롤러는 Swagger 어노테이션 필수 (`@Tag`, `@Operation`, `@ApiResponses`)
- **포맷팅 변경 금지**: 기존 코드 포맷팅이나 공백 수정 절대 금지
### 비즈니스 로직 패턴
위반 관리(`crdn`)와 마스터 데이터(`baseData`)의 경우, 다음의 기존 패턴을 따르세요:
- 뷰 패턴: `src/main/webapp/WEB-INF/views/baseData/`와 `src/main/webapp/WEB-INF/views/crdn/`
- Java 패턴: `src/main/java/go/kr/project/baseData/bldgNewPrcCrtrAmt/`와 `src/main/java/go/kr/project/crdn/`
### 최근 아키텍처 추가: 스마트 CRUD 패턴
`CrdnLevyPrvntcController`는 생성/업데이트 작업을 처리하는 고급 패턴을 보여줍니다:
- **통합 저장 API**: `/saveLevyInfo.ajax`가 insert vs update를 자동으로 결정
- **스냅샷 복원**: 그리드 행 선택이 기존 데이터를 로드하여 이전 계산을 복원
- **스마트 데이터 로딩**: 복잡한 조인을 사용하여 표시명과 계산 비율을 함께 가져옴
- **프론트엔드 상태 관리**: JavaScript가 모드 감지와 폼 채우기를 처리
이 패턴은 데이터를 계산 스냅샷으로 저장하고 나중에 복원해야 하는 유사한 위반 처리 워크플로우에서 따라야 합니다.
---
# 📘 프로젝트 상세 문서
## 1. 전체 프로젝트 구조
### 1.1 Java 패키지 구조 상세
```
go.kr.project/
│
├── common/ # 공통 기능
│ ├── controller/ # 공통 컨트롤러
│ │ ├── CommonCodeController # 공통코드 조회
│ │ ├── HtmlEditorController # HTML 에디터 파일 관리
│ │ └── SearchAddressController # 주소 검색
│ ├── service/ # 공통 서비스
│ │ ├── CommonCodeService # 공통코드 서비스
│ │ ├── CommonHeaderService # 공통 헤더 서비스
│ │ └── HtmlEditorService # HTML 에디터 서비스
│ ├── mapper/ # 공통 매퍼
│ └── model/ # 공통 모델
│ ├── PagingVO # 페이징 기본 VO (모든 VO의 부모 클래스)
│ ├── FileVO # 파일 정보 VO
│ └── CmmnCodeSearchVO # 공통코드 검색 VO
│
├── login/ # 로그인 및 인증
│ ├── service/LoginService # 로그인 서비스
│ ├── mapper/LoginMapper # 로그인 매퍼
│ └── model/ # 로그인 모델
│ ├── SessionVO # 세션 정보 VO
│ ├── UserSessionVO # 사용자 세션 VO
│ └── LoginUserVO # 로그인 사용자 VO
│
├── mypage/ # 마이페이지
│ ├── controller/MypageController
│ ├── service/MypageService
│ └── service/impl/MypageServiceImpl
│
├── system/ # 시스템 관리
│ ├── user/ # 사용자 관리
│ │ ├── controller/UserController
│ │ ├── service/UserService
│ │ ├── service/impl/UserServiceImpl
│ │ ├── mapper/UserMapper
│ │ └── model/
│ │ ├── SystemUserVO # 시스템 사용자 VO
│ │ └── SystemUserSearchVO # 사용자 검색 VO
│ ├── group/ # 그룹 관리
│ │ ├── controller/GroupController
│ │ ├── service/GroupService
│ │ └── model/GroupVO
│ ├── role/ # 역할 관리
│ │ ├── controller/RoleController
│ │ ├── service/RoleService
│ │ └── model/RoleVO
│ ├── menu/ # 메뉴 관리
│ │ ├── controller/MenuController
│ │ ├── service/MenuService
│ │ └── mapper/MenuMapper
│ ├── code/ # 코드 관리
│ │ ├── controller/CodeController
│ │ ├── service/CodeService
│ │ ├── mapper/CodeMapper
│ │ └── model/
│ │ ├── CodeGroupVO # 코드 그룹 VO
│ │ └── CodeDetailVO # 코드 상세 VO
│ ├── auth/ # 권한 관리
│ │ ├── controller/AuthController
│ │ ├── service/AuthService
│ │ ├── mapper/AuthMapper
│ │ └── model/
│ │ ├── AuthVO
│ │ ├── GroupRoleVO
│ │ ├── RoleMenuVO
│ │ └── MenuProgramVO
│ ├── loginLog/ # 로그인 로그
│ │ ├── controller/LoginLogController
│ │ ├── service/LoginLogService
│ │ └── model/LoginLogVO
│ └── execquery/ # 쿼리 실행 (개발/디버깅용)
│ ├── controller/DbQueryController
│ ├── service/DbQueryService
│ └── config/IsolatedTransactionManager
│
├── baseData/ # 기초 데이터 관리
│ └── bldgNewPrcCrtrAmt/ # 건축물 신축가격 기준액 관리
│ ├── controller/BldgNewPrcCrtrAmtController (추정)
│ ├── service/BldgNewPrcCrtrAmtService
│ ├── service/impl/BldgNewPrcCrtrAmtServiceImpl
│ ├── mapper/BldgNewPrcCrtrAmtMapper
│ └── model/BldgNewPrcCrtrAmtVO
│
├── crdn/ # 단속 관리 (핵심 비즈니스 도메인)
│ ├── crndRegistAndView/ # 단속 등록 및 조회
│ │ ├── main/ # 메인 단속 프로세스
│ │ │ ├── controller/
│ │ │ │ ├── CrdnRegistAndViewController # 단속 등록/조회
│ │ │ │ ├── CrdnLevyPrvntcController # 부과예고 관리
│ │ │ │ ├── CrdnRelevyController # 재부과 관리
│ │ │ │ └── CrdnImpltTaskController # 이행 업무 관리
│ │ │ ├── service/
│ │ │ │ ├── CrdnRegistAndViewService
│ │ │ │ ├── CrdnLevyPrvntcService
│ │ │ │ ├── CrdnRelevyService
│ │ │ │ └── CrdnImpltTaskService
│ │ │ ├── service/impl/
│ │ │ │ ├── CrdnRegistAndViewServiceImpl
│ │ │ │ ├── CrdnLevyPrvntcServiceImpl
│ │ │ │ ├── CrdnRelevyServiceImpl
│ │ │ │ └── CrdnImpltTaskServiceImpl
│ │ │ └── model/
│ │ │ ├── CrdnRegistAndViewVO # 단속 기본 정보 VO
│ │ │ ├── CrdnLevyInfoVO # 부과 정보 VO (계산식 포함)
│ │ │ ├── CrdnRelevyVO # 재부과 정보 VO
│ │ │ ├── CrdnImpltTaskVO # 이행 업무 VO
│ │ │ ├── CrdnAdsbmtnRtVO # 가감산율 VO
│ │ │ ├── CrdnCmpttnRt2VO # 산정률2 VO
│ │ │ └── LevyPrvntcActInfoVO # 부과예고 행위정보 VO
│ │ ├── crdnActInfo/ # 행위 정보 관리
│ │ │ ├── controller/CrdnActInfoController
│ │ │ ├── service/
│ │ │ │ ├── CrdnActInfoService
│ │ │ │ └── CrdnPhotoService # 사진 관리
│ │ │ ├── service/impl/
│ │ │ └── model/
│ │ │ ├── CrdnActInfoVO # 행위 정보 VO
│ │ │ └── CrdnVltnLwrgVO # 위반 법령 VO
│ │ ├── crdnPstnInfo/ # 위치 정보 관리
│ │ │ ├── controller/CrdnPstnInfoController
│ │ │ ├── service/CrdnPstnInfoService
│ │ │ └── model/CrdnPstnInfoVO # 위치 정보 VO
│ │ ├── crdnOwnrInfo/ # 소유자 정보 관리
│ │ │ ├── controller/CrdnOwnrInfoController
│ │ │ ├── service/CrdnOwnrInfoService
│ │ │ └── model/CrdnOwnrInfoVO # 소유자 정보 VO
│ │ ├── crdnActrInfo/ # 행위자 정보 관리
│ │ │ ├── controller/CrdnActrInfoController
│ │ │ ├── service/CrdnActrInfoService
│ │ │ └── model/ (추정)
│ │ ├── crdnExmnr/ # 조사자 정보 관리
│ │ │ ├── controller/CrdnExmnrController
│ │ │ ├── service/CrdnExmnrService
│ │ │ ├── mapper/CrdnExmnrMapper
│ │ │ └── model/CrdnExmnrVO
│ │ └── crdnOwnrSelect/ # 소유자 선택
│ │ ├── controller/CrdnOwnrSelectController
│ │ ├── service/CrdnOwnrSelectService
│ │ └── service/impl/CrdnOwnrSelectSelectServiceImpl
│ ├── ownac/ # 소유자 조치 관리
│ │ ├── controller/OwnActRegistAndViewController
│ │ ├── service/OwnActRegistAndViewService
│ │ └── service/impl/OwnActRegistAndViewServiceImpl
│ └── exmnr/ # 조사자 관리
│ ├── controller/ExmnrController
│ ├── service/ExmnrService
│ └── service/impl/ExmnrServiceImpl
│
├── noti/ # 알림 시스템 (추정)
│
└── ma30/ # MA30 관련 (추정)
└── model/
├── Ma30FindListVO
└── Ma30FindRlistSearchVO
```
### 1.2 View (JSP) 디렉토리 구조
```
src/main/webapp/WEB-INF/views/
│
├── common/ # 공통 뷰
│ ├── header.jsp # 헤더
│ ├── footer.jsp # 푸터
│ └── menu.jsp # 메뉴
│
├── login/ # 로그인
│ └── login.jsp
│
├── system/ # 시스템 관리
│ ├── user/ # 사용자 관리
│ ├── group/ # 그룹 관리
│ ├── role/ # 역할 관리
│ ├── menu/ # 메뉴 관리
│ ├── code/ # 코드 관리
│ └── loginLog/ # 로그인 로그
│
├── baseData/ # 기초 데이터
│ └── bldgNewPrcCrtrAmt/ # 건축물 신축가격 기준액
│
└── crdn/ # 단속 관리
├── crndRegistAndView/
│ └── main/
│ ├── list.jsp # 단속 목록
│ ├── crdnRegistPopup.jsp # 단속 등록/수정 팝업
│ ├── detailView-main.jsp # 단속 상세보기 메인
│ └── crdnLevyPrvntc/
│ ├── levyPrvntcPopup.jsp # 부과예고 팝업
│ └── LevyAddMinusPopup.jsp # 가감산 팝업
└── ownac/ # 소유자 조치
```
### 1.3 MyBatis Mapper XML 구조
```
src/main/resources/mybatis/mapper/
│
├── common/
│ ├── CommonCodeMapper_maria.xml
│ └── CommonHeaderMapper_maria.xml
│
├── login/
│ └── LoginMapper_maria.xml
│
├── system/
│ ├── user/UserMapper_maria.xml
│ ├── group/GroupMapper_maria.xml
│ ├── role/RoleMapper_maria.xml
│ ├── menu/MenuMapper_maria.xml
│ ├── code/CodeMapper_maria.xml
│ ├── auth/AuthMapper_maria.xml
│ └── loginLog/LoginLogMapper_maria.xml
│
├── baseData/
│ └── bldgNewPrcCrtrAmt/BldgNewPrcCrtrAmtMapper_maria.xml
│
└── crdn/
├── crndRegistAndView/
│ ├── main/
│ │ ├── CrdnRegistAndViewMapper_maria.xml
│ │ ├── CrdnLevyPrvntcMapper_maria.xml
│ │ ├── CrdnRelevyMapper_maria.xml
│ │ └── CrdnImpltTaskMapper_maria.xml
│ ├── crdnActInfo/
│ │ ├── CrdnActInfoMapper_maria.xml
│ │ └── CrdnPhotoMapper_maria.xml
│ ├── crdnPstnInfo/
│ │ └── CrdnPstnInfoMapper_maria.xml
│ ├── crdnOwnrInfo/
│ │ └── CrdnOwnrInfoMapper_maria.xml
│ ├── crdnActrInfo/
│ │ └── CrdnActrInfoMapper_maria.xml
│ ├── crdnExmnr/
│ │ └── CrdnExmnrMapper_maria.xml
│ └── crdnOwnrSelect/
│ └── CrdnOwnrSelectMapper_maria.xml
├── ownact/
│ └── OwnActRegistAndViewMapper_maria.xml
└── exmnr/
└── ExmnrMapper_maria.xml
```
---
## 2. 주요 업무 로직 상세
### 2.1 단속 관리 프로세스 (crdn 도메인)
#### 2.1.1 단속 등록 및 조회 (CrdnRegistAndViewController)
**주요 API 엔드포인트:**
- `GET /crdn/crndRegistAndView/list.do` - 단속 목록 화면
- `POST /crdn/crndRegistAndView/list.ajax` - 단속 목록 조회 (페이징)
- `GET /crdn/crndRegistAndView/crdnRegistPopup.do` - 단속 등록/수정 팝업
- `GET /crdn/crndRegistAndView/detailView.do` - 단속 상세보기
- `POST /crdn/crndRegistAndView/insert.ajax` - 단속 등록
- `POST /crdn/crndRegistAndView/update.ajax` - 단속 수정
- `POST /crdn/crndRegistAndView/delete.ajax` - 단속 삭제 (논리삭제)
- `GET /crdn/crndRegistAndView/selectOne.ajax` - 단속 상세 조회
- `POST /crdn/crndRegistAndView/updateStatus.ajax` - 단속 상태 업데이트
- `GET /crdn/crndRegistAndView/checkActCmpltCd.ajax` - 조치처리상태 확인
- `POST /crdn/crndRegistAndView/excel.do` - 단속 목록 엑셀 다운로드
**주요 필드 (CrdnRegistAndViewVO):**
- `crdnYr` (단속 연도) + `crdnNo` (단속 번호) = 복합키
- `sggCd` (시군구 코드)
- `crdnPrcsSttsCd` (단속 진행 상태 코드)
- `dsclMthd` (적발 방법)
- `stdgEmdCd` (법정동 읍면동 코드)
- `rgnSeCd` (지역 구분 코드)
**비즈니스 규칙:**
1. 등록 시 세션의 조직코드(orgCd)를 sggCd로 자동 설정
2. 삭제는 논리삭제 (DEL_YN='Y')
3. 페이징 처리 시 반드시 순서 준수:
- 총 개수 조회 → totalCount 설정 → pagingYn='Y' 설정
#### 2.1.2 부과예고 관리 (CrdnLevyPrvntcController)
**주요 API 엔드포인트:**
- `GET /crdn/crndRegistAndView/crdnLevyPrvntc/selectLevyInfoFirstCheck.ajax` - 부과정보 존재 여부 확인
- `GET /crdn/crndRegistAndView/crdnLevyPrvntc/levyPrvntcPopup.do` - 부과예고 팝업
- `GET /crdn/crndRegistAndView/crdnLevyPrvntc/selectIsAllLevyInfoCompleted.ajax` - 부과정보 완료 여부
- `POST /crdn/crndRegistAndView/crdnLevyPrvntc/actlist.ajax` - 행위정보 목록 조회
- `GET /crdn/crndRegistAndView/crdnLevyPrvntc/LevyAddMinusPopup.do` - 가감산 팝업
- `POST /crdn/crndRegistAndView/crdnLevyPrvntc/adsbmtnRtList.ajax` - 가감산율 목록 조회
- `GET /crdn/crndRegistAndView/crdnLevyPrvntc/selectLevyInfoByActInfoId.ajax` - 기존 부과정보 조회
- `POST /crdn/crndRegistAndView/crdnLevyPrvntc/saveLevyInfo.ajax` - 부과정보 저장 (신규/수정 자동 판단)
- `POST /crdn/crndRegistAndView/crdnLevyPrvntc/delLevyInfo.ajax` - 부과정보 삭제
- `POST /crdn/crndRegistAndView/crdnLevyPrvntc/calculateAll.ajax` - **통합 계산 API (핵심 로직)**
**주요 필드 (CrdnLevyInfoVO):**
- 기본키: `levyInfoId`
- 참조키: `crdnYr`, `crdnNo`, `impltTaskSeCd`, `actInfoId`
- 계산 관련 필드:
- `bldgCrtrMprcAmt` (건물 기준 시가액)
- `strctIdx` (구조 지수)
- `usgIdx` (용도 지수)
- `pstnIdx` (위치 지수)
- `elpsYrRdvlrt` (경과 연도 잔가율)
- `bscsCstrnRt` (기초 공사율)
- `vltnArea` (위반 면적)
- `adsbmtnEnfcRt` (가감산 시행률)
- `cmpttnRt` (산정률)
- `cmpttnRt2` (산정률2)
- `bdstTxtnMprc` (건축물 과세 시가)
- `mprcStdAmt` (시가 표준액)
- `cmpttnAmt` (산정액)
- `levyWholAmt` (부과 총액)
**핵심 비즈니스 규칙:**
1. **스마트 저장 패턴**:
- `saveLevyInfo.ajax`는 기존 데이터 존재 여부를 자동으로 확인
- 존재하면 UPDATE, 없으면 INSERT 자동 실행
2. **사전 검증**:
- 부과예고 등록 전 반드시 위치정보, 행위정보가 먼저 등록되어야 함
- `selectLevyInfoFirstCheck.ajax`로 사전 검증 수행
3. **계산 스냅샷 패턴**:
- 계산 시점의 모든 값(지수, 비율 등)을 DB에 저장
- 나중에 조회 시 저장된 값으로 복원하여 일관성 유지
#### 2.1.3 행위 정보 관리 (CrdnActInfoController)
**주요 데이터:**
- 위반 행위의 상세 정보 (행위 유형, 위반 법령 등)
- 사진 정보 (CrdnPhotoService 별도 관리)
#### 2.1.4 위치 정보 관리 (CrdnPstnInfoController)
**주요 데이터:**
- 단속 위치 정보
- 지번, 주소, 좌표 등
#### 2.1.5 소유자 정보 관리 (CrdnOwnrInfoController)
**주요 데이터:**
- 건축물 소유자 정보
- 성명, 연락처, 주소 등
---
## 3. 데이터 흐름 상세
### 3.1 표준 CRUD 데이터 흐름
#### 3.1.1 조회 (SELECT) 흐름
```
[사용자]
↓
[JSP - list.jsp]
↓ (페이지 로드 시 TUI Grid 초기화)
↓
[JavaScript - dataSource.api.readData]
↓ (AJAX POST 요청: /list.ajax)
↓
[Controller - listAjax(@ModelAttribute VO)]
↓ (1. totalCount 조회)
↓ (2. setTotalCount)
↓ (3. setPagingYn("Y"))
↓ (4. Service 호출)
↓
[Service - selectList(VO)]
↓ (비즈니스 로직, 검증)
↓
[Mapper - selectList(VO)]
↓ (MyBatis 호출)
↓
[MyBatis XML -