κ²μν
μΉ μ ν리μΌμ΄μ
νλ‘μ νΈ μ
λλ€.
2022.08.04 ~ 2022.08.07
λμ Spring Boot
μ React
λ₯Ό μ¬μ©ν΄ ꡬννμ΅λλ€.
μ΄ νλ‘μ νΈλ₯Ό ν΅ν΄ μ΄λ£¨κ³ μ ν λͺ©νλ Springμμ μ 곡νλ νλ μμν¬λ₯Ό μ§μ μ¬μ©ν΄ 보기
μμ΅λλ€.
νλ‘μ νΈ κ΅¬ν κ³Όμ λμ νμ μΈμ¦/μΈκ°, μμΈμ²λ¦¬λ₯Ό κ³ λ―Όνλ©° μ½λλ₯Ό μμ±νμ΅λλ€.
- νλ‘μ νΈ κ΅¬μ‘°
- μ¬μ© κΈ°μ
- ꡬν κΈ°λ₯
- κΈ°λ₯ μ€ννλ©΄
- API λͺ μΈμ
- ERD μ€κ³
- νΈλ¬λΈμν
κΈ°μ | λ²μ |
---|---|
Spring Boot | 2.7.2 |
Spring Security | 2.7.2 |
Bean Validation | 2.7.2 |
JSON Web Token | 0.9.1 |
MyBatis | 2.1.3 |
MySQL Connector J | 8.0.28 |
Swagger | 3.0.0 |
κΈ°μ | λ²μ |
---|---|
NodeJS | 16.16.0 |
React | 18.2.0 |
axios | 0.27.2 |
react-axios | 2.0.6 |
react-dom | 18.2.0 |
react-js-pagination | 3.0.3 |
react-router | 6.3.0 |
react-router-dom | 6.3.0 |
react-scripts | 5.0.1 |
- κ²μν κΈ°λ₯
- λͺ¨λ κ²μκΈ λ° νΉμ κ²μκΈ μ‘°ν
- κ²μκΈ κ²μ (μ λͺ©, λ΄μ©, μμ±μ)
- κ²μκΈ μμ± [νμ]
- κ²μκΈ μμ [νμ, κ²μκΈ μμ±μ]
- κ²μκΈ μμ [νμ, κ²μκΈ μμ±μ]
- κ²μκΈ λ΅κΈ μμ± [νμ]
- λκΈ κΈ°λ₯
- λκΈ μ‘°ν
- λκΈ μμ± [νμ]
- λκΈ μμ [νμ, λκΈ μμ±μ]
- λκΈ μμ [νμ, λκΈ μμ±μ]
- νμ κΈ°λ₯
- νμκ°μ
- λ‘κ·ΈμΈ/λ‘κ·Έμμ
- λͺ¨λ κ²μκΈμ μ‘°νν μ μμ΅λλ€. νμ΄μ§ κΈ°λ₯μ ν΅ν΄ ν νμ΄μ§μμ μ΅λ 10κ°μ κ²μκΈμ΄ μ‘°νλ©λλ€.
- κ²μκΈμ μ λͺ©μ ν΄λ¦νλ©΄, κ²μκΈμ μμΈ λ΄μ©μ μ‘°νν μ μμ΅λλ€.
- κ²μκΈμ μ λͺ©κ³Ό λ΄μ© λλ μμ±μλ‘ κ²μκΈμ κ²μν μ μμ΅λλ€.
- λ‘κ·ΈμΈν μ¬μ©μλ κ²μκΈμ μμ±ν μ μμ΅λλ€.
- λ‘κ·ΈμΈνμ§ μμμ κ²½μ° κΈ μμ±μ΄ μ νλ©λλ€.
- κ²μκΈ μμ±μλ κ²μκΈμ μμ ν μ μμ΅λλ€.
- κ²μκΈ μμ±μλ κ²μκΈμ μμ ν μ μμ΅λλ€.
- νλμ κ²μκΈμ λν λ΅κΈμ μμ±ν μ μμ΅λλ€.
κ²μκΈ μμ±
κ³Ό λ§μ°¬κ°μ§λ‘ λ‘κ·ΈμΈν μ¬μ©μλ§ λ΅κΈμ μμ±ν μ μμ΅λλ€.
κ²μκΈ μμΈ
μμ κ΄λ ¨λ λκΈμ μ‘°νν μ μμ΅λλ€. νμ΄μ§ κΈ°λ₯μ ν΅ν΄ ν νμ΄μ§μμ μ΅λ 5κ°μ λκΈμ΄ μ‘°νλ©λλ€.
- λ‘κ·ΈμΈν μ¬μ©μλ λκΈμ μμ±ν μ μμ΅λλ€.
- μμ μ΄ μμ±ν λκΈμ μμ ν μ μμ΅λλ€.
- μμ μ΄ μμ±ν λκΈμ μμ ν μ μμ΅λλ€.
- νμκ°μ μ μμ΄λ μ€λ³΅μ 체ν¬ν©λλ€.
- νμκ°μ μ ν΅ν΄ μλΉμ€μ μ¬μ©μ μ 보λ₯Ό μ μ₯ν©λλ€.
- λ‘κ·ΈμΈ
- λ‘κ·ΈμΈμ μλ£νλ©΄ λΈλΌμ°μ μ
Local Storage
μ μ¬μ©μid
μJWT
ν ν° μ 보λ₯Ό μ μ₯ν©λλ€.
- λ‘κ·Έμμ
- λ‘κ·Έμμμ μλ£νλ©΄ λΈλΌμ°μ μ
Local Storage
μ λ΄μ©λ μμ ν©λλ€.
HTTP λ©μλλ₯Ό ν΅ν΄ νμλ₯Ό λͺ
μν μ μλλ‘ RESTful λ°©μμΌλ‘ μ€κ³νμ΅λλ€.
νμ λ° λΉνμμ λ°λΌ κ°μ©ν κΈ°λ₯μ μ μ½μ λκΈ° μν΄ Spring Security + JWT ν ν° λ°©μμΌλ‘ ꡬννλ€.
κ°λ¨ν BBS μμ€ν μ λ§λλ κ²μ λͺ©νλ‘ νμΌλ, Spring Security λ₯Ό μ¬μ©νλ μΈμ¦ λ‘μ§μ ꡬννκΈ° 볡μ‘νλ€. Spring Security μ λμ μ리λ₯Ό μ ννκ² λͺ¨λ₯΄λ μνμμ ꡬννλ € νλ μ΄λ €μμ΄ μμλ€. (λ°°λ³΄λ€ λ°°κΌ½μ΄ λ μ»€μ§ λλ π«€)
Spring μμ μ 곡νλ Interceptor κΈ°λ₯κ³Ό ArgumentResolver, Annotation κΈ°λ₯μ μ¬μ©νκ³ μ¬μ©μ μμ΄λλ§μ λ°μ μΈκ° 체ν¬λ₯Ό νλ€λ©΄ κ°λ¨νκ² κ΅¬ν κ°λ₯νμ κ² κ°λ€.
μμ²μ λ³΄λΈ μ¬μ©μλ₯Ό νλ³νκΈ° μν΄ @AuthenticationPrincipal
μ μ¬μ©νμ¬, λ‘κ·ΈμΈ μ μΈμ¦ν ν μ μ₯ν μ¬μ©μ μ λ³΄μΈ UserDetails
μ username(Id)
λ₯Ό κ°μ Έμ κΈ μμ±μμ λΉκ΅νλ€.
μ¬μ©μκ° νμκ°μ
κ³Ό λ‘κ·ΈμΈμ μν΄ μ
λ ₯ν λ°μ΄ν°μ λν΄ Bean Validation
μ μ¬μ©ν΄ κ²μ¦ κΈ°λ₯μ ꡬννλ€.
ν νλ¦Ώ μμ§μΌλ‘ μλ²μμ λ·°λ₯Ό 그리λ λ°©μμ΄ μλ, λ°μ΄ν°λ§ μ μ‘νλ API μλ²μμ μ λ ₯κ° κ²μ¦μ λν μ€λ₯ λ©μμ§λ₯Ό μ΄λ»κ² μ λ¬ν΄μΌ ν μ§ κ³ λ―Όνμλ€.
Bean Validation
μμ λμ§ μμΈλ₯Ό λ°μμ μ²λ¦¬ν λ€μ μ€λ₯ λ©μμ§λ₯Ό μλ΅μΌλ‘ λ΄λ €μ£Όλλ‘ κ΅¬ννλ€.
- νμκ°μ μμ² νΌ λ°μ΄ν°
- νμ κ°μ μμ² μ²λ¦¬ 컨νΈλ‘€λ¬
λν μ¬μ©μ κ΄λ ¨ μμΈλ₯Ό μ²λ¦¬νκΈ° μν΄ μ»€μ€ν μμΈλ₯Ό λ§λ€μ΄μ μμΈλ₯Ό λ°μμν€κ³ νΈλ€λ¬μμ μ²λ¦¬ν μ μλλ‘ κ΅¬ννλ€.
@AdviceController
λ₯Ό λ λ§μ΄ μ¬μ©νλ€κ³ νλλ°, μ΄ νλ‘μ νΈμμλ νμ κ΄λ ¨λ μμΈ μ²λ¦¬λ§μ μμ±νκΈ° μν΄ μ μ μμΈμ²λ¦¬λ₯Ό μ¬μ©νμ§ μμλ€. λν νμμλ 컨νΈλ‘€λ¬λ³λ‘ μ²λ¦¬νλ μμΈλ₯Ό μΈλΆν νλκ² μ’μ§ μμκΉ? λΌλ μκ°μ κ°μ§κ³ μμλ€.
νμ§λ§ κ²°κ΅ μ΄λ€ μμΈμ²λ¦¬λ μλ²μμ λ°μν μμΈλ₯Ό μ²λ¦¬ν λ€μ μμ²μ λ³΄λΈ νλ‘ νΈ μͺ½μΌλ‘ μν μ½λλ μ€λ₯ λ©μμ§λ λ΄λ €μ€μΌ νλ€. λ°λΌμ 컀μ€ν μμΈμ μμΈ λ©μμ§λ₯Ό λ²μ©μ± μκ² μμ±νλ©΄ μ€νλ € μ μμμ μμΈμ²λ¦¬ νλκ² μΌκ΄μ± μμ κ²μ΄λΌλ κΉ¨λ¬μμ μ»μλ€.
μμ²κ³Ό μλ΅μΌλ‘ μ£Όκ³ λ°λ λ°μ΄ν°λ₯Ό ν λμ νμΈνκΈ° μν΄ μμ² λ°μ΄ν°μ μλ΅ λ°μ΄ν°λ₯Ό κ°κ°μ DTOλ‘ λΆλ¦¬νλ€.
μμ²μΌλ‘ λ°μ λ°μ΄ν°λ₯Ό λ°νμΌλ‘ SQL 쿼리λ₯Ό μνν λ νμν λ°μ΄ν°λ§μ λ겨주기 μν΄ Serviceμμ Daoλ‘ λκΈ°λ νλΌλ―Έν°λ DTOλ‘ λΆλ¦¬νλ€.
μ΄λ κ² κ΅¬ννμ λμ μ₯μ μ 컨νΈλ‘€λ¬ λ©μλμ νλΌλ―Έν°λ‘ λ§μ μΈμλ₯Ό λκ²¨μ£Όμ§ μμλ λλ€λ μ , μ£Όκ³ λ°λ λ°μ΄ν°λ₯Ό νμΈνκ³ μμ ν΄μΌνλ κ²½μ° DTO ν΄λμ€ λ§μ μμ ν΄μΌ νλ μ μ΄μλ€.
νμ§λ§ λ¨μ μ κΈ°λ₯μ΄ μΆκ°λ λλ§λ€ ν΄λμ€ νμΌμ΄ λμ΄λ κ΄λ¦¬κ° νλ€μ΄μ‘κ³ , λ°μ΄ν°λ₯Ό ν λμ νμΈν μ μμ§λ§ νμΈνκΈ° μν΄μλ μ§μ ν΄λμ€ νμΌμ μ΄μ΄λ΄μΌ νλ€λ μ μ΄μλ€.
μμ² νλΌλ―Έν°κ° λ§μ§ μμ κ²½μ° (2-3κ°) κ΅³μ΄ ν΄λμ€ νμΌλ‘ λ°λ‘ μμ±νμ§ μκ³ μ»¨νΈλ‘€λ¬ λ©μλμ μ΄λ Έν μ΄μ μΌλ‘ 맀ννλ κ²μ΄ μ½λμ κ°λ μ±κ³Ό μ μ§λ³΄μ μΈ‘λ©΄μμ μ’μ λ°©λ²μ΄ λ κ²μ΄λΌ μκ°λλ€.
κ²μκΈ μ‘°νμ μ€λ³΅ μΉ΄μ΄ν
μλ°©μ μν΄ read_history
ν
μ΄λΈμ λμ΄ κ΅¬ννλ€.
Cookie
μ κ²½μ° νλμ λλ©μΈ λΉ μ¬μ©ν μ μλ κ°μκ° μ νλκΈ° λλ¬Έμ, μ¬λ¬ κ²μκΈμ μ‘°ννλ©΄ μ ν κ°μλ₯Ό λμ΄λ²λ¦΄ κ²μ΄λΌ μμνλ€. κ·Έλμ μ¬μ©μκ° μ΄λ―Έ μ½μ κ²μκΈμΈμ§ νμΈν μ μλλ‘ μλ²μμ μ¬μ©μ μμ΄λ
κ²μκΈ
μ‘°ν μκ°
μ λμ΄ μ²΄ν¬νλ€.
μ€μΌμ₯΄λ¬λ₯Ό ꡬνν΄ 24μκ° λ¨μλ‘ μ‘°νμλ₯Ό μ΄κΈ°ν μμΌμ λ€μλ μ΄ λλ©΄ μ‘°νμκ° λ€μ μΉ΄μ΄ν λ μ μκ²λ ꡬννλ©΄ μ’μ κ² κ°λ€. μλλ©΄ μ‘°νμλΌλ λ°μ΄ν°λ₯Ό κ΄λ¦¬νμ§ μκ³ μ½μ κΈ, μ½μ§ μμ κΈ λ‘ κ΄λ¦¬λ μ μλλ‘ κ΅¬ννλ κ²λ νλμ μ’μ λ°©λ²μ΄λΌ μκ°νλ€.