μ±μ© μ§μμ κ΄λ¦¬(ATS: Applicant Tracking System) λ°±μλ μ ν리μΌμ΄μ μ§μμ μ‘°ν, νν° κ²μ(νλ ₯/μ 곡/κ²½λ ₯/보μ κΈ°μ ), μ§ν μν λ³κ²½μ μ 곡ν©λλ€. QueryDSL κΈ°λ° κ³ κΈ κ²μ, ID κΈ°λ° νμ΄μ§, OpenAPI 3.0 λ¬Έμ μλνκ° μ μ©λμ΄ μμ΅λλ€.
| μμ | κΈ°μ |
|---|---|
| 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 |
λ³Έ νλ‘μ νΈλ 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 μΌλ‘ μμ νκ² ν΅μ |
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
- νλ ₯(κ³ μ‘Έ/μ€νμ¬/νμ¬(λμ‘Έ)/μμ¬/λ°μ¬)
- μ 곡 κ³μ΄
- 보μ κΈ°μ 볡μ κ²μ
- κ²½λ ₯ μ°μ°¨ λ²μ
- μ§ν μν(μ§μ/μλ₯ν©κ²©/λ©΄μ λκΈ°/ν©κ²©)
QueryDSL GroupBy + ID Pagination + Sub Query μ‘°ν©
νν° μ€ν¬ κ²μ μμλ μ§μμμ λͺ¨λ 보μ κΈ°μ μ λ°νν©λλ€.
- μ§μ β μλ₯ν©κ²© β λ©΄μ λκΈ° β ν©κ²© νλ¦
- Enum κΈ°λ° μμΈ μ²λ¦¬ + μλ΅ DTO μΆλ ₯
μ£Όμ: ν΄λΉ νλ‘μ νΈλ μΈλΆμμ μ κ·Όν μ μλ κ°μΈ μλ²μ 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./gradlew clean build
./gradlew bootRun| λμ | λ°©μ |
|---|---|
| Service | Repository Mock + Projection Factory |
| Projection | μ€μ κ°μ²΄ μμ± (Factory Pattern) |
| Repository | QueryDSL Integration Test (미ꡬν) |
- JWT μΈμ¦ + κ΄λ¦¬μ κΆν μΆκ°
- ElasticSearch κΈ°λ° κ²μ κ³ λν
- μ΄λ ₯μ-κ³΅κ³ κ΄κ³ μ€μ¬μ κ΄λ¦¬
