Skip to content

dhku/ipam-backend

Repository files navigation

IPAM Backend

IP Address Management μ‹œμŠ€ν…œμ˜ λ°±μ—”λ“œ μ„œλ²„μž…λ‹ˆλ‹€.

μŠ€ν¬λ¦°μƒ· 2026-03-18 μ˜€ν›„ 5 56 23 μŠ€ν¬λ¦°μƒ· 2026-03-18 μ˜€ν›„ 5 55 59 μŠ€ν¬λ¦°μƒ· 2026-03-18 μ˜€ν›„ 5 56 38 μŠ€ν¬λ¦°μƒ· 2026-03-18 μ˜€ν›„ 5 57 19 μŠ€ν¬λ¦°μƒ· 2026-03-18 μ˜€ν›„ 6 02 19

기술 μŠ€νƒ

λΆ„λ₯˜ 기술
Language Java 17
Framework Spring Boot 3.5.x
Database MySQL 8.x (FULLTEXT 검색)
Session Redis 7.x (Spring Session, Sentinel HA)
Auth Keycloak (OAuth2/OIDC)
Realtime SSE (Server-Sent Events, Redis Pub/Sub)
Docs Swagger (springdoc-openapi)

ν”„λ‘œμ νŠΈ ꡬ쑰

src/main/java/com/nhn/ipambackend/
β”œβ”€β”€ domain/
β”‚   β”œβ”€β”€ address/       # IP μ£Όμ†Œ 관리 (13μ’… νƒ€μž…, TABLE_PER_CLASS 상속)
β”‚   β”œβ”€β”€ subnet/        # μ„œλΈŒλ„· 관리 (계측 ꡬ쑰, λΆ„ν• /병합/VLSM)
β”‚   β”œβ”€β”€ region/        # Region 관리
β”‚   β”œβ”€β”€ user/          # μ‚¬μš©μž/μ—­ν•  관리 (Keycloak 연동)
β”‚   β”œβ”€β”€ favorite/      # 즐겨찾기 (볡합킀)
β”‚   β”œβ”€β”€ log/           # 감사 둜그 (μŠ€λƒ…μƒ· 방식)
β”‚   β”œβ”€β”€ dashboard/     # λŒ€μ‹œλ³΄λ“œ 톡계
β”‚   β”œβ”€β”€ search/        # 톡합 검색 (FULLTEXT, ν‚€μ›Œλ“œ νƒ€μž… μžλ™ 감지)
β”‚   β”œβ”€β”€ manage/        # λ§ˆμŠ€ν„° 데이터 관리 (Zone, SubnetType, DynamicAddressType, ESM, Service)
β”‚   β”œβ”€β”€ alertpanel/    # μ•Œλ¦Ό νŒ¨λ„ (CI번호 λˆ„λ½ 감지)
β”‚   └── sse/           # μ‹€μ‹œκ°„ 이벀트 (SSE + Redis Pub/Sub)
└── global/
    β”œβ”€β”€ base/          # 곡톡 응닡, μ˜ˆμ™Έ 처리, μƒνƒœ μ½”λ“œ
    β”œβ”€β”€ config/        # μ„€μ • (Security, Redis, Async, WebClient λ“±)
    └── util/          # μœ ν‹Έλ¦¬ν‹° (IPConverter, JsonUtil)

도메인별 νŒ¨ν‚€μ§€ ꡬ쑰

각 도메인은 μ•„λž˜μ™€ 같은 νŒ¨ν‚€μ§€ ꡬ쑰λ₯Ό λ”°λ¦…λ‹ˆλ‹€:

domain/{도메인λͺ…}/
β”œβ”€β”€ controller/    # REST API 컨트둀러
β”œβ”€β”€ service/       # λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 (interface + impl)
β”œβ”€β”€ repository/    # JPA Repository (+ Specification/QueryDSL)
β”œβ”€β”€ dto/
β”‚   β”œβ”€β”€ request/   # μš”μ²­ DTO
β”‚   └── response/  # 응닡 DTO
β”œβ”€β”€ entity/        # JPA μ—”ν‹°ν‹°
└── enums/         # Enum μ •μ˜ (ν•„μš” μ‹œ)

둜컬 개발 ν™˜κ²½ μ„€μ •

1. 사전 μš”κ΅¬μ‚¬ν•­

  • Java 17
  • Docker & Docker Compose
  • MySQL 8.x (둜컬 λ˜λŠ” Docker)
  • Frontend ν”„λ‘œμ νŠΈ (../ipam-frontend)

2. /etc/hosts μ„€μ •

Keycloak 인증이 도메인 기반으둜 λ™μž‘ν•˜λ―€λ‘œ hosts 파일 μˆ˜μ •μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

sudo vi /etc/hosts

μ•„λž˜ λ‚΄μš© μΆ”κ°€:

127.0.0.1 ipam.nhn.com

