- API μ€ν λ¬Έμ - λͺ¨λ API μλν¬μΈνΈμ μμΈ λͺ μΈμ
- μν€ν μ² λ¬Έμ - μμ€ν μ€κ³ λ° κΈ°μ μ€ν μμΈ μ 보
νμκ°μ , κ°μ λ±λ‘, κ°μ λͺ©λ‘ μ‘°ν, μκ°μ μ²μ μ§μνλ RESTful API μλ²μ λλ€.
- νμ κ΄λ¦¬ (μκ°μ/κ°μ¬ ꡬλΆ)
- κ°μ λ±λ‘ λ° λͺ©λ‘ μ‘°ν (νμ΄μ§, μ λ ¬ μ§μ)
- μκ°μ μ²/μ·¨μ (μ μ°©μ μ μ κ΄λ¦¬, λμμ± μ μ΄)
- JWT κΈ°λ° μΈμ¦/μΈκ°
- μννΈ μμ λ°©μμ μ¬μκ° νμ©
- Framework: Spring Boot 3.5.6
- Language: Java 17
- Database: H2 (in-memory)
- Authentication: JWT (JSON Web Token)
- Documentation: Swagger/OpenAPI 3
- Build Tool: Gradle
- JDK 17 μ΄μ
- Git
-
νλ‘μ νΈ ν΄λ‘
git clone https://github.com/kungbi/wolbu-assignment.git cd wolbu-assignment -
μ ν리μΌμ΄μ μ€ν
# Gradle Wrapper μ¬μ© (κΆμ₯) ./gradlew bootRun # λλ JAR λΉλ ν μ€ν ./gradlew build java -jar build/libs/assignment-0.0.1-SNAPSHOT.jar
-
μ€ν νμΈ
- μλ² μμ: http://localhost:8080
- ν¬μ€ 체ν¬:
GET /api/health
- API λ¬Έμ: http://localhost:8080/swagger-ui/index.html
- H2 λ°μ΄ν°λ² μ΄μ€ μ½μ: http://localhost:8080/h2-console
- JDBC URL:
jdbc:h2:mem:testdb - Username:
sa - Password: (곡백)
- JDBC URL:
H2 μ½μμ μ¬μ©νλ €λ©΄ src/main/resources/application.propertiesμμ λ€μ μ€μ μ μ£Όμμ ν΄μ νμΈμ:
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb;MODE=MYSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username=sa
spring.datasource.password=- νμκ°μ
:
POST /api/auth/signup - λ‘κ·ΈμΈ:
POST /api/auth/login - κ°μ λ±λ‘:
POST /api/lectures(κ°μ¬λ§ κ°λ₯) - κ°μ λͺ©λ‘:
GET /api/lectures?sort=RECENT&page=0&size=20 - μκ°μ μ²:
POST /api/enrollments(λ€κ±΄ μ μ² κ°λ₯) - μκ°μ·¨μ:
DELETE /api/enrollments/{enrollmentId}
-
νμκ°μ (μκ°μ)
curl -X POST http://localhost:8080/api/auth/signup \ -H "Content-Type: application/json" \ -d '{ "name": "νκΈΈλ", "email": "[email protected]", "phone": "010-1234-5678", "password": "password123", "role": "STUDENT" }'
-
λ‘κ·ΈμΈ
curl -X POST http://localhost:8080/api/auth/login \ -H "Content-Type: application/json" \ -d '{ "email": "[email protected]", "password": "password123" }'
-
κ°μ λͺ©λ‘ μ‘°ν
curl -X GET "http://localhost:8080/api/lectures?sort=RECENT&page=0&size=20" -
μκ°μ μ²
curl -X POST http://localhost:8080/api/enrollments \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -d '{ "lectureIds": [1, 2, 3] }'
- μ΄λ©μΌ μ€λ³΅ λΆκ°, λΉλ°λ²νΈ κ·μΉ(6~10μ, μλμλ¬Έμ+μ«μ 2μ’ μ΄μ)
- κ°μ¬λ§ κ°μ κ°μ€ κ°λ₯, μκ°μ μ²μ λͺ¨λ κ°λ₯
- κ°μ μ μ μ μ°©μ 보μ₯
- μννΈ μμ + μ¬μκ° νμ©: μ·¨μλ μν λ³κ²½μΌλ‘ μ²λ¦¬, μ¬μκ° κ°λ₯
- νμ± μ€λ³΅ μ μ² λΆκ°(λμΌ κ°μμ CONFIRMED μν 1κ±΄λ§ νμ©)
- μ μ κ³μ°μ νμ± λ±λ‘(CONFIRMED)λ§ κΈ°μ€
- νμκ°μ (signup): ν ν° λ―Έλ°κΈ, μ¬μ©μ μ λ³΄λ§ λ°ν
- λ‘κ·ΈμΈ(login): Access Tokenμ μλ΅ body(
accessToken), Refresh Tokenμ HttpOnly μΏ ν€(refreshToken) - ν ν° μ€ν€λ§: JWT HS256, payloadμ
sub(userId),email,role
-
νμ: JSON Body
{error: { "code": "COURSE_FULL", "message": "μ μμ΄ μ΄κ³Όλμμ΅λλ€." }} -
κ³΅ν΅ μ½λ μμ:
- 400: μ λ ₯ κ²μ¦ μ€ν¨
- 401/403: μΈμ¦Β·κΆν μ€ν¨
- 404: 리μμ€ μμ
- 409: μ μ μ΄κ³ΌΒ·μ€λ³΅ μ μ²
-
μ€ν:
./gradlew test -
μ»€λ² λ²μ:
- νμκ°μ κ²μ¦
- κ°μ λ±λ‘/λͺ©λ‘ μ λ ¬
- μ μ μ΄κ³Ό/μ€λ³΅ μ μ²
- λμμ± ν μ€νΈ (μ¬λ¬ μμ² β μ μ μ΄κ³Ό μμ νμΈ)
./gradlew test- νμκ°μ κ²μ¦ (μ΄λ©μΌ μ€λ³΅, λΉλ°λ²νΈ μ μ± )
- κ°μ λ±λ‘/λͺ©λ‘ μ λ ¬ κΈ°λ₯
- μκ°μ μ² μ μ μ΄κ³Ό/μ€λ³΅ μ μ² λ°©μ§
- λμμ± ν μ€νΈ (λ€μ€ μ¬μ©μ λμ μ μ² μ μ μ 보μ₯)
- μ¬μκ° νμ© μλ리μ€
ν
μ€νΈ μ€ν ν build/reports/tests/test/index.htmlμμ μμΈ κ²°κ³Όλ₯Ό νμΈν μ μμ΅λλ€.
src/main/java/com/company/wolbu/assignment/
βββ AssignmentApplication.java # λ©μΈ μ ν리μΌμ΄μ
ν΄λμ€
βββ auth/ # μΈμ¦/μΈκ° λλ©μΈ
β βββ controller/ # REST API 컨νΈλ‘€λ¬
β βββ domain/ # λλ©μΈ μν°ν° (Member, RefreshToken)
β βββ dto/ # μμ²/μλ΅ DTO
β βββ exception/ # λλ©μΈ μμΈ
β βββ repository/ # λ°μ΄ν° μ κ·Ό κ³μΈ΅
β βββ security/ # JWT, 보μ μ€μ
β βββ service/ # λΉμ¦λμ€ λ‘μ§
βββ common/ # κ³΅ν΅ μ»΄ν¬λνΈ
β βββ config/ # Swagger λ± μ€μ
β βββ dto/ # κ³΅ν΅ μλ΅ DTO
β βββ exception/ # κΈλ‘λ² μμΈ μ²λ¦¬
β βββ logging/ # λ‘κΉ
μ€μ
βββ config/ # μ μ μ€μ
βββ enrollment/ # μκ°μ μ² λλ©μΈ
β βββ controller/ # μκ°μ μ² API
β βββ domain/ # μκ°μ μ² μν°ν°
β βββ dto/ # μκ°μ μ² DTO
β βββ exception/ # μκ°μ μ² μμΈ
β βββ repository/ # μκ°μ μ² λ ν¬μ§ν 리
β βββ service/ # μκ°μ μ² λΉμ¦λμ€ λ‘μ§
βββ health/ # ν¬μ€μ²΄ν¬ API
βββ lecture/ # κ°μ λλ©μΈ
β βββ controller/ # κ°μ API
β βββ domain/ # κ°μ μν°ν°
β βββ dto/ # κ°μ DTO
β βββ exception/ # κ°μ μμΈ
β βββ repository/ # κ°μ λ ν¬μ§ν 리
β βββ service/ # κ°μ λΉμ¦λμ€ λ‘μ§
- μν€ν μ² μμΈ λ¬Έμ: docs/architecture.md
- API λ¬Έμ: μ ν리μΌμ΄μ μ€ν ν http://localhost:8080/swagger-ui/index.html
- κ°λ° νκ²½: Spring Boot 3.5.6, Java 17, H2 Database