κ°μ¬λ κ°μλ₯Ό μ΄μ΄ μΌμ /곡μ§/κ³Όμ λ₯Ό κ΄λ¦¬νκ³ , νμμ κ°μλ₯Ό μ μ²νκ³ μ€ν°λ κ·Έλ£Ήμ λ§λ€μ΄ ν¨κ» 곡λΆνλ κ΅μ‘ κ΄λ¦¬ μΉ νλ«νΌμ λλ€.
- μλΉμ€λͺ : EduManager
- κ°λ° κΈ°κ°: 2024.10 ~ 2024.12
- κ°λ° μΈμ: 4λͺ (λλμ¬μλνκ΅ λ°μ΄ν°λ² μ΄μ€ νλ‘κ·Έλλ° κ΅κ³Ό ν νλ‘μ νΈ)
- ν΅μ¬ νΉμ§: νλ μμν¬ μμ΄ Servlet/JSP + μμ JDBCλ‘ μ§μ ꡬνν κ³μΈ΅ν MVC
- νλ‘μ νΈ κ°μ
- μλΉμ€ κΈ°ν λ°°κ²½
- μ£Όμ νλ©΄ λ° κΈ°λ₯ μκ°
- νλ‘μ νΈ ν΅μ¬ κΈ°μ
- μμ€ν μν€ν μ²
- ERD
- DB μ μ© λ° μ€ν
- λλ ν 리 ꡬ쑰
- νμ μκ°
- FAQ
- κΈ°μ μ€ν
EduManagerλ κ°μμ μ€ν°λλ₯Ό ν κ³³μμ μ΄μνλ κ΅μ‘ κ΄λ¦¬ μΉ μλΉμ€μ λλ€. λ°μ΄ν°λ² μ΄μ€ νλ‘κ·Έλλ° κ΅κ³Ό νλ‘μ νΈμΈ λ§νΌ, μ€νλ§/λ§μ΄λ°ν°μ€ κ°μ νλ μμν¬μ κΈ°λμ§ μκ³ κ΄κ³ν DB μ€κ³μ μμ JDBCλ‘ μΉ λ°±μλμ λμ μ리λ₯Ό λ°λ°λ₯λΆν° ꡬνν κ²μ΄ ν΅μ¬μ λλ€.
- π©βπ« κ°μ¬: κ°μ κ°μ€, μ κΈ° μμ μΌμ /곡μ§/κ³Όμ λ±λ‘, μκ°μ κ΄λ¦¬
- π©βπ νμ: κ°μ κ²μκ³Ό μκ° μ μ², μ°/리뷰, μ€ν°λ κ·Έλ£Ή κ°μ€κ³Ό νμ λͺ¨μ§
- ποΈ ν΅ν© μΊλ¦°λ: μμ /μ€ν°λ/κ³Όμ /κ³΅μ§ μΌμ μ ν νλ©΄μμ νμΈ
- ποΈ μμ JDBC: ORM μμ΄ PreparedStatement, νΈλμμ , 컀λ₯μ νμ μ§μ λ€λ£Έ
κ°μμ μ€ν°λλ₯Ό μ΄μν λ νμν μ 보λ λ³΄ν΅ μΉ΄μΉ΄μ€ν‘ 곡μ§, μμ μκ°μ λͺ λ¨, ꡬλ μ λ¬μ²λΌ μ¬λ¬ κ³³μ ν©μ΄μ Έ μμ΅λλ€. κ°μ¬λ μΌμ /곡μ§/κ³Όμ /μκ°μμ λ°λ‘λ°λ‘ κ΄λ¦¬ν΄μΌ νκ³ , νμμ μ§κΈ μ΄λ€ κ°μμ μ€ν°λκ° μ΄λ € μλμ§ νλμ νμ νκΈ° μ΄λ ΅μ΅λλ€.
- π§© λΆμ°λ κ΅μ‘ νλμ νλμ νλ¦μΌλ‘:
κ°μ λͺ¨μ§ β μκ° μ μ² β μΌμ /곡μ§/κ³Όμ κ΄λ¦¬ β μ€ν°λ λͺ¨μμ ν νλ«νΌμμ μ²λ¦¬ - π μν κΈ°λ° νλ©΄: κ°μ¬μ νμμ΄ κ°μ μν μ λ§λ νλ©΄μμ νμν μμ λ§ λΉ λ₯΄κ²
- π οΈ λ°λ°λ₯λΆν° ꡬν: νλ μμν¬ λμ κ΄κ³ν DB μ€κ³μ μμ JDBCλ‘ λ°±μλ λμ μ리μ μ§μ€
κ°μ¬ κ³μ μΌλ‘ λ‘κ·ΈμΈν΄ μΊ‘μ²ν μ€μ μλΉμ€ νλ©΄μ λλ€. (λ€μ΄λΉ ν€ λμμΈ μμ€ν )
| λ‘κ·ΈμΈ | νμκ°μ (μν μ ν) | λ΄ μ 보 |
|---|---|---|
![]() |
![]() |
![]() |
- νμ / κ°μ¬ μν κΈ°λ° νμκ°μ (λ¨κ³λ³ μ λ ₯)κ³Ό λ‘κ·ΈμΈ/λ‘κ·Έμμ
- μΈμ κΈ°λ° μΈμ¦ λ° κΆνλ³ μ κ·Ό μ μ΄ (μ: κ°μ κ°μ€μ κ°μ¬λ§)
- νλ‘ν μ¬μ§ μ
λ‘λ (Oracle BLOBμ μ μ₯νκ³
/imageλ‘ μ€νΈλ¦¬λ° μλΉ) - μμ΄λ μ€λ³΅ νμΈ(AJAX μΈλΌμΈ κ²μ¬), λ΄ μ 보 μμ , νμ νν΄(μννΈ μμ , κ°μΈμ 보 μ΅λͺ ν)
| κ°μ / μ€ν°λ μ μ² λͺ©λ‘ | κ°μ μμΈ | κ°μ κ°μ€ (κ°μ¬) |
|---|---|---|
![]() |
![]() |
![]() |
- κ°μ¬: κ°μ κ°μ€/μμ , μ κΈ°/λ¨κΈ° μμ μΌμ , μν, 곡μ§, κ³Όμ λ±λ‘, λν μ¬μ§ μ λ‘λ
- νμ: κ°μ λͺ©λ‘/μμΈ μ‘°ν, μκ° μ μ², μ°(μ’μμ), 리뷰 μμ±
- μΌμ μΆ©λ κ²μ¬ λ± κ°μ μ΄μμ νμν κ²μ¦ ν¬ν¨
| μ€ν°λ κ°μ€ | μ€ν°λ μμΈ / κ°μ |
|---|---|
![]() |
![]() |
- μ€ν°λ κ°μ€/μμ , λͺ¨μ§ μΈμκ³Ό μ κΈ° λͺ¨μ μμΌ μ€μ
- κ°μ μ μ² β 리λμ μλ½/κ±°μ νλ¦
- μ€ν°λ μΌμ /곡μ§/κ³Όμ , 첨λΆνμΌ, κ³Όμ μ μΆ, μ°, 리뷰 κΈ°λ₯ μ 곡
| ν΅ν© μΌμ μΊλ¦°λ | λ§μ΄νμ΄μ§ |
|---|---|
![]() |
![]() |
- ν΅ν© μΌμ μΊλ¦°λ: μμ /μΌμ /μν/κ³Όμ λ₯Ό λ μ§λ³λ‘ νμΈνκ³ νλͺ© ν΄λ¦ μ μμΈ νμ΄μ§λ‘ μ΄λ
- λ§μ΄νμ΄μ§: λ΄ μ 보 / λ΄ κ°μ / λ΄ μ€ν°λ / μ° λͺ©λ‘
| κ³΅μ§ λ±λ‘ | κ³Όμ λ±λ‘ | κ°μ μμ |
|---|---|---|
![]() |
![]() |
![]() |
- 곡μ§/κ³Όμ /μΌμ λ±λ‘ μ μμΈ λ΄μ©, μ΄λ―Έμ§, 첨λΆνμΌ μ λ‘λ
- κ³Όμ λ μμμΌ/μμμκ°, λ§κ°μΌ/λ§κ°μκ°μ κ΄λ¦¬νκ³ νλͺ©λ³ μμ /μμ μ§μ
| κ³Όμ ν¨ / λ§κ° κ΄λ¦¬ | κ³Όμ μ μΆ | λ§κ° μ μ μΆ μ°¨λ¨ |
|---|---|---|
![]() |
![]() |
![]() |
- κ³Όμ μ μΆ(μ€λͺ
+ νμΌ μ
λ‘λ), κ³Όμ ν¨μ
D-3/κΈ°νλ§κ°μλ νμ - λ§κ° μκ°μ΄ μ§λλ©΄ μ μΆ μ°¨λ¨ (μλ² κ²μ¦ + UIμμ μ μΆ νΌ μ¨κΉ)
- μ μΆλ¬Ό μ κ·Ό μ μ΄: κ°μ¬λ μ 체 μ μΆλ¬Ό μ΄λ/λ€μ΄λ‘λ, νμμ λ³ΈμΈ μ μΆλ¬Όλ§
- λͺ¨λ μμ²μ
DispatcherServlet(Front Controller) ν κ³³μΌλ‘ λ°κ³ ,RequestMappingμ΄ URLμControllerλ‘ λΆκΈ°ν©λλ€. - κ°
Controllerλ κ³΅ν΅ μΈν°νμ΄μ€(execute)λ₯Ό ꡬνν΄ forward(JSP) λλ redirect κ²½λ‘λ₯Ό λ°ννκ³ , λμ€ν¨μ²κ° μ΄λμ λ΄λΉν©λλ€. - λ§€νμ΄ μλ μμ²μ 404λ‘ μ²λ¦¬ν΄, λΌμ°ν μ± μμ ν κ³³μ λͺ¨μμ΅λλ€.
- λ§€ μμ²λ§λ€ 컀λ₯μ μ μλ‘ λ§λ€μ§ μκ³ Apache Commons DBCP2 컀λ₯μ νμμ λΉλ € μ°κ³ λ°λ©ν©λλ€.
ConnectionManager(ν λνΌ) βJDBCUtil(쿼리 μ€ν/νΈλμμ ) βDAOλ‘ μ΄μ΄μ§λ λ°μ΄ν° μ κ·Ό κ³μΈ΅μ μ§μ μ€κ³νμ΅λλ€.- (νΈλ¬λΈμν
) μμ²λ§λ€ 곡μ λλ
JDBCUtilμνλ₯ΌThreadLocalλ‘ κ²©λ¦¬ν΄, λμ μ μ μ μΏΌλ¦¬κ° λ€μμ΄λ λμμ± λ²κ·Έλ₯Ό μ κ±°νμ΅λλ€.
- λΉλ°λ²νΈ PBKDF2 ν΄μ±:
PBKDF2WithHmacSHA256(μμ μνΈ + 12λ§ ν λ°λ³΅)μΌλ‘ μ μ₯νκ³ , μΈλΆ λΌμ΄λΈλ¬λ¦¬ μμ΄ JDKλ§μΌλ‘ ꡬννμ΅λλ€. κΈ°μ‘΄ νλ¬Έ κ³μ μ λ‘κ·ΈμΈ μ μλ νΈν(λ κ±°μ ν΄λ°±) ν μ μ§ μ νλ©λλ€. - νμ νν΄ μννΈ μμ + μ΅λͺ
ν: 물리 μμ μ κ°μ¬/μ€ν°λ 리λλ₯Ό μ§μ°λ©΄ νμΈμ μκ°/μ μΆ μ΄λ ₯κΉμ§ μ°μ μμ λκ±°λ κ³ μκ° λλ λ¬Έμ κ° μμ΄,
status='WITHDRAWN'νμ + κ°μΈμ 보 μ΅λͺ νλ‘ λ°κΏ μΈλν€ λ¬΄κ²°μ±κ³Ό μ΄λ ₯μ 보쑴ν©λλ€. - κΆν κΈ°λ° μ κ·Ό μ μ΄(νμ λͺ
λΆ/νμΈ μ 보λ κ΄λ¦¬μ/λ³ΈμΈλ§, κ°μ/νλͺ© μμ /μμ λ μμ κ°μ¬/μ€ν°λ 리λλ§), μ μ₯ν XSS λ°©μ΄(
<c:out>μ΄μ€μΌμ΄ν), μ격μ¦λͺ λΆλ¦¬(context.propertiesλΉμΆμ ).
- νλ‘ν/κ°μ/μ€ν°λ μ΄λ―Έμ§λ₯Ό νμΌ μμ€ν
μ΄ μλ Oracle
BLOBμΌλ‘ DBμ μ μ₯ν©λλ€. - λ³λ
IMAGEν μ΄λΈμ(OWNER_TYPE, OWNER_ID)ν€λ‘ 보κ΄νκ³ ,ViewImageControllerκ°/image?type=&id=λ‘ μ€νΈλ¦¬λ° μλΉν©λλ€(λ‘κ·ΈμΈ κ²μ΄νΈ + μ΄λ―Έμ§ MIME νμ΄νΈλ¦¬μ€νΈ +nosniff).
- 곡μ§/κ³Όμ /μΌμ /μν νλͺ©μ 첨λΆνμΌμ μ°κ²°νλλ‘
ITEMATTACHMENTν μ΄λΈμ λΆλ¦¬νκ³ , νμ₯μ νμ© λͺ©λ‘κ³Ό νμΌ μ/μ©λ μ νμ ν΅κ³Όν λ€ BLOBμΌλ‘ μ μ₯ν©λλ€. - κ³Όμ μ μΆλ¬Όμ
ASSIGNMENTSUBMISSIONμ μ μ₯νλ©°, κ°μ νμμ΄ λ€μ μ μΆνλ©΄ μ΅μ μ μΆλ‘ κ΅μ²΄νκ³ , λ€μ΄λ‘λλ μκ°μ/κ°μ¬, μ€ν°λ λ©€λ²/리λ κΆνμ νμΈν λ€ νμ©ν©λλ€.
- μμ
μ€ν¨ μ
requestκ° μλ μΈμ μ λ©μμ§λ₯Ό λ΄κ³ redirectνλ PRG(Post-Redirect-Get) ν¨ν΄μ μ μ©νμ΅λλ€. - κ³΅ν΅ λ€λΉκ²μ΄μ
μ΄ μΈμ
μ
flashErrorλ₯Ό μ½μ΄ ν λ²λ§ νμν λ€ μ¦μ μ κ±°ν΄, μλ‘κ³ μΉ¨ μ¬μ μ‘ λ¬Έμ μμ΄ μ€ν¨ μ¬μ λ₯Ό μ λ¬ν©λλ€.
- μλ μ£Όμ/μλ² μ€λ₯λ₯Ό ν°μΊ£ κΈ°λ³Έ νλ©΄ λμ λ€μ΄λΉ ν λ§ μ»€μ€ν μλ¬ νμ΄μ§λ‘ μλ΅ν©λλ€.
- μμΈ μ€ννΈλ μ΄μ€(λ΄λΆ ν΄λμ€/νλ μμν¬ μ 보)κ° μ¬μ©μμκ² λ ΈμΆλμ§ μλλ‘ μ°¨λ¨νμ΅λλ€.
νλ°νΈ 컨νΈλ‘€λ¬ ν¨ν΄ κΈ°λ°μ κ³μΈ΅ν MVC ꡬ쑰μ λλ€.
User Browser
ββ Filter (Encoding/Resource)
ββ DispatcherServlet (Front Controller)
ββ RequestMapping (URL β Controller λ§€ν)
ββ Controller (μμ² μ²λ¦¬, forward / redirect κ²°μ )
ββ Manager (Service/λΉμ¦λμ€ λ‘μ§, μ±κΈν€)
ββ DAO β JDBCUtil β ConnectionManager (DBCP2 Pool)
ββ Oracle DB
ββ View : JSP + JSTL (forward μ λ λλ§)
μμ² μ²λ¦¬ νλ¦
- λͺ¨λ μμ²μ
Filter(μΈμ½λ©/μ μ 리μμ€)λ₯Ό κ±°μ³DispatcherServletμΌλ‘ μ§μ RequestMappingμ΄ URLμ λ§λControllerλ₯Ό μ°Ύμ (μμΌλ©΄ 404)ControllerβManagerβDAOβ 컀λ₯μ ν μμΌλ‘ DB μμ μν- κ²°κ³Όμ λ°λΌ JSP forward λλ redirect λ°ν
- μ€ν¨ μ μΈμ
flashError+ PRGλ‘ μ¬μ©μμκ² 1νμ± μλ¦Ό
ν΅μ¬ μν°ν° κ΄κ³ (κ°λ΅ν)
erDiagram
MEMBER ||--o| STUDENT : "μ΄λ€"
MEMBER ||--o| TEACHER : "μ΄λ€"
TEACHER ||--o{ LECTURE : "κ°μ€"
MEMBER ||--o{ STUDYGROUP : "리λ"
STUDENT ||--o{ LECTURE_ENROLLMENT : "μκ°μ μ²"
LECTURE ||--o{ LECTURE_ENROLLMENT : "μκ°μ"
LECTURE ||--o{ LECTURE_LIKE : "μ°"
LECTURE ||--o{ LECTURE_REVIEW : "리뷰"
LECTURE ||--o{ SCHEDULE : "μ κΈ°μΌμ "
LECTURE ||--o{ NOTICE : "곡μ§"
LECTURE ||--o{ ASSIGNMENT : "κ³Όμ "
LECTURE ||--o{ ITEM_ATTACHMENT : "νλͺ©μ²¨λΆ"
STUDYGROUP ||--o{ STUDYGROUP_APPLICATION : "κ°μ
μ μ²"
STUDYGROUP ||--o{ STUDYGROUP_REVIEW : "리뷰"
STUDYGROUP ||--o{ SCHEDULE : "λͺ¨μμΌμ "
STUDYGROUP ||--o{ ITEM_ATTACHMENT : "νλͺ©μ²¨λΆ"
ASSIGNMENT ||--o{ ASSIGNMENT_SUBMISSION : "μ μΆ"
νλ‘ν/κ°μ/μ€ν°λ μ΄λ―Έμ§λ λ³λ
IMAGEν μ΄λΈμ(OWNER_TYPE, OWNER_ID)ν€ +IMG_DATA BLOBμΌλ‘ μ μ₯ν©λλ€. 곡μ§/κ³Όμ /μΌμ /μν 첨λΆνμΌμITEMATTACHMENT, κ³Όμ μ μΆλ¬ΌμASSIGNMENTSUBMISSIONμ BLOBμΌλ‘ μ μ₯ν©λλ€.
μ κ· κΈ°λ₯μ λ°μνλ €λ©΄ κΈ°μ‘΄ κΈ°λ³Έ μ€ν€λ§μ μλ SQLμ μμλλ‘ μ μ©ν©λλ€.
@db/IMAGE.sql
@db/ALTER_LECTURE_NAME_LENGTH.sql
@db/ALTER_ASSIGNMENT_TIME_COLUMNS.sql
@db/ALTER_SCHEDULE_DESCRIPTION.sql
@db/CREATE_ITEM_ATTACHMENT.sql
@db/CREATE_ASSIGNMENT_SUBMISSION.sql
@db/WIDEN_PWD_FOR_HASH.sql
@db/SOFT_DELETE_MEMBER.sql
@db/MEMBER_DELETE_CASCADE.sql
WIDEN_PWD_FOR_HASH.sql- λΉλ°λ²νΈ ν΄μ(PBKDF2) μ μ₯μ μνpwdμ»¬λΌ νλ (λ―Έμ μ© μ μ κ· νμκ°μ μ€ν¨)SOFT_DELETE_MEMBER.sql- νμ νν΄λ₯Ό μννΈ μμ + μ΅λͺ νλ‘ μ ννκΈ° μνMEMBER.statusμ»¬λΌ μΆκ° (λ―Έμ μ© μ λ‘κ·ΈμΈ/νμλͺ©λ‘/νν΄ μΏΌλ¦¬κ°ORA-00904λ‘ μ€ν¨)MEMBER_DELETE_CASCADE.sql- (μ ν) κ³Όκ±° νλ μμ μ© μ°μμ 리 νΈλ¦¬κ±°. μννΈ μμ λμ μΌλ‘ λ μ΄μ λ°ννμ§ μμΌλ©°, κ΄λ¦¬μκ° SQLλ‘ μ§μ νλ μμ ν λλ₯Ό λλΉν μμ λ§μ λλ€.
DB μ μ μ 보λ src/main/resources/context.properties.exampleμ 볡μ¬ν΄ context.propertiesλ‘ μμ±ν©λλ€. λΉλμ λ°°ν¬λ Maven, Tomcat 9λ‘ μνν©λλ€.
mvn -q -DskipTests package # target/EduManager.war μμ± ν Tomcat 9μ λ°°ν¬μμ° μλ리μ€
- κ°μ¬ λ‘κ·ΈμΈ β κ°μ κ°μ€(λν μ΄λ―Έμ§ μ λ‘λ) β μ κΈ° μμ μΌμ /곡μ§/κ³Όμ λ±λ‘
- νμ λ‘κ·ΈμΈ β κ°μ/μ€ν°λ μ μ² λͺ©λ‘μμ μκ° μ μ² β κ³Όμ μμΈμμ νμΌ/μ€λͺ μ μΆ
- λ©μΈ μΊλ¦°λμμ νλͺ© ν΄λ¦ β μμΈ νμ΄μ§ μ΄λ, λ§κ° μ§λ κ³Όμ λ μ μΆ μ°¨λ¨ νμΈ
- κΆν μλ μ¬μ©μμ μμ νμ΄μ§ μ κ·Όκ³Ό νμΌ λ€μ΄λ‘λ μ°¨λ¨ νμΈ
π¦ EduManager
βββ π db/ # DB μ€ν€λ§ / DDL (IMAGE, 첨λΆ, μ μΆ, μννΈμμ λ±)
βββ π pom.xml # Maven μμ‘΄μ± / λΉλ μ€μ
βββ π src/main
βββ π java
β βββ π controller # νλ°νΈ 컨νΈλ‘€λ¬ + λλ©μΈλ³ Controller
β β βββ π DispatcherServlet.java # μ§μ
μ (Front Controller)
β β βββ π RequestMapping.java # URL β Controller λ§€ν
β β βββ π lecture / study / member / mypage / main
β βββ π filter # EncodingFilter, ResourceFilter
β βββ π model
β βββ π domain # λλ©μΈ κ°μ²΄ (lecture / study / member / calendar)
β βββ π service # Manager λΉμ¦λμ€ λ‘μ§ (lecture / study / member)
β βββ π dao # DAO + JDBCUtil + ConnectionManager (lecture / study / member)
βββ π webapp
βββ π css / js / images # μ μ 리μμ€ (λ€μ΄λΉ λμμΈ μμ€ν
)
βββ π WEB-INF
βββ π web.xml # μλΈλ¦Ώ / νν° / μλ¬ νμ΄μ§ λ§€ν
βββ π error.jsp # 컀μ€ν
404 / 500 νμ΄μ§
βββ π navigation / lecture / study / member / mypage / main / registration / item
μΈ κ³μΈ΅(controller / dao / domain / service) λͺ¨λ lecture / study / member λλ©μΈμΌλ‘ μΌκ΄λκ² λΆλ¦¬λμ΄ μμ΅λλ€.
![]() μλ€ν @sondahyun |
![]() κΉν¬μ @heessunny |
![]() μ‘°μν₯ @JoEunHyang |
![]() zzinggny @zzinggny |
- Q. μ€νλ§μ μ°μ§ μμ μ΄μ λ?
- A. λ°μ΄ν°λ² μ΄μ€ νλ‘κ·Έλλ° κ΅κ³Ό νλ‘μ νΈλ‘, νλ μμν¬κ° κ°μΆ°μ£Όλ μμ² λΆκΈ°/νΈλμμ /컀λ₯μ κ΄λ¦¬λ₯Ό μ§μ ꡬννλ©° λμ μ리λ₯Ό μ΅νλ λ° λͺ©μ μ λμ΅λλ€.
- Q. μ΄λ―Έμ§μ 첨λΆνμΌμ μ΄λμ μ μ₯λλμ?
- A. νμΌ μμ€ν
μ΄ μλλΌ Oracle BLOBμ μ μ₯νκ³
/imageλ‘ μ€νΈλ¦¬λ° μλΉν©λλ€. (νλ‘ν/κ°μ/μ€ν°λ μ΄λ―Έμ§, νλͺ© 첨λΆνμΌ, κ³Όμ μ μΆλ¬Ό)
- A. νμΌ μμ€ν
μ΄ μλλΌ Oracle BLOBμ μ μ₯νκ³
- Q. νμ νν΄νλ©΄ λ°μ΄ν°κ° μ¬λΌμ§λμ?
- A. μννΈ μμ λΌ νμ 보쑴νκ³ κ°μΈμ λ³΄λ§ μ΅λͺ νν©λλ€. μκ°/μ μΆ/νκΈ° λ± μ΄λ ₯κ³Ό μΈλν€ λ¬΄κ²°μ±μ μ μ§λλ©°, μμ±μλ "(νν΄νμ)"μΌλ‘ νκΈ°λ©λλ€.
- Q. λ‘컬μμ μ€ννλ €λ©΄?
- A.
db/μ SQLμ μμλλ‘ μ μ©νκ³context.propertiesλ₯Ό μμ±ν λ€mvn packageλ‘ λΉλν΄ Tomcat 9μ λ°°ν¬ν©λλ€.
- A.
Created by Team EduManager π



















