Banner

My Tech Blog (ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด/Spring&JSP)

์˜ค๋Š˜์˜ ๋ช…์–ธ
" ๊ตญ๊ฐ€๊ฐ€ ๋‹น์‹ ์„ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์„์ง€ ๋ฌป์ง€ ๋ง๊ณ , ๋‹น์‹ ์ด ๊ตญ๊ฐ€๋ฅผ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์„์ง€ ๋ฌผ์–ด๋ผ. "
- ์กด F. ์ผ€๋„ค๋”” (๋ฏธ๊ตญ 35๋Œ€ ๋Œ€ํ†ต๋ น)
Swagger(Springdoc OpenAPI)์—์„œ ๋ถˆํ•„์š”ํ•œ ์ปฌ๋Ÿผ์ด ๋ณด์ด๋Š” ์ด์œ ๋Š”API ์‘๋‹ต์— DTO๋ฅผ ์จ์•ผ ํ•˜๋Š”๋ฐ Entity๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. โŒ ๋ฌธ์ œ@GetMapping("/users/{id}")public UserEntity getUser(@PathVariable Long id) { return userService.getUser(id);}UserEntity๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ, Swagger์—์„œ ๋ชจ๋“  ํ•„๋“œ(password, phoneNumber ๋“ฑ)๊ฐ€ API ๋ฌธ์„œ์— ํฌํ•จ๋œ๋‹ค. โœ… ํ•ด๊ฒฐ๋ฒ•โ†’ Swagger์—์„œ ๋ถˆํ•„์š”ํ•œ ์ปฌ๋Ÿผ์ด ๋ณด์ด๋ฉด, Entity ๋Œ€์‹  DTO๋ฅผ ์‚ฌ์šฉํ•˜์ž@GetMapping("/users/{id}")public UserDto getUser(@PathVariable Lon..
1. DAO (Data Access Object)DAO๋Š” DB์™€ ์ง์ ‘ ํ†ต์‹ ์„ ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ๊ฐ€์ ธ์˜ค๋Š” ๊ฐ์ฒด์ด๋‹ค.์‚ฌ์šฉ์ฒ˜ : `MyBatis` ํ˜น์€ `JPA`์™€ ๊ฐ™์€ ORM์—์„œ ์‹ค์ œ๋กœ DB ์ ‘๊ทผ์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ์ฒดํŠน์ง•: ๋ณดํ†ต ์ธํ„ฐํŽ˜์ด์Šค + Mapper (XML or ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐฉ์‹)์œผ๋กœ ๊ตฌ์„ฑ๋จ ์˜ˆ์ œ (MyBatis)import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Insert;import org.apache.ibatis.annotations.Select;import org.apache.ibatis.annotations.Param;@Mapperpublic interface UserDAO { // ..
๊พธ๋ฏธ๊ธฐ ๋ผ๊ณ  ํ•˜๊ธฐ์—๋Š” ์†Œ์†Œํ•˜์ง€๋งŒ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์†์„ฑ ๊ณต๋ถ€ํ•˜๋Š” ์‹œ๊ฐ„ ๋„ค๋น„๊ฒŒ์ด์…˜๋ฐ” ์•„๋ž˜ ๋ฉ”์ธ ์˜์—ญ์— ๋ถ€ํŠธ์ŠคํŠธ๋žฉ์œผ๋กœ ์†Œ๊ฐœ๊ธ€ ์ถ”๊ฐ€main์˜์—ญ์ด๋ผ๊ณ  ํ•ด์•ผ ํ• ์ง€ content ์˜์—ญ์ด๋ผ๊ณ  ํ•ด์•ผ ํ• ์ง€ 1. ์†Œ๊ฐœ๊ธ€ ์ถ”๊ฐ€ `jumbotron`ํŽ˜์ด์ง€ ๋‚ด์—์„œ ๊ฐ•์กฐํ•˜๋Š” ํžˆ์–ด๋กœ ์„น์…˜์ด๊ณ  ํฐ ํ…์ŠคํŠธ์™€ ์—ฌ๋ฐฑ์„ ๊ธฐ๋ณธ์œผ๋กœ ํฌํ•จํ•จ๋ถ€ํŠธ์ŠคํŠธ๋žฉ 5์—์„œ๋Š” Jumbotron ํด๋ž˜์Šค๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ ์กฐํ•ฉํ•ด์„œ ๋น„์Šทํ•œ ํšจ๊ณผ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋‚ด์•ผ ํ•œ๋‹ค. `rounded`์š”์†Œ์˜ ๋ชจ์„œ๋ฆฌ๋ฅผ ๋‘ฅ๊ธ€๊ฒŒ ๋งŒ๋“ฌ  border-radius: 0.375rem (์•ฝ 6px)์—ฌ๊ธฐ์„œ rounded-circle, rounded-pill ์“ฐ๋ฉด ๋” ๊ทน๋‹จ์ ์œผ๋กœ(?) ๋‘ฅ๊ทผ ์Šคํƒ€์ผ ๊ฐ€๋Šฅ`display-4`ํ…์ŠคํŠธ๋ฅผ ํฌ๊ฒŒ ํ‘œ์‹œํ•˜๋Š” ํ—ค๋”ฉ ์Šคํƒ€์ผ๋ถ€ํŠธ์ŠคํŠธ๋žฉ์˜ ๋””์Šคํ”Œ๋ ˆ์ด ํด๋ž˜์Šค์ธ๋ฐ ..
1. ๊ฒŒ์‹œ๊ธ€  ์ˆ˜์ •ํ•˜๋Š” update ๋ฉ”์„œ๋“œ ๋งŒ๋“ค๊ธฐBbsDAO ํด๋ž˜์Šค ํ•˜๋‹จ์— ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€public int update(int bbsID, String bbsTitle, String bbsContent) { String SQL = "UPDATE BBS SET bbsTitle = ?, bbsContent = ? WHERE bbsID = ?"; PreparedStatement psmt = null; try { psmt = conn.prepareStatement(SQL); psmt.setString(1, bbsTitle); psmt.setString(2, bbsContent); psmt.setInt(3, bbsID); return p..
1. BbsDAO ํด๋ž˜์Šค์— getBbs() ๋ฉ”์„œ๋“œ ๋งŒ๋“ค๊ธฐ `getBbs(int bbsID)` ๋ฉ”์„œ๋“œ๋Š” ํŠน์ • bbsID๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒŒ์‹œ๊ธ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.์ฆ‰ ํ•˜๋‚˜์˜ ๊ธ€ ๋‚ด์šฉ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ์ฒ˜์Œ์— ์ ์€ ์ฝ”๋“œ(ํ‹€๋ฆผ) public Bbs getBbs(int bbsID) { String SQL = "SELECT * FROM BBS WHERE bbsID = ?"; try (PreparedStatement psmt = conn.prepareStatement(SQL); ResultSet rs = psmt.executeQuery()) { psmt.setInt(1, bbsID); if (rs.next()) { ..
๊ธ€๋ชฉ๋ก๊ณผ ํŽ˜์ด์ง€๋„ค์ด์…˜(Pagination)๊ฒŒ์‹œ๋ฌผ์„ DB์—์„œ ๋ถˆ๋Ÿฌ์™€ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๋ ค๋ฉด ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…๊ณผ ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ ๋‘ ๊ฐ€์ง€๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ๊ฒŒ์‹œ๊ธ€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด ArrayList๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DB์—์„œ ์ž‘์„ฑ์ž, ์ œ๋ชฉ ๋“ฑ ๊ฒŒ์‹œ๊ธ€์˜ ์ฃผ์š” ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด ๋•Œ ์ค‘์š”ํ•œ ์ ์€ ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ์ด๋‹ค. ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ๋Š” ํ•œ ํŽ˜์ด์ง€์— ๋ช‡ ๊ฐœ์˜ ๊ฒŒ์‹œ๊ธ€์„ ๋ณด์—ฌ์ค„์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ณผ์ •์ด๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ํ•œ ํŽ˜์ด์ง€์— ์ด 10๊ฐœ์˜ ๊ฒŒ์‹œ๊ธ€์„ ๊ฐ€์ ธ์˜ค๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์˜ค๋Š˜์€ `BbsDAO`์— ํŠน์ • ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ(pageNumber)์— ํ•ด๋‹นํ•˜๋Š” ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ โšก `getList(int pageNumber)`๋ฅผ ๋งŒ๋“ค์–ด ๋ณผ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ์—์„œ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ๋ฅผ ๊ธฐ์ค€์œผ..
1. write.jsp ๊ธ€์“ฐ๊ธฐ ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ ๋จผ์ € ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ ํŽ˜์ด์ง€ `write.jsp`๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋ ค๊ณ  ํ•œ๋‹ค.`bbs.jsp`๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๋ถ™์—ฌ ๋„ฃ๊ณ  ์ค‘๊ฐ„ ๋ถ€๋ถ„๋งŒ ์ˆ˜์ • ํ•ด ์ค„ ๊ฒƒ์ด๋‹ค. nav๋ฐ” ์•„๋ž˜ ๋ถ€๋ถ„์— ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑBootstrap5 ์ด์šฉํ–ˆ๋‹ค. โšก `mt-5` margin-top: 5rem;  โšก ``ํƒœ๊ทธ์— `required` ์†์„ฑ ๋„ฃ์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•จ. ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅ ์•ˆ ํ•œ ์ฑ„๋กœ submit ํ•˜๋ฉด `์ด ์ž…๋ ฅ๋ž€์„ ์ž‘์„ฑํ•˜์„ธ์š”.` ๋ผ๋Š” ๊ฒฝ๊ณ  ๋ฉ”์„ธ์ง€๋ฅผ ๋„์šด๋‹ค.  โšก `form-control` ํด๋ž˜์Šค Bootstrap์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜๋กœ, ์ž…๋ ฅ ํ•„๋“œ์˜ ์Šคํƒ€์ผ์„ ์‰ฝ๊ฒŒ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋จ.์ด๊ฑฐ ์“ฐ๋ฉด ์ž…๋ ฅ ํ•„๋“œ(input, textarea, select ๋“ฑ)๊ฐ€ ๊ธฐ๋ณธ..
1. ๊ฒŒ์‹œํŒ ๋ฉ”์ธ ํŽ˜์ด์ง€ `bbs.jsp`๋งŒ๋“ค๊ธฐ๋จผ์ € `main.jsp` ํŽ˜์ด์ง€์—์„œ ๊ฒŒ์‹œํŒ ๋ถ€๋ถ„ href ์†์„ฑ์— "bbs.jsp" ๋ฅผ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.  `main.jsp` ํŽ˜์ด์ง€๋ฅผ ๋ณต์‚ฌํ•ด์„œ webapp ์—๋‹ค ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•˜๊ณ  ์ด๋ฆ„๋งŒ `bbs.jsp`๋กœ ๋ฐ”๊พธ์ž.์—ฌ๊ธฐ์„œ ์ฝ”๋“œ์— ์†์„ ์ข€ ๋ณผ ๊ฒƒ์ด๋‹ค. ๋งŒ๋“ค์—ˆ์œผ๋ฉด `Home`์— ์žˆ๋˜ active ํด๋ž˜์Šค๋ฅผ `๊ฒŒ์‹œํŒ`์œผ๋กœ ์˜ฎ๊ฒจ ์ค˜์„œ ํ˜„์žฌ ์„ ํƒํ•œ ํŽ˜์ด์ง€์ž„์„ ๊ฐ€์‹œ์ ์œผ๋กœ ๋ณด์—ฌ ์ค€๋‹ค. ๊ทธ ๋‹ค์Œ ๋„ค๋น„๊ฒŒ์ด์…˜๋ฐ” ์•„๋ž˜์— ๊ฒŒ์‹œํŒ ํ˜•์‹์˜ ํ…Œ์ด๋ธ”์„ ์‚ฝ์ž… ํ•ด ์ค€๋‹ค.ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ธฐ ์ „์—  `` ํƒœ๊ทธ๋กœ container์™€ row ์˜์—ญ์„ ์žก์•„ ์ฃผ๊ณ  ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด์ฃผ์ž.  ๋ฒˆํ˜ธ ..
์ƒ๋‹จ์œผ๋กœ