diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..61f9604 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,225 @@ +# CLAUDE.md + +이 파일은 Claude Code (claude.ai/code)가 이 저장소에서 작업할 때 참고할 가이드입니다. + +## 프로젝트 개요 + +전자정부 표준프레임워크(eGovFramework) v3.9.0 기반의 Maven 빌드 Java 웹 애플리케이션입니다. 문자ON("MunjaON")이라는 SMS/MMS/카카오톡 메시징 서비스의 관리자 플랫폼입니다. + +**기술 스택:** +- Java 8 +- Spring Framework 4.3.22 +- 전자정부 표준프레임워크 3.9.0 +- iBATIS (전자정부프레임워크 경유) +- MySQL 5.1.31 +- Maven 빌드 시스템 +- JSP/JSTL 뷰 + SiteMesh 데코레이터 + +## 빌드 및 개발 + +### 빌드 명령어 + +```bash +# 컴파일 및 패키징 (WAR 파일 생성) +mvn clean install + +# 컴파일만 수행 +mvn compile + +# 내장 톰캣 실행 (설정된 경우) +mvn tomcat7:run +``` + +### 환경 설정 + +애플리케이션은 Spring 프로파일 기반 설정을 사용합니다: +- 환경 프로파일: `dev`, `local`, `prod` +- 시스템 속성으로 설정: `-Dspring.profiles.active=dev` +- 설정 파일 위치: `src/main/resources/egovframework/egovProps/globals_{profile}.properties` + +데이터베이스 설정은 활성 프로파일에 따라 `globals_{profile}.properties`에서 로드됩니다. + +## 프로젝트 아키텍처 + +### 패키지 구조 + +``` +src/main/java/ +├── egovframework.com/ # 전자정부 커스텀 서비스 +│ └── idgen/ # ID 생성 서비스 +├── itn.com/ # 공통 프레임워크 컴포넌트 +│ ├── api/ # REST API 컨트롤러 +│ ├── cmm/ # 공통 유틸리티 & 기본 클래스 +│ │ ├── aspect/ # AOP 로깅 +│ │ ├── filter/ # XSS/보안 필터 +│ │ ├── interceptor/ # 요청 인터셉터 +│ │ └── service/ # 공통 서비스 (파일, 사용자) +│ ├── sym/ # 시스템 관리 (로깅) +│ ├── uss/ # 사용자 지원 서비스 +│ │ ├── ion/ # 통합 (배너, 설정, API) +│ │ └── olh/ # 온라인 도움말 +│ └── utl/ # 유틸리티 +└── itn.let/ # 비즈니스 로직 모듈 + ├── kakao/ # 카카오톡 메시지 서비스 + ├── mail/ # 이메일 서비스 + ├── mjo/ # 핵심 메시징 (SMS/MMS) + ├── cert/ # 본인인증 + ├── fax/ # 팩스 서비스 + └── schdlr/ # 스케줄러 작업 +``` + +### 계층형 아키텍처 + +표준 MVC 계층형 아키텍처를 따릅니다: + +1. **컨트롤러 계층** (`*.web.*Controller`) + - 요청 처리 및 응답 생성 + - URL 패턴: `*.do` (Spring DispatcherServlet 매핑) + - `*.web` 패키지에 위치 + +2. **서비스 계층** (`*.service.*Service`, `*ServiceImpl`) + - 비즈니스 로직 구현 + - 트랜잭션 경계 정의 + - 인터페이스-구현체 패턴 + +3. **DAO 계층** (`*.service.impl.*DAO`) + - iBATIS SqlMapClient를 사용한 데이터 접근 + - 공통 작업을 위해 `EgovComAbstractDAO` 상속 + - SQL 매핑: `src/main/resources/egovframework/sqlmap/` + +4. **VO/DTO 계층** (`*VO`, `*DTO`) + - 데이터 전송 객체 + - 페이징을 위해 `ComDefaultVO` 상속 + +### 주요 기본 클래스 + +- **EgovComAbstractDAO**: iBATIS 작업(`insert`, `update`, `delete`, `select`, `selectList`)을 포함한 기본 DAO +- **ComDefaultVO**: 페이징 지원 기본 VO (`pageIndex`, `pageUnit`, `pageSize`) +- **ComDefaultCodeVO**: 코드 기반 엔티티용 기본 VO + +### 설정 파일 + +**Spring 설정:** +- `src/main/resources/egovframework/spring/com/context-*.xml` - 애플리케이션 컨텍스트 +- `src/main/webapp/WEB-INF/config/egovframework/springmvc/*.xml` - MVC 설정 +- 주요 컨텍스트: + - `context-datasource.xml` - 데이터베이스 연결 (프로파일 기반) + - `context-sqlMap.xml` - iBATIS SQL 매핑 설정 + - `context-security.xml` - Spring Security 설정 + - `context-aspect.xml` - AOP 로깅 설정 + +**SQL 매핑:** +- 위치: `src/main/resources/egovframework/sqlmap/config/mysql/` +- 패턴: `sql-map-config-mysql-{모듈명}.xml` +- SQL 정의: `src/main/resources/egovframework/sqlmap/com/**/*_SQL_Mysql.xml` + +**뷰 설정:** +- JSP 위치: `src/main/webapp/WEB-INF/jsp/` +- SiteMesh 데코레이터: `src/main/webapp/WEB-INF/decorators.xml` +- 레이아웃 템플릿: `src/main/webapp/WEB-INF/jsp/layout/` + +## 주요 기능 + +### 보안 및 필터 + +- **Spring Security**: `context-security.xml`을 통해 설정 +- **XSS 필터**: `XssFilter`가 요청을 래핑하여 입력값 검증 +- **문자 인코딩**: 기본 UTF-8, 특정 결제 엔드포인트는 EUC-KR +- **CORS**: `CORSFilter`를 통해 활성화 + +### 외부 연동 + +- **결제 게이트웨이**: KG 모빌리언스 (`globals.properties`에 설정) +- **본인인증**: NiceID, KMC, ARS 인증 +- **메시징 API**: 카카오톡, SMS/MMS 서비스 +- **파일 업로드**: Apache Commons FileUpload +- **PDF 처리**: Apache PDFBox +- **엑셀**: Apache POI + +### 스케줄 작업 + +- Quartz 스케줄러 설정: `context-scheduling-*.xml` +- 작업 구현: `itn.let.schdlr` 패키지 +- 분산 작업 잠금을 위해 ShedLock 사용 (JDBC 기반) + +## 개발 가이드 + +### 신규 기능 추가 절차 + +1. **VO 생성**: `ComDefaultVO` 또는 `ComDefaultCodeVO` 상속 +2. **SQL 매퍼 생성**: `src/main/resources/egovframework/sqlmap/`에 XML 추가 +3. **SQL 설정 등록**: `sql-map-config-mysql-{모듈명}.xml`에 등록 +4. **DAO 생성**: `EgovComAbstractDAO` 상속 +5. **서비스 생성**: 인터페이스 + 구현체 패턴 +6. **컨트롤러 생성**: `@Controller` 또는 `@RestController` 사용 +7. **JSP 생성**: `src/main/webapp/WEB-INF/jsp/{모듈명}/`에 배치 + +### 코드 규칙 + +- 전자정부 프레임워크 표준과 네이밍 규칙을 따름 +- 서비스 인터페이스는 `Service` 접미사 +- 서비스 구현체는 `ServiceImpl` 접미사 +- DAO 클래스는 `DAO` 접미사 +- 컨트롤러 클래스는 `Controller` 접미사 +- 의존성 주입은 `@Resource(name="빈이름")` 사용 + +### iBATIS SQL 매핑 + +SQL 구문은 네임스페이스.구문ID 패턴으로 참조: +```java +// EgovComAbstractDAO를 상속한 DAO에서 +insert("모듈명.insertData", vo); +selectList("모듈명.selectDataList", searchVO); +``` + +### 주요 작업 패턴 + +**페이징:** +```java +// VO에서 +ComDefaultVO를 상속하여 페이징 필드 사용 +// PaginationInfo와 ImagePaginationRenderer 활용 +``` + +**파일 업로드:** +```java +// 파일 작업은 EgovFileMngService 사용 +// Globals.file.saveDir 속성 기반으로 파일 저장 +``` + +**로깅:** +```java +// LoggerAspect를 통한 AOP 기반 로깅 +// log4jdbc를 통한 SQL 로깅 +``` + +## 테스트 + +현재 Maven 설정에서 테스트가 비활성화되어 있습니다(`pom.xml`의 `skipTests=true`). 활성화하려면: +```bash +# pom.xml의 surefire 플러그인 설정 수정 후 실행: +mvn test +``` + +## 배포 + +애플리케이션은 WAR 파일(`mjon.war`)로 빌드되어 Tomcat에 배포됩니다: +- 배포 경로: `/usr/local/tomcat` (운영) +- 포트: Tomcat server.xml에서 설정 +- 세션 타임아웃: 600분 (10시간) +- 에러 페이지: `/common/error.jsp` + +### 환경별 배포 + +1. 적절한 프로파일 설정: `-Dspring.profiles.active={dev|prod}` +2. `globals_{profile}.properties`에 데이터베이스 자격증명 확인 +3. properties에 파일 경로(ckeditor, fax 등) 설정 +4. WAR 파일을 Tomcat webapps 디렉토리에 배포 + +## 중요 사항 + +- **문자 인코딩**: 레거시 결제 시스템을 위한 UTF-8/EUC-KR 혼용 +- **데이터베이스**: MySQL 5.x - 구버전 iBATIS 사용 (MyBatis 아님) +- **보안**: Spring Security 통합, `EgovUserDetailsService`를 통한 사용자 정보 +- **프로파일 필수**: 애플리케이션 시작 시 `-Dspring.profiles.active` 필요 +- **외부 라이브러리**: `WEB-INF/lib`에 일부 JAR 파일 (결제, 인증 모듈) diff --git a/RESTAPI문자테스트_화면설계서_1차_250917_정다은 (1).pptx b/RESTAPI문자테스트_화면설계서_1차_250917_정다은 (1).pptx new file mode 100644 index 0000000..cb76a04 Binary files /dev/null and b/RESTAPI문자테스트_화면설계서_1차_250917_정다은 (1).pptx differ diff --git a/button_01.png b/button_01.png new file mode 100644 index 0000000..311c642 Binary files /dev/null and b/button_01.png differ diff --git a/src/main/java/itn/let/mail/service/StatusResponse.java b/src/main/java/itn/let/mail/service/StatusResponse.java index 50649c9..b2cf57b 100644 --- a/src/main/java/itn/let/mail/service/StatusResponse.java +++ b/src/main/java/itn/let/mail/service/StatusResponse.java @@ -73,6 +73,13 @@ public class StatusResponse { this.timestamp = timestamp; } + public StatusResponse(HttpStatus status, String message, Object object, LocalDateTime timestamp) { + this.status = status; + this.message = message; + this.object = object; + this.timestamp = timestamp; + } + public StatusResponse(HttpStatus status, String message, LocalDateTime timestamp) { this.status = status; this.message = message; diff --git a/src/main/java/itn/let/mjo/api/sms/service/ApiAccLogVO.java b/src/main/java/itn/let/mjo/api/sms/service/ApiAccLogVO.java new file mode 100644 index 0000000..f6d99df --- /dev/null +++ b/src/main/java/itn/let/mjo/api/sms/service/ApiAccLogVO.java @@ -0,0 +1,50 @@ +package itn.let.mjo.api.sms.service; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +/** + * api key 관리 + * @since 2025.11.05 + * @version 1.0 + * @see + * + *
+ * << 개정이력(Modification Information) >> + * + * 수정일 수정자 수정내용 + * ------- -------- --------------------------- + * 2025.11.05 이호영 최초 생성 + * + *+ */ + + + +@Getter +@Setter +@ToString +public class ApiAccLogVO{ + + private String logId; + private String accessType; + private String accessKey; + private String accessToken; + private String reqUserId; + private String reqInfoMeth; + private String reqUrl; + private String resCode; + private String reqRegistPnttm; + private String reqRegisterId; + private String resUpdtPnttm; + private String resUpdusrId; + + private String reqCnStr; // JSON 문자열 임시 저장 + private String resCnStr; // JSON 문자열 임시 저장 + + private ReqCnVO reqCn; // JSON → 객체 변환 후 세팅 + private ResCnVO resCn; + + +} \ No newline at end of file diff --git a/src/main/java/itn/let/mjo/api/sms/service/ApiSmsTestMsgService.java b/src/main/java/itn/let/mjo/api/sms/service/ApiSmsTestMsgService.java new file mode 100644 index 0000000..172ee21 --- /dev/null +++ b/src/main/java/itn/let/mjo/api/sms/service/ApiSmsTestMsgService.java @@ -0,0 +1,56 @@ +package itn.let.mjo.api.sms.service; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; + +import itn.let.mail.service.StatusResponse; +import itn.let.mjo.apikey.service.ApiKeyVO; + +/** + * api key 관리 + * @since 2009.04.10 + * @version 1.0 + * @see + * + *
+ * << 개정이력(Modification Information) >> + * + * 수정일 수정자 수정내용 + * ------- -------- --------------------------- + * 2009.04.10 조재영 최초 생성 + * 2017.07.21 장동한 로그인인증제한 작업 + * + *+ */ +public interface ApiSmsTestMsgService { + + StatusResponse findByApiInfoWhereMberIdAjax(String checkId); + + Map
+ * << 개정이력(Modification Information) >> + * + * 수정일 수정자 수정내용 + * ------- -------- --------------------------- + * 2025.11.05 이호영 최초 생성 + * + *+ */ + + + +@Getter +@Setter +@ToString +public class ReqCnVO { + + // === 조회/페이징 === + private String page; + private String pageSize; + private String startDate; + private String endDate; + + // === 카카오 템플릿 전송 관련 === + private String bizId; + private String apiKey; + private String senderKey; + private String templateCode; + private Boolean hasTemplateTitle; + private String subMsgSendYn; // "Y"/"N" + private List