์๋ ํ์ธ์!
์๋ชจ๋ ์ ๋๋ค ใ ใ ใ ์ค๋์ ํ์ ์์ฒด ํด๊ฐ์ธ ๋ ์ด๋ผ ์ฌ์ ์๊ฒ ๊ธ์ ์์ฑํ ์ ์๊ฒ ๋์์ด์.
์ ๊ฐ ์ง๋ ๋ฒ์ ์ด๋ฏธ๋ ํ๋ก์ ํธ ์งํ์ค์ด๋ผ ๋ธ๋ก๊ทธ ์ ๋ก๋๊ฐ ์กฐ๊ธ ๋์๋์ ๋๋ค๊ณ ํ์๋๋ฐ์!
์ค๋ ๋๋์ด ๋ง๋ฌด๋ฆฌ๊ฐ ๋์ด์ ํ๊ธฐ๋ฅผ ๋จ๊ธฐ๊ณ ์ ๋ ๋จ์๋ง์ ๋ธ๋ก๊ทธ๋ฅผ ์ผฐ์ต๋๋ค. ๐ค
์ ๋ด์ผ ๋ฐํ๊น์ง ๋๋์ผ ๋ง๋ฌด๋ฆฌ๊ธด ํ์ง๋ง
์ค๋ ๋ฑํ ํ ๊ฒ๋ ์๊ณ ํด์ ์ฌ์ ๋กญ๊ฒ ํ๊ธฐ๋ฅผ ๋จ๊ฒจ๋ณด๊ณ ์ ํฉ๋๋ค.
๊ด๋ จ ์๋ฃ
๐GitHub
https://github.com/chicken-tender/JDBC_OracleDB_PetCommunity.git
GitHub - chicken-tender/JDBC_OracleDB_PetCommunity
Contribute to chicken-tender/JDBC_OracleDB_PetCommunity development by creating an account on GitHub.
github.com
https://github.com/chicken-tender/Thymeleaf_PetCommunity.git
GitHub - chicken-tender/Thymeleaf_PetCommunity
Contribute to chicken-tender/Thymeleaf_PetCommunity development by creating an account on GitHub.
github.com
๐ง์ฌ์ฉํ ๊ฒ
- IDE, App : IntelliJ, Dbeaver, Sourcetree
- DB : Oracle
- ์ธ์ด : Java
- ๊ธฐ๋ก : Notion
โ๏ธ ๊ตฌํ ๋ฒ์
- ํ์๊ฐ์
- ๋ก๊ทธ์ธ, ๋ก๊ทธ์์
- ๊ด๋ฆฌ์ ๋ก๊ทธ์ธ
- ํ์ ์ ๋ณด ์กฐํ
- ๊ฐ์ธ ์ ๋ณด ์กฐํ
- ๋ง์ด ํ์ด์ง
- ํซ ํ์ด์ง
- ๊ฒ์ํ(์์ ๊ฒ์ํ, ์ ๋ณด ๊ณต์ )
- ๊ฒ์๊ธ ์์ฑ, ์์ , ์ญ์
- ๋๊ธ ์์ฑ, ์์ , ์ญ์
- ์ผ์ง ์์ฑ, ์์ , ์ญ์
๐ ERD
โ๏ธ DB ์ค๊ณ
MEMBER
์ด๋ฆ | ์ปฌ๋ผ๋ช | ์๋ฃํ | ์ ์ฝ ์กฐ๊ฑด |
ID | USER_ID | VARCHAR2(20) | PRIMARY KEY |
PW | USER_PW | VARCHAR2(20) | NOT NULL |
CHECK(8์ ์ด์) | |||
์ด๋ฆ | USER_NAME | VARCHAR2(15) | NOT NULL |
์ด๋ฉ์ผ | VARCHAR2(30) | UNIQUE | |
ํธ๋ํฐ ๋ฒํธ | PHONE | CHAR(13) | UNIQUE |
๊ฐ์ ๋ ์ง | JOIN_DATE | DATE DEFAULT |
BOARD
์ด๋ฆ | ์ปฌ๋ผ๋ช | ์๋ฃํ | ์ ์ฝ ์กฐ๊ฑด |
๊ฒ์ํ ์ด๋ฆ | BOARD_NAME | VARCHAR2(21) | PRIMARY KEY |
WRITE
์ด๋ฆ | ์ปฌ๋ผ๋ช | ์๋ฃํ | ์ ์ฝ ์กฐ๊ฑด |
๊ธ๋ฒํธ | BOARD_NUM | NUMBER | PRIMARY KEY |
๊ฒ์ํ ์ด๋ฆ | BOARD_NAME | VARCHAR2(21) | * ์ธ๋ ํค |
์ ๋ชฉ | TITLE | VARCHAR2(50) | NOT NULL |
๋ด์ฉ | BODY_TEXT | VARCHAR2(4000) | |
๋ ์ง | REG_DATE | DATE | NOT NULL |
ID | USER_ID | VARCHAR2(20) | * ์ธ๋ ํค |
REPLY
์ด๋ฆ | ์ญํ | ์ปฌ๋ผ๋ช | ์๋ฃํ | ์ ์ฝ ์กฐ๊ฑด |
๋ฒํธ | REPLY_NUM | NUMBER | PRIMARY KEY | |
๋๊ธ ์์ฑ | REPLY_WRITE | VARCHAR2(300) | NOT NULL | |
ID | ์์ฑํ ID | USER_ID | VARCHAR2(20) | * ์ธ๋ ํค |
๊ธ ๋ฒํธ | ์ด๋ ๊ธ์ ๋๊ธ ๋ฌ๊ฑด์ง ์ ํ | BOARD_NUM | NUMBER(3) | * ์ธ๋ ํค |
PET
์ด๋ฆ | ์ญํ | ์ปฌ๋ผ๋ช | ์๋ฃํ | ์ ์ฝ ์กฐ๊ฑด |
๋ฐ๋ ค๋ฌ ์ด๋ฆ | ํ์ด์ง ๋ถ๋ฆฌ | PET_NAME | VARCHAR2(20) | PRIMARY KEY |
์ฑ๋ณ | ‘M’ / ‘F’ | PET_GENDER | CHAR(1) | CHECK (M/F) |
๋ฐ๋ ค๋ฌ ์๋ ์์ผ | ๋ฐ๋ ค๋ฌ ๋์ด ๊ณ์ฐ | PET_BDAY | DATE | |
์ข ๋ฅ | PET_SPEC | VARCHAR2(30) | ||
ID | ๋๊ตฌ์ ๋ฐ๋ ค๋ฌ์ธ ์ง ํ์ธ | USER_ID | * ์ธ๋ ํค |
PET_PAGE
์ด๋ฆ | ์ญํ | ์ปฌ๋ผ๋ช | ์๋ฃํ | ์ ์ฝ ์กฐ๊ฑด |
ID | ์ฌ์ฉ์ ๋ณ ์กฐํ | USER_ID | * ์ธ๋ ํค | |
๋ฐ๋ ค๋ฌ ์ด๋ฆ | PET_NAME | VARCHAR2(20) | * ์ธ๋ ํค | |
๋ ์ง | PET_DIARY | DATE | ||
๋ฐ๋ ค๋ฌ ์ฌ์ง | PET_IMG | VARCHAR2(500) | ||
๋ฉ๋ชจ | PET_MEMO | VARCHAR2(250) | ||
์ฐ์ฑ | Yes/No ๊ตฌ๋ถ | PET_WALK | CHAR(1) | NOT NULL, CHECK (Y/N) |
๋ณต์ฉ ์ฝ ์ฌ๋ถ | Yes/No ๊ตฌ๋ถ | PET_MEDI | CHAR(1) | NOT NULL, CHECK (Y/N) |
์ด๋ฒ์ ์งํํ ํ๋ก์ ํธ๋ 'DB์ค๊ณ ๋ฐ JDBC'๋ก ๊ทธ ๋์ ๋ฐฐ์ด Java์ DB(Oracle)๋ฅผ ์ฐ๊ฒฐํ์ฌ ๋ค์ํ ์ฃผ์ ์ค ํ๋๋ฅผ ์ ์ ํ ๋ค ํฐ๋ฏธ๋์์ ์ถ๋ ฅํ๊ธฐ๊ฐ ๊ธฐ๋ณธ ๋ชฉํ์์ต๋๋ค.
์๊ฐ์ด ์ข ๋จ์ผ๋ฉด ์น์์๋ ๊ตฌํํด๋ณด๋ผ๊ณ ํ์ จ๋๋ฐ ์ ๋ ๊ผญ ์น๊น์ง ๊ตฌํํ๋ฆฌ๋ผ ๋ง์์ ๋จน๊ณ ์์ํ์ต๋๋ค.
๊ธฐ๊ฐ์ ์ด 2.24 ~ 3.7 ์ฝ 2์ฃผ์๊ณ ,
์ ํฌ ์กฐ๋ ์กฐ๊ธ ์ฌ์ ์๊ฒ ๋๋ด์ ๊ฒฐ๊ตญ ์น ๊ตฌํ(Thymeleaf)๊น์ง ์งํํ๊ณ ๋ง๋ฌด๋ฆฌํ์์ต๋๋ค.
์ฒซ ํ์
๊ฐ๋ฐ์ ์์ํ ์ดํ์๋ ๋ ์ ํผ์์๋ง ์์ ํ๊ณ , ๊ณต๋ถํ๊ณ ํ์์ต๋๋ค.
๊ทธ๋์ ๋๊ตฐ๊ฐ์ ๊ฐ์ด ํ์ ์ ํ๋ค๋๊ฒ ์ ๋ ์ ์์๊น? ์๊ฒฌ์ด ์๋ง์ผ๋ฉด ์ด๋กํ์ง ํ๋ ๊ฑฑ์ ์ด ๊ต์ฅํ ๋ง์์ต๋๋ค.
ํ์ง๋ง ์ ๊ฐ ์กฐ์ฅ์ด ๋๋ฉด์ ์..์ด๊ฑด ๋ด๊ฐ ์ค์ฌ์ ์์ผ๋ฉด ๋ถ๋ช ํ ๋ฐฐ๊ฐ ์ฐ์ผ๋ก ๊ฐ๊ฒ ๊ตฌ๋๋ ์๊ฐ์ด ๋ค์ด์ ์ฐ์์ข์ ํ์ง ์๊ณ ์ค์ฌ์ ์ ์ก๋ ๊ฒ์ ์ด์ ์ ๋์์ต๋๋ค.
ํ์ ์ ํฌํจ 3๋ช ์ผ๋ก ๊ตฌ์ฑ๋์์ต๋๋ค.
๐บ์ฃผ์ ์ ์
๋คํํ(?) ์ ํฌ ์ ๋ค ๊ณ ์์ด๋ฅผ ์ข์ํด์ ๊ณ ์์ด ์ง์ฌ๋ฅผ ์ํ ๊ณต๊ฐ์ ๋ง๋ค์ด๋ณด์!๊ฐ ๋์ด์.
๊ฑฐ์ ์ผ์ฌ์ฒ๋ฆฌ์ฌ์ ์ฃผ์ ๊ฐ ์ ์ ๋์๋ง์ ๋ค์ ๋จ๊ณ๋ถํฐ๋ ์์ํ์ต๋๋ค. ใ ใ
DB ์ค๊ณ
DB ์ค๊ณ๋ ๊ฐ์ ํํธ๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ๋๋๊ฒ ๋์ด์ ์ ๋ ๊ฒ์ํ(๊ธ์ฐ๊ธฐ์ ๋๊ธ), ๋ค๋ฅธ ๋ถ์ ํ์ ์ ๋ณด, ๋ง์ง๋ง ํ ๋ถ์ ํซ ํ์ด์ง์ ํซ์ ๋งก์์ ๋น ๋ฅด๊ฒ ์ค๊ณ๊น์ง ์๋ฃํ์ฌ ๊ทธ ๋ ์ ํ์๋ ๊ทธ๋ ๊ฒ ๋ง๋ฌด๋ฆฌ๊ฐ ๋ฉ๋๋ค.
git์ ์ค์์ฑ
๊ทธ ๋ค์๋ ๋ถํฐ๋ ์ค์ ์์ ์ด ๋๋๋ฉด ๋๋จธ์ง ์๊ฐ์ ์กฐ๋ณ๋ก ์์ ํ๋ผ๊ณ ํ์ ์ ํธํ๊ฒ ํ ์ ์์๋๋ฐ์.
๊ทธ๋ ๊ฒ ์์ ์ ํ๋ค๊ฐ ๋ฌธ๋ ํ์ ์ ์ํด์๋ ๊ฐ์์ ์์ค๋ฅผ ๊ณต์ ํ ์ ์๋ ๊ณต๊ฐ์ด ํ์ํ๋ค๋ ๊ฒ์ ๊นจ๋ซ๊ฒ ๋ฉ๋๋ค.
๋ง์นจ ํ ๋ถ์ด ์์ ์ ํ์ ํ์ จ์ ๋ '์์คํธ๋ฆฌ'๋ฅผ ์ด์ฉํด์ ์ฝ๊ฒ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ํ์ จ๋ค๊ณ ํด์
๊ทธ ๋ ์ ์์ ํ๊ฒฝ ์ธํ ํ๋๋ฐ ์๊ฐ์ ๊ฑฐ์ ์ผ์์ต๋๋ค.
์ง๊ธ ์๊ฐํด๋ณด๋ฉด ์์ ์๊ฐ์ด ์ด๋ฐํ ์์ค์ git์ ํ๋ฃจ ํฌ์ํ๊ธธ ์ ๋ง ์ํ๋ค๊ณ ์๊ฐ์ด ๋ญ๋๋ค.
๊ฐ์ด ๊ตฌ๊ธ๋ง๋ ํ๊ณ ๊ฐ์ธ์ ์ผ๋ก๋ ๊ณต๋ถ๊ฐ ๋ง์ด ๋์ด์ ํผ์ ์ธ ๋๋ณด๋ค ํจ์ฌ ์์ํ์ด ์ข์์ง ๊ฒ์ด ๋๊ปด์ก๊ฑฐ๋ ์. ใ ใ
๊ทธ ์ดํ ๋จ๊ณ
์ฟผ๋ฆฌ๋ฌธ ์์ฑ -> JDBC ๊ตฌํ -> UI ๊ตฌํ -> PPT
์ ๋ ๊ท์ฐฎ์์ ์ด๋ ๊ฒ ํํํ๊ฑด ์๋๊ณ
์ง๊ธ ์์ฑํ๋ ๊ธ์ ๊ธฐ์ ์ ์ธ ๊ฒ๋ณด๋จ ์ ๊ฐ์ธ์ ์ผ๋ก ๋๊ผ๋ ๊ฐ์ ์ด๋ ํ๊ธฐ๋ฅผ ์ฐ๊ธฐ ์ํจ์ด๋ค ๋ณด๋ ์์ธํ ์์ค๋ git์ ์ฐธ๊ณ ํด์ฃผ์ธ์. ๐
์, PPT๋ ํ ๋ถ์ด ๋ํ๊ต ๋ ์ง๋ฆฌ๋๋ก ํด๋ณด์ จ๋ค๊ณ ํ์ ์ ๊ทธ ๋ถ์ด ์ ๋ฆฌ๋ฅผ ๋ค ํด์ฃผ์ จ์ด์. (๊ฐ์ฌํฉ๋๋ค.๐
ํ๊ธฐ
- ํผ์ ํ๋ ๊ฒ์ด ๋ ํธํ๋ค๋ ์๊ฐ์ ๊นจ๋ถ์
์ค ๊ฒฝํ์ด์๋ค.
(๊ทผ๋ฐ ์ด๊ฑด ํ์๋ค์ ์ ๋ง๋ ์ ๋ณต์ธ๊ฐ?๋ผ๋ ์๊ฐ์ด ๋๋ ๋ถ๋ถ์ด๊ธฐ๋ ํ..ใ ใ ใ ) - git์ ๋ํด ์์ธํ ์๊ฒ ๋์๋ค.
(pull, push, merge, fork, repositary, master, branch ...) - ๋ฐ๋ฐ๋ฅ๋ถํฐ ๊ฐ์ด ๋ ผ์ํ๊ณ ์ค๊ณํ๋ค๋ณด๋ ์์ฐ์ค๋ ํ๋ก๊ทธ๋จ์ ์ ์ ์ด ์๊ธด๋ค.
- ๋์์์ด ํ ์คํธ ํ๋ฉฐ ๋ํ๋๋ ์ค๋ฅ๋ฅผ ๊ณ ์น๋ฉด์ ๋๋ฒ๊น ์ ๋ํ ์ฌ๋ฏธ๋ ์๊ฒ๋์๋ค.
- ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ๊ธฐ ํธํ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ ํ๋ ๊ฒ์ด ์ฌ๋ฐ์๋ค.
์ด๋ ค์ ๋ ์
๊ธ์์๋ ๋ญ ์์ํ๊ฒ ๋๋ค, ๋น ๋ฅด๊ฒ ๋๋ค ๋ผ๊ณ ๊ณ์ ์ผ์ง๋ง ๊ทธ๋ ๋ค๊ณ ํด์ ์ด๋ ค์์ด ํ๋๋ ์์๋ ๊ฒ์ ์๋์์.
์ฝ๋๋ฅผ ์์ฑํ๋ฉด์ ์๊ฐ๋๋ก ์๋์ด ์๋ ๋๋ ๊ตฌ๊ธ๋ง ํ๋๋ฐ ์๊ฐ์ ๊ฑฐ์ ์๊ธฐ๋ ํ์ต๋. ํฌํใ
๊ทธ ์ค์ ๊ธฐ์ต๋๋ ๊ฒ์...
'๊ฒ์๊ธ ์ ํ'์ [๊ธ์ฐ๊ธฐ ํ ์ด๋ธ]๊ณผ [๋๊ธ ํ ์ด๋ธ]์ JOINํ์ฌ ๋๊ธ์ด ์์ผ๋ฉด ๋๊ธ ์ ์ธํ๊ณ ๋ณด์ฌ์ฃผ๊ณ ,
๋๊ธ์ด ์์ผ๋ฉด ๋๊ธ๊น์ง ํฌํจํ์ฌ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ๊ผฝ์ ์ ์๊ฒ ๋ค์.
๋ฌผ๋ก ํ๋ก ํธ์๋์์ UI๋ฅผ ๊ตฌํํ๋ค๋ฉด ์ด๋ ๊ฒ๊น์ง ์ ๋จน์ง ์์์ ๊ฒ ๊ฐ์๋ฐ..
ํฐ๋ฏธ๋์์ ์ถ๋ ฅ ํ๋ค๋ณด๋ ์ ๋ณด๊ธฐ๋ ๋ถํธํ๊ณ ์๋ PC ํต์ ์์ ์ปดํจํฐ๋ฅผ ์ฐ๋ ๊ธฐ๋ถ์ด์์ต๋๋ค. ใ ใ ใ
์ง๋๊ณ ์๊ฐํด๋ณด๋ ๋ณ ๊ฒ ์๋์์ง๋ง ์ฒ์์ ๋๊ธ์ด ์๋ ๊ฒ์๊ธ์ด ์กฐํ๊ฐ ์ ๋ ๋ ๋นํฉํ๋..
์ ๋ ํ๋!
JOIN ์ฟผ๋ฆฌ๋ฌธ์ ์ด์ฉํ ๋..
SELECT W.BOARD_NUM, W.USER_ID, TITLE, BODY_TEXT, R.USER_ID, REPLY_WRITE
FROM WRITE W, REPLY R
WHERE W.BOARD_NUM = R.BOARD_NUM
AND W.BOARD_NUM = [๊ธ๋ฒํธ];
์ ์ฟผ๋ฆฌ๋ฌธ์ JAVA์ ๋๊ธธ ๋
String rUserId = rs.getString("R.USER_ID");
์ด๋ ๊ฒ ํ๋๊น ๊ณ์ '๋ถ์ ํฉํ ์ด ์ด๋ฆ' ์ค๋ฅ๊ฐ ๋ ์ ์..JOIN์ ์๋์ด๊ฐ๋?๋ผ๊ณ ์๊ฐํด์
String rUserId = rs.getString("USER_ID");
๋ผ๊ณ ํ๊ณ ๊ทธ๋ฅ ๋๊ฒผ๋ค๊ฐ ๋๊ธ ์์ฑ์ ID๋ ๊ธ ์์ฑ์ ID๊ฐ ๊ฐ์ผ๋ฉด ํฐ์ผ๋๋๊น ๋ค์ ๊ณ ์ณค์ต๋๋ค. ใ ใ
AS ๋ณ์นญ์ผ๋ก ์ฌ์ ์ ํ ๋ค ๋๊ธฐ๋๊น ์ ๋ ์ ๋ณ๊ฑฐ ์๋์์ง๋ง ๋ฟ๋ฏํ๋ ๊ธฐ์ต์ด ๋ฉ๋๋ค.
SELECT W.BOARD_NUM, W.USER_ID, TITLE, BODY_TEXT, R.USER_ID AS R_USER_ID, REPLY_WRITE
FROM WRITE W, REPLY R
WHERE W.BOARD_NUM = R.BOARD_NUM
AND W.BOARD_NUM = [๊ธ๋ฒํธ];
String rUserId = rs.getString("R_USER_ID");
๊ฐ์ ํ ์ (?)
์กฐ๊ธ ๋ ์ค๊ณ์ ๋ง์ ์๊ฐ์ ๋ค์ฌ์ ๊ธฐ์ด๊ณต์ฌ๋ฅผ ํผํผํ ํ ๋ค ์ฝ๋๋ฅผ ์์ฑํ๋ ์ชฝ์ผ๋ก ์งํ
์) ๋ฉ๋ด ๊ตฌ์ฑ๋(๋ฉ๋ด ํธ๋ฆฌ), UI ๋ ์ด์์ ์ก๊ธฐ
์ด๋ฒ์๋ ์ค๊ณ๋ถํฐ ๋ก์ง๊น์ง ๊ธ๋ก ์จ์ ์ํตํ๋ค๋ณด๋
๋ฉ๋ด ์ ํํ ๋ ์ด๋๋ก ์ด๋๋๋์ง๊ฐ ํท๊ฐ๋ ค์ ๊ตฌ์กฐ ์ก์ ๋ ํค๋งธ๋... ๐
์ ๋ฆฌํ๋ฉฐ
์ด ์ธ์๋ NullPointerException์ด๋ ์กฐํ๊ฐ ์๋๋ค๊ฑฐ๋ git ์ถฉ๋ ... ๋ฑ๋ฑ ์ด๋ ค์์ด ์์ ๋๋ง๋ค ๋ ์์ผ๋ฉฐ ๋์์ฃผ์ ๊ฐ์ฌ๋๊ณผ
๊ฐ์ด ๋๋ฒ๊น ํ๊ณ , ์์ ํ๋ฉฐ ํ์ ์ ์ค์์ฑ์ ๊นจ๋ซ๊ฒ ํด์ค ์ฐ๋ฆฌ ์กฐ์๋ถ๋ค์๊ฒ ๋ฌดํํ ๊ฐ์ฌ๋ฅผ ํํฉ๋๋ค.
๋ด์ผ ๋ฐํ๊น์ง ๋ง๋ฌด๋ฆฌ ํ์ดํ !