CCTV μμ κ΄λ¦¬ λ° λ³΅νΈν μμ€ν μ λ°±μλ μ ν리μΌμ΄μ μ λλ€.
- νλ‘μ νΈ κ°μ
- κΈ°μ μ€ν
- νλ‘μ νΈ κ΅¬μ‘°
- μ£Όμ κΈ°λ₯
- API λ¬Έμ
- μ€μΉ λ° μ€ν
- νκ²½ μ€μ
- λ°μ΄ν°λ² μ΄μ€
- 보μ
- κ°λ° κ°μ΄λ
SafeViewλ CCTV μμμ μμ νκ² κ΄λ¦¬νκ³ λ³΅νΈννλ μμ€ν μ λλ€. λΈλ‘μ²΄μΈ κΈ°μ μ νμ©νμ¬ ν€μ 무결μ±μ 보μ₯νκ³ , JWT κΈ°λ° μΈμ¦μΌλ‘ 보μμ κ°ννμ΅λλ€.
- π JWT κΈ°λ° μΈμ¦: Access Tokenκ³Ό Refresh Tokenμ ν΅ν μμ ν μΈμ¦
- ποΈ λΈλ‘μ²΄μΈ μ°λ: 볡νΈν ν€μ 무결μ±κ³Ό μΆμ μ± λ³΄μ₯
- πΉ CCTV μμ κ΄λ¦¬: μμ λ Ήν, μ μ₯, λ€μ΄λ‘λ κΈ°λ₯
- π₯ μν κΈ°λ° μ κ·Ό μ μ΄: USER, MODERATOR, ADMIN κΆν κ΄λ¦¬
- π 볡νΈν ν€ κ΄λ¦¬: ν€ λ°κΈ, κ²μ¦, μ·¨μ κΈ°λ₯
- Java 17
- Spring Boot 3.x
- Spring Security
- Spring Data JPA
- H2 Database (κ°λ°μ©)
- Gradle
- JWT (JSON Web Token)
- BCrypt (λΉλ°λ²νΈ μνΈν)
- Spring Security
- Web3j (Ethereum ν΄λΌμ΄μΈνΈ)
- Solidity (μ€λ§νΈ 컨νΈλνΈ)
- Sepolia Testnet
- AI Server (μμ μ²λ¦¬)
- S3 Storage (μμ μ μ₯)
src/main/java/com/safeview/
βββ domain/ # λλ©μΈλ³ ν¨ν€μ§
β βββ administrator/ # κ΄λ¦¬μ κΈ°λ₯
β β βββ controller/ # κ΄λ¦¬μ API 컨νΈλ‘€λ¬
β β βββ dto/ # κ΄λ¦¬μ κ΄λ ¨ DTO
β β βββ entity/ # κ΄λ¦¬μ μμ² μν°ν°
β β βββ mapper/ # DTO-Entity λ³ν
β β βββ repository/ # λ°μ΄ν° μ κ·Ό κ³μΈ΅
β β βββ service/ # λΉμ¦λμ€ λ‘μ§
β βββ auth/ # μΈμ¦ κ΄λ ¨
β β βββ controller/ # μΈμ¦ API 컨νΈλ‘€λ¬
β β βββ dto/ # μΈμ¦ κ΄λ ¨ DTO
β β βββ mapper/ # μΈμ¦ λ§€νΌ
β β βββ service/ # μΈμ¦ μλΉμ€
β βββ decryption/ # 볡νΈν κΈ°λ₯
β β βββ config/ # 볡νΈν μ€μ
β β βββ controller/ # 볡νΈν API 컨νΈλ‘€λ¬
β β βββ dto/ # 볡νΈν κ΄λ ¨ DTO
β β βββ entity/ # 볡νΈν ν€ μν°ν°
β β βββ mapper/ # 볡νΈν λ§€νΌ
β β βββ repository/ # 볡νΈν λ°μ΄ν° μ κ·Ό
β β βββ service/ # 볡νΈν μλΉμ€
β βββ user/ # μ¬μ©μ κ΄λ¦¬
β β βββ controller/ # μ¬μ©μ API 컨νΈλ‘€λ¬
β β βββ dto/ # μ¬μ©μ κ΄λ ¨ DTO
β β βββ entity/ # μ¬μ©μ μν°ν°
β β βββ mapper/ # μ¬μ©μ λ§€νΌ
β β βββ repository/ # μ¬μ©μ λ°μ΄ν° μ κ·Ό
β β βββ service/ # μ¬μ©μ μλΉμ€
β βββ video/ # μμ κ΄λ¦¬
β βββ controller/ # μμ API 컨νΈλ‘€λ¬
β βββ dto/ # μμ κ΄λ ¨ DTO
β βββ entity/ # μμ μν°ν°
β βββ mapper/ # μμ λ§€νΌ
β βββ repository/ # μμ λ°μ΄ν° μ κ·Ό
β βββ service/ # μμ μλΉμ€
βββ global/ # μ μ μ€μ λ° κ³΅ν΅ κΈ°λ₯
βββ config/ # μ€μ ν΄λμ€λ€
βββ entity/ # κΈ°λ³Έ μν°ν°
βββ exception/ # μμΈ μ²λ¦¬
βββ response/ # μλ΅ νμ
βββ security/ # 보μ κ΄λ ¨
- νμκ°μ : μ΄λ©μΌ, λΉλ°λ²νΈ, κ°μΈμ 보λ₯Ό ν΅ν νμκ°μ
- λ‘κ·ΈμΈ/λ‘κ·Έμμ: JWT ν ν° κΈ°λ° μΈμ¦
- μ΄λ©μΌ μ€λ³΅ νμΈ: νμκ°μ μ μ΄λ©μΌ μ€λ³΅ κ²μ¦
- μν κ΄λ¦¬: USER, MODERATOR, ADMIN κΆν 체κ³
- JWT ν ν° κ΄λ¦¬: Access Token (1μκ°), Refresh Token (7μΌ)
- HttpOnly μΏ ν€: XSS 곡격 λ°©μ§λ₯Ό μν μμ ν ν ν° μ μ₯
- λΉλ°λ²νΈ μνΈν: BCryptλ₯Ό ν΅ν μμ ν λΉλ°λ²νΈ μ μ₯
- κΆνλ³ μ κ·Ό μ μ΄: APIλ³ κΆν κ²μ¦
- κΆν μμ² κ΄λ¦¬: μ¬μ©μμ κ΄λ¦¬μ κΆν μμ² μ²λ¦¬
- μ 체 μ¬μ©μ κ΄λ¦¬: λͺ¨λ μ¬μ©μ μ 보 μ‘°ν λ° κ΄λ¦¬
- μμ² μΉμΈ/κ±°μ : κ΄λ¦¬μ κΆν μμ²μ λν μ²λ¦¬
- ν€ λ°κΈ: CCTV μμ 볡νΈνλ₯Ό μν ν€ μμ±
- ν€ κ²μ¦: λ°κΈλ ν€μ μ ν¨μ± κ²μ¦
- ν€ μ·¨μ: λ§λ£λκ±°λ 보μμ μ·¨μκ° νμν ν€ κ΄λ¦¬
- λΈλ‘μ²΄μΈ μ°λ: ν€ μ 보μ λ¬΄κ²°μ± λ³΄μ₯
- μμ λ Ήν: AI μλ²μ μ°λν μμ λ Ήν μμ/μ€μ§
- μμ μ μ₯: S3 μ€ν 리μ§λ₯Ό ν΅ν μμ ν μμ μ μ₯
- μμ λͺ©λ‘: μ¬μ©μλ³ μμ λͺ©λ‘ μ‘°ν
- μμ λ€μ΄λ‘λ: μ μ₯λ μμ λ€μ΄λ‘λ κΈ°λ₯
POST /api/auth/login- λ‘κ·ΈμΈPOST /api/auth/logout- λ‘κ·ΈμμGET /api/auth/me- νμ¬ μ¬μ©μ μ 보 μ‘°ν
POST /api/users/signup- νμκ°μGET /api/users/check-email- μ΄λ©μΌ μ€λ³΅ νμΈ
POST /api/admin/requests- κ΄λ¦¬μ κΆν μμ² μμ±GET /api/admin/requests- κ΄λ¦¬μ κΆν μμ² λͺ©λ‘ μ‘°νPUT /api/admin/requests/{id}- κ΄λ¦¬μ κΆν μμ² μ²λ¦¬
POST /api/decryption/keys/issue- 볡νΈν ν€ λ°κΈPOST /api/decryption/keys/verify- 볡νΈν ν€ κ²μ¦DELETE /api/decryption/keys/revoke- 볡νΈν ν€ μ·¨μGET /api/decryption/keys- 볡νΈν ν€ λͺ©λ‘ μ‘°ν
POST /api/videos/start- μμ λ Ήν μμPOST /api/videos/stop- μμ λ Ήν μ€μ§GET /api/videos/all- μ¬μ©μλ³ μμ λͺ©λ‘ μ‘°νGET /api/videos/download/{filename}- μμ λ€μ΄λ‘λ
GET /api/blockchain/status- λΈλ‘μ²΄μΈ μ°κ²° μν νμΈGET /api/blockchain/balance- κ³μ μμ‘ μ‘°νPOST /api/blockchain/keys/register- ν€ λΈλ‘μ²΄μΈ λ±λ‘
- Java 17 μ΄μ
- Gradle 7.x μ΄μ
- H2 Database (κ°λ°μ©)
git clone [repository-url]
cd Backend./gradlew build./gradlew bootRun- μ ν리μΌμ΄μ : http://localhost:8080
- H2 μ½μ: http://localhost:8080/h2-console
spring:
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
username: sa
password:
jpa:
hibernate:
ddl-auto: create-drop
show-sql: true
h2:
console:
enabled: true
jwt:
secret: your-jwt-secret-key-here
expiration: 3600000 # 1μκ° (ms)
refresh-expiration: 604800000 # 7μΌ (ms)
cctv:
decryption:
key-type: CCTV_AES256
max-uses: 10
expiration-hours: 24
blockchain:
network-url: https://sepolia.infura.io/v3/your-project-id
contract-address: your-contract-address
private-key: your-private-key
ai:
server:
url: http://localhost:5000
api:
internal:
ai-server-key: your-ai-server-api-key- μ¬μ©μ μ 보 μ μ₯
- μ΄λ©μΌ, λΉλ°λ²νΈ, κ°μΈμ 보, μν ν¬ν¨
- κ΄λ¦¬μ κΆν μμ² μ 보
- μμ²μ, μ λͺ©, μ€λͺ , μν, μ²λ¦¬ μ 보 ν¬ν¨
- 볡νΈν ν€ μ 보
- ν€ ν΄μ, μ¬μ©μ ID, λ§λ£ μκ°, μ¬μ© νμ ν¬ν¨
- λΈλ‘μ²΄μΈ νΈλμμ μ 보
- νΈλμμ ν΄μ, ν€ ν΄μ, μν μ 보 ν¬ν¨
- μμ μ 보
- νμΌλͺ , S3 URL, μ¬μ©μ ID ν¬ν¨
- JWT ν ν°: Access Tokenκ³Ό Refresh Token λΆλ¦¬
- HttpOnly μΏ ν€: XSS 곡격 λ°©μ§
- BCrypt μνΈν: λΉλ°λ²νΈ μμ ν μ μ₯
- μν κΈ°λ° μ κ·Ό μ μ΄: APIλ³ κΆν κ²μ¦
- λΈλ‘μ²΄μΈ κ²μ¦: ν€ λ¬΄κ²°μ± λ³΄μ₯
- API ν€ κ²μ¦: AI μλ² ν΅μ 보μ
- μ λ ₯κ° κ²μ¦: λͺ¨λ μ¬μ©μ μ λ ₯ κ²μ¦
- CORS μ€μ : νλ‘ νΈμλμμ μμ ν ν΅μ
- HTTPS: νλ‘λμ νκ²½μμ HTTPS μ¬μ© κΆμ₯
- ν¨ν€μ§ ꡬ쑰: λλ©μΈλ³ ν¨ν€μ§ λΆλ¦¬
- μ£Όμ: λͺ¨λ ν΄λμ€μ λ©μλμ μ£Όμ μμ±
- μμΈ μ²λ¦¬: μΌκ΄λ μμΈ μ²λ¦¬ λ° μλ΅ νμ
- IDE μ€μ : IntelliJ IDEA λλ Eclipse κΆμ₯
- μ½λ ν¬λ§·ν : Google Java Style Guide μ€μ
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€ νμ λ°°ν¬λ©λλ€.
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request