# 🎯 Java-Service-Tree-Framework-Backend-Core > A-RMS의 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 및 데이터 관리 λ°±μ—”λ“œ μ„œλΉ„μŠ€ [![Java](https://img.shields.io/badge/Java-11-orange.svg)](https://openjdk.java.net/) [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-2.3.12-brightgreen.svg)](https://spring.io/projects/spring-boot) [![Spring Cloud](https://img.shields.io/badge/Spring%20Cloud-Hoxton.SR9-blue.svg)](https://spring.io/projects/spring-cloud) [![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) ## πŸ“‹ λͺ©μ°¨ - [ν”„λ‘œμ νŠΈ κ°œμš”](#-ν”„λ‘œμ νŠΈ-κ°œμš”) - [μ£Όμš” κΈ°λŠ₯](#-μ£Όμš”-κΈ°λŠ₯) - [기술 μŠ€νƒ](#-기술-μŠ€νƒ) - [μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜](#-μ‹œμŠ€ν…œ-μ•„ν‚€ν…μ²˜) - [ν”„λ‘œμ νŠΈ ꡬ쑰](#-ν”„λ‘œμ νŠΈ-ꡬ쑰) - [μ‹œμž‘ν•˜κΈ°](#-μ‹œμž‘ν•˜κΈ°) - [API λ¬Έμ„œ](#-api-λ¬Έμ„œ) - [배포](#-배포) - [개발 κ°€μ΄λ“œ](#-개발-κ°€μ΄λ“œ) --- ## 🎯 ν”„λ‘œμ νŠΈ κ°œμš” **Backend-Core**λŠ” A-RMS(Requirements Management System)의 핡심 λ°±μ—”λ“œ μ„œλΉ„μŠ€λ‘œ, λͺ¨λ“  λΉ„μ¦ˆλ‹ˆμŠ€ 둜직, 데이터 관리, 그리고 μ—”ν„°ν”„λΌμ΄μ¦ˆ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. ### 핡심 μ—­ν•  - πŸ“Š **μš”κ΅¬μ‚¬ν•­ 관리**: μš”κ΅¬μ‚¬ν•­ 생λͺ…μ£ΌκΈ° 전체 관리 - πŸ”— **Jira 톡합**: Jira Cloud/Server 연동 및 동기화 - πŸ“ˆ **뢄석 μ—”μ§„**: λΉ„μš©/μ‹œκ°„/λ²”μœ„/λ¦¬μ†ŒμŠ€ 뢄석 - πŸ“„ **λ¦¬ν¬νŒ…**: Full Data Report, SWOT 뢄석 - πŸ‘₯ **μ œν’ˆ/μ„œλΉ„μŠ€ 관리**: μ œν’ˆ 및 버전 관리 - πŸ“ **μœ„ν‚€ & λΈ”λ‘œκ·Έ**: λ¬Έμ„œ 관리 μ‹œμŠ€ν…œ - πŸ” **λ³΄μ•ˆ & 인증**: Keycloak 톡합 인증/인가 ### λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜ ``` [Global-Config Server] ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” ↓ ↓ ↓ [Backend-Core] ⭐ [Engine-Fire] [Middleware-Proxy] ↓ ↓ ↓ [MySQL DB] [Kafka] [API Gateway] ↓ [Flyway Migration] ``` --- ## ✨ μ£Όμš” κΈ°λŠ₯ ### 1. μš”κ΅¬μ‚¬ν•­ 관리 (Requirement Management) #### μš”κ΅¬μ‚¬ν•­ 생λͺ…μ£ΌκΈ° - **μš”κ΅¬μ‚¬ν•­ μΆ”κ°€** (`reqadd`) - μƒˆλ‘œμš΄ μš”κ΅¬μ‚¬ν•­ 등둝 - **μš”κ΅¬μ‚¬ν•­ μƒνƒœ** (`reqstate`) - μƒνƒœ μ „ν™˜ 관리 - **μš”κ΅¬μ‚¬ν•­ μš°μ„ μˆœμœ„** (`reqpriority`) - μš°μ„ μˆœμœ„ 관리 - **μš”κ΅¬μ‚¬ν•­ λ‚œμ΄λ„** (`reqdifficulty`) - λ³΅μž‘λ„ 평가 - **μš”κ΅¬μ‚¬ν•­ 리뷰** (`reqreview`) - κ²€ν†  ν”„λ‘œμ„ΈμŠ€ - **μš”κ΅¬μ‚¬ν•­ μ½”λ©˜νŠΈ** (`reqcomment`) - ν˜‘μ—… 및 λ…Όμ˜ #### μƒνƒœ 관리 - μƒνƒœ μΉ΄ν…Œκ³ λ¦¬ μ‹œμŠ€ν…œ - μƒνƒœ μ „ν™˜ μ›Œν¬ν”Œλ‘œμš° - μƒνƒœ λ³€κ²½ 이λ ₯ 좔적 (둜그) #### μΊ˜λ¦°λ” λ·° - μš”κ΅¬μ‚¬ν•­ 일정 관리 - κ°„νŠΈ 차트 톡합 - λ§ˆμΌμŠ€ν†€ 좔적 ### 2. Jira 톡합 #### Jira μ„œλ²„ 관리 ```java - jiraserver: Jira μ„œλ²„ μ„€μ • 관리 - jiraserverlog: μ„œλ²„ λ³€κ²½ 이λ ₯ - jiraserver_pure: 순수 μ„œλ²„ 데이터 - jiraserver_project_pure: μ„œλ²„-ν”„λ‘œμ νŠΈ 관계 ``` #### Jira ν”„λ‘œμ νŠΈ 동기화 ```java - jiraproject: Jira ν”„λ‘œμ νŠΈ λ§€ν•‘ - jiraprojectlog: ν”„λ‘œμ νŠΈ λ³€κ²½ 이λ ₯ - jiraproject_pure: 순수 ν”„λ‘œμ νŠΈ 데이터 - jiraproject_issuetype_pure: ν”„λ‘œμ νŠΈ-μ΄μŠˆνƒ€μž… 관계 ``` #### Jira 메타데이터 ```java - jiraissuetype: 이슈 νƒ€μž… (Bug, Task, Story λ“±) - jiraissuestatus: 이슈 μƒνƒœ (To Do, In Progress, Done λ“±) - jiraissuestatuscategorymap: μƒνƒœ μΉ΄ν…Œκ³ λ¦¬ λ§€ν•‘ - jiraissuepriority: 이슈 μš°μ„ μˆœμœ„ - jiraissueresolution: 이슈 ν•΄κ²°μ±… (Fixed, Won't Fix λ“±) ``` ### 3. μ œν’ˆ/μ„œλΉ„μŠ€ 관리 #### μ œν’ˆ μ„œλΉ„μŠ€ (Product Service) ```java - pdservice: μ œν’ˆ μ„œλΉ„μŠ€ λ§ˆμŠ€ν„° - pdservicelog: μ œν’ˆ λ³€κ²½ 이λ ₯ - pdserviceversion: μ œν’ˆ 버전 관리 - pdserviceversionlog: 버전 λ³€κ²½ 이λ ₯ - pdservice_detail: μ œν’ˆ 상세 정보 - pdservice_pure: 순수 μ œν’ˆ 데이터 ``` **κΈ°λŠ₯:** - μ œν’ˆ 계측 ꡬ쑰 (Tree ꡬ쑰) - 버전별 μš”κ΅¬μ‚¬ν•­ λ§€ν•‘ - μ œν’ˆ λ‘œλ“œλ§΅ 관리 - 릴리즈 κ³„νš ### 4. 뢄석 μ—”μ§„ #### 4κ°€μ§€ 뢄석 μ˜μ—­ ``` api/analysis/ β”œβ”€β”€ cost/ # λΉ„μš© 뢄석 β”‚ └── μ˜ˆμ‚° 좔적, ROI 계산 β”œβ”€β”€ time/ # μ‹œκ°„ 뢄석 β”‚ └── 일정 μ€€μˆ˜μœ¨, μ§€μ—° 뢄석 β”œβ”€β”€ scope/ # λ²”μœ„ 뢄석 β”‚ └── κΈ°λŠ₯ λ²”μœ„, λ³€κ²½ 관리 └── resource/ # λ¦¬μ†ŒμŠ€ 뢄석 └── 인λ ₯ 배치, 업무 λΆ€ν•˜ ``` **μ£Όμš” λ©”νŠΈλ¦­:** - μš”κ΅¬μ‚¬ν•­ μ™„λ£Œμœ¨ - 평균 ν•΄κ²° μ‹œκ°„ - μš°μ„ μˆœμœ„ 뢄포 - μƒνƒœλ³„ 톡계 ### 5. λ¦¬ν¬νŒ… μ‹œμŠ€ν…œ #### Full Data Report ```java api/report/fulldata/ ``` - 전체 μš”κ΅¬μ‚¬ν•­ 데이터 μΆ”μΆœ - Excel/PDF ν˜•μ‹ 지원 - μ»€μŠ€ν…€ 필터링 #### 메일 리포트 ```java api/report/mail/ ``` - μ •κΈ° 리포트 μžλ™ λ°œμ†‘ - Thymeleaf ν…œν”Œλ¦Ώ μ—”μ§„ - HTML 메일 지원 ### 6. λŒ€μ‹œλ³΄λ“œ ```java api/dashboard/ ``` **μœ„μ ―:** - μš”κ΅¬μ‚¬ν•­ ν˜„ν™©νŒ - 진척도 차트 - μš°μ„ μˆœμœ„ 뢄포 - νŒ€λ³„ μ›Œν¬λ‘œλ“œ - 이슈 νŠΈλ Œλ“œ ### 7. κΈ€λ‘œλ²Œ 트리맡 ```java api/globaltreemap/ ``` **Tree 기반 데이터 ꡬ쑰:** - 계측적 데이터 관리 - λ“œλž˜κ·Έ μ•€ λ“œλ‘­ μž¬μ •λ ¬ - λΆ€λͺ¨-μžμ‹ 관계 관리 - 경둜 탐색 ### 8. μœ„ν‚€ & λΈ”λ‘œκ·Έ #### μœ„ν‚€ ```java api/wiki/ ``` - Markdown 지원 - 버전 관리 - 검색 κΈ°λŠ₯ #### λΈ”λ‘œκ·Έ ```java api/blog/ ``` - 기술 λΈ”λ‘œκ·Έ - μΉ΄ν…Œκ³ λ¦¬ 관리 - νƒœκ·Έ μ‹œμŠ€ν…œ ### 9. λ°±μ˜€ν”ΌμŠ€ μ‹œμŠ€ν…œ ```java api/backoffice/ β”œβ”€β”€ config/ # μ‹œμŠ€ν…œ μ„€μ • β”œβ”€β”€ information/ # μ‹œμŠ€ν…œ 정보 └── system/ # μ‹œμŠ€ν…œ 관리 ``` **관리 κΈ°λŠ₯:** - μ‚¬μš©μž 관리 - κΆŒν•œ 관리 - μ‹œμŠ€ν…œ μ„€μ • - 둜그 λͺ¨λ‹ˆν„°λ§ ### 10. λ§ˆμΌ€νŒ… & 고객 관리 #### λ‰΄μŠ€λ ˆν„° ```java api/newsletter/ ``` - κ΅¬λ…μž 관리 - 메일 λ°œμ†‘ - ν…œν”Œλ¦Ώ 관리 #### 고객 사둀 ```java api/clientcase/ ``` - 성곡 사둀 관리 - 레퍼런슀 관리 #### νŒ¨μΉ˜λ…ΈνŠΈ ```java api/patchnote/ ``` - 버전 릴리즈 λ…ΈνŠΈ - 변경사항 곡지 #### PoC (Proof of Concept) ```java api/poc/ ``` - PoC μš”μ²­ 관리 - μ§„ν–‰ μƒνƒœ 좔적 - κ²°κ³Ό 보고 --- ## πŸ”§ 기술 μŠ€νƒ ### 핡심 ν”„λ ˆμž„μ›Œν¬ | μΉ΄ν…Œκ³ λ¦¬ | 기술 | 버전 | |---------|------|------| | **Language** | Java | 11 | | **Framework** | Spring Boot | 2.3.12 | | **Cloud** | Spring Cloud | Hoxton.SR9 | | **Build** | Gradle | 6.9.1 | | **Container** | Docker | Latest | ### μ£Όμš” 라이브러리 #### Spring Boot Starters ```gradle // Web & REST API implementation 'org.springframework.boot:spring-boot-starter-web' // AOP implementation 'org.springframework.boot:spring-boot-starter-aop' // Cache implementation 'org.springframework.boot:spring-boot-starter-cache' // Validation implementation 'org.springframework.boot:spring-boot-starter-validation' // Actuator implementation 'org.springframework.boot:spring-boot-starter-actuator' // Mail implementation 'org.springframework.boot:spring-boot-starter-mail' // Thymeleaf (Template Engine) implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' ``` #### 데이터 μ•‘μ„ΈμŠ€ ```gradle // JPA & Hibernate implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.hibernate:hibernate-core:5.6.15.Final' implementation 'org.hibernate:hibernate-entitymanager:5.6.15.Final' // MyBatis implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.1' // MySQL implementation 'mysql:mysql-connector-java:8.0.32' // Flyway (DB Migration) implementation 'org.flywaydb:flyway-core' // SQL Logging implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16' ``` #### Spring Cloud ```gradle // Config Client implementation 'org.springframework.cloud:spring-cloud-starter-config' // OpenFeign (MSA Communication) implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' // Sleuth (Distributed Tracing) implementation 'org.springframework.cloud:spring-cloud-starter-sleuth:2.2.6.RELEASE' // Zipkin (Tracing Server) implementation 'org.springframework.cloud:spring-cloud-sleuth-zipkin:2.2.6.RELEASE' ``` #### λ³΄μ•ˆ ```gradle // Spring Security implementation 'org.springframework.security:spring-security-web:5.3.13.RELEASE' // Keycloak implementation 'org.keycloak:keycloak-spring-security-adapter:12.0.4' ``` #### λ©”μ‹œμ§• & μ•Œλ¦Ό ```gradle // Kafka implementation 'org.springframework.kafka:spring-kafka' // Slack API implementation 'com.slack.api:slack-api-client:1.25.1' ``` #### λ¬Έμ„œ 처리 ```gradle // Apache POI (Excel) implementation 'org.apache.poi:poi:5.1.0' implementation 'org.apache.poi:poi-ooxml:5.1.0' // HTML Parser implementation 'org.jsoup:jsoup:1.14.3' ``` #### μœ ν‹Έλ¦¬ν‹° ```gradle // ModelMapper (DTO-Entity λ³€ν™˜) implementation 'org.modelmapper:modelmapper:3.1.1' // Lombok implementation 'org.projectlombok:lombok' // Guava implementation 'com.google.guava:guava:32.0.1-jre' // Gson implementation 'com.google.code.gson:gson:2.10.1' // Apache Commons implementation 'org.apache.commons:commons-lang3:3.12.0' implementation 'org.apache.commons:commons-collections4:4.4' implementation 'org.apache.commons:commons-text:1.10.0' implementation 'commons-beanutils:commons-beanutils:1.9.4' ``` #### μ›Ή 기술 ```gradle // DWR (Direct Web Remoting) implementation '313devgrp:dwr:3.3.3' // File Upload implementation 'commons-fileupload:commons-fileupload:1.5' // Email implementation 'javax.mail:mail:1.4.7' ``` #### ν…ŒμŠ€νŠΈ & ν’ˆμ§ˆ ```gradle // JUnit 5 testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' // Spring Boot Test testImplementation 'org.springframework.boot:spring-boot-starter-test' // Unitils implementation 'org.unitils:unitils:2.4' ``` #### λ¬Έμ„œν™” ```gradle // Swagger implementation 'io.springfox:springfox-boot-starter:3.0.0' implementation 'io.springfox:springfox-swagger-ui:3.0.0' ``` #### λΈŒλΌμš°μ € μžλ™ν™” ```gradle // Selenium WebDriver implementation 'org.seleniumhq.selenium:selenium-java:4.25.0' // WebDriver Manager implementation 'io.github.bonigarcia:webdrivermanager:5.9.2' ``` --- ## πŸ—οΈ μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜ ### 계측 ꡬ쑰 ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Presentation Layer β”‚ β”‚ (Controller, REST API, DWR) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Service Layer β”‚ β”‚ (Business Logic, Transaction) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Data Access Layer β”‚ β”‚ (JPA, MyBatis, DAO) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Database Layer β”‚ β”‚ (MySQL, Flyway Migration) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### Tree Service Framework **핡심 κ°œλ…:** ```java // λͺ¨λ“  도메인 객체λ₯Ό Tree ꡬ쑰둜 관리 public interface TreeService { Node addNode(Node node); Node getNode(Long id); List getChildren(Long parentId); void moveNode(Long nodeId, Long newParentId); void deleteNode(Long id); } ``` **μž₯점:** - 계측적 데이터 μžμ—°μŠ€λŸ¬μš΄ ν‘œν˜„ - λΆ€λͺ¨-μžμ‹ 관계 λͺ…ν™• - 경둜 탐색 용이 - λ“œλž˜κ·Έ μ•€ λ“œλ‘­ κ΅¬ν˜„ κ°„νŽΈ ### μ „μžμ •λΆ€ ν”„λ ˆμž„μ›Œν¬ 톡합 ``` egovframework/ β”œβ”€β”€ spring/ β”‚ β”œβ”€β”€ context-common.xml # 곡톡 μ„€μ • β”‚ β”œβ”€β”€ context-hibernate.xml # Hibernate μ„€μ • β”‚ └── context-jdbc.xml # JDBC μ„€μ • β”œβ”€β”€ mybatis/ # MyBatis 맀퍼 β”œβ”€β”€ message/ # λ©”μ‹œμ§€ λ¦¬μ†ŒμŠ€ └── validator/ # 검증 κ·œμΉ™ ``` ### Flyway λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ ``` com/arms/db/ β”œβ”€β”€ V1__init_aRMS.sql # 초기 μŠ€ν‚€λ§ˆ β”œβ”€β”€ V2__init_aRMS.sql # 2μ°¨ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ β”œβ”€β”€ ... └── V38__init_aRMS.sql # μ΅œμ‹  λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ ``` **λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ „λž΅:** - 버전 기반 순차 적용 - λ‘€λ°± λΆˆκ°€ (Forward Only) - μžλ™ 체크섬 검증 - μ‹€ν–‰ 이λ ₯ 관리 --- ## πŸ“‚ ν”„λ‘œμ νŠΈ ꡬ쑰 ``` src/main/java/com/arms/ β”œβ”€β”€ Application.java # 메인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ β”‚ β”œβ”€β”€ api/ # API 계측 β”‚ β”œβ”€β”€ requirement/ # ⭐ μš”κ΅¬μ‚¬ν•­ 관리 β”‚ β”‚ β”œβ”€β”€ reqadd/ # μš”κ΅¬μ‚¬ν•­ μΆ”κ°€ β”‚ β”‚ β”œβ”€β”€ reqaddlog/ # μš”κ΅¬μ‚¬ν•­ 둜그 β”‚ β”‚ β”œβ”€β”€ reqstate/ # μš”κ΅¬μ‚¬ν•­ μƒνƒœ β”‚ β”‚ β”œβ”€β”€ reqstatus/ # μš”κ΅¬μ‚¬ν•­ 진행상황 β”‚ β”‚ β”œβ”€β”€ reqpriority/ # μš°μ„ μˆœμœ„ β”‚ β”‚ β”œβ”€β”€ reqdifficulty/ # λ‚œμ΄λ„ β”‚ β”‚ β”œβ”€β”€ reqreview/ # 리뷰 β”‚ β”‚ β”œβ”€β”€ reqcomment/ # μ½”λ©˜νŠΈ β”‚ β”‚ └── reqstatus_calendar/ # μΊ˜λ¦°λ” β”‚ β”‚ β”‚ β”œβ”€β”€ jira/ # ⭐ Jira 톡합 β”‚ β”‚ β”œβ”€β”€ jiraserver/ # Jira μ„œλ²„ μ„€μ • β”‚ β”‚ β”œβ”€β”€ jiraproject/ # Jira ν”„λ‘œμ νŠΈ β”‚ β”‚ β”œβ”€β”€ jiraissuetype/ # 이슈 νƒ€μž… β”‚ β”‚ β”œβ”€β”€ jiraissuestatus/ # 이슈 μƒνƒœ β”‚ β”‚ β”œβ”€β”€ jiraissuepriority/ # 이슈 μš°μ„ μˆœμœ„ β”‚ β”‚ └── jiraissueresolution/ # 이슈 ν•΄κ²°μ±… β”‚ β”‚ β”‚ β”œβ”€β”€ product_service/ # ⭐ μ œν’ˆ/μ„œλΉ„μŠ€ 관리 β”‚ β”‚ β”œβ”€β”€ pdservice/ # μ œν’ˆ μ„œλΉ„μŠ€ β”‚ β”‚ β”œβ”€β”€ pdserviceversion/ # μ œν’ˆ 버전 β”‚ β”‚ β”œβ”€β”€ pdservice_detail/ # μ œν’ˆ 상세 β”‚ β”‚ └── pdservice_pure/ # 순수 μ œν’ˆ 데이터 β”‚ β”‚ β”‚ β”œβ”€β”€ analysis/ # ⭐ 뢄석 μ—”μ§„ β”‚ β”‚ β”œβ”€β”€ cost/ # λΉ„μš© 뢄석 β”‚ β”‚ β”œβ”€β”€ time/ # μ‹œκ°„ 뢄석 β”‚ β”‚ β”œβ”€β”€ scope/ # λ²”μœ„ 뢄석 β”‚ β”‚ β”œβ”€β”€ resource/ # λ¦¬μ†ŒμŠ€ 뢄석 β”‚ β”‚ └── topmenu/ # 뢄석 메뉴 β”‚ β”‚ β”‚ β”œβ”€β”€ dashboard/ # λŒ€μ‹œλ³΄λ“œ β”‚ β”œβ”€β”€ report/ # λ¦¬ν¬νŒ… β”‚ β”‚ β”œβ”€β”€ fulldata/ # Full Data Report β”‚ β”‚ └── mail/ # 메일 리포트 β”‚ β”‚ β”‚ β”œβ”€β”€ globaltreemap/ # κΈ€λ‘œλ²Œ 트리맡 β”‚ β”œβ”€β”€ wiki/ # μœ„ν‚€ β”‚ β”œβ”€β”€ blog/ # λΈ”λ‘œκ·Έ β”‚ β”œβ”€β”€ newsletter/ # λ‰΄μŠ€λ ˆν„° β”‚ β”œβ”€β”€ clientcase/ # 고객 사둀 β”‚ β”œβ”€β”€ patchnote/ # νŒ¨μΉ˜λ…ΈνŠΈ β”‚ β”œβ”€β”€ poc/ # PoC 관리 β”‚ β”‚ β”‚ β”œβ”€β”€ backoffice/ # λ°±μ˜€ν”ΌμŠ€ β”‚ β”‚ β”œβ”€β”€ config/ # μ‹œμŠ€ν…œ μ„€μ • β”‚ β”‚ β”œβ”€β”€ information/ # μ‹œμŠ€ν…œ 정보 β”‚ β”‚ └── system/ # μ‹œμŠ€ν…œ 관리 β”‚ β”‚ β”‚ β”œβ”€β”€ dwralarm/ # DWR μ•ŒλžŒ β”‚ β”‚ β”‚ └── util/ # μœ ν‹Έλ¦¬ν‹° β”‚ β”œβ”€β”€ aes/ # μ•”ν˜Έν™” β”‚ β”œβ”€β”€ aspect/ # AOP β”‚ β”œβ”€β”€ communicate/ # 톡신 β”‚ β”œβ”€β”€ dynamicdbmaker/ # 동적 DB 생성 β”‚ β”œβ”€β”€ dynamicscheduler/ # 동적 μŠ€μΌ€μ€„λŸ¬ β”‚ β”œβ”€β”€ filerepository/ # 파일 μ €μž₯μ†Œ β”‚ β”œβ”€β”€ slack/ # Slack μ•Œλ¦Ό β”‚ └── model/ # 곡톡 λͺ¨λΈ β”‚ β”œβ”€β”€ config/ # μ„€μ • 클래슀 β”‚ β”œβ”€β”€ ArmsDetailUrlConfig.java # URL 상세 μ„€μ • β”‚ β”œβ”€β”€ DwrConfig.java # DWR μ„€μ • β”‚ β”œβ”€β”€ JdbcConfig.java # JDBC μ„€μ • β”‚ β”œβ”€β”€ KafkaConfig.java # Kafka μ„€μ • β”‚ β”œβ”€β”€ MybatisConfig.java # MyBatis μ„€μ • β”‚ β”œβ”€β”€ OpenFeignConfig.java # OpenFeign μ„€μ • β”‚ β”œβ”€β”€ RouteTableConfig.java # λΌμš°νŒ… ν…Œμ΄λΈ” β”‚ β”œβ”€β”€ SlackConfig.java # Slack μ„€μ • β”‚ β”œβ”€β”€ SpringDataConfig.java # JPA μ„€μ • β”‚ β”œβ”€β”€ Swagger2Config.java # Swagger μ„€μ • β”‚ β”œβ”€β”€ ThreadPoolConfig.java # μŠ€λ ˆλ“œ ν’€ β”‚ β”œβ”€β”€ ThymeleafConfig.java # Thymeleaf μ„€μ • β”‚ └── WebConfig.java # Web MVC μ„€μ • β”‚ └── egovframework/ # μ „μžμ •λΆ€ ν”„λ ˆμž„μ›Œν¬ └── javaservice/ └── treeframework/ # Tree Service Framework src/main/resources/ β”œβ”€β”€ application.yml # μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μ • β”œβ”€β”€ bootstrap-dev.yml # 개발 ν™˜κ²½ μ„€μ • β”œβ”€β”€ bootstrap-stg.yml # μŠ€ν…Œμ΄μ§• ν™˜κ²½ μ„€μ • β”œβ”€β”€ bootstrap-live.yml # 운영 ν™˜κ²½ μ„€μ • β”œβ”€β”€ com/arms/ β”‚ β”œβ”€β”€ db/ # Flyway λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ β”‚ β”‚ β”œβ”€β”€ V1__init_aRMS.sql β”‚ β”‚ β”œβ”€β”€ V2__init_aRMS.sql β”‚ β”‚ └── ... β”‚ └── egovframework/ β”‚ β”œβ”€β”€ spring/ # Spring μ„€μ • XML β”‚ β”œβ”€β”€ mybatis/ # MyBatis 맀퍼 β”‚ β”œβ”€β”€ message/ # λ©”μ‹œμ§€ λ¦¬μ†ŒμŠ€ β”‚ └── validator/ # 검증 κ·œμΉ™ β”œβ”€β”€ dwr.xml # DWR μ„€μ • β”œβ”€β”€ logback/ # 둜그 μ„€μ • β”‚ β”œβ”€β”€ logback-dev.xml β”‚ β”œβ”€β”€ logback-stg.xml β”‚ └── logback-live.xml β”œβ”€β”€ static/ # 정적 λ¦¬μ†ŒμŠ€ └── templates/ # Thymeleaf ν…œν”Œλ¦Ώ β”œβ”€β”€ mail.html β”œβ”€β”€ chart.html └── poc/ # PoC 메일 ν…œν”Œλ¦Ώ ``` --- ## πŸš€ μ‹œμž‘ν•˜κΈ° ### ν•„μˆ˜ μš”κ΅¬μ‚¬ν•­ - β˜• **Java 11** 이상 - 🐘 **Gradle 6.9.1** 이상 - 🐬 **MySQL 8.0** 이상 - 🌍 **Global-Config Server** (μ‹€ν–‰ 쀑) - 🐳 **Docker** (선택사항) ### 1. Repository Clone ```bash git clone -b dev https://github.com/313DEVGRP/Java-Service-Tree-Framework-Backend-Core.git cd Java-Service-Tree-Framework-Backend-Core ``` ### 2. λ°μ΄ν„°λ² μ΄μŠ€ μ„€μ • #### MySQL μ„€μΉ˜ 및 λ°μ΄ν„°λ² μ΄μŠ€ 생성 ```sql -- MySQL 접속 mysql -u root -p -- λ°μ΄ν„°λ² μ΄μŠ€ 생성 CREATE DATABASE arms_dev CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- μ‚¬μš©μž 생성 및 κΆŒν•œ λΆ€μ—¬ CREATE USER 'arms_user'@'%' IDENTIFIED BY 'your_password'; GRANT ALL PRIVILEGES ON arms_dev.* TO 'arms_user'@'%'; FLUSH PRIVILEGES; ``` ### 3. ν™˜κ²½ μ„€μ • #### bootstrap-dev.yml μ„€μ • ```yaml spring: cloud: config: uri: http://localhost:33133 # Global-Config Server URL profile: dev name: javaServiceTreeFrameworkBackendCore ``` #### Config Server의 μ„€μ • 파일 (javaServiceTreeFrameworkBackendCore-dev.yml) ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/arms_dev?useSSL=false&serverTimezone=Asia/Seoul username: arms_user password: your_password driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: validate # Flyway μ‚¬μš©μœΌλ‘œ validate만 show-sql: true flyway: enabled: true locations: classpath:com/arms/db baseline-on-migrate: true server: port: 31313 # Kafka μ„€μ • (선택사항) spring: kafka: bootstrap-servers: localhost:9092 ``` ### 4. ν”„λ‘œνŒŒμΌ μ„€μ • #### IntelliJ IDEA ``` Run/Debug Configurations β†’ Active profiles: dev ``` #### μ»€λ§¨λ“œλΌμΈ ```bash export SPRING_PROFILES_ACTIVE=dev ``` ### 5. λΉŒλ“œ ```bash # Gradle Wrapper κΆŒν•œ (Linux/Mac) chmod +x gradlew # λΉŒλ“œ ./gradlew clean build # ν…ŒμŠ€νŠΈ μ œμ™Έ λΉŒλ“œ ./gradlew clean build -x test ``` ### 6. μ‹€ν–‰ #### 둜컬 μ‹€ν–‰ ```bash # Gradle둜 μ‹€ν–‰ ./gradlew bootRun # JAR둜 μ‹€ν–‰ java -jar build/libs/Java-Service-Tree-Framework-Backend-Core-25.10.x.jar ``` #### Docker둜 μ‹€ν–‰ ```bash # Docker 이미지 λΉŒλ“œ ./gradlew docker # Docker μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ docker run -d \ -p 31313:31313 \ --name backend-core \ -e SPRING_PROFILES_ACTIVE=dev \ -e SPRING_DATASOURCE_URL=jdbc:mysql://host.docker.internal:3306/arms_dev \ 313.co.kr:5550/313devgrp/java-service-tree-framework-backend-core:25.10.x ``` ### 7. ν—¬μŠ€ 체크 ```bash # μ„œλ²„ μƒνƒœ 확인 curl http://localhost:31313/actuator/health # 응닡 μ˜ˆμ‹œ { "status": "UP", "components": { "db": { "status": "UP", "details": { "database": "MySQL", "validationQuery": "isValid()" } } } } ``` ### 8. Swagger UI ``` http://localhost:31313/swagger-ui/ ``` --- ## πŸ“– API λ¬Έμ„œ ### μ£Όμš” API μ—”λ“œν¬μΈνŠΈ #### μš”κ΅¬μ‚¬ν•­ 관리 | Method | Endpoint | μ„€λͺ… | |--------|----------|------| | GET | `/api/reqadd/{id}` | μš”κ΅¬μ‚¬ν•­ 쑰회 | | POST | `/api/reqadd` | μš”κ΅¬μ‚¬ν•­ 생성 | | PUT | `/api/reqadd/{id}` | μš”κ΅¬μ‚¬ν•­ μˆ˜μ • | | DELETE | `/api/reqadd/{id}` | μš”κ΅¬μ‚¬ν•­ μ‚­μ œ | | GET | `/api/reqadd/tree` | μš”κ΅¬μ‚¬ν•­ 트리 쑰회 | | GET | `/api/reqstatus` | μš”κ΅¬μ‚¬ν•­ μƒνƒœ 쑰회 | #### Jira 톡합 | Method | Endpoint | μ„€λͺ… | |--------|----------|------| | GET | `/api/jiraserver` | Jira μ„œλ²„ λͺ©λ‘ | | POST | `/api/jiraserver` | Jira μ„œλ²„ 등둝 | | GET | `/api/jiraproject` | Jira ν”„λ‘œμ νŠΈ λͺ©λ‘ | | POST | `/api/jiraproject/sync` | Jira ν”„λ‘œμ νŠΈ 동기화 | #### μ œν’ˆ/μ„œλΉ„μŠ€ 관리 | Method | Endpoint | μ„€λͺ… | |--------|----------|------| | GET | `/api/pdservice` | μ œν’ˆ μ„œλΉ„μŠ€ λͺ©λ‘ | | POST | `/api/pdservice` | μ œν’ˆ μ„œλΉ„μŠ€ 생성 | | GET | `/api/pdserviceversion` | μ œν’ˆ 버전 λͺ©λ‘ | | POST | `/api/pdserviceversion` | μ œν’ˆ 버전 생성 | #### 뢄석 | Method | Endpoint | μ„€λͺ… | |--------|----------|------| | GET | `/api/analysis/cost` | λΉ„μš© 뢄석 | | GET | `/api/analysis/time` | μ‹œκ°„ 뢄석 | | GET | `/api/analysis/scope` | λ²”μœ„ 뢄석 | | GET | `/api/analysis/resource` | λ¦¬μ†ŒμŠ€ 뢄석 | #### λŒ€μ‹œλ³΄λ“œ | Method | Endpoint | μ„€λͺ… | |--------|----------|------| | GET | `/api/dashboard/summary` | λŒ€μ‹œλ³΄λ“œ μš”μ•½ | | GET | `/api/dashboard/chart` | 차트 데이터 | #### 리포트 | Method | Endpoint | μ„€λͺ… | |--------|----------|------| | POST | `/api/report/fulldata` | Full Data Report 생성 | | POST | `/api/report/mail` | 메일 리포트 λ°œμ†‘ | --- ## 🐳 배포 ### Docker 배포 #### 1. 이미지 λΉŒλ“œ ```bash # Gradle Task ./gradlew docker # μˆ˜λ™ λΉŒλ“œ docker build -t 313devgrp/java-service-tree-framework-backend-core:25.10.x . ``` #### 2. 이미지 ν‘Έμ‹œ ```bash docker push 313.co.kr:5550/313devgrp/java-service-tree-framework-backend-core:25.10.x ``` #### 3. Docker Compose ```yaml version: '3.8' services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: arms_dev MYSQL_USER: arms_user MYSQL_PASSWORD: arms_password ports: - "3306:3306" volumes: - mysql-data:/var/lib/mysql backend-core: image: 313.co.kr:5550/313devgrp/java-service-tree-framework-backend-core:25.10.x depends_on: - mysql ports: - "31313:31313" environment: SPRING_PROFILES_ACTIVE: dev SPRING_CLOUD_CONFIG_URI: http://global-config:33133 SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/arms_dev SPRING_DATASOURCE_USERNAME: arms_user SPRING_DATASOURCE_PASSWORD: arms_password volumes: mysql-data: ``` ```bash docker-compose up -d ``` ### Maven Repository 배포 ```bash ./gradlew publish ``` --- ## πŸ‘¨β€πŸ’» 개발 κ°€μ΄λ“œ ### μ½”λ”© μ»¨λ²€μ…˜ #### 넀이밍 κ·œμΉ™ - **클래슀**: PascalCase (예: `RequirementController`) - **λ©”μ„œλ“œ**: camelCase (예: `getRequirement`) - **μƒμˆ˜**: UPPER_SNAKE_CASE (예: `MAX_RETRY_COUNT`) - **νŒ¨ν‚€μ§€**: lowercase (예: `com.arms.api.requirement`) #### Tree Service μ‚¬μš© ```java @Service public class RequirementService extends TreeServiceImpl { // μš”κ΅¬μ‚¬ν•­ μΆ”κ°€ public Requirement addRequirement(Requirement req) { return addNode(req); } // μš”κ΅¬μ‚¬ν•­ 트리 쑰회 public List getRequirementTree(Long rootId) { return getChildrenRecursive(rootId); } // μš”κ΅¬μ‚¬ν•­ 이동 public void moveRequirement(Long reqId, Long newParentId) { moveNode(reqId, newParentId); } } ``` ### λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ #### μƒˆ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 파일 생성 ```sql -- V39__add_new_feature.sql CREATE TABLE IF NOT EXISTS T_ARMS_NEW_FEATURE ( c_id BIGINT AUTO_INCREMENT PRIMARY KEY, c_name VARCHAR(255) NOT NULL, c_created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` **파일λͺ… κ·œμΉ™:** - `V{버전}__μ„€λͺ….sql` - 버전은 순차적으둜 증가 - 밑쀄 두 개(`__`)둜 버전과 μ„€λͺ… ꡬ뢄 ### λ‘œκΉ… ```java @Slf4j @Service public class RequirementService { public Requirement create(RequirementDTO dto) { log.debug("Creating requirement: {}", dto); try { Requirement req = save(dto); log.info("Successfully created requirement: {}", req.getId()); return req; } catch (Exception e) { log.error("Failed to create requirement", e); throw e; } } } ``` --- ## πŸ” 문제 ν•΄κ²° ### 1. Flyway λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ‹€νŒ¨ **증상:** ``` FlywayException: Validate failed: Checksum mismatch ``` **ν•΄κ²°:** ```sql -- Flyway 이λ ₯ 확인 SELECT * FROM flyway_schema_history; -- λ¬Έμ œκ°€ μžˆλŠ” λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ‚­μ œ (주의!) DELETE FROM flyway_schema_history WHERE version = 'λ¬Έμ œλ²„μ „'; -- λ˜λŠ” Flyway repair ./gradlew flywayRepair ``` ### 2. Config Server μ—°κ²° μ‹€νŒ¨ **증상:** ``` Could not resolve placeholder 'spring.datasource.url' ``` **ν•΄κ²°:** ```bash # Config Server 확인 curl http://localhost:33133/javaServiceTreeFrameworkBackendCore/dev # bootstrap.yml 확인 spring: cloud: config: uri: http://localhost:33133 fail-fast: true # μ—°κ²° μ‹€νŒ¨ μ‹œ μ‹œμž‘ 쀑단 ``` ### 3. MySQL μ—°κ²° μ‹€νŒ¨ **증상:** ``` Communications link failure ``` **ν•΄κ²°:** ```bash # MySQL μƒνƒœ 확인 systemctl status mysql # λ°©ν™”λ²½ 확인 sudo ufw allow 3306 # MySQL μ„€μ • 확인 my.cnfμ—μ„œ bind-address = 0.0.0.0 ``` --- ## πŸ“ž μ—°λ½μ²˜ - **Maintainer**: 313DEVGRP - **Email**: 313@313.co.kr - **Website**: http://www.313.co.kr --- ## πŸ“„ λΌμ΄μ„ μŠ€ Copyright Β© 2025 313DEVGRP. All rights reserved. This project is licensed under the MIT License. --- **Made with ❀️ by 313DEVGRP** > Backend-CoreλŠ” A-RMS의 **심μž₯λΆ€**둜, λͺ¨λ“  λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 데이터λ₯Ό κ΄€λ¦¬ν•˜λŠ” 핡심 μ„œλΉ„μŠ€μž…λ‹ˆλ‹€!