3. ν™˜κ²½ λ³€μˆ˜ μ„€μ •

.env.local 파일 확인 및 μˆ˜μ •:

FRONTEND_URL=http://ipam.nhn.com      # Frontend URL (hosts μ„€μ • ν•„μš”)
MYSQL_HOST=host.docker.internal        # Docker λ‚΄μ—μ„œ 둜컬 MySQL μ ‘κ·Ό
MYSQL_PORT=3306
MYSQL_DATABASE=mydb
MYSQL_USERNAME=root
MYSQL_PASSWORD=your_password
SPRING_PROFILES_ACTIVE=local          # local ν”„λ‘œν•„ (ν…ŒμŠ€νŠΈ 데이터 생성)

4. μ„œλ²„ μ‹€ν–‰ (Docker Compose)

# Frontend + Backend + Redis 전체 μ‹€ν–‰
docker compose --env-file .env.local up -d --build

# 둜그 확인
docker compose logs -f backend

5. μ„œλ²„ μ‹€ν–‰ (IDEμ—μ„œ 직접)

IntelliJ/VSCodeμ—μ„œ 직접 μ‹€ν–‰ μ‹œ:

  1. Run Configuration에 ν™˜κ²½λ³€μˆ˜ μ„€μ •
  2. λ˜λŠ” application-local.yml μ‚¬μš©
./gradlew bootRun --args='--spring.profiles.active=local'

6. 접속 확인

μ„œλΉ„μŠ€ URL
Frontend http://ipam.nhn.com
Backend API http://ipam.nhn.com/api
Swagger UI http://ipam.nhn.com/api/swagger-ui/index.html
Health Check http://ipam.nhn.com/api/actuator/health

운영 배포(prod)

Primary μ„œλ²„ (Server A)

# Git pull + ν…ŒμŠ€νŠΈ + 이미지 λΉŒλ“œ + μ„œλΉ„μŠ€ μ‹œμž‘
./deploy.sh rebuild

# ν…ŒμŠ€νŠΈ κ±΄λ„ˆλ›°κ³  배포 (κΈ‰ν•  λ•Œ)
./deploy.sh rebuild --skip-test

# ν…ŒμŠ€νŠΈλ§Œ μ‹€ν–‰
./deploy.sh test

# μ„œλΉ„μŠ€ μƒνƒœ 확인
./deploy.sh status

# 둜그 확인
./deploy.sh logs

# μ„œλΉ„μŠ€ 쀑지
./deploy.sh down

Secondary μ„œλ²„ (Server B) - 이쀑화

# 이쀑화 λͺ¨λ“œλ‘œ 배포
./deploy.sh rebuild --secondary

# 이쀑화 μ„œλ²„ μƒνƒœ 확인
./deploy.sh status --secondary

API λ¬Έμ„œ

Swagger UI: /api/swagger-ui.html

μ£Όμš” μ—”λ“œν¬μΈνŠΈ

도메인 Base URL μ£Όμš” κΈ°λŠ₯
Subnet /api/subnets CRUD, λΆ„ν• (κ· λ“±/VLSM), 병합, Supernet, Import, λ§΅, μ‚¬μš©λŸ‰, 곡인IP λŒ€μ‹œλ³΄λ“œ
Address /api/addresses 쑰회, μ˜ˆμ•½/μ·¨μ†Œ(κ°œλ³„/λ²”μœ„), μ˜ˆμ•½ κ°€λŠ₯ μ—¬λΆ€, 동적 μ£Όμ†Œ 생성
Region /api/regions Region CRUD
User /api/users μ—­ν•  관리, 속성 관리, 벌크 μ—­ν•  λ³€κ²½
Favorite /api/favorites μ„œλΈŒλ„· 즐겨찾기 μΆ”κ°€/제거/쑰회
Log /api/logs 감사 둜그 쑰회, CSV 내보내기
Search /api/search 톡합 검색, IP Range, ESM, 검색 기둝, 메타데이터
Dashboard /api/dashboard λŒ€μ‹œλ³΄λ“œ 톡계
Manage /api/zones, /api/subnet-types, /api/dynamic-address-types λ§ˆμŠ€ν„° 데이터 관리
Alert Panel /api/alert-panel ci_no λˆ„λ½ μ•Œλ¦Ό
SSE /api/sse μ‹€μ‹œκ°„ 이벀트 슀트림

ν…ŒμŠ€νŠΈ

# 전체 ν…ŒμŠ€νŠΈ
./gradlew test

# 도메인별 ν…ŒμŠ€νŠΈ
./gradlew test --tests "com.nhn.ipambackend.domain.subnet.*"
./gradlew test --tests "com.nhn.ipambackend.domain.address.*"
./gradlew test --tests "com.nhn.ipambackend.domain.search.*"
./gradlew test --tests "com.nhn.ipambackend.domain.favorite.*"
./gradlew test --tests "com.nhn.ipambackend.domain.region.*"
./gradlew test --tests "com.nhn.ipambackend.domain.log.*"
./gradlew test --tests "com.nhn.ipambackend.domain.dashboard.*"
./gradlew test --tests "com.nhn.ipambackend.domain.user.*"
./gradlew test --tests "com.nhn.ipambackend.domain.manage.*"

