7.5 KiB
7.5 KiB
프로젝트 코딩 가이드라인 (Java Backend)
AI 에디터(Agent)는 다음 규칙을 항상 준수하여 코드를 작성하고 수정해야 합니다.
0. 기본 소통 규칙 (Communication)
- 언어: 사용자에 대한 모든 답변과 코드 설명은 항상 **한글(Korean)**로만 작성해야 합니다.
1. 패키지 구성 (Package Structure)
- 컨트롤러 (Controller):
ctrl - 서비스 (Service):
svc - DTO (Data Transfer Object):
dto - 매퍼 (Mapper):
mapper - 공통 서비스:
com.madeu.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에 설정합니다.- 권한 체크는
request.getAttribute("selectUseYn")등 인터셉터가 설정한 값을 참조합니다.
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등 - 접근/로직 변수:
loginMemberId - 응답 매핑 변수:
msgCode,msgDesc,success,totalCount,rows(Object 타입),tId
- DB 컬럼 매핑 필드:
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. 공통 모듈 사용 규칙 (Common Modules)
6-1. 로그 히스토리 (LogHistoryService)
- 위치:
com.madeu.common.service.LogHistoryService - CUD 작업 후 반드시 호출합니다:
logHistoryService.save("기능명", "서비스명", requestObj, responseObj, errorMsg); request,session은 LogHistoryService 내부에서 자동 주입되므로 호출 시 전달할 필요 없습니다.
6-2. 메시지 서비스 (MessageSource)
- 위치:
src/main/resources/messages.properties - 서비스에서 하드코딩 메시지 대신 메시지 코드를 사용합니다:
@Autowired private MessageSource messageSource; private String msg(String code) { return messageSource.getMessage(code, null, Locale.getDefault()); } // 사용 예 dto.setMsgDesc(msg("auth.error.select")); dto.setMsgDesc(msg("success.insert")); - 공통 메시지 코드 규칙:
- 권한 오류:
auth.error.{select|insert|update|delete|noAuth} - CRUD 성공:
success.{insert|update|delete} - CRUD 실패:
error.{select|insert|update|delete} - 모듈별 메시지:
{모듈명}.{카테고리}.{설명}(예:procedureReview.error.noData)
- 권한 오류:
7. 인터셉터 및 필터 규칙 (Interceptor & Filter)
7-1. WebLoginInterceptor
- 인터셉터
postHandle에서 권한 속성(selectUseYn,insertUseYn,updateUseYn,deleteUseYn)을 ModelAndView에 주입합니다. - 서비스에서
request.getAttribute("xxxUseYn")으로 권한을 체크합니다.
7-2. RequestCachingFilter (CachedBodyRequestWrapper)
application/json요청만CachedBodyRequestWrapper로 래핑합니다.- Multipart, GET 등 다른 요청은 래핑하지 않습니다.
8. 파일 업로드 규칙 (File Upload)
MultipartFile.transferTo()사용 시 반드시 절대경로를 명시합니다:File dest = new File(outDir, savedName); file.transferTo(dest.toPath().toAbsolutePath());- 상대경로 사용 시 Tomcat 임시 디렉토리 기준으로 해석되어 오류가 발생합니다.
9. 참조 구현체 (Reference Implementation)
ProcedureReview모듈이 위 규칙의 기준 구현체입니다.- 새로운 모듈 개발 시
com.madeu.crm.procedureReview패키지 구조를 참고합니다:ctrl/ProcedureReviewController.java- Skinny Controller 패턴svc/ProcedureReviewService.java- MessageSource + LogHistoryService + DTO 기반dto/ProcedureReviewDTO.java- 응답/검색/DB 매핑 필드 분류mapper/ProcedureReviewMapper.java- @Mapper 인터페이스mappers/ProcedureReviewSqlMap.xml- DTO resultType + FQCN namespace