패키지 구조
com.scraping.agent 패키지 구조 및 도메인 분리 규칙
최종 수정:
패키지 구조
기본 패키지
com.scraping.agent
전체 구조
com.scraping.agent
├── domain/
│ ├── admin/
│ │ └── controller/
│ │ ├── AdminController.java
│ │ └── NotesAdminController.java
│ ├── code/
│ │ ├── repository/
│ │ ├── service/
│ │ ├── vo/
│ │ └── Code.java
│ ├── digest/ # AI 다이제스트
│ │ ├── ai/ # AI 에이전트
│ │ │ ├── HeadAgent.java
│ │ │ ├── SummaryAgent.java
│ │ │ └── VerificationAgent.java
│ │ ├── controller/
│ │ ├── repository/
│ │ ├── service/
│ │ │ ├── AiProcessingService.java
│ │ │ ├── DigestNewsService.java
│ │ │ ├── DigestOrchestrator.java
│ │ │ └── MailService.java
│ │ ├── vo/
│ │ └── DigestNews.java
│ ├── guide/ # 개발 가이드 (마크다운)
│ │ ├── controller/
│ │ ├── model/ # View Model (DB 없음)
│ │ ├── service/
│ │ └── vo/
│ ├── home/
│ │ └── controller/
│ ├── news/ # 뉴스 수집
│ │ ├── collector/ # 뉴스 수집기
│ │ │ ├── job/ # 채용 공고 수집기
│ │ │ ├── AiNewsCollector.java
│ │ │ ├── DevNewsCollector.java
│ │ │ └── ...
│ │ ├── controller/
│ │ ├── repository/
│ │ ├── service/
│ │ ├── CollectedItem.java
│ │ ├── ContentType.java # Enum
│ │ ├── NewsItem.java
│ │ └── VerificationStatus.java # Enum
│ ├── notes/
│ │ ├── controller/
│ │ ├── repository/
│ │ ├── service/
│ │ ├── vo/
│ │ └── Post.java
│ └── resume/
│ ├── controller/
│ ├── service/
│ └── vo/
└── global/
├── batch/ # 스케줄러 (DigestScheduler)
├── common/ # 공통 클래스 (ApiResponse, BaseEntity)
├── config/ # 설정 (DataInitializer, DigestProperties)
├── constant/ # 상수 (CategoryConstant, CodeConstant 등)
├── exception/ # 전역 예외 처리 (GlobalExceptionHandler)
├── health/ # 헬스체크 컨트롤러
├── slack/ # Slack 알림 (SlackService, SlackEventListener)
└── util/ # 유틸리티 (FingerprintUtils)
도메인별 역할
| 도메인 | 설명 |
admin | 관리자 화면 (뉴스/노트 관리) |
code | 공통 코드 관리 (카테고리 등) |
digest | Claude AI 기반 뉴스 다이제스트 생성 및 메일 발송 |
guide | 이 docs/ 디렉터리의 마크다운 파일을 읽어 화면 렌더링 |
home | 메인 페이지 |
news | 외부 소스에서 뉴스/기술 글 수집 및 표시 |
notes | 개인 노트/포스트 관리 |
resume | 이력서 페이지 |
파일 위치 규칙
Entity
- 도메인 루트에 위치:
domain/{도메인}/{Domain}.java
- 예:
domain/news/NewsItem.java, domain/notes/Post.java
Controller
domain/{도메인}/controller/ 아래 위치
- 화면 반환:
@Controller 사용
- REST API:
@RestController 사용
Service
domain/{도메인}/service/ 아래 위치
- Interface 작성 안 함 (단일 구현체 기준)
Repository
domain/{도메인}/repository/ 아래 위치
- JPA:
JpaRepository<Entity, Long> 상속
- MyBatis:
@Mapper 인터페이스
VO (요청/응답)
domain/{도메인}/vo/ 아래 위치
- 요청:
{목적}Req.java (예: PostCreateReq)
- 응답:
{목적}Res.java (예: DigestNewsListRes)
Model (DB 없는 View Model)
domain/{도메인}/model/ 아래 위치
- 예:
domain/guide/model/GuideDoc.java
메서드 네이밍 접두사 표
| 동작 | 접두사 | 예시 |
| 등록/생성 | reg | regPost, regNews |
| 수정 | upt | uptPost, uptNews |
| 삭제 | del | delPost, delNews |
| 단건 조회 | get | getPost, getNews |
| 목록 조회 | get + List/Page | getPostList, getNewsPage |
global/ 패키지 사용 규칙
- 도메인 간 공유 로직만
global/에 위치
- 도메인 전용 로직을
global/에 넣는 것 금지
- 상수는
global/constant/{도메인}Constant.java에 관리
- 신규 유틸리티는
global/util/ 아래 추가