Skip to content

npee/ats-example

Repository files navigation

πŸ“Œ ATS Backend Example

μ±„μš© μ§€μ›μž 관리(ATS: Applicant Tracking System) λ°±μ—”λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ§€μ›μž 쑰회, ν•„ν„° 검색(ν•™λ ₯/전곡/κ²½λ ₯/보유 기술), μ§„ν–‰ μƒνƒœ 변경을 μ œκ³΅ν•©λ‹ˆλ‹€. QueryDSL 기반 κ³ κΈ‰ 검색, ID 기반 νŽ˜μ΄μ§•, OpenAPI 3.0 λ¬Έμ„œ μžλ™ν™”κ°€ μ μš©λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

πŸš€ Tech Stack

μ˜μ—­ 기술
Language Java 17
Framework Spring Boot 3.5.7
DB MySQL
ORM JPA(Hibernate 6) + QueryDSL 5
API Docs SpringDoc OpenAPI 3.0 (Swagger UI)
Build Tool Gradle
기타 Lombok

πŸš€ CI/CD & 배포 μ•„ν‚€ν…μ²˜

λ³Έ ν”„λ‘œμ νŠΈλŠ” GitHub Actions + AWS EC2 + Nginx + 도메인(Cloudflare) + μ™ΈλΆ€ DB μ‘°ν•©μœΌλ‘œ μ™„μ „ μžλ™ 배포 ν™˜κ²½μ„ κ΅¬μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

πŸ” 배포 νŒŒμ΄ν”„λΌμΈ κ°œμš”

단계 μ„€λͺ…
1. Push to main κ°œλ°œμžκ°€ μ½”λ“œλ₯Ό push ν•˜λ©΄ 배포 μžλ™ μ‹œμž‘
2. GitHub Actions Gradle Build β†’ JAR 생성
3. Secure Copy(SCP) EC2 μ„œλ²„λ‘œ JAR μžλ™ μ—…λ‘œλ“œ
4. SSH Remote Deploy EC2 μ„œλ²„μ—μ„œ κΈ°μ‘΄ ν”„λ‘œμ„ΈμŠ€ μ’…λ£Œ + μƒˆλ‘œμš΄ 버전 μ‹€ν–‰
5. Reverse Proxy (Nginx) μ™ΈλΆ€ μš”μ²­μ„ 80/443 β†’ Spring Boot(8080)으둜 ν¬μ›Œλ”©
6. HTTPS 인증 Let’s Encrypt μΈμ¦μ„œ μžλ™ κ°±μ‹ 
7. μ™ΈλΆ€ DB 연동 MySQL은 개인 NAS/μ„œλ²„μ— κ΅¬μΆ•ν•˜μ—¬ λΉ„μš© μ΅œμ ν™”, EC2 ↔ DB 접속은 Tailscale VPN 으둜 μ•ˆμ „ν•˜κ²Œ 톡신

πŸ“ ν”„λ‘œμ νŠΈ ꡬ쑰 (Domain-Driven Package)

src/main/java/io/npee/ats
 β”œβ”€ global                  # 곡톡 μ„€μ •/μ˜ˆμ™Έ
 β”‚   β”œβ”€ config              # QueryDSL, Swagger μ„€μ • λ“±
 β”‚   └─ error               # μ „μ—­ μ˜ˆμ™Έ 처리기
 β”‚
 └─ domain
     └─ applicant           # μ§€μ›μž 도메인
         β”œβ”€ entity          # JPA μ—”ν‹°ν‹°
         β”œβ”€ dto
         β”‚   β”œβ”€ request     # μš”μ²­ DTO
         β”‚   β”œβ”€ response    # 응닡 DTO
         β”‚   └─ projection  # QueryDSL Projection DTO
         β”œβ”€ enum            # ν”„λ‘œμ„ΈμŠ€ μƒνƒœ, ν•™λ ₯ λ“±
         β”œβ”€ repository      # JPA + QueryDSL Repository
         β”œβ”€ service         # λΉ„μ¦ˆλ‹ˆμŠ€ 둜직
         └─ controller      # REST API

πŸ—ƒ ERD

ERD Diagram

πŸ”— ERDCloud Link

🧠 μ£Όμš” κΈ°λŠ₯

πŸ”Ž μ§€μ›μž ν•„ν„° 쑰회 API

  • ν•™λ ₯(κ³ μ‘Έ/쀀학사/학사(λŒ€μ‘Έ)/석사/박사)
  • 전곡 계열
  • 보유 기술 볡수 검색
  • κ²½λ ₯ μ—°μ°¨ λ²”μœ„
  • μ§„ν–‰ μƒνƒœ(지원/μ„œλ₯˜ν•©κ²©/λ©΄μ ‘λŒ€κΈ°/합격)

QueryDSL GroupBy + ID Pagination + Sub Query μ‘°ν•©
ν•„ν„° μŠ€ν‚¬ 검색 μ‹œμ—λ„ μ§€μ›μžμ˜ λͺ¨λ“  보유 κΈ°μˆ μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€.

πŸ”„ μ§€μ›μž μƒνƒœ λ³€κ²½ API

  • 지원 β†’ μ„œλ₯˜ν•©κ²© β†’ λ©΄μ ‘λŒ€κΈ° β†’ 합격 흐름
  • Enum 기반 μ˜ˆμ™Έ 처리 + 응닡 DTO 좜λ ₯

πŸ›  μ‹€ν–‰ 방법

1) λ³„λ„λ‘œ κ΄€λ¦¬λ˜λŠ” μ„€μ • 파일(application.yml) μΆ”κ°€

주의: ν•΄λ‹Ή ν”„λ‘œμ νŠΈλŠ” μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  수 μ—†λŠ” 개인 μ„œλ²„μ˜ DBλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ–΄, 둜컬 ν™˜κ²½μ—μ„œ μ‹€ν–‰ν•˜λ €λ©΄ 둜컬 DBλ₯Ό ꡬ좕해야 ν•©λ‹ˆλ‹€.

spring:
  application:
    name: ats
  datasource:
    url: ${DB_URL}
    username: ${DB_USER}
    password: ${DB_PASSWORD}
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: none
    show-sql: true
    properties:
      hibernate:
        format_sql: true
        dialect: org.hibernate.dialect.MySQL8Dialect

springdoc:
  api-docs:
    version: OPENAPI_3_0

2) Gradle Build & Run

./gradlew clean build
./gradlew bootRun

πŸ§ͺ Test Strategy (μš”μ•½)

λŒ€μƒ 방식
Service Repository Mock + Projection Factory
Projection μ‹€μ œ 객체 생성 (Factory Pattern)
Repository QueryDSL Integration Test (λ―Έκ΅¬ν˜„)

πŸ“Œ μ•žμœΌλ‘œμ˜ κ°œμ„  λ°©ν–₯

  • JWT 인증 + κ΄€λ¦¬μž κΆŒν•œ μΆ”κ°€
  • ElasticSearch 기반 검색 고도화
  • 이λ ₯μ„œ-곡고 관계 μ€‘μ‹¬μ˜ 관리

About

ats system sample

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages