π 6μ£Όκ°μ ν νλ‘μ νΈ νκ³ λ₯Ό κΈ°λ‘ν©λλ€. νλ‘μ νΈμ μ§§μ μκ°μ ν¨κ» νμ
μ νλ©΄μ μμλ κ²λ€μ λν΄ μμ±ν©λλ€.
π Project μ°Έμ¬ μΈμ
ππ» νλ‘ νΈμλ 3λͺ
ππ» λ°±μλ 3λͺ
π Project λ°©κ°κ³ μκ°
ππ» μ¬ν μ΄λ
μλ€μ μ£Όκ±°λΉμ© λΆλ΄μ λμ΄λ΄κ³ μ μ¬μ©μκ° μνλ κΈμ‘λμ λ°©κ³Ό λ£Έλ©μ΄νΈλ₯Ό λ§€μΉν΄ μ£Όλ νλ«νΌ μλΉμ€ Project
πββοΈ λνμ μΈ κΈ°λ₯
1. μ±ν₯μ΄ λ§λ λ£Έλ©μ΄νΈ μλ μΆμ² κΈ°λ₯ μ 곡
2. μ¬μ©μκ° λ£Έλ©μ΄νΈ λ§€μΉμ΄ μλ£λλ©΄ μ μ μ±ν
κΈ°λ₯ μ 곡
3. μ¬μ©μκ° μνλ μ§μ, κΈ°κ°, κΈμ‘, μ±λ³μ λ§λ κ²μκΈ νν°λ§νμ¬ κ²μ κ°λ₯
π μ§§μ νλ‘μ νΈ κ΅¬ν κΈ°λ₯λ€
π€ ν νλ‘μ νΈ λΏλ§μλλΌ μ‘°λ³κ³Όμ λ± μ λν΄μ λλ μ’μ κ²½νμ κ°μ§μ μ΄ μλ€. (λμ€μ λ€λ₯ΈκΈμ ν΅ν΄μ μ΄μΌκΈ°λ₯Ό μ μκΉ μκ°μ€μ΄λ€.)
κ·Έλμ νλ‘μ νΈ μμλ¨κ³μμ κΈ°λ보λ€λ κ±±μ μ΄ λ΄ μκ°μ μ νμ΄λ₯Ό ν¬κ² μ°¨μ§ νλ€.
( νλ‘μ νΈκ° λλ λ μ―€μ΄μΌ λ°κ²¬ν λ°μ λ κ³Όκ±°μ λ π£)
λ΄κ° νλ νλ,λ°μΈλ€μ΄ νμκ² μκ°λ³΄λ€ λ§μ μν₯μ λ―Έμ³£λ κ² κ°λ€..
π€ μ²μλμ ν΄λ³΄λ κΈ°λ₯κ³Ό κΈ°μ λ€ κ·Έκ±Έ λμ νκΈ°κΉμ§ λ§μ€μμ΄ λ§μλκ²κ°λ€.
Socketμ μ΄μ©ν μ±ν ꡬν, AWS λ°°ν¬, CI-CD λ± μ²μ ν΄λ³΄λκ²λ€μ λμ νκΈ°μ λλ € κ²μλ¨Ήκ³ μν μμμκΉμ λν΄ μκ°νλ©΄μ λ§μ€μμ΄ λ§μλ κ² κ°λ€. κ·Έλ΄λ λ§λ€ λλ " κ·Έλμ ν΄λ³΄μ£ " νλ©° λ΄λ΄νκ² λ§νλκ²κ°λ€. κ±±μ λ§ ν기보λ€λ μΌλ¨ λ¬Έμ μ μ§μ λΆλͺνλκ±Έλ‘!
π¬ νμ μ νλ€λ³΄λ©΄ ~μ λ΄λΉμΌλ‘ κ΅¬λΆ μ§μμ μλλΆλΆμ΄ μκΈ΄λ€. κ°λ Ή AμB μ°λμμ μκΈ°λ μ΄μλ€μ λν΄μλ A μ B κ°μ΄ κ³ λ―Όν΄μΌν λ¬Έμ λΌκ³ μκ°νλ€.
FE ννΈμ BE ννΈ μ°λμ FE ννΈμμ "400μλ¬κ° λμμ.", "500μλ¬κ° λμμ."λ‘ μν΅νμλλ° κΈ°μ‘΄ BE ννΈ μ½λμμ μμ²μ΄ μ¬λ°λ₯Έκ²½μ°μλ§ μ μμ μΈ responseλ₯Ό ν΄μ£ΌμκΈ° λλ¬Έμ μ€λ₯λ₯Ό λ°λ‘ νμ νκΈ° νλ€μλ€. κ·Έλμ μνν μν΅μ μν΄ μΆκ°μ μΌλ‘ ApiResponse κ³΅ν΅ μ½λλ₯Ό μμ±νμ¬ λ°ννμλ€.
{
"status": 400, // HttpStatus μλ΅κ°
"code": USER_NOT_FOUND, //μλ΅μ½λμλνκ° μμ λ μ¬μ©μλ₯Ό μ°Ύμμμμκ²½μ°
"msg": "μ μ λ₯Ό μ°Ύμμμμ΅λλ€.", // μλ¬μ½λμΌκ²½μ° μλ¬μ λν λ©μμ§,μ±κ³΅μΌ κ²½μ° μ±κ³΅μλν λ©μΈμ§
"data":[] //λ°μ΄ν°κ° μμκ²½μ° λ΄λΆμ λ΄μμ λ°ν
}
μμκ°μννλ‘ RestController ννλ₯Ό λ³κ²½ν΄μ£Όλ FE λΆλ€λ λ°±μλμμ μ΄λ€λ¬Έμ κ° λ°μνμ§ μ§κ΄μ μΌλ‘ νμ ν μ μμκ³ BEννΈμμλ μμΈμ½λλ₯Ό μΆμ νκΈ°μ νΈλ¦¬νμλ€.
π₯ 4μ£Όμ°¨μ FEνμμ€ νλΆμ΄ κ°μΈμ¬μ μΌλ‘ νμ°¨νκ² λμλ€.
FEννΈ νμ μ€μ¬μ μ΄ λμ΄ μ£Όμ λΆμ΄ κ°μμ€λ½κ² λκ°κ²λμ΄ FEνμλ€μ΄ μ μ μ μΌλ‘ λ§μ΄ νλ€μ΄ νλ€. νμ§λ§ λ λ μ¬λ μκ°μΌλ‘ μ°λ¦¬κ° ν΄μΌν μΌμ λ§κ°νλ©΄ μλμκΈ°μ FE νμλ€μκ² λ¨μμλ μΌμ μ€ μμνμ§μμ κΈ°λ₯μ λλνκ³ μ§κΈ μ§νμ€μΈ μμ μ λν΄μ μμ±λλ₯Ό μ¬λ¦¬λκ²μΌλ‘ λ°©ν₯μ λ€μ μ‘μλ€. BE νμμλ μμμΉ λͺ»νμΌμ λλμ§λ§ FEνμ λμ± μ κ²½μ°μ΄κ³ νλ€μμκ²μ΄λΌλ μκ°μ FE μ 무 λν μ κ²½ μ»λκ² κ°λ€. (μΌμ μ²΄ν¬ , μ§ν μν© νμΈλ±)
π νλ‘μ νΈ μ€ μλ λͺ°λλκ² λ€..
π service ,controller λ± λλ©μΈ ν¨ν€μ§λ‘ λ°λ‘ ꡬλΆνμ§μκ³ ν service,controller ν ν¨ν€μ§ μμ μ¬λ¬λλ©μΈμ΄ μμΌλ μΆνμ μμ νκΈ°μν΄ ν¨ν€μ§ μμμ λλ©μΈμ μΆκ°μ μΌλ‘ μ°Ύλ μμ μ΄ νμνλ€.
# νλ‘μ νΈ ν΄λꡬ쑰
ββcommon
β ββexception
ββconfig
β ββchat
β ββredis
β ββsecurity
ββcontroller
ββdto
β ββapply
β ..
ββentity
β ββchat
ββrepository
β ββimpl
β ββmongo
ββservice
β ββimpl
ββtype
ββutil
ν¨ν€μ§ λͺ μ΄ μ€λ³΅λλκ²μ΄ μ«μ΄μ ν ν¨ν€μ§μ λͺ¨λ λλ©μΈμ λ£μ κ²°κ³Ό class λͺ μΌλ‘ κ²μνκ±°λ Aκ°λ°μ νμν μ½λλΏλ§μλλΌ C,Dμ½λλ νν¨ν€μ§μ μμΌλ λ³΄κΈ°κ° μ λ§ λΆνΈνλ€. π κ°μ μ νλ€λ©΄ (λλ©μΈν¨ν€μ§) - service, λ±μΌλ‘ μμ λλ©μΈμ΄λ¦μΌλ‘λ ν¨ν€μ§λ‘ ꡬλΆνμ¬ μλ‘μ΄ ν¨ν€μ§μΈ΅μ λ§λ€μ΄μ κ΄λ¦¬νλκ²μ΄ λ μ’μμν λ° .. λΌλ μμ¬μμ΄ λ¨λλ€.
ννλ‘μ νΈμ€ userμ μν, μ΄λ―Έμ§,μ 보λ±μ μ λ°μ΄νΈνλλ° user ννΈ λ΄λΉλ°λ‘ user μ profile μ λ΄κ° λ΄λΉνκ²λμλ€. κ·Έλ¬λ©΄μ 컨νΈλ‘€λ¬λ₯Ό MyController λΌκ³ μμ±νλ€.
@RequestMapping("api/my")
public class MyController{
//...κΈ°νλ±λ±
}
μ΄ μ»¨νΈλ‘€λ¬λ₯Ό ν΅ν΄μ profileμ μ
λ°μ΄νΈνλλ° "api/my/articles"
, .. λ± my(λμ) λ± λͺ¨νΈν λ¨μ΄λ‘ μμ±λ api λ₯Ό λ§λ€μλ€. κΈ°λ₯μ μΌλ‘ μ΄μνμ§ μμμ§λ§ λ©ν λμΌλ‘λΆν° μ μ μΌλ‘ νλ‘ νΈμ νλ©΄μ 보며 μ€κ³ν api νΌλλ°± λ°μλ€. μ΄ κ²½μ° λ΄κ°μλ λ€λ₯Έμ¬λμ΄ μ μ§λ³΄μλ₯Όν λ κ³€λνμ μ΄ μμκ²κ°λ€.. (μ ν restful νμ§μλ€..)
ννλ‘μ νΈλ₯Ό νλ©΄μ TDD λ₯Ό μ²μμΌλ‘ λμ
ν΄λ³΄μλ€. κ·Έ κ³Όμ μμ ν
μ€νΈλ₯Ό ν λ @SpringbootTest μ΄λ
Έν
μ΄μ
κ³Ό λ¬Έμ κ° λ§μλ€. ν
μ€νΈμ SpringContext (μΈλΆ μ£Όμ
λ³μ ,μ€μ λ± ) μ ν΅ν©μ μΈ ν
μ€νΈλ₯Ό μ§ννκΈ°κ° μ΄λ €μ λ€.
컨νΈλ‘€λ¬, μλΉμ€ λ± μ¬λΌμ΄μ€ ν
μ€νΈλ₯Ό μμλ¨μλ‘ ν
μ€νΈλ₯Ό νλ©° μ§ννμ§λ§. μ 체μ μΈ
μ¬λ¬ 볡ν©μ μΈ ν
μ€νΈλ₯Ό λμ ν΄λ³΄μ§ λͺ»νκ²μ΄ μμ¬μ λ€. (λλ μ λ§ TDDλ₯Ό μ€μ²νκ²μΌκΉπ€)