πλ§ν¬ : https://www.quizstudio.site
πνλ‘μ νΈ μκ°
ποΈκ°λ° κΈ°κ° : 2023.03 ~
π οΈμ¬μ©κΈ°μ
π»κ΅¬λνλ©΄
λͺ©μ°¨
Spring batch λμ μ΄μ
OPENAI API μμ²μμλΆν° AWS RDSμ μ μ₯μμ , REDISμ μ μ₯μμ μ μΌκ΄μ μΌλ‘ μ²λ¦¬ν΄μΌ ν νμλ₯Ό λκ»΄ Spring Batchλ₯Ό λμ νμμ΅λλ€.
μ΄λ κ² ν¨μΌλ‘μ¨ API μμ²μ λ°λ₯Έ μλ΅ μλ λ³λ(30μ΄μμ 3λΆκΉμ§ λ€μ)μ μν₯μ λ°μ§ μκ³ μΌκ΄λ μλΉμ€λ₯Ό μ 곡ν μ μμ΅λλ€. λν, νκ΅ μκ° κΈ°μ€μΌλ‘ μ¬μ©μλ€μ΄ μ μ μλ²½ μκ°λμ API μμ² μμ μ μννμ¬ μλΉμ€μ μμ μ±κ³Ό ν¨μ¨μ±μ λμμ΅λλ€.
λν 1000ν ν°λΉ 0.001$ λΉμ©μ΄ μ²κ΅¬λλ λ§νΌ, μλ‘μ΄ μμ²λλ§λ€ api μμ²μμ κ³ΌκΈμ μνμμλ λ²μ΄λ¬μ΅λλ€.
μκ°λκ° λ€λ₯Έ μμ μμ λ°μ΄ν°λ₯Ό 곡μ νλ λ¬Έμ μ λν΄ κ³ λ―Όνμμ΅λλ€.
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ λ΄λΆμ μΈ Queueλ₯Ό νμ©νμ¬ μ μμ μΌλ‘ λ°μ΄ν°λ₯Ό 곡μ ν μ μμμ΅λλ€. μ΄λ κ² ν¨μΌλ‘μ¨ μλ‘ λ€λ₯Έ μκ°λμ μμ νλ λ€λ₯Έ μμλ€ μ¬μ΄μμ λ°μ΄ν°λ₯Ό μννκ² μ λ¬νκ³ κ³΅μ ν μ μκ² λμμ΅λλ€.
μΉμλ²λ₯Ό reverse proxy κ΅¬μ‘°λ‘ μ€κ³νμ¬, μλ¨μ Nginxλ₯Ό κ°μ§ μλ²λ‘ λκ³ λ·λ¨μ μΉμλ²λ₯Ό 보νΈ
AWS ELBμ μΆκ°μ μΈ μ€μ μ λν κ³ΌκΈ μ°λ €
ν΄λΉ λΌμ°ν μ flowλ λ€μκ³Ό κ°μ΅λλ€.
νμ μ μΈ λ¦¬μμ€ ν΄κ²°
νμ΅μ©μΌλ‘ μ μν νλ‘μ νΈ μ΄λ―λ‘, μ’μ μ±λ₯μ μλ²κ° μλ ν리ν°μ΄ μλ²(t2.micro)λ₯Ό μ΄μ©ν΄μΌ νμ΅λλ€.
κ³μλλ λ©λͺ¨λ¦¬ λ¦ νμμ ν΄κ²°νκΈ° μν΄ swap fileμ ν΅ν΄ λ©λͺ¨λ¦¬λ₯Ό λλ¦¬κ³ , κ° μλ²μ 컀λ₯μ μλ₯Ό λͺ μμ μΌλ‘ μ ννμ¬ ν΄κ²°νμμ΅λλ€.
node module λμ μ΄μ
μ£Ό μλΉμ€μΈ aiνν μ λ¬Έμ λ₯Ό λΉ λ₯Έ μλλ‘ μ¬μ©μμκ² μλ΅νκΈ° μν΄ event non-blocking κΈ°λ°μΈ nodeλ₯Ό μ±ννμ΅λλ€.
μ΄λ₯Ό ν΅ν΄ λ€μμ μμ²μ λμμ μ²λ¦¬νκ³ λ³λ ¬μ μΌλ‘ μμ μ μνν μ μμ΄μ μ¬μ©μμκ² μ μν μλ΅μ μ 곡ν μ μμ΅λλ€.
λ¬Έμ μμ² μμλ μ§μ μ μΈ AWS RDS μμ²μ΄ 리μμ€λ₯Ό ν¬κ² μ¬μ©ν κ²μΌλ‘ νλ¨νμ¬, AI λ¬Έμ λ°μ΄ν°λ₯Ό μ μ₯νλ μ₯μλ‘ μΈλ©λͺ¨λ¦¬ DBμΈ Redisλ₯Ό μ ννμμ΅λλ€.
μ€νλ§ λͺ¨λμμ @Async ν€μλμ κ°μ κ²μΌλ‘ non-blockingμ ꡬνν μ μμ΅λλ€.
νμ§λ§ λͺ¨λμ μ νν κΈ°μ ormμΈ JPA λ blocking queryμ΄κΈ° λλ¬Έμ μ¬μ©νμ§ μμμ΅λλ€.
κ°μΈμ 보 λ¬Έμ
μ¬μ©μμκ² νμκ°μ νλ‘μΈμ€λ μ κ·Όμ±μ μ ννλ€κ³ μκ°νμ¬, μμ λ‘κ·ΈμΈμΌλ‘λ§ κ°νΈνκ² λ‘κ·ΈμΈ ν μ μλλ‘ νμμ΅λλ€.
μ¬μ©μμκ² λ°λ κ°μΈμ 보λ emailμ΄ μμ΅λλ€. ν΄λΉ emailμ μνΈν ν μ μ₯νμ¬, μΆνμ db ν΄νΉμ΄ λμμ λλ νκ²©μ΄ μλλ‘ νμμ΅λλ€.
SSO(Single Sign-On)
λ©ν° λͺ¨λ κΈ°λ°μ΄λ―λ‘ JWTν ν°μ μ΄μ©νμ¬ SSOμ ꡬννμ΅λλ€.
Flowλ λ€μκ³Ό κ°μ΅λλ€.
μ½λλ₯Ό κ²μ¦νκ³ , κ°λ°μκ° μλν λ Όλ¦¬μ λ°©ν₯λλ‘ μ μλνλμ§λ₯Ό νμΈν μ μλ κ°μ₯ μ’μλ°©λ²μ ν μ€νΈλΌκ³ μκ°ν©λλ€.
κ°κ°μ λͺ¨λμ μ΄ 155κ°μ e2e ν μ€νΈμ unit ν μ€νΈλ₯Ό μμ±νμ΅λλ€.
github actionμ ν΅ν΄ CI/CDλ₯Ό ꡬμΆνμ΅λλ€.
λͺ¨λλ€μ΄ λ 립μ μΌλ‘ λΉλλλλ‘ κ°κ°μ CI/CDλ₯Ό ꡬμΆνμ΅λλ€.
κ° κ³μΈ΅μ΄ μλ‘μκ² μν₯μ΄ μλλ‘ λΆλ¦¬νλ κ²μ νλ‘μ νΈ μ€κ³ μ μ€μν κ³ λ―Ό μ¬ν μ€ νλμ΄μμ΅λλ€. μ΄ κ³ λ―Όμ λν λ΅μΌλ‘ κ° κ³μΈ΅λ§λ€ νμ€ν λΆλ¦¬λ₯Ό μν΄ mapper κ°μ²΄λ₯Ό μ¬μ©νμ΅λλ€.
Mapperλ layer μ΄λ μμ λ°μ΄ν°λ₯Ό ν΄λΉ λ μ΄μ΄μ λ°μ΄ν° μ μ© κ°μ²΄(DTO)λ‘ λ³ννλ μν μ μνν©λλ€.
μ΄λ₯Ό ν΅ν΄ κ° λ°μ΄ν°λ μλ‘ μν₯μ μ£Όμ§ μκ³ , ν΄λΉ λ°μ΄ν°μ λν λΉμ¦λμ€ λ‘μ§μλ§ μ§μ€ν μ μμμ΅λλ€. λν λ°μ΄ν°μ λΆλ³μ±μ 보μ₯ν μ μμμ΅λλ€.
κ°κ°μ 맀νΌ(mapper) κ°μ²΄λ λ³νλλ μμ μμμ μν μ μννλ κ°μ²΄μ λ°μ ν κ΄κ³λ₯Ό κ°μ§λ―λ‘, λ©μλλ₯Ό μ μ λ©μλλ‘ κ΅¬μ±νμ΅λλ€
λ¨μ μ‘°νμ μμμ κΈ°λ₯μ λ κ°κΉμ΄ μ’ μλκ³ , μμ , μμ , μ½μ κ³Ό κ°μ μμ μ λλ©μΈμ λ κ°κΉμ΄ μ’ μλλ€κ³ μκ°νμ¬, μ‘°νμ λ°μ΄ν°μ‘°μ λ ν¬μ§ν 리λ₯Ό λΆλ¦¬νμ¬, 볡μ‘λμ μ± μ λΆλ¦¬λ₯Ό κ°μ νκ³ μ νμ΅λλ€.
νλμ λλ©μΈ μλΉμ€μμ λ€λ₯Έ λλ©μΈμ λ ν¬μ§ν 리λ₯Ό DI νλ κ²μ μΆνμ μλΉμ€μ μ¬μ΄μ¦κ° μ»€μ§ μλ‘ μμ‘΄κ΄κ³μ 볡μ‘λκ° λμμ§ μ μκΈ° λλ¬Έμ, μ¬λ¬κ°μ λλ©μΈμ λ ν¬μ§ν 리λ₯Ό DIν΄μ λΉμ¦λμ€ λ‘μ§μ μ²λ¦¬ν΄μΌ νλ κ²½μ°μλ Facade ν¨ν΄μ μ΄μ©ν΄ ν΄κ²°νμ΅λλ€.
ν΄λΉ ꡬ쑰 κ°μ μ λν issue μ λλ€. https://github.com/bmm522/quiz-studio/issues/23
Validation 체ν¬μ κ²½μ°λ₯Ό λκ°μ§λ‘ μ νμ΅λλ€.
Clientλ‘ λΆν° μ€λ Validation 체ν¬
ν΄λΌμ΄μΈνΈλ‘λΆν° μ€λ Validationμ λν μ± μμ Requestλ‘λΆν° μμ±λλ DTOμ μμΌλ©°, μ΄λ₯Ό μν΄ DTOκ° μμ±λλ μμ μΈ Presentation κ³μΈ΅μ Mapperμμ 체ν¬νλλ‘ μ€κ³νμ΅λλ€.
μ΄λ₯Ό ν΅ν΄, 컨νΈλ‘€λ¬λ κ²μ¦λ λ°μ΄ν°λ₯Ό μλΉμ€λ μ΄μ΄μ μ λ¬ ν μ μκ² λμμ΅λλ€.
Dbμ λ°μ΄ν°λ₯Ό νμΈν΄μΌ νλ Validation 체ν¬
λ°μ΄ν°λ² μ΄μ€μ λ°μ΄ν°λ₯Ό νμΈν΄μ ν΄μΌνλ Validation 체ν¬λ μλΉμ€ λ μ΄μ΄μμ μ΄λ£¨μ΄μ ΈμΌ νλ€κ³ νλ¨νμ΅λλ€.
μ΄μ λνμ μΌλ‘ κΆν 체ν¬κ° μμμ΅λλ€. μμ μ€λͺ ν λλ‘, ν΄λΉ μν λ§ μννλ Validatorλ₯Ό ν΅ν΄ μ΄λ₯Ό ꡬννμμ΅λλ€.