- λ°°ν¬ URL : http://μΌν λνκ΅.kro.kr
- Test ID : FCACvnEA0@example.com
- Test PW : qwe@1234
- Test ID : nidgvQVz57@example.com
- Test PW : 3567811
- Test ID : 24000004
- Test PW : 9416473
- νλ‘μ νΈ μκ°
- νμ ꡬμ±
- κ°λ° νκ²½
- μ±νν κ°λ° κΈ°μ κ³Ό λΈλμΉ μ λ΅
- νλ‘μ νΈ κ΅¬μ‘°
- μν λΆλ΄
- κ°λ° κΈ°κ° λ° μμ κ΄λ¦¬
- μ κ²½ μ΄ λΆλΆ
- νμ΄μ§λ³ κΈ°λ₯
- νΈλ¬λΈ μν
- κ°μ λͺ©ν
- νλ‘μ νΈ νκΈ°
π‘ λνκ΅ λ΄ νμ¬ λ° νμ΅ κ΄λ¦¬μ νΈλ¦¬μ±κ³Ό ν¨μ¨μ±μ κ·ΉλννκΈ° μν΄ ν λ¨μλ‘ κ°λ°λ μ€λ§νΈ νμ¬/νμ΅ κ΄λ¦¬ μμ€ν (LMS)μ μ 곡νλ μλΉμ€μ λλ€. μ΄ μμ€ν μ ν΅ν΄ λνκ΅μμ λ°μνλ νκΈ° λ³ μ£Όμ μ΄λ²€νΈλ€μ λ³΄λ€ μ½κ³ ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν μ μμ΅λλ€.
β μ£Όμ κΈ°λ₯
- νμ κ΄λ¦¬ : νμλ€μ κ°μΈμ 보, μ±μ , λ±λ‘κΈ λ±μ κ΄λ¦¬νκ³ μ‘°νν μ μλ κΈ°λ₯
- κ΅μ / κ°μ κ΄λ¦¬ : κ°μ κ³νμ μμ±, μ±μ μ λ ₯ λ° κ΄λ¦¬ λ± κ΅μλ€μ μν κ΄λ¦¬ κΈ°λ₯
- 곡μ§μ¬ν λ° νμ¬ μΌμ : νκ΅μ 곡μ§μ¬ν λ° νμ¬ μΌμ λ±μΌλ‘ νμμ΄λ κ΅μμκ² μ 보 μ 곡μ μν νλ«νΌ κΈ°λ₯
- νμ¬ κ΄λ¦¬ νλ‘μΈμ€μ ν¨μ¨μ± λ° μ νμ± ν₯μ
- νμ λ° κ΅μ§μμ λ§μ‘±λ μ¦κ°
- λν μ΄μμ μ λ°μ μΈ ν¨μ¨μ± ν₯μ
π₯BackEnd Data Flow
μ΅μ λ[PM] | λ°μμ | μ΄λ³κΈΈ | μ μμ© | ν©λ―Όμ° |
---|---|---|---|---|
@choiyuran |
@soeun21 |
@LeeBG |
@RightAccept |
@hwangminu |
- Front : HTML, Thymeleaf, css, JavaScript, jQuery
- Back-end : IntelliJ IDEA, JDK 11
- λ²μ λ° μ΄μκ΄λ¦¬ : Github, Github Issues, Github Project
- νμ ν΄ : Discord, Notion, Kakao Talk
- μλΉμ€ λ°°ν¬ νκ²½ : Aws CodeDeploy, AWS EC2 Ubuntu, AWS S3, Github Action
- μλ² μ¬μ΄λ μλ° ν νλ¦Ώ μμ§μΌλ‘, μμ HTMLμ μ΄μ©νμ¬ λ·°λ₯Ό ꡬμ±ν μ μκ² ν΄μ€λλ€.
- μμ°μ€λ¬μ΄ ν νλ¦Ώμ μν μ°μν ν΅ν©μ±κ³Ό μ€νλ§ νλ μμν¬μμ λ°μ΄λ νΈνμ±μ μ 곡ν©λλ€.
- λΈλΌμ°μ μμ μ§μ μ΄ μ μλ μ μ νλ‘ν νμ μ λμ μΈ μΉ μ ν리μΌμ΄μ μΌλ‘ μ½κ² μ νν μ μμ΅λλ€.
- μλ° νκ²½μμ λ§μ΄ν¬λ‘μννΈ μ€νΌμ€ νμΌ ν¬λ§·μ μ½κ³ μΈ μ μκ² ν΄μ£Όλ λΌμ΄λΈλ¬λ¦¬μ λλ€.
- μμ , μλ λ± λ€μν μ€νΌμ€ νμΌ ν¬λ§·μ μ²λ¦¬ν μ μμ΄ λ°μ΄ν° λ³΄κ³ μλ λ¬Έμ μμ± μλνμ μ μ©ν©λλ€.
- νλΆν κΈ°λ₯μ μ 곡νμ¬ λ³΅μ‘ν λ°μ΄ν°λ₯Ό μ²λ¦¬νκ³ , μ¬μ©μ μ μ ν¬λ§·ν μ΄λ μ€νμΌμ μ μ©ν μ μμ΅λλ€.
- νλ‘μ νΈμμλ νμ λ±λ‘κΈ°λ₯μ μν μμ νμΌμ λ€λ£¨λλ° μ¬μ©νμ¬ μμ λ°μ΄ν° μ²λ¦¬μ λ§μ λμμ μ»μμ΅λλ€.
- μ€νλ§ κΈ°λ° μ ν리μΌμ΄μ μμ λ°μ΄ν° μ κ·Ό κ³μΈ΅μ μ½κ³ ν¨μ¨μ μΌλ‘ ꡬνν μ μκ² ν΄μ£Όλ λͺ¨λμ λλ€.
- 리ν¬μ§ν 리 κ³μΈ΅μ λν ꡬν μμ΄ μΈν°νμ΄μ€λ§μΌλ‘ CRUD μ°μ°μ μ½κ² μ¬μ©ν μ μμ΅λλ€.
- κ°μ²΄ μ§ν₯μ μΈ λ°μ΄ν° μ κ·Όμ μ 곡νλ©°, 볡μ‘ν κ²μ 쿼리λ μ½κ² ꡬνν μ μκ² ν΄μ€λλ€.
- νμ μμ ν 쿼리λ₯Ό μν νλ μμν¬λ‘, 볡μ‘ν 쿼리μ λ€μ΄λλ―Ή 쿼리λ₯Ό μ½λ μμ€μμ μ½κ² ꡬνν μ μμ΅λλ€.
- μ»΄νμΌ μμ μ μ€λ₯λ₯Ό λ°κ²¬ν μ μμ΄ μμ μ±μ΄ λμΌλ©°, μ½λ μλ μμ± κΈ°λ₯μ ν΅ν΄ κ°λ° μμ°μ±μ ν₯μμν΅λλ€.
- λ€μν λ°μ΄ν° μ μ₯μ(JPA, JDO, SQL, NoSQL)μ λν μ§μμΌλ‘ νμ₯μ±μ΄ λ°μ΄λ©λλ€.
- Git-flow μ λ΅μ κΈ°λ°μΌλ‘ main, develop λΈλμΉμ feature 보쑰 λΈλμΉλ₯Ό μ΄μ©νμ΅λλ€.
- main, test, team λΈλμΉλ‘ λλμ΄ κ°λ°μ νμμ΅λλ€.
- main λΈλμΉλ λ°°ν¬ λ¨κ³μμλ§ μ¬μ©νλ λΈλμΉμ λλ€. testμ κ°λ°μ΄ μλ£λ λΆλΆλ€μ λΆμ¬μ λ°°ν¬μλ²μ μ μ©ν©λλ€.
- test λΈλμΉλ κ°λ° λ¨κ³μμ git-flowμ master μν μ νλ λΈλμΉμ λλ€.
- team1,2,3,4,5,6 λΈλμΉλ κ°μΈλ³λ‘ νκ° μ© λλ λΈλμΉμ΄λ©° κΈ°λ₯ λ¨μλ‘ λ 립μ μΈ κ°λ° νκ²½μ μνμ¬ μ¬μ©νκ³ merge ν κ° λΈλμΉλ₯Ό μμ ν κ²μ λλ€.
βββ README.md
βββ gradlew
βββ .gitignore
βββ appspec.yml
βββ build.gradle
βββ gradlew.bat
βββ settings.gradle
β
βββ .github
β βββ workflows
β βββ deploy.yml
βββ src
β βββ main
β βββ java
β βββ com
β βββ itbank
β βββ simpleboard
β βββ component
β βββ config
β βββ controller
β βββ dto
β βββ entity
β βββ handler
β βββ interceptor
β βββ repository
β βββ manager
β βββ professor
β βββ student
β βββ user
β βββ service
β βββ initDB.java
β βββ SimpleboardApplication.java
β βββ resources
β βββ static
β βββ css
β βββ excelForm
β βββ img
β βββ js
β βββ scss
β βββ vendor
β βββ templates
β βββ common
β βββ layout
β βββ manage
β βββ professor
β βββ student
β
β βββ test
- UI
- νμ΄μ§ : μΈμ/λͺ©λ‘ μ‘°ν, μμ , κ°μ λ±λ‘, μμΈλ³΄κΈ°
- κ³΅ν΅ : κ°μ μμΈλ³΄κΈ°, 곡μ§μ¬ν, νμ¬μΌμ
- κΈ°λ₯
- μΌλΆ νμ΄μ§, QueryDSL 쑰건 κ²μ, 곡μ§μ¬ν λ±λ‘ λ° μμ , κ°μ λ±λ‘ λ° μμ /μμΈλ³΄κΈ°, κ°μμ€ μ¬μ© μκ° μ²΄ν¬, κ΅μ/νμ μ‘°ν λ° μμ , νκ³Ό μ‘°ν λ° λ±λ‘, νμ μν λ³κ²½, μ₯νκΈ μ‘°ν
- UI
- νμ΄μ§ : νμ λ±λ‘, νμ λ±λ‘ 리μ€νΈ νμΈ
- κ³΅ν΅ μ»΄ν¬λνΈ : κ³΅ν΅ ν μ΄λΈ νμ, κ²μ 쑰건창
- κΈ°λ₯
- νμΌ μ λ‘λ/λ€μ΄λ‘λ, νμ μ 보 λ±λ‘ λ° μμ , QueryDSL 쑰건 κ²μ
- UI
- νμ΄μ§ : κ°μ μ‘°ν, κ°μ νκ° μ‘°ν
- κ³΅ν΅ μ»΄ν¬λνΈ :
- κΈ°λ₯
- μΌλΆ νμ΄μ§, QueryDSL 쑰건 κ²μ, κ°μ μ‘°ν/κ²μ, (κ΅μ)μ±μ μ λ ₯, νμΌ μ λ‘λ/λ€μ΄λ‘λ, λ‘κ·ΈμΈ/λ‘κ·Έμμ/λΉλ°λ²νΈ μ°ΎκΈ°, νμ μ 보 μμ
- UI
- νμ΄μ§ : μκ°μ μ² νμ΄μ§ , λ±λ‘νμ΄μ§ μ΄μ
- κ³΅ν΅ μ»΄ν¬λνΈ : νμ리ν head, header, footer λΆλ¦¬
- κΈ°λ₯
- μΌλΆ νμ΄μ§, querydsl 쑰건 κ²μ, μκ°μ μ², κ°μνκ°, λ±λ‘κΈ λ©λΆ λ° μ‘°ν λ± νμ κ΄λ ¨ κΈ°λ₯ ꡬν
- λ°°ν¬
- CI/CD GitHub Actionμ μ΄μ©ν λ°°ν¬ μλν μμ±, AWS EC2 λ°°ν¬ λ‘μ§ λ° μ μ€ν¬λ¦½νΈ μμ±
- μ 체 κ°λ° κΈ°κ° : 2024-01-02 ~ 2024-03-13
- UI ꡬν : 2024-01-11 ~ 2024-01-26
- κΈ°λ₯ ꡬν : 2024-02-17 ~ 2024-03-04
- κΈ°λ₯ ν μ€νΈ : 2024-03-05 ~ 2024-03-13
- GitHub Projectsμ Notion νμλ‘μ μ¬μ©νμ¬ μ§ν μν©μ 곡μ νμ΅λλ€.
- μ£Όκ°νμλ₯Ό μ§ννλ©° μμ μμμ λ°©ν₯μ±μ λν κ³ λ―Όμ μΉ΄μΉ΄μ€ν‘μμ λλκ³ νμλ‘μ μμ±νμ¬ ν΄κ²°νμ΅λλ€.
- λ¨Όμ μ΄κΈ°νλ©΄μΈ λ‘κ·ΈμΈ νλ©΄μ λλ€. κΈ°λ³Έμ μΌλ‘ λ‘κ·ΈμΈμ ν΄μΌ μ 체 μμ€ν μ μ΄μ©ν μ μμ΅λλ€.
- λ‘κ·ΈμΈ μμ΄λλ₯Ό κΈ°μ΅νλ μΏ ν€λ°©μμ μ μ©νκ³ , λΉλ°λ²νΈ μ°ΎκΈ°λ‘ μμ΄λ²λ¦° λ΄ λΉλ°λ²νΈλ₯Ό μ°Ύμ μ μλ λ§ν¬λ‘ μ°κ²°λ©λλ€.
- λ‘κ·ΈμΈμ μ±κ³΅νλ©΄ μμ μ μ λΆ(νμ,κ΅μ§μ,κ΅μ)μ λ°λΌ λ€λ₯Έ ν νλ©΄μΌλ‘ μ§μ ν©λλ€.
μ΄κΈ°νλ©΄ |
---|
- 곡μ§μ¬ν λ° νμ¬μΌμ μ λ‘κ·ΈμΈμ ν λͺ¨λ μ¬λμ΄ μ΄λν μ μμ΅λλ€.
- νμ§λ§, 곡μ§μ¬νκ³Ό νμ¬μΌμ λ±λ‘,μμ ,μμ λ κ΄λ¦¬μμ κΆνμ΄κ³ μ΄λμ 곡ν΅κΈ°λ₯μ λλ€.
곡μ§μ¬ν | νμ¬μΌμ |
---|---|
- μ΄λ©μΌ μ£Όμμ λΉλ°λ²νΈλ₯Ό μ λ ₯νλ©΄ μ λ ₯μ°½μμ λ°λ‘ μ ν¨μ± κ²μ¬κ° μ§νλκ³ ν΅κ³Όνμ§ λͺ»ν κ²½μ° κ° κ²½κ³ λ¬Έκ΅¬κ° μ λ ₯μ°½ νλ¨μ νμλ©λλ€.
- μ΄λ©μΌ μ£Όμμ νμμ΄ μ ν¨νμ§ μκ±°λ μ΄λ―Έ κ°μ λ μ΄λ©μΌμΌ κ²½μ° λλ λΉλ°λ²νΈκ° 6μ λ―Έλ§μΌ κ²½μ°μλ κ° μ λ ₯μ°½ νλ¨μ κ²½κ³ λ¬Έκ΅¬κ° λνλ©λλ€.
- μμ±μ΄ μλ£λ ν, μ ν¨μ± κ²μ¬κ° ν΅κ³Όλ κ²½μ° λ€μ λ²νΌμ΄ νμ±νλλ©°, λ²νΌμ ν΄λ¦νλ©΄ νλ‘ν μ€μ νλ©΄μ΄ λνλ©λλ€.
κ΅μ/κ΅μ§μ λ±λ‘ |
---|
- νμ λ±λ‘ κΈ°λ₯μ κ΅μ / κ΅μ§μ λ±λ‘κ³Όλ λ€λ₯΄κ² ν λ²μ λ§μ νμμ΄ ν νκΈ°μ μ ννκΈ° λλ¬Έμ νλ²μ λ§μ λ°μ΄ν°λ₯Ό μ μ₯νκΈ° μν΄ Excelλ‘ λ±λ‘ν©λλ€.
- κΈ°λ³Έμ μΌλ‘ ExcelFormμ λ€μ΄λ°μ μ μμΌλ©° ExcelνμΌμ λ°μ΄ν°λ₯Ό μ΄λ»κ² κΈ°μ ν΄μΌ νλμ§
- μμ±μ΄ μλ£λ ν, μ ν¨μ± κ²μ¬κ° ν΅κ³Όλ κ²½μ° λ€μ λ²νΌμ΄ νμ±νλλ©°, λ²νΌμ ν΄λ¦νλ©΄ νλ‘ν μ€μ νλ©΄μ΄ λνλ©λλ€.
νμ λ±λ‘ μμ νΌ λ€μ΄λ°κΈ° |
---|
νμ λ±λ‘ (μμ νΌ λ±λ‘νκΈ°) |
---|
- κ΄λ¦¬μλ νμ, κ΅μ, κ΅μ§μμ λͺ¨λ μ‘°νν μ μμ΅λλ€.
- μ‘°νν λ νμκ³Ό κ΅μλ νκ³Όμ μ΄λ¦μΌλ‘
- κ΅μ§μμ μ΄λ¦κ³Ό μ°λ½μ²λ‘ κ²μν μ μλλ‘ νμ΅λλ€.
- νμ΄μ§μ ν΅ν΄ ν νμ΄μ§μ 10κ°μ κ²°κ³Όλ§μ 보μ¬μ€ μ μκ³ , ν΄μ¬μλ₯Ό ν¬ν¨ν κ²μ, νμμ μ€λ λ±λ‘λ μ μ νμμ κ²μν μ μμ΅λλ€.
μΈμ μ‘°ννκΈ° (λνλ‘ νμ μ‘°ν) |
---|
- λ¨κ³Όλνμ μ ννλ©΄ ν΄λΉ λ¨κ³Όλνμ μνλ νκ³Όλ₯Ό κ²μν μ μμ΅λλ€.
- νκ³Όλͺ μΌλ‘λ κ²μμ΄ κ°λ₯ν©λλ€.
νκ³Ό μ‘°ννκΈ° |
---|
- μ 체 κ°μλ₯Ό μ‘°νν μ μμΌλ©°, νκ³Ό, κ°μ νμ , κΈ°κ°, νκΈ°, νλ λ± μ¬λ¬ 쑰건μ λ°λ₯Έ κ²μμ΄ κ°λ₯ν©λλ€.
- νκ°λ κ°μλ λ³Ό μ μμΌλ©° ν νμ΄μ§μ 10건μ λ°μ΄ν°λ₯Ό κ²μν μ μμ΅λλ€.
- κ°μμμΈλ³΄κΈ°λ₯Ό ν΅ν΄ κ°μμ μμΈ λ΄μμ μ‘°νν μ μμ΅λλ€.
κ°μ μ‘°ν |
---|
- μκ°ν νμλ€μ΄ μ΄ κ°μμ λν νκ°λ₯Ό λ¨κΈ°λ λ° μ΄λ€ νκ°λ΄μ©μ λ¨κ²Όλμ§ νμΈν μ μμ΅λλ€.
- μ μμ μ£Όκ΄μ νκ°μ λ΄μ©μ νμΈν μ μμ΅λλ€.
- A,B,C,D,E λ‘ Aκ° λ§€μ° κ·Έλ λ€, Eκ° λ§€μ° μλλ€ μ λλ€.
κ°μ νκ° νμΈ |
---|
- κ΅μ§μμ κ°μ λ±λ‘μ ν μ μμ΅λλ€.
- κ°μ λ±λ‘μ ν λ κΈ°μ‘΄ κ°μμ κ°μμ€κ³Ό κ°μμκ°μ μ€λ³΅μ λ§λ λ‘μ§μ΄ μ μ©λμ΄μμ΄ λ§μ½ μ€λ³΅μ΄λλ€λ©΄ λ±λ‘μ€ν¨κ° λ©λλ€.
- κ°μμ€κ³Ό κ°μμκ°μ΄ κ²ΉμΉμ§ μμ κ²½μ° κ°μ λ±λ‘μ μ±κ³΅ νκ² λ©λλ€.
κ°μλ±λ‘ + μ€ν¨ |
---|
- κ°μ μμ μ κ²½μ°μλ λ§μ°¬κ°μ§λ‘ μ€λ³΅μ¬λΆλ₯Ό 체ν¬ν©λλ€.
- κΈ°μ‘΄μ κ°μμ μ€λ³΅μ΄ λλ€λ©΄ μμ μ€ν¨λ‘ λ¨κ² λ©λλ€.
κ°μ μμ |
---|
- κ΅μ§μμ ν΄λΉ νμμ΄ λ±λ‘κΈμ λ©λΆ νλμ§ μλμ§ νμΈν μ μμ΅λλ€.
- λ±λ‘κΈμ λ΄μ§ μμ νμμκ²λ λ―Έλ©μ΄λΌλ λ¬Έκ΅¬κ° λμ€κ³ λ±λ‘κΈμ λ©λΆν νμμ λ©λΆμλ£λΌλ λ¬Έκ΅¬κ° λ¨κ² λ©λλ€.
λ±λ‘κΈ λ©λΆ μ¬λΆ μ‘°ν |
---|
- μ₯νκΈμ λ΄λΆμ₯νκΈ, μΈλΆμ₯νκΈμΌλ‘ λΆλ₯λκ³ μ΄λ₯Ό κ΅μ§μμ μ΄λ₯Ό λ±λ‘ν μ μμ΅λλ€.
- μ₯νκΈμ κΈμ‘μ΄ 99999999λΌλ©΄ μ΄κ²μ 1νκΈ° μ μ‘μ₯νκΈμ΄λΌλ λ»μ λλ€.
μ₯νκΈ λ¦¬μ€νΈ λ° λ±λ‘νκΈ° |
---|
- λ΄ μ 보νμΈμ΄μ μ λΉλ°λ²νΈλ₯Ό νμΈνλ μ μ°¨λ₯Ό κ±°μΉ©λλ€.
- λΉλ°λ²νΈκ° νμΈλλ©΄ μμ ν μ μλ λ΄ μ 보λ΄μ©μ΄ 보μ΄κ³ μμ ν λΆλΆλ€μ μμ νκ³ μ΄λ©μΌ μΈμ¦μν΄μ μμ μ λ§λ¬΄λ¦¬ν΄μ£Όλ©΄ λ©λλ€.
- λΉλ°λ²νΈλ₯Ό μμ ν λμλ κΈ°μ‘΄μ λΉλ°λ²νΈμ saltκ°μΌλ‘ λΉλ°λ²νΈκ° μΌμΉνλμ§ κ²μ¬νκ³ μλ‘μ΄ λΉλ°λ²νΈλ‘ μμ ν©λλ€.
- μ΄ λ, saltμμ μλ‘μ΄ saltλ‘ κ°±μ μ΄λλ©° λΉλ°λ²νΈλ μλ‘μ΄ saltκ°κ³Ό μλ‘μ΄ λΉλ°λ²νΈ κ°μΌλ‘ μνΈνλμ΄ DBμ μ μ₯λλ νμμ λλ€.
λ΄ μ 보보기+ λ΄ μ 보μμ + λΉλ°λ²νΈ λ³κ²½ |
---|
- κ΅μ,κ³Όλͺ©,νλ μΌλ‘ μνλ μκ°νλͺ©μ κ²μν μ μμ΅λλ€.
- νμμ μμ μ΄ μνλ μκ°λμ μνλ νκ³Όμ λν κ°μλ₯Ό μκ°μ μ²ν μ μμ΅λλ€.
- μκ°μ μ²μ μ±κ³΅νλ©΄ 곧 μκ°κ°μλ‘ νμ λ©λλ€.
- μκ°μ μ² μμΌκ³Ό μκ°μ΄ κ²ΉμΉλ©΄ μκ°μ μ²μ μ€ν¨νκ² λ©λλ€. κ·Έλ¦¬κ³ μκ° μ΅λ μΈμμ μ΄κ³Όνκ² λλ©΄ μκ°μ μ²μ΄ λΆκ°ν©λλ€.
μκ°μ μ² |
---|
- νκΈ°κ° λλκ³ κ΅μκ° μ±μ μ μ λ ₯νλ©΄ λ΄ κ°μλ€μ μ±μ μ νμΈν μ μμ΅λλ€.
- λ΄ κ°μ μ±μ λ€μ νκΈ°λ§λ€ νμΈν μ μμ΅λλ€.
- νκΈ°λ³μ΄ μλ μ 체 μ±μ μ μ‘°νν μλ μμ΅λλ€.
μ±μ νμΈ |
---|
- λ΄κ° μκ°νκ³ μλ κ°μκ° λ§μΉλ©΄ κ΅μ§μμ μν΄ κ°μνκ° κΈ°κ°μ΄ μ€μ λ©λλ€.
- κ°μνκ°κΈ°κ° λ΄μ νμμ κ°μ νκ°λ₯Ό ν μ μμ΅λλ€.
- κ°μνκ°λ A,B,C,D,E λ‘ μ νν μ μμΌλ©° Aκ° λ§€μ° κΈμ , Eκ° λ§€μ° λΆμ μ λλ€.
- μ£Όκ΄μ μ견μ λ¨κΈΈ μ μμΌλ©° κ°μ νκ°κ° μλ£λ κ°μλ λͺ©λ‘μ λνλμ§ μμ΅λλ€.
κ°μ νκ° νκΈ° |
---|
- λ΄κ° μν νκ³Όμ λ±λ‘κΈκ³Ό λ΄κ° λ°μ μ₯νκΈμ ν©μ°ν΄μ λ΄κ° μ΄λ²νκΈ°μ λ΄μΌν λ±λ‘κΈμ νμΈν μ μκ³
- λ±λ‘κΈμ λ©λΆν μ μμ΅λλ€.
- λ±λ‘κΈ λ©λΆλ μ€μ λ‘ λ©λΆν μ μκΈ° λλ¬Έμ λλ―Έ κ³μ’λ²νΈμ λ©λΆνλ€λ alertλ§μ λ¨κΉλλ€.
- μ¬μ§μ ν΄λΉ νμμ μ μ‘ μ₯νκΈμ λ°μκΈ° λλ¬Έμ μ΅μ’ λ©λΆκΈμ‘μ΄ 0μμΈ λͺ¨μ΅μ μ μ μμ΅λλ€.
λ±λ‘κΈ λ©λΆ |
---|
- νμμ ν΄νμ μ² λ° λ³΅ν μ μ²μ ν μ μμ΅λλ€.
- νμμ ν΄νμ μ² λ° λ³΅ν μ μ²μ νκ³ κ΅μ§μμ΄ μ΄λ₯Ό μΉμΈν΄μΌ 볡νμν, ν΄νμνλ‘ μ νλ©λλ€.
- ν΄νμ€μΈ νμλ§ λ³΅νμ μ²μ ν μ μκ³ μ¬νμ€μΈ νμλ§μ΄ ν΄νμ μ²μ ν μ μμΌλ©°
- μ μ² ν κΈ°ν μ€μ μ΄λ λ€λ₯Έ μ€μκ° μλ€λ©΄ μ μ²μ μ·¨μν μ μμ΅λλ€.
- ν΄ν λ° λ³΅ν μ μ²μ ν λμλ κΈ°κ° μ€μ μ μ μ€μ ν΄μΌ ν©λλ€. ν΄ν μμμΌμ΄ ν΄ν μμ μ’ λ£μΌλ³΄λ€ λ€μ μλ€λ©΄ λΆκ°λ₯νλλ‘ λ§μμ΅λλ€.
ν΄ν μ μ² | 볡ν μ μ² |
---|---|
- κ΅μλ νμμκ² μ±μ μ λΆμ¬ν κΆνμ΄ μμ΅λλ€.
- μμ μ κ°μλ₯Ό λ£λ νμμ μ±μ μ λΆμ¬ν μ μκ³ λ μμ ν μ μμ΅λλ€.
- μ±μ κΈ°μ μ λμ κ°μ νμ΄μ§μμ μ±μ μ λ ₯μ μ ννμ¬ λͺ¨λ¬μ°½μμ μνλ©λλ€.
μ±μ μ λ ₯ | μ±μ μμ |
---|---|
- κ΅μλ μμ μ κ°μμ λν΄ κ°μ κ³νμλ₯Ό λ±λ‘ν μ μμ΅λλ€.
- κ°μ κ³νμλ₯Ό λ±λ‘μν΄μΌ κ°μ μμΈλ³΄κΈ°μμ νμλ€μ΄ μμ μ νμ νκ³ μκ°μ μ²μ ν μ μλλ‘ μ 보λ₯Ό μ 곡ν μ μμ΅λλ€.
κ°μ κ³νμ λ±λ‘ |
---|
-
FrontEnd
π ThymeLeaf λ¬Έμ ν΄κ²° μ¬λ‘
λ¬Έμ μν© ν΄κ²° λ°©λ² Headerμ μ΄λ―Έμ§λ₯Ό λμ°λ κ³Όμ μμ ThymeLeaf μμΈ λ°μ StudentDto
μnull
κ°μ κ°μ§λimg
νλ μΆκ°νκ³Ό λͺ©λ‘μ νμ΄μ§ μ μ© ν, κ²μ κ²°κ³Όκ° μλ€λ 문ꡬλ₯Ό λμμ£Όλ λΆλΆμμ νμ리ν μμΈ λ°μ th:if
쑰건μ 리μ€νΈκ°null
μ΄κ±°λisEmpty()
λΉμ΄μλμ§ νμΈνλλ‘ μμ th:if
쑰건μΌλ‘null
체ν¬λ₯Ό μ§νν λ, κ²μ κ²°κ³Όκ° μμ κ²½μ°null
μμΈκ° λ¨λ λ¬Έμ list = Page.empty()
λ‘ λΉ νμ΄μ§λ₯Ό λ΄μμ λ°νν΄μ£Όλ λ°©λ²μΌλ‘ ν΄κ²°π€ Redirection λ¬Έμ ν΄κ²° μ¬λ‘
λ¬Έμ μν© ν΄κ²° λ°©λ² λΉλ°λ²νΈ μ°ΎκΈ° κ΄λ ¨ ajaxλ₯Ό μ€ννλ©΄ λ‘κ·ΈμΈ νμ΄μ§κ° μλ‘κ³ μΉ¨ λ¨ MvcConfig
μ μ€ννλ €λ ajax μ£Όμλ₯Ό νμ΄νΈλ¦¬μ€νΈλ‘ λ±λ‘π Search λ¬Έμ ν΄κ²° μ¬λ‘
λ¬Έμ μν© ν΄κ²° λ°©λ² νμ΄μ§κ° λμ΄κ°μ λ μ²΄ν¬ λ°μ€λ₯Ό ν¬ν¨ν κ²μμ λ€μ μλνλ©΄ κ²μμ΄κ° μ΄κΈ°ν λλ λ¬Έμ λͺ©λ‘μΌλ‘ λ²νΌμ ν΄λ¦ν μμλ§ κ²μ μ‘°κ±΄μ΄ μ΄κΈ°ν λκ² μ€μ λ€λ₯Έ νμ΄μ§λ‘ μ΄λ ν ν΄λΉ νμ΄μ§λ₯Ό μλ‘ λ‘λ©ν΄λ κ²μνλ κ²μμ΄κ° inputκ³Ό selectμ κ·Έλλ‘ λ¨μμλ λ¬Έμ λ°μ @GetMapping
μ μ¬μ©ν κ²μ λ°©μμΌλ‘ μμ νμ¬ controllerμμ λμ΄μ¨ κ²μμ΄ νλΌλ―Έν° κ°μ΄ μ‘΄μ¬νλ©΄ valueλ‘ λ€μ λκΈ°λλ‘ μμ -
BackEnd
β Entity λ¬Έμ ν΄κ²° μ¬λ‘
λ¬Έμ μν© ν΄κ²° λ°©λ² User
μν°ν°μuserid
μ μ£Όλ―Όλ²νΈμ Unique μ μ½ μ‘°κ±΄μ΄ κ±Έλ¦¬μ§ μλ λ¬Έμ @Column(length=xx)
μ μΆκ°νμ¬ ν¬κΈ° μ νμ μΆκ°Professor
μManager
μν°ν°μ ν΄μ¬ μ¬λΆκ° μ λΆ 1λ‘ λ€μ΄κ° μλ λ¬Έμ ν΄μ¬ μ¬λΆ νλμ @Enumerated(EnumType.STRING)
μμ±κ³΅μ§μ¬νμ μμ±ν λ, 곡μ§μ¬νμ λ΄μ©μ΄ κΈΈμ΄μ§λ©΄ μμΈκ° λ°μ content
νλμ@Lob
μ μ¬μ©νμ¬ μλ£νμ λ§κ² BLOB λλ CLOBμΌλ‘ λ³κ²½β Running Time λ¬Έμ ν΄κ²° μ¬λ‘
λ¬Έμ μν© ν΄κ²° λ°©λ² lectureList
μ λ‘λ© μκ°μ΄ λ무 μ€λ 걸리λ λ¬Έμ LectureList
λ₯Ό λ°μμ€κ³ , ν΄λΉ Listμ μ‘΄μ¬νλMajor
λ€μ λ°μμ€λ λ°©μμΌλ‘ μμ IDμ Passwordλ₯Ό μ λ ₯νμ§ μκ³ λ‘κ·ΈμΈ μλ μ NullPointerException
λ°μString.isEmpty()
λ₯Ό μ¬μ©νμ¬ IDμ Passwordκ° λΉμ΄μμ§ μμ λλ§ κΈ°μ‘΄ λ‘κ·ΈμΈ λ©μλλ₯Ό μ€νConvert λ¬Έμ ν΄κ²° μ¬λ‘
λ¬Έμ μν© μ€λͺ AcademicalCalendar Entityλ₯Ό DTOλ‘ λ³ννλ κ³Όμ μμ, λ μ§μ nullμ΄ λ€μ΄κ°λ λ¬Έμ μμΈ: Entityμλ Date νμ , DTOμλ LocalDate νμ μ΄λΌ λ³ν κ³Όμ μμ nullμ΄ λ€μ΄κ°λ
ν΄κ²°: Entityμ νμ μ LocalDateνμ μΌλ‘ μμ DBμμ κ°μ Έμ¨ μμμΌ, μ’ λ£μΌμ View νμ΄μ§λ‘ μ λ¬ μ μμΈ λ°μ μμΈ: SimpleDateFormatμ μ¬μ©νμ¬ μμμΌκ³Ό μ’ λ£μΌμ String νμ μΌλ‘ λ³ν ν μ λ¬νλλ°, λ³ν κ³Όμ μμ null 체ν¬λ₯Ό μ§ννμ§ μμ μμΈκ° λ°μν κ²
ν΄κ²°: Parsing λμμ κ°μ΄ μ‘΄μ¬νλμ§ νμΈνλ Null μ²΄ν¬ κ΅¬λ¬Έ μμ±Sessionμμ userλ₯Ό λ°μμ¨ ν, ManagerLoginDtoλ‘ λ€μ΄μΊμ€ν μ νκΈ° μν΄ UserDTOμ μλ roleμ μ κ·Όνλ κ³Όμ μμ μμΈ λ°μ μμΈ: userλΌλ μ΄λ¦μΌλ‘ ManagerLoginDto, ProfessorDto, StudentDtoκ° λ€μ΄κ° μκ³ , ν΄λΉ DTO λ΄λΆμ UserDTOκ° μ‘΄μ¬νκΈ° λλ¬Έμ μ΄μ€μΌλ‘ λ€μ΄μΊμ€ ν λμ΄μΌ νλ κ²μ΄ μμΈ
ν΄κ²°: userλ₯Ό Objectλ‘ λ°μμ¨ ν, 쑰건문μ μ¬μ©νμ¬ κ° DTOλ‘ λ€μ΄μΊμ€ν μ΄ λλμ§ νμΈ ν λ€μ΄μΊμ€ν μ μ§νObject user = session.getAttribute("user"); if (user instanceof ManagerLoginDto) { ManagerLoginDto manager = (ManagerLoginDto) user; }
Insert
λ¬Έμ μν© μ€λͺ Fetch API λ°©μμ μ΄μ©ν΄μ κ΅μ, κ΅μ§μ λ±λ‘ μ μλ²μ λ°μ΄ν° μ μ₯μ λμ§λ§, ν΄λΌμ΄μΈνΈ μΈ‘μΌλ‘ μλ΅μ΄ κ°μ§ μμ: Completed 500 INTERNAL_SERVER_ERROR μμΈ: CORS μ΄μ, μλ² μλ΅ μ²λ¦¬, λ€νΈμν¬ λ¬Έμ , μμ² ν€λ μ€μ , μμ² λ³Έλ¬Έ λ°μ΄ν°, μλ² μΈ‘ λ‘κΉ λ± λ€μν μμΈ μ€ λͺ νν μ΄μ λ₯Ό μ°Ύμ§ λͺ»ν¨
ν΄κ²°: jQueryμ$.ajax()
ν¨μλ₯Ό μ¬μ©νμ¬ λΉλκΈ°μ μΌλ‘ μλ²μ μμ²μ λ³΄λΈ ν μλ² μλ΅μ λν μ²λ¦¬λ₯Ό successμ error μ½λ°± ν¨μλ‘ μ²λ¦¬. μλ² μλ΅μ΄ JSON νμμΈ κ²½μ° ν΄λΉ λ°μ΄ν°λ₯Ό μ²λ¦¬νκ³ , μΆκ°μ μΈ λ‘μ§μ μνμ±μ μ μ λ ₯νκ³ μ μΆνλ©΄ μλ²μμ NullPointerException λ°μ μμΈ: μλ°μ€ν¬λ¦½νΈμμ enrollment_idx
λ₯Ό μ λ¬νμ§ λͺ»ν μνμμ,map.get("enrollment_idx");
μ ν΅ν΄ λ°μΌλ €κ³ νκΈ° λλ¬Έ
ν΄κ²°:enrollment_idx
λ₯Ό λ°μμ€μ§ λͺ»ν μμΈμ΄ Listλ₯Ό λ°μμ€λ κ³Όμ μ μλ€κ³ νλ¨νμ¬ ProfessorRepositoryCustomImplμ νμΈνμκ³ ,enrollment_idx
λ₯Ό λ°μμ€λ κ΅¬λ¬Έμ΄ μμ λ κ²μ λ°κ²¬νμ¬ λ€μ μμ±Modify
λ¬Έμ μν© μ€λͺ κ°μ μμ μ μ§ννλ μ€ formμΌλ‘ λ°μ΄ν°λ₯Ό λκΈ°λ©΄ nullμ΄ λ€μ΄κ° μμΈ: μμΌ, μμ μκ°κ³Ό λ μκ°μ String λ°°μ΄λ‘ λ°μκΈ° λλ¬Έμ, λ°μ΄ν°κ° μ‘΄μ¬νμ§ μμΌλ©΄ λ°°μ΄λ μ‘΄μ¬νμ§ μκΈ° λλ¬Έμ nullμ΄ λ€μ΄κ° κ²
ν΄κ²°: μ λ ₯ λ°μ Stringλ°°μ΄μ κΈΈμ΄λ§νΌ λ°λ³΅νμ¬ nullμ΄ μλ κ°λ§ μλ‘ μμ±ν StringBuilderμ λ΄μμ DB λ°μ΄ν°λ₯Ό μμ μ΄λ―Έ μ λ ₯λ μ±μ μ μμ ν λ updateκ° μλ insert λλ λ¬Έμ Serviceμμ Grade μν°ν°λ₯Ό μλ‘ μμ±νκ³ save λ©μλλ₯Ό μ¬μ©νκΈ° λλ¬Έ QueryDSL
λ¬Έμ μν© μ€λͺ κ°μ νκ° μ€λ³΅ QueryDSLμ innerJoinμμ μ‘°μΈλ¬Έμ μ€λ₯λ‘ λ¬Έμ λ°μ QueryDSLμ μ¬μ©νμ¬ ProfessorDTOλ₯Ό λ°μμ€λ κ³Όμ μμ major μ΄λ¦μ college μ΄λ¦μΌλ‘ λ°μμ€λ λ¬Έμ ProfessorDTOμλ MajorDTOκ° μ‘΄μ¬νκ³ , MajorDTOμλ nameκ³Ό college_nameμ΄λΌλ νλκ° μ‘΄μ¬νλ€. ProfessorDTO λ΄λΆμμ MajorDTOλ₯Ό μμ±ν λ Entityμμ κ°μ νλλͺ μ μ¬μ©νλ nameμ΄ λ¬Έμ κ° λμ΄ major.nameμ΄ μλ major.college.nameμ΄ λ€μ΄κ° κ²μ΄ μμΈμΌλ‘ μΆμΈ‘ μ±μ μ‘°νλ₯Ό μν΄ GradeLectureDtoλ₯Ό κ°μ Έμ€λ©΄μ InvalidPathException: Invalid path: 'grade.score' λ°μ ν΄λΉ λ©μλμ fromμ QLecture.lectureλ‘ μμ±νμλλ°, Lecture μν°ν°μλ grade λΌλ νλκ° μ‘΄μ¬νμ§ μκ³ , Grade μν°ν°μ μ°κ²°ν μ‘°μΈλ¬Έμ μμ±νμ§ μμκΈ° λλ¬Έ κ°μλͺ©λ‘ λΆλ¬μ€λ κ³Όμ μμ eq(null) is not allowed. Use isNull() instead; λΌλ μλ¬ λ©μμ§ μΆλ ₯ where 쑰건μ μμ±νκΈ° μν΄ eq λ©μλλ₯Ό μ¬μ©ν λ, κ²μ 쑰건 맀κ°λ³μμ λν null체ν¬λ₯Ό μ§ννμ§ μμκΈ° λλ¬Έμ λ°μν λ¬Έμ @PageableDefault (sort=βidxβ) μ΄λ Έν μ΄μ μ΄ μ μ©λμ§ μμ QueryDSLμ μ¬μ©νλ κ²½μ°μλ QueryDSLμ΄ μ΄λ Έν μ΄μ λ³΄λ€ μ°μ μ λμ΄μ @PageableDefault (sort=βidxβ) μ΄λ Έν μ΄μ μ΄ μ μ©λμ§ μμ λ‘κ·ΈμΈ μ βνλ² κΈ°μ΅νκΈ°βμ 체ν¬κ° λμ΄μμ§ μμΌλ©΄ μμΈ νμ΄μ§λ‘ μ΄λνλ λ¬Έμ βνλ² κΈ°μ΅νκΈ°βμ κ°μ @RequestParamμΌλ‘ κ°μ Έμ¬ λ, Requiredκ° κΈ°λ³Έκ° trueλ‘ μ€μ λμ΄ μμκΈ° λλ¬Έ BooleanExpression studentIdxCondition = condition.getStudentIdx() != null ? enrollment.student.idx.eq(condition.getStudentIdx()) : null; BooleanExpression semesterCondition = condition.getSemester() != null ? enrollment.lecture.semester.eq(condition.getSemester()) : null;
πͺ μΏ ν€
λ¬Έμ μν© λ‘κ·ΈμΈ μ βνλ² κΈ°μ΅νκΈ°βμ 체ν¬κ° λμ΄μμ§ μμΌλ©΄ μμΈ νμ΄μ§λ‘ μ΄λνλ λ¬Έμ μμΈ βνλ² κΈ°μ΅νκΈ°βμ κ°μ @RequestParamμΌλ‘ κ°μ Έμ¬ λ, Requiredκ° κΈ°λ³Έκ° tureλ‘ μ€μ λμ΄ μμκΈ° λλ¬Έ ν΄κ²° @RequestParamμ Requiredλ₯Ό falseλ‘ μ€μ νκ³ , κ°μ΄ μμΌλ©΄ 쑰건문μ λ€μ΄κ° λ μμΈκ° λ°μνκΈ° λλ¬Έμ defaultValueλ₯Ό βfalseβλ‘ μ€μ β AWS
λ¬Έμ μν© μΈμ€ν΄μ€ 경보 λ° μνμ²΄ν¬ μλ¬λ¬Έμ μμΈ μμΈμ λͺ¨λ₯΄κ² μΌλ μνμ²΄ν¬ κ³Όμ μμ μλ¬κ° μκΈ°κ³ μ΄ μλ¬λ‘ μΈν΄ μ μμ΄ λΆκ°λ₯ν΄μ§λ λ¬Έμ κ° μκ²Όμ ν΄κ²° μΈμ€ν΄μ€ μ€μ§ ν λ€μ μμ μ΄ κ³Όμ μμ νΌλΈλ¦ IPμ£Όμκ° λ°λλ λ¨μ μ΄ μμΌλ ν΄κ²°νμ IPμ£Όμμ λ§μΆ°μ λλ©μΈ IPμ£Όμ λ³κ²½ λ° ν¬νΈν¬μλ©μ λ€μ ν΄μ€μΌλ‘μ¨ λ³΅κ΅¬ μλ£
- μ μ λΆμ - μ€λ³΅λ μ½λκ° λ§κ³ , μ½λ μ€λ©(Code Smell)κ³Ό λΆνμν λ°λ³΅μΌλ‘ 볡μ‘λκ° λμ ν¨μ¨μ΄ λ¨μ΄μ§λ€. μ΄λ₯Ό κ°μ ν΄ λΆνλ₯Ό μ€μ¬μΌν νμκ° μλ€.
- κΈ°λ₯μ μΌλ‘ λΆμ‘±ν λΆλΆλ€μ΄ λ§λ€. μ€λ³΅ ν΄κ²° λμμ± λ¬Έμ ν΄κ²° λ±
- μ±ν κΈ°λ₯μ΄λ μλ¦ΌκΈ°λ₯μ μΉμμΌμ μ¬μ©ν΄μ ꡬννκ³ μΆλ€.
- λΆνν μ€νΈ λΆμ‘±μΌλ‘ λ§μ λΆν λ°μμ μ΄λ₯Ό ν΄κ²°ν νμκ° μλ€.
νμ¬κ΄λ¦¬ μμ€ν νλ‘μ νΈλ₯Ό νλ©΄μ μλ‘μ΄ κ²μ λ°°μ°κ³ κ²½νν μ μμμ΅λλ€. μ΄ νλ‘μ νΈμμ μ€νλ§λΆνΈ, JPA, κ·Έλ¦¬κ³ QueryDSL κ°μ κΈ°μ μ μ°λ©΄μ κ°λ°μ μ§ννλλ° μ΄λ° κΈ°μ λ€ λλΆμ λ°μ΄ν°λ₯Ό ν¨μ¨μ μΌλ‘ λ€λ£¨κ³ 볡μ‘ν 쿼리λ μ½κ² μμ±ν μ μμλκ² ν° κ²½νμ΄μμ΅λλ€. μ΄λ² νλ‘μ νΈλ₯Ό ν΅ν΄ κΈ°μ μ μΌλ‘λ λ§μ΄ μ±μ₯νκ³ , νμν¬μ νλ‘μ νΈ κ΄λ¦¬ λ₯λ ₯λ ν¨κ» λ λ°μ ν μ μμμ΅λλ€. μλ‘μ κΈ°μ κ³Ό μ§μμ 곡μ νκ³ , ν¨κ» λ¬Έμ λ₯Ό ν΄κ²°ν΄ λκ°λ κ³Όμ μμ λ§μ κ²μ λ°°μΈ μ μμμ΅λλ€. νλ‘μ νΈλ₯Ό μ§ννλ©΄μ μλ²½νκ² μ²λ¦¬νμ§ λͺ»ν λΆλΆλ€λ μμ΄μ μμ¬μμ΄ λ¨κΈ°λ νμ§λ§ ν¨κ» νλ‘μ νΈλ₯Ό μ§ννλ νμλ€ λͺ¨λ κ³ μνμ ¨μ΅λλ€!!
μλ£μ΄ν μλ‘κ² ν νλ‘μ νΈλ₯Ό μ§ννλ©° λ§μ κ²λ€μ λ°°μ°κ³ κ²½νν μ μμλ μκ°μ 보λΈκ² κ°μ΅λλ€. μ€ν°λλ₯Ό ν΅ν΄ λ°°μ΄ SpringDataJPAμ QueryDSLμ μ¬μ©ν΄λ³΄κΈ° μν΄ μμν νλ‘μ νΈμμ΄μ μ½κ² μκ°νμ§λ§ Entity μ€κ³ν νλ‘μ νΈκ° μ μ μ§νλλ©° μκ°νμ§ λͺ»νλ λ§μ λΆλΆλ€μ΄ μμ΄μ μμ μ μ΄λ €μμ κ²ͺκΈ°λ νμ΅λλ€. μμΈμ μ μ μλ μ€λ₯λ‘ λ§μ μκ°μ ν€λ§€μλ μ λ μμμ§λ§ νμλ€μ΄ μμκΈ° λλ¬Έμ νλ‘μ νΈλ₯Ό λ§λ¬΄λ¦¬ ν μ μμλκ² κ°μ΅λλ€. νλ‘μ νΈλ₯Ό λ§λ¬΄λ¦¬νλ©΄μ 체κ³μ μΌλ‘ μ€κ³/κΈ°λ‘ νμ§ λͺ»νλ λΆλΆλ€μ΄ λμ± μμ½κ² λ€κ°μμ§λ§ κ·Έ λν λ μμ±λ μλ νλ‘μ νΈλ₯Ό λ§λ€κΈ° μν κ³Όμ μ΄λΌκ³ μκ°λ©λλ€. κ°μΈμ μΌλ‘ λΆμ‘±νλ λΆλΆλ€μ΄ λ§μλλ° λ§μ΄ λμμ£Όκ³ μλ €μ€ νμλ€μκ² κ°μ¬νλ¨ λ§μ μ νκ³ μΆμ΅λλ€. λͺ¨λ κ°μ¬ν©λλ€.
ννλ‘μ νΈλ₯Ό μ§ννλ©΄μ μ λ§ λ§μ κ²μ λ°°μ μ΅λλ€. κ΅λΉ μ·¨μ κ³Όμ μ ν΅ν΄ λ°°μ΄ μ§μκ³Ό μ΅κ·Όμ μλ‘κ² λ°°μ΄ SpringDataJPAμ QueryDSLμ μ¬μ©ν΄μ μλ‘μ΄ νλ‘μ νΈλ₯Ό λ§λ€κ² λμλλ° μ²μμλ μ λ§ κ°λ¨νκ² λλΌ μ μμ κ² κ°λ€λ μκ°μ΄ λ€μμ§λ§ μκ°λ³΄λ€ νμ¬κ΄λ¦¬μμ€ν μλ λ§μ λν μΌλ€μ΄ λ€μ΄κ°μꡬλλΌλ μκ°μ νκ² λμκ³ νΉνλ μκ°κ΄λ ¨λ μ²λ¦¬λ μ²μ QueryDSLλ‘ νλ‘μ νΈλ₯Ό μ§ννλλ° λ§μ λκ΄λ€μ΄ μμμ΅λλ€. μ΄λ¬ν λκ΄λ€μ κ·Ήλ³΅ν΄ λκ°λ©΄μ λ§μ 보λμ λκΌκ³ λ€μμλ μ’ λ λ₯μν΄ μ Έμ μμ±λ μλ νλ‘μ νΈλ₯Ό λ§λ€μ΄μ νμ μμ μ¬μ©νκ³ μΆλ€λ μκ°μ΄ λ€μμ΅λλ€. μ°λ¦¬ νμλ€ λ€λ€ κ³ μλ§μΌμ ¨μ΅λλ€. λ€λ€ μ’μ κ³³μΌλ‘ μ·¨μ μ μ±κ³΅νμ ¨μΌλ©΄ μ’κ² μ΅λλ€.
νμλ€κ³Ό μλ‘ μ견μ λλκ³ , λͺ¨λ₯΄λ κ²μ΄ μμΌλ©΄ μλ‘ κ°λ₯΄μ³μ£Όλ©° μμ νλ κ³Όμ μ΄ λ무 μ¦κ±°μ μ΅λλ€. μ λλ‘ μ¬μ©ν΄λ³΄μ§ λͺ»νλ Gitμ ν΅ν© νμ λ₯λ ₯μ μμ μ μμκ³ , μ§μ μ¬μ©ν΄λ³΄μ§ λͺ»νλ SprignDataJPAμ QueryDSLμ μ€μ λ‘ μ¬μ©νλ©° λ§μ κ²μ λ°°μΈ μ μμμ΅λλ€. Entity μ€κ³λ₯Ό μλ£νλ€κ³ μκ°νμ§λ§, μμ κ³Όμ μμ νλκ° μΆκ°λλ κ³Όμ κ³Ό λλ―Έ λ°μ΄ν°λ₯Ό λ£λ κ³Όμ μμ DBμ κ°λ μ μ€κ³μ λ Όλ¦¬μ μ€κ³μ μ€μμ±μ λ€μ ν λ² κΉ¨λ¬μ μ μμμ΅λλ€. μμ ν λΉμμλ "μ΄λ§νλ©΄ μλ²½νμ§!" λΌκ³ μκ°νλ κ²°κ³Όλ¬Όμ΄ νλ‘μ νΈ λ§λ¬΄λ¦¬λ₯Ό νλ κ³Όμ μμ λΆμ‘±ν λΆλΆλ€μ΄ λμ λ€μ΄μ€λ κ²μ΄ μμ½μ΅λλ€. μ΄λ² νλ‘μ νΈλ₯Ό κΈ°λ°μΌλ‘ λ€μ νλ‘μ νΈμ νμ μμλ μ‘°κΈ λ μμ±λ μλ κ²°κ³Όλ¬Όμ μμ±ν μ μμ κ² κ°μ΅λλ€. λ§λ΄λ‘μ¨ ν, λλλ€μκ² μ’μ λͺ¨μ΅μ 보μ΄λ €κ³ νλλ° μ λλμ§ λͺ¨λ₯΄κ² μ΅λλ€. μ°λ¦¬ νμ λͺ¨λ μ’μ κ³³μ μ·¨μ§νκ³ , μμΌλ‘λ μμ£Ό λ§λ μ μμμΌλ©΄ μ’κ² μ΅λλ€. λ€λ€ νμ΄ν !!