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