ν…ŒμŠ€νŠΈ 파일 λͺ©λ‘

도메인 ν…ŒμŠ€νŠΈ 파일
Subnet SubnetServiceTest, SubnetEntityTest
Address AddressServiceTest, AddressEntityTest
Search SearchServiceTest
Favorite FavoriteServiceTest
Region RegionServiceTest
Log LogServiceTest, AuditLogServiceTest
Dashboard DashboardServiceTest
User UserServiceTest, RoleTest
Manage DynamicAddressTypeServiceTest

Cursor 개발 κ·œμΉ™

.cursor/rules/ 디렉토리에 도메인별 개발 κ°€μ΄λ“œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

파일 μ„€λͺ…
.overview.mdc ν”„λ‘œμ νŠΈ 전체 ꡬ쑰, μ½”λ”© μ»¨λ²€μ…˜
subnets.mdc μ„œλΈŒλ„· 도메인 (계측 ꡬ쑰, λΆ„ν• /병합/VLSM, Import)
addresses.mdc μ£Όμ†Œ 도메인 (13μ’… νƒ€μž…, TABLE_PER_CLASS, μ˜ˆμ•½/μ·¨μ†Œ)
search.mdc 검색 도메인 (FULLTEXT, ν‚€μ›Œλ“œ μžλ™ 감지, ESM)
regions.mdc Region 도메인
logs.mdc 감사 둜그 (μŠ€λƒ…μƒ· 방식)
favorites.mdc 즐겨찾기 (볡합킀)

Cursorμ—μ„œ ν•΄λ‹Ή 도메인 파일 μž‘μ—… μ‹œ μžλ™μœΌλ‘œ κ·œμΉ™μ΄ μ μš©λ©λ‹ˆλ‹€.


ν™˜κ²½λ³„ ν”„λ‘œν•„

ν”„λ‘œν•„ μš©λ„ νŠΉμ§•
local 둜컬 개발 ν…ŒμŠ€νŠΈ 데이터 μžλ™ 생성, SQL λ‘œκΉ…
prod 운영 (Primary) SQL λ‘œκΉ… λΉ„ν™œμ„±ν™”, Redis Sentinel

μ£Όμš” μ„€μ • 파일

파일 μ„€λͺ…
.env.local 둜컬 개발 ν™˜κ²½λ³€μˆ˜
.env.prod 운영 ν™˜κ²½λ³€μˆ˜ (Primary)
.env.secondary 운영 ν™˜κ²½λ³€μˆ˜ (Secondary, 이쀑화)
docker-compose.yml Primary: Frontend + Backend + Redis Master + Sentinel
docker-compose.secondary.yml Secondary: 이쀑화 ꡬ성
deploy.sh 톡합 배포 슀크립트 (up, down, restart, rebuild, logs, status, test)

DB λ§ˆμ΄κ·Έλ ˆμ΄μ…˜

파일 μ„€λͺ…
db/init.sql 초기 μŠ€ν‚€λ§ˆ/데이터
db/init-logs.sql 둜그 ν…Œμ΄λΈ” μ΄ˆκΈ°ν™”
db/alias.sql 검색 Alias 데이터
db/preset.sql 검색 Preset 데이터
db/migration-fulltext-search.sql FULLTEXT 검색 인덱슀 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜
db/migration-roles.sql μ—­ν• (Roles) λ§ˆμ΄κ·Έλ ˆμ΄μ…˜
db/migration-log-server-ip.sql 둜그 μ„œλ²„ IP λ§ˆμ΄κ·Έλ ˆμ΄μ…˜
db/migration-dynamic-address-type.sql 동적 μ£Όμ†Œ νƒ€μž… λ§ˆμ΄κ·Έλ ˆμ΄μ…˜

문제 ν•΄κ²°

Keycloak 인증 μ‹€νŒ¨

  1. /etc/hosts에 ipam.nhn.com μ„€μ • 확인
  2. FRONTEND_URL이 http://ipam.nhn.com인지 확인
  3. Keycloak ν΄λΌμ΄μ–ΈνŠΈ μ„€μ •μ—μ„œ Redirect URI 확인

Dockerμ—μ„œ 둜컬 MySQL μ ‘κ·Ό λΆˆκ°€

MYSQL_HOSTλ₯Ό host.docker.internal둜 μ„€μ • (Mac/Windows)

ν…ŒμŠ€νŠΈ 데이터가 μƒμ„±λ˜μ§€ μ•ŠμŒ

SPRING_PROFILES_ACTIVE=local μ„€μ • 확인

About

2026 NHN Cloud Internship Project

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages