You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
12 KiB
12 KiB
CLAUDE.md
이 파일은 Claude Code(claude.ai/code)가 이 저장소의 코드 작업 시 참고할 가이드입니다.
기본 중요 가이드라인
🚨 반드시 지켜야 할 규칙
- 한글로 대화: 모든 응답과 진행상황은 한글로 작성
- 테스트 소스 작성 불가: 테스트 코드는 생성하지 않음
- 중요 로직 주석 필수: 모든 중요한 로직에 한글 주석 작성
- 스웨거 적용: 모든 컨트롤러 클래스에 스웨거 어노테이션 적용
- 기존 소스 수정 제한: 공백 제거 등 로직에 불필요한 수정 금지
🏛️ 아키텍처 패턴
- MVC 패턴: Spring Boot + MyBatis + JSP 구조
- 템플릿 엔진: Apache Tiles 사용
- 보안: 세션 기반 인증/인가
- 코딩 스타일:
noticeSample모듈을 참조 표준으로 사용
🎨 프론트엔드 가이드
- URL 태그: 모든 URL은
<c:url value="" />태그 사용 필수 - 정적 리소스:
src/main/webapp/resources/css,js,xit등 해당 위치 사용 - 모달:
/system/loginLog/list.jsp참조 - 팝업:
/system/user/auth_popup.jsp참조 - CSS 위치:
- 모달/메인 윈도우:
xit-common.css - 팝업:
xit-popup.css
- 모달/메인 윈도우:
🗄️ 데이터베이스 규칙
컬럼 단어사전 준수 (필수)
- 참조:
DB-DDL/maria/dictionary/column_word_dictionary.md반드시 확인 - 신규 단어: 사전에 없는 단어는 반드시 사전에 추가
- 시간 표기: LocalDateTime 컬럼은 "일시(dttm)"로 명명
- 예시: 일시 →
reg_dttm, 시간 →reg_dttm
MyBatis 설정
- camelCase 자동 적용: 컬럼 별칭(alias) 불필요
- DB 구조 참조:
DB-DDL/maria/ddl/xitframework/*.sql
기본 키 생성 규칙
-- 총 20자리: 데이터 약어(4자리) + 시퀀스(16자리)
SELECT CONCAT('BBSN', LPAD(NEXTVAL(seq_notice_id), 16, '0'))
페이징 처리 순서 (중요!)
// 1. 총 개수 조회
int totalCount = excelSampleService.selectExcelSampleListTotalCount(paramVO);
// 2. 총 개수 설정
paramVO.setTotalCount(totalCount);
// 3. 페이징 활성화 (반드시 이 순서로!)
paramVO.setPagingYn("Y");
빌드 및 개발 명령어
빌드 명령어
# 테스트 포함 전체 빌드
./gradlew clean build
# 테스트 제외 빌드
./gradlew clean build -x test
# 표준 WAR 파일 생성
./gradlew war
# 실행 가능한 bootWar 파일 생성
./gradlew bootWar
# 압축 해제된 WAR 추출 (디버깅용)
./gradlew exploded
개발 서버 실행
# 로컬 내장 Tomcat으로 실행
./gradlew bootRun
# 특정 프로필과 포트로 실행
java -jar build/libs/xit-framework-boot.war --spring.profiles.active=local --server.port=9090
# 백그라운드 실행 (Linux/macOS)
nohup java -jar build/libs/xit-framework-boot.war > app.log 2>&1 &
아키텍처 개요
Spring Boot 2.7.18 + 전자정부프레임워크 4.3.0 기반 애플리케이션:
핵심 기술 스택
| 기술 | 버전 | 설명 |
|---|---|---|
| Java | 1.8 | 자바 개발 및 실행 환경 |
| Spring Boot | 2.7.18 | 스프링 기반 애플리케이션 개발 프레임워크 |
| 전자정부 프레임워크 | 4.3.0 | 한국 정부 표준 웹 개발 프레임워크 |
| MariaDB | - | 관계형 데이터베이스 |
| MyBatis | 2.3.1 | SQL 매핑 프레임워크 |
| Apache Tiles | 3.0.8 | 레이아웃 템플릿 엔진 |
| TOAST UI Grid | 4.19.2 | 자바스크립트 그리드 라이브러리 |
| Quartz | - | JDBC 기반 클러스터 스케줄러 |
주요 라이브러리
| 라이브러리 | 버전 | 설명 |
|---|---|---|
| Lombok | - | 자바 코드 생성 라이브러리 |
| Apache Commons Text | 1.10.0 | 텍스트 처리 유틸리티 |
| Apache POI | 5.3.0 | 엑셀 파일 처리 라이브러리 |
| Gradle | - | 빌드 및 의존성 관리 도구 |
프로젝트 구조 패턴
go.kr.project/
├── {module}/
│ ├── controller/ # REST/MVC 컨트롤러
│ ├── service/ # 비즈니스 로직 (인터페이스 + 구현체)
│ ├── mapper/ # MyBatis 데이터 접근 인터페이스
│ ├── model/ # 데이터 전송 객체 (VO 클래스)
│ └── config/ # 모듈별 설정
├── common/ # 공통 유틸리티 및 컴포넌트
├── batch/ # Quartz 기반 배치 작업 시스템
├── system/ # 시스템 관리 (사용자, 역할, 메뉴 등)
└── template/ # 템플릿/샘플 코드
egovframework/ # 프레임워크 확장
├── config/ # Spring 설정
├── util/ # 유틸리티 클래스
├── filter/ # 보안 필터 (XSS, 세션)
├── interceptor/ # 요청 인터셉터 (인증, 리퍼러 체크)
└── exception/ # 커스텀 예외 및 핸들러
디렉토리 구조
xit-framework/
├── DB-DDL/ # 데이터베이스 스크립트
│ └── maria/ # MariaDB 스크립트
│ ├── ddl/ # 테이블 정의 스크립트
│ ├── dml/ # 샘플 데이터 스크립트
│ └── dictionary/ # 컬럼 단어사전
├── src/
│ ├── main/
│ │ ├── java/ # 자바 소스 코드
│ │ │ ├── egovframework/ # 전자정부 프레임워크 확장 코드
│ │ │ └── go/kr/project/ # 프로젝트 소스 코드
│ │ ├── resources/ # 리소스 파일
│ │ │ ├── mybatis/ # MyBatis 설정 및 매퍼
│ │ │ └── application.yml # 애플리케이션 설정 파일
│ │ └── webapp/ # 웹 리소스
│ │ ├── resources/ # 정적 리소스 (CSS, JS, 이미지 등)
│ │ └── WEB-INF/views/ # JSP 뷰 파일
│ └── test/ # 테스트 코드 (작성 불가)
└── build.gradle # Gradle 빌드 스크립트
데이터베이스 설계
역할 기반 접근 제어 시스템을 사용:
- **사용자(Users)**는 **그룹(Groups)**에 속함
- **그룹(Groups)**은 여러 **역할(Roles)**을 가짐
- **역할(Roles)**은 메뉴(Menus) 접근 권한을 부여
- **메뉴(Menus)**는 접근 제어를 위한 URL 패턴을 정의
핵심 테이블: tb_user, tb_group, tb_role, tb_menu, tb_group_role, tb_role_menu
주요 컴포넌트 및 패턴
MVC 패턴
각 기능 모듈은 다음 구조를 따름:
- Controller: HTTP 요청 처리, 서비스로 위임
- Service: 비즈니스 로직 포함,
@Service("ServiceName")어노테이션 사용 - Mapper: 데이터베이스 작업을 위한 MyBatis 인터페이스
- Model: 데이터 전송을 위한 VO 클래스
API 응답 패턴
모든 AJAX 엔드포인트는 ApiResponseUtil을 사용하여 일관된 응답 제공:
// 데이터와 함께 성공 응답
return ApiResponseUtil.success(data, "성공 메시지");
// 페이징과 함께 그리드 데이터 응답
return ApiResponseUtil.successWithGrid(list, pagingVO);
// 오류 응답
return ApiResponseUtil.error("오류 메시지");
파일 구성 규칙
- 컨트롤러:
{모듈명}Controller.java - 서비스:
{모듈명}Service.java(인터페이스),{모듈명}ServiceImpl.java(구현체) - 매퍼:
{모듈명}Mapper.java+{모듈명}Mapper_maria.xml - 모델:
{모듈명}VO.java - 뷰:
/WEB-INF/views/{module}/{page}.{layout}.jsp
보안 기능
- XSS 보호: 모든 요청 매개변수 자동 필터링
- 인증: 5회 로그인 실패 후 계정 잠금이 있는 세션 기반 인증
- 인가: 역할/메뉴를 통한 URL 패턴 기반 접근 제어
- CSRF 보호: 리퍼러 헤더 검증
- 세션 관리: 자동 갱신, 동시 로그인 제어
배치 시스템 (Quartz 기반)
포괄적인 배치 작업 관리 시스템을 포함:
- 웹 UI: 작업 관리를 위한
/batch/list.do - REST APIs: 작업 등록, 실행, 일시정지/재개, 로그
- 데이터베이스 추적: 전체 실행 기록 및 로깅
- 클러스터링: 다중 인스턴스 배포 지원
- 작업 클래스:
AbstractBatchJob확장 또는Job인터페이스 구현
설정 및 환경
프로필
- local: 로컬 개발환경, 핫 리로드, 로컬 데이터베이스
- dev: 개발 서버 환경
- prd: 최적화된 로깅이 있는 운영 환경
주요 설정 파일
application.yml: 공통 설정, Quartz 설정, 보안 설정application-{profile}.yml: 환경별 데이터베이스, 경로, 로깅mybatis/mybatis-config.xml: MyBatis 설정 (camelCase 매핑 활성화)tiles.xml: 레이아웃 템플릿 정의
데이터베이스 연결
HikariCP 커넥션 풀 사용. 환경별 YAML 파일에 연결 설정. 현재 4코어/32GB 풀 설정: max-pool-size: 10, connection-timeout: 30s
개발 가이드라인
코드 컨벤션
/system/모듈의 기존 패턴을 참조로 사용- 모든 데이터베이스 테이블명은 snake_case 사용 (예:
tb_user) - 모든 Java 속성은 camelCase 사용 (MyBatis가 변환 처리)
- 컨트롤러는
"{module}/{page}.{layout}"형식의 뷰 이름 반환 - JSP에서 모든 URL은
<c:url value="" />태그 사용 - AJAX 응답은
response.result사용 (response.success아님)
데이터베이스 스키마
- 새 테이블은
DB-DDL/maria/ddl/xitframework/에 위치 - 샘플 데이터는
DB-DDL/maria/dml/에 위치 ON DELETE CASCADE사용 금지 - 애플리케이션 코드에서 처리- ID 생성은 시퀀스 테이블 사용 (패턴:
seq_{table}_id)
프론트엔드 통합
- UI 프레임워크: 커스텀 XIT 스타일링이 적용된 Bootstrap
- 그리드 컴포넌트: TOAST UI Grid (
xit-tui-grid.js참조) - 유효성 검사: 폼 유효성 검사에
xit-validation.js사용 - 파일 업로드: 드래그 앤 드롭 지원 다중 파일 업로드
- 아이콘: Material Design Icons + FontAwesome
보안 모범 사례
- 로그에 비밀번호나 민감한 데이터 노출 금지
- 모든 파일 업로드는 타입과 크기 검증
- 사용자 비밀번호는
EgovFileScrty.encryptPassword()로 암호화 - 세션 타임아웃: 30분(dev), 60분(prd)
배포
WAR 배포
# 외부 Tomcat용 표준 WAR
./gradlew war
# 출력: build/libs/xit-framework.war
# 내장 서버가 있는 실행 가능한 WAR
./gradlew bootWar
# 출력: build/libs/xit-framework-boot.war
환경 설정
다음을 통해 프로필 설정:
application.yml:spring.profiles.active: local- 명령줄:
--spring.profiles.active=dev - 환경변수:
SPRING_PROFILES_ACTIVE=dev
외부 WAS 배포 (Tomcat)
xit-framework.war를webapps/에 복사- JVM 옵션 설정:
-Dspring.profiles.active=dev - Java 1.8+ 및 충분한 메모리 할당 확인
중요 참고사항
- 기본 관리자: 초기 데이터 스크립트에서 관리자 사용자 설정 확인
- 데이터베이스 설정: 첫 시작 전
DB-DDL/maria/ddl/의 DDL 스크립트 실행 - 파일 저장소: 환경 YAML에서
file.upload.path설정 - 로깅: 설정된 경로에 로그, 30일 보관으로 일일 순환
- 모니터링:
/actuator/health,/actuator/metrics에서 액츄에이터 엔드포인트 사용 가능 - API 문서: Swagger UI는
/swagger-ui.html에서 사용 가능 (dev/local만)
이 시스템은 포괄적인 감사 추적, 배치 작업 모니터링, 알림 시스템, 파일 처리, 엑셀 처리, 데이터 유효성 검사를 위한 광범위한 유틸리티 기능을 포함합니다.