πβκ°μ¬ μ μ© κ°μ κ΄λ¦¬ κΈ°λ₯, ν νλ©΄ μμ λ΄μ μ μ§λ³΄μν UX μν€ν μ²β
π 2025λ 4μ 30μΌ | βοΈ by λ°μ°¬ν¬ |
π§ κ°λ° λ°°κ²½ β βνλμ νλ©΄μμ, λͺ¨λ κ°μ μ‘μ μβ
κ°μ¬λ μ½ν μΈ μ μμμ΄μ μ΄μμλ€.
κ·Έλ€μκ²λ 무μ보λ€λ ν¨μ¨μ μΈ βκ΄λ¦¬ λꡬβκ° νμνλ€.
μ΄λ² κΈ°λ₯μ λͺ©νλ λͺ ννλ€:
κ°μ¬λ€μ΄ μμ μ κ°μλ₯Ό ν νμ΄μ§μμ μμ νκ² κ΄λ¦¬ν μ μλλ‘ νμ.
λ¨μ μ‘°νλ₯Ό λμ΄ νν°λ§, μ λ ¬, μμ , μν μ ν, μμ , 볡ꡬκΉμ§ λͺ¨λ νλμ νλ©΄ μμμ μ²λ¦¬ν μ μμ΄μΌ νλ€.
π― ν΅μ¬ μ€κ³ λͺ©ν
νλͺ© | μ€κ³ μ² ν |
---|---|
π― μν€ν μ² | JSP κΈ°λ° MVC2 + DAO/Service λΆλ¦¬λ‘ μ μ§λ³΄μμ± ν보 |
π§± νμ₯μ± | νλλͺ κΈ°λ° μμ ꡬ쑰 β μ κ· νλͺ© μΆκ° μ μ΅μ λ³κ²½ |
β‘ UX λ°μμ± | μ 체 νμ΄μ§ μλ‘κ³ μΉ¨ μμ΄ AJAX κΈ°λ° μ€μκ° λκΈ°ν |
π§ͺ ν μ€νΈ | 컨νΈλ‘€λ¬ β μλΉμ€ β DAO β DB νλ¦ μ 체 κ²μ¦ κ°λ₯ |
π§© UI ν΅ν© | νν°, μν μ ν, μμ , μμ , 볡ꡬκΉμ§ νλμ λ·°μ λ°°μΉ |
π μ 체 νλ¦ κ΅¬μ‘° (Mermaid)
graph TD
A[κ°μ¬ λ‘κ·ΈμΈ] --> B[λ΄ κ°μ κ΄λ¦¬ νμ΄μ§ μμ²]
B --> C[LectureManagementLectureService νΈμΆ]
C --> D[LectureManagementLectureDAO.selectLecturesByInstructor]
D --> E[DBμμ μ‘°κ±΄λ³ κ°μ μ‘°ν]
E --> F[JSPμ lecture λͺ©λ‘ μ λ¬]
F --> G[κ°μ λͺ©λ‘ UI λ λλ§]
G --> H1[νν°/μ λ ¬ μ²λ¦¬]
G --> H2[κ°μ νλ μΈλΌμΈ μμ ]
G --> H3[곡κ°/λΉκ³΅κ° μν ν κΈ]
G --> H4[μμ ν Undo κΈ°λ₯]
H1 --> I1["μ λͺ©λ‘ μ‘°ν (AJAX)"]
H2 --> I2[lecture/updateField β DB λ°μ]
H3 --> I3[lecture/toggleStatus β μν μ ν]
H4 --> I4[lecture/delete β μμ μ²λ¦¬]
π§© μ£Όμ κΈ°λ₯ μ€κ³ μ λ΅
1οΈβ£ κ°μ λͺ©λ‘ μ‘°ν (κ²μ + νν° + μ λ ¬ ν΅ν©)
getLecturesByInstructorFiltered()
νλμ λ©μλμ 쑰건 νλ ν΅ν©- DAOλ λμ μΏΌλ¦¬λ‘ νν°λ§ λ° μ λ ¬ μ²λ¦¬
- κ²μ ν€μλλ κ°μλͺ + μ€λͺ μ 체 μμ ν¬ν¨
β κ°μ¬ ID κΈ°λ°μΌλ‘λ§ λμν΄, μΈμ¦ μ°ν λ° κ³Όλν λ°μ΄ν° λ ΈμΆ λ°©μ§
2οΈβ£ μΈλΌμΈ μμ κΈ°λ₯ (UX + μ μ§λ³΄μμ κ· ν)
| μμ νλ | κ²μ¦ κ·μΉ | | β | β | | κ°μλͺ | 2μ μ΄μ | | μ€λͺ | μ ν μμ | | κ°κ²© | μ«μ, 0 μ΄μ | | μΉ΄ν κ³ λ¦¬ | Drop-down μ ν μ ν |
input
λλselect
λ‘ μ ν νblur
μ AJAX μμ²-
μλ²μμλ
updateLectureField(lectureId, field, value)
κ΅¬μ‘°λ‘ μ²λ¦¬β μλΉμ€ λ¨μμ νλλͺ λ§ λ³κ²½ν΄λ μ¬μ¬μ© κ°λ₯
public boolean updateLectureField(Long id, String field, String value)
β SQL Injection λ°©μ§λ₯Ό μν΄ fieldμ λν΄ whitelist μ²΄ν¬ νμ
3οΈβ£ 곡κ°/λΉκ³΅κ° μν μ ν (ν κΈ UI + μ€μκ° λ°μ)
- μνλ Badge μμκ³Ό ν μ€νΈλ‘ μ¦μ λ³κ²½
- AJAX β
/lecture/toggleStatus
νΈμΆ - μλ²μμλ μν νλλ§ update μ²λ¦¬
β μ 체 λͺ©λ‘ μλ‘κ³ μΉ¨ μμ΄ UX νλ¦ μ μ§
4οΈβ£ κ°μ μμ + Undo κΈ°λ₯ (νλ‘ νΈ μ€μ¬ μμ 볡ꡬ)
- μμ μ νμΈ λͺ¨λ¬ β 10μ΄κ° 볡ꡬ λ²νΌ λ ΈμΆ
- 볡ꡬλ νμ¬ UIμμλ§ κ°λ₯νμ§λ§,
- μΆν Redis TTL κΈ°λ° soft-delete κ΅¬μ‘°λ‘ νμ₯ κ°λ₯
π§± λ°±μλ ꡬ쑰 (MVC2 + DAO/Service Layer)
κ³μΈ΅ | μν |
---|---|
Controller | μμ² λΆκΈ° λ° νλΌλ―Έν° μμ§ |
Service | λΉμ¦λμ€ λ‘μ§ β DAO νΈμΆ λΆλ¦¬ |
DAO | DB 쿼리 μ€ν (MyBatis κΈ°λ°) |
DTO | λ°μ΄ν° κ°μ²΄ (LectureManagementLectureDTO) |
JSP | λ·° λ λλ§ + AJAX μ΄λ²€νΈ μ²λ¦¬ |
π¨ UI & UX μ λ΅ μμ½
μμ | μ€λͺ |
---|---|
β μΈλΌμΈ μμ | ν΄λ¦ μ μ¦μ μμ κ°λ₯, blurλ‘ μ μ₯ |
β μν badge | 곡κ°/λΉκ³΅κ° μν μμ + ν μ€νΈ νμ |
β λ°μν ν μ΄λΈ | λͺ¨λ°μΌ λμ (@media ) |
β Spinner νμ | AJAX μμ² μ€ λ‘λ© μκ°ν |
β Toast λ©μμ§ | κ²°κ³Ό λ©μμ§ νΌλλ°± |
β λͺ¨λ¬ | μμ νμΈ μ UX λΆλ¦¬ λ° μ€μ λ°©μ§ |
βοΈ κΈ°μ μ νμ΄λΌμ΄νΈ
π λμ νλ μμ ꡬ쑰
// Service
public boolean updateLectureField(Long lectureId, String field, String value)
- fieldλ
title
,description
,price
,category
λ± - SQLμμλ λμ μ²λ¦¬κ° μ΄λ €μ°λ―λ‘ β DAO λ¨μμ fieldλͺ νν°λ§ ν λΆκΈ° μ²λ¦¬
β μλ‘μ΄ νλκ° μΆκ°λΌλ μ¬μ¬μ© κ°λ₯ν ꡬ쑰
π μ€λ¬΄ κ°μ /νμ₯ μ μ
νλͺ© | κ°μ ν¬μΈνΈ |
---|---|
π 보μ κ°ν | CSRF ν ν°, κ°μ¬ κΆν 체ν¬, λ‘κ·ΈμΈ μΈμ κ²μ¦ |
π κ΅μ ν | JSTL i18n λμ μΌλ‘ λ€κ΅μ΄ μ§μ |
π μ±λ₯ μ΅μ ν | Lazy Loading λλ νμ΄μ§λ€μ΄μ |
π ν΅κ³ μ°λ | μκ°μ μ, μ‘°ν μ μ»¬λΌ νμ |
β» Undo κ³ λν | λ°±μλμ Redis TTL κΈ°λ° soft delete ꡬ쑰 λμ |
β κ²°κ³Ό μμ½ λ° νκ³
μ΄λ² κΈ°λ₯μ λ¨μν CRUDμ λμ΄μ΄ μλλΌ,
βμ¬μ©μμ κ΄λ¦¬ ν¨μ¨μ±κ³Ό κ°λ°μμ μ μ§λ³΄μμ±βμ λͺ¨λ λ§μ‘±μν€λ μν€ν μ²λ₯Ό λͺ©νλ‘ νλ€.
- π‘ κ°μ¬ μ μ₯μμ ν΄λ¦ λͺ λ²μΌλ‘ κ°μλ₯Ό μμ νκ² κ΄λ¦¬ν μ μκ³
- π§± κ°λ°μ μ μ₯μμ κ° κΈ°λ₯μ΄ μ¬μ¬μ© κ°λ₯νκ³ ν μ€νΈ κ°λ₯ν κ΅¬μ‘°λ‘ λλμ΄ μμ
- β μ€λ¬΄μμ μ¦μ μ μ§λ³΄μκ° νμν κ΄λ¦¬μ/κ°μ¬ νμ΄μ§μ λν ν¨ν΄μΌλ‘ νμ© κ°λ₯
βκ°μ¬ κ΄λ¦¬ νμ΄μ§λ λ¨μν ν μ΄λΈμ΄ μλλΌ,
λΉμ¦λμ€ μꡬλ₯Ό νμ UX μ€κ³ 곡κ°μ΄λ€.β
β κΈ°λ₯λ³λ‘ μͺΌκ° κ² μλλΌ, μ¬μ©μ νλ¦μΌλ‘ ν΅ν©ν ꡬ쑰μ νμ λκΌλ€.