# 프로젝트 코딩 가이드라인 (Java Backend) AI 에디터(Agent)는 다음 규칙을 항상 준수하여 코드를 작성하고 수정해야 합니다. ## 0. 기본 소통 규칙 (Communication) - **언어**: 사용자에 대한 모든 답변과 코드 설명은 항상 **한글(Korean)**로만 작성해야 합니다. ## 1. 패키지 구성 (Package Structure) - **베이스 패키지**: `com.madeuhome` - **컨트롤러 (Controller)**: `ctrl` - **서비스 (Service)**: `svc` - **DTO (Data Transfer Object)**: `dto` - **매퍼 (Mapper)**: `mapper` - **공통 서비스**: `com.madeuhome.common.service` (LogHistoryService 등 시스템 공통 모듈) ## 2. 파일 명명 규칙 및 구성 (File Naming Conventions) - **컨트롤러 (Controller)**: `[도메인명]Controller.java` (예: `ABCDController.java`) - **서비스 (Service)**: `[도메인명]Service.java` (인터페이스와 구현체(impl)를 분리하지 않고 Service 클래스 파일 하나로만 구현, 예: `ABCDService.java`) - **DTO**: `[도메인명]DTO.java` (예: `ABCDDTO.java`) - **매퍼 (Mapper)**: `[도메인명]Mapper.java` (예: `ABCDMapper.java`) - **XML Mapper**: `[도메인명]SqlMap.xml` (namespace는 Mapper 인터페이스의 **FQCN**과 반드시 일치) ## 3. URL 및 메소드 명명 규칙 (RequestMapping & Method Naming) ### 1) RequestMapping (URL) 및 컨트롤러 메소드명 - 페이지 이동하는 url : `moveXXXX.do` - 팝업 오픈하는 url : `openXXXX.do` - 조회 url : `getXXXX.do` - 저장 url : `putXXXX.do` - 수정 url : `modXXXX.do` - 삭제 url : `delXXXX.do` - **단, 컨트롤러 메소드명은 위 url에서 `.do`를 제외한 이름과 동일하게 명명합니다.** ### 2) 서비스 메소드명 - 서비스 메소드명은 **컨트롤러 메소드명과 동일**하게 명명합니다. - 조회: `getXXXX` / 목록 조회: `getXXXXList` - 저장: `putXXXX` - 수정: `modXXXX` - 삭제: `delXXXX` ### 3) Mapper 인터페이스 메소드명 - 단일조회 : `selectXXXX` - 리스트조회 : `selectListXXXX` - insert : `insertXXXX` - update : `updateXXXX` - delete : `deleteXXXX` ## 4. 데이터베이스 연동 정보 (DB Connection) - `application-local.yml`의 설정을 기반으로 한 공통 접속 정보입니다. - **Host**: 183.98.184.84 - **Port**: 3306 - **Database**: madeu - **User**: madeu - **Password**: apdlemdb12#$ ## 5. 아키텍처 및 코딩 원칙 (Architecture & Coding Principles) ### 5-1. 컨트롤러 원칙 (Skinny Controller) - 컨트롤러에는 비즈니스 로직이나 예외처리 로직을 넣지 않고, **서비스 메서드를 호출하는 1줄로만 작성**합니다. - 컨트롤러 클래스는 `@Controller` 대신 **`@RestController`**를 사용하며, `@ResponseBody`는 생략합니다. - 데이터 입출력 메소드의 파라미터는 **단일 DTO 하나만 `@RequestBody`**로 받습니다. - 파일 업로드가 포함된 경우에만 `@ModelAttribute` + `@RequestParam MultipartFile`을 허용합니다. - 화면 이동(`move~`) 메소드는 **`ModelAndView`를 리턴**합니다. (`@RestController`에서 String 리턴 시 뷰 이름이 아닌 응답 바디로 해석되므로) - 화면 이동 메소드의 뷰 경로는 **컨트롤러에서 직접 명시**합니다. (서비스에 위임 금지) ### 5-2. 서비스 원칙 (Service Layer) - 에러 처리(try-catch), 응답 메시지(msgCode, msgDesc) 설정은 **서비스 계층에서 전담**합니다. - `HttpServletRequest`, `HttpSession`은 `@Autowired`로 직접 주입받아 사용합니다. (Spring이 Request-scope 프록시로 제공) - `session.getAttribute("loginMemberId")`를 통해 로그인 ID를 가져오고, DTO에 설정합니다. ### 5-3. DTO 원칙 (DTO Communication) - **HashMap 사용 금지**. 컨트롤러 ↔ 서비스 ↔ 매퍼 간 모든 데이터는 **DTO 객체만 사용**합니다. - DTO에는 `@Data` (Lombok)을 사용합니다. - DTO 필드 구성: - **DB 컬럼 매핑 필드**: `muProcedureReviewId`, `title`, `content` 등 - **조회 결과 전용 필드**: `rowNum`, `writeDate`, `writeName` 등 - **검색/UI 변수**: `startDate`, `endDate`, `start`, `limit`, `sort`, `dir` 등 - **응답 매핑 변수**: `msgCode`, `msgDesc`, `success`, `totalCount`, `rows`(Object 타입), `tId` ### 5-4. Mapper 원칙 (MyBatis Mapper) - Mapper는 **`@Mapper` 어노테이션을 사용한 인터페이스**로 작성합니다. (`SqlSessionDaoSupport` 상속 금지) - XML Mapper의 `namespace`는 Mapper 인터페이스의 **FQCN(Fully Qualified Class Name)**과 일치시킵니다. - XML의 `resultType`은 `hashmap` 대신 **DTO FQCN**을 사용합니다. - 예외: 도메인 외부 테이블 조회(카테고리 등)는 `hashmap` 허용 - XML alias는 **DTO 필드명(camelCase)**과 정확히 일치시킵니다. - 단건 조회는 `List` 대신 **DTO 단일 객체를 리턴**합니다. ## 6. 파일 업로드 규칙 (File Upload) - `MultipartFile.transferTo()` 사용 시 반드시 **절대경로를 명시**합니다: ```java File dest = new File(outDir, savedName); file.transferTo(dest.toPath().toAbsolutePath()); ``` - 상대경로 사용 시 Tomcat 임시 디렉토리 기준으로 해석되어 오류가 발생합니다.