<aside> <img src="/icons/hammer_gray.svg" alt="/icons/hammer_gray.svg" width="40px" /> Java β’ Spring β’ Oracle β’ Git β’ MyBatis β’ Apache Tomcat Server β’ JSP β’ HTML β’ CSS β’ Javascript β’ Bootstrap β’ JQuery β’
</aside>
<aside> <img src="/icons/report_orange.svg" alt="/icons/report_orange.svg" width="40px" /> μ¬λ¬ κ°μ λ μνΌ κ³Όμ μ 보 λ±λ‘ λΆκ° ν΄κ²°
</aside>
μ΄κΈ°μ Recipe(λ μνΌ κΈ°λ³Έ μ 보 ν
μ΄λΈ), Step(λ μνΌ κ³Όμ ν
μ΄λΈ), Ingredient(λ μνΌ μ¬λ£ ν
μ΄λΈ) ν
μ΄λΈμ λ°μ΄ν°λ₯Ό ν λ²μ μ
λ ₯λ°κΈ° μν΄ Array λ°©μμ μ¬μ©νμΌλ, λ μνΌ κ³Όμ μ νΉμ±μ μ¬λ¬ κ°μ ννμ λμμ μ²λ¦¬ν λ Array ν¬κΈ° μ€λ₯λ‘ μΈν overflow λ¬Έμ κ° λ°μνμ΅λλ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ ModelAttribute
κ°μ Array λμ ArrayList
λ‘ μ μ₯νλ λ°©μμΌλ‘ λ³κ²½νμ¬, μ¬λ¬ κ°μ λ μνΌ κ³Όμ κ³Ό μ¬μ§ λ°μ΄ν°κ° μ μμ μΌλ‘ λ±λ‘λ μ μλλ‘ νμμ΅λλ€.
λν, λ μνΌ κ³Όμ μ λ³΄κ° μ¬λ¬ κ°μΌ κ²½μ° μ¬μ§λ μ¬λ¬ μ₯ λ±λ‘ν΄μΌ νλ μν©μμ, κΈ°μ‘΄ VARCHAR νμ μ΄ 4000ByteκΉμ§λ§ μ μ₯ κ°λ₯νμ¬ λμ©λ μ¬μ§ λ°μ΄ν°λ₯Ό μ μ₯νλ λ° νκ³κ° μμμ΅λλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ Ingredient ν μ΄λΈμ μ¬μ§ λ°μ΄ν° νμ μ VARCHARμμ BLOBμΌλ‘ λ³κ²½(4000Byte β 4GB)νμ¬, μ¬μ©μκ° μ¬μ§ μ©λμ μ€μ΄μ§ μκ³ λ λμ©λ μ΄λ―Έμ§ νμΌμ μ λ‘λν μ μλλ‘ κ°μ νμ΅λλ€.
μ±κ³Ό: λ°μ΄ν° μ μ₯ ꡬ쑰λ₯Ό κ°μ νμ¬ λ€μμ λ μνΌ κ³Όμ μ 보μ μ¬μ§ λ°μ΄ν°λ₯Ό μμ½κ² λ±λ‘ν μ μκ² λμκ³ , λμ©λ μ΄λ―Έμ§ νμΌλ λ¬Έμ μμ΄ μ²λ¦¬ν μ μμ΄ μ¬μ©μ νΈμμ±μ΄ ν¬κ² ν₯μλμμ΅λλ€.
<aside> <img src="/icons/report_orange.svg" alt="/icons/report_orange.svg" width="40px" /> κ°μ μμΈ νμ΄μ§μ λμμ μ κ·Όνμλ μ‘°νμκ° μ¦κ°λμ§ μλ λ¬Έμ ν΄κ²°
</aside>
λ μνΌ μμΈ νμ΄μ§μμ 2κ° μ΄μμ κ³μ μ΄ λμμ κ°μ νμ΄μ§μ μ κ·Όνμ λ, μ‘°νμκ° μ¦κ°νμ§ μλ λ¬Έμ κ° λ°μνμ΅λλ€. μ΄ λ¬Έμ λ μ¬λ¬ μ¬μ©μ μμ²μ΄ λμμ λ°μνλ©΄μ λ°μ΄ν°λ² μ΄μ€μμ μ‘°νμ(visitcnt
)κ° μ λλ‘ μ¦κ°λμ§ μλ κ²μ΄ μμΈμ΄μμ΅λλ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ @Transactional
μ μ¬μ©νμ¬ recipe_tbl
μ λν λμ μ κ·Όμ μμ°¨μ μΌλ‘ μ²λ¦¬νλλ‘ νμκ³ , κ·Έ κ²°κ³Όλ‘ μ‘°νμκ° μ ννκ² 1μ© μ¦κ°νλλ‘ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
μ±κ³Ό: λμμ± λ¬Έμ λ₯Ό ν΄κ²°νμ¬ μ¬λ¬ μ¬μ©μκ° λμμ λ μνΌ μμΈ νμ΄μ§μ μ κ·Όν΄λ μ‘°νμκ° μ νν μ¦κ°νλλ‘ νμμΌλ©°, μ΄λ₯Ό ν΅ν΄ λ°μ΄ν° 무결μ±μ μ μ§νκ³ μ¬μ©μ νλμ μ ννκ² λ°μν μ μμμ΅λλ€.
<aside> <img src="/icons/cursor-click_gray.svg" alt="/icons/cursor-click_gray.svg" width="40px" /> ν μ΄λΈ μ»¬λΌ μλ£νμ λ°λ₯Έ λ μνΌ λ±λ‘ κΈ°λ₯
</aside>
κΈ°μ‘΄ CSV νμΌμ λ°μ΄ν° νμ μ μ½μ λ°νμΌλ‘, λ μνΌ λ±λ‘ μ μλͺ»λ λ°μ΄ν°κ° μ λ ₯λμ§ μλλ‘ μμΈ μΌμ΄μ€λ₯Ό μ²λ¦¬νμ΅λλ€. μλ₯Ό λ€μ΄, λͺ μΈλΆκ³Ό κ°μ λ μνΌ μ 보λ λ°λμ INT νμ μΌλ‘λ§ μ λ ₯λλλ‘ νμΌλ©°, μ΄λ₯Ό UIμμ λ²νΌ λ°©μμΌλ‘ ꡬννμ¬ μ¬μ©μκ° μλͺ»λ λ°μ΄ν°λ₯Ό μ λ ₯ν κ°λ₯μ±μ μμ² μ°¨λ¨νμ΅λλ€. λν, μ¬λ£μ μκ³Ό κ°μ μ 보λ μ«μλ‘λ§ μ λ ₯λλλ‘ μ€μ νμμΌλ©°, μ΄λ₯Ό NumberFormatExceptionμ ν΅ν Try-Catch μ²λ¦¬λ‘ κ΄λ¦¬νμ¬, μλͺ»λ λ°μ΄ν°κ° μ λ ₯λ κ²½μ° μ¬μ©μμκ² μ¬μ λ ₯μ μμ²νλ λ°©μμΌλ‘ μ€λ₯λ₯Ό λ°©μ§νμ΅λλ€.
μ±κ³Ό: μ΄λ₯Ό ν΅ν΄ μ¬μ©μκ° λ μνΌλ₯Ό λ±λ‘ν λ λ°μν μ μλ λ°μ΄ν° νμ μ€λ₯λ₯Ό μ¬μ μ μ°¨λ¨νμ¬, λ°μ΄ν°λ² μ΄μ€μ μ λ ₯λλ μ 보μ μ νμ±κ³Ό μ λ’°μ±μ 보μ₯ν μ μμμ΅λλ€. κΆκ·Ήμ μΌλ‘ λ°μ΄ν° μ ν©μ±μ λμ΄κ³ μ¬μ©μ κ²½νμ κ°μ νλ κ²°κ³Όλ₯Ό μ»μμ΅λλ€.
<aside> <img src="/icons/cursor-click_gray.svg" alt="/icons/cursor-click_gray.svg" width="40px" /> μ‘°ν μμ λκΈ μλ₯Ό κΈ°λ°μΌλ‘ ν λ μνΌ TOP 10 κΈ°λ₯
</aside>
μ‘°ν μμ λκΈ μλ₯Ό κΈ°μ€μΌλ‘ μμ 10κ°μ λ μνΌλ₯Ό λ©μΈ νμ΄μ§ μλ¨ λ°°λμ λ
ΈμΆνλ κΈ°λ₯μ ꡬννμ΅λλ€. μ²μμλ XML νμΌμμ 쿼리λ₯Ό ORDER BY DESC
λ‘ μ λ ¬ν ν JSPμμ <c:if>
λ‘ μμ 10κ°λ§ νν°λ§νμ§λ§, λͺ¨λ λ°μ΄ν°λ₯Ό κ°μ Έμ€λ λ°©μμ΄ λΉν¨μ¨μ μ΄λΌ νλ¨νμ΅λλ€. μ΄λ₯Ό κ°μ νκΈ° μν΄ λ°μ΄ν°λ² μ΄μ€ 쿼리μμ ROWNUM <= 10
쑰건과 ORDER BY DESC
λ₯Ό μ¬μ©ν΄ μ‘°ν μμ λκΈ μκ° λ§μ λ μνΌλ₯Ό μ°μ μΆμΆνλλ‘ λ³κ²½νμ΅λλ€.
μ±κ³Ό: μ΄λ‘ μΈν΄ μ¬μ©μλ€μ κ°μ₯ μΈκΈ° μλ λ μνΌλ₯Ό μ μνκ² νμΈν μ μκ² λμμΌλ©°, μ‘°ν μλλ₯Ό 354msμμ 11msλ‘ μ½ 31λ°° κ°μ νμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ¬μ΄νΈ μ±λ₯μ΄ ν₯μλμκ³ , μ¬μ©μ λ§μ‘±λμ μ¬μ΄νΈ λ΄ νλμ±μ΄ ν¬κ² μ¦κ°νμ΅λλ€.
<aside> <img src="/icons/cursor-click_gray.svg" alt="/icons/cursor-click_gray.svg" width="40px" /> λ€μν ν€μλλ‘ λ μνΌλ₯Ό κ²μ ν μ μκ² λμμ΅λλ€.
</aside>