์คํ๋ง์ผ๋ก ํ์๊ฐ์ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ(feat. ์คํ๋ง ๊ฐ๋ )
์คํ๋ง ๊ณต๋ถํ๋ฉด์ ์ ๋ฆฌํ ๋ด์ฉ ์
๋๋ค !
์ค๋ฅ๊ฐ ์๋ค๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์ :)
[๊ธฐ๋ณธ ๊ฐ๋
]
1. MVC ํจํด
2. DB ํต์ API
3. ์๋ฒ ํ ํ๋ฆฟ ์์ง
4. redirect, forward
5. ํ๋ ์์ํฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ
[ํ์๊ฐ์
๊ธฐ๋ฅ]
6. ๋ก์ปฌ์๋ฒ ์ฐ๊ฒฐ ๋ฐ ํ์ผ ๊ตฌ์ฑ
7. Controller
8. DTO
9. Entity
10. Service
11. Repository
๋ณธ ํฌ์คํ
์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ๊น์ง ํ๊ฒฝ ์ค์ ์ด ๋์ด์๋ค๋๊ฐ์ ํ์ ์์ฑํ์๊ณ ,
UI๋ณด๋ค๋ ๊ธฐ๋ฅ์ ์ธ ๋ถ๋ถ์ ์ง์คํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ์ต๋๋ค.
1. MVC ํจํด
Model (๋ฐ์ดํฐ), View (ํ๋ฉด), Controller (์ฒ๋ฆฌ) ๋ก ๊ตฌ์ฑ๋ ํจํด ์ ๋๋ค.
๋ก๊ทธ์ธ ์ "~๋ ๋ฐ๊ฐ์ต๋๋ค!" ๋ผ๋ ๋ฌธ๊ตฌ๋ ์ด๋ป๊ฒ ๋ง๋ค์ด์ง๊ฑธ๊น์?
์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์ ๋ณด๋ฅผ model์ ๋ด์์ view๋ฅผ ํตํด ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค์ผ ํ๋๋ฐ,
์ด๋ controller๊ฐ ๋ ์ฌ์ด์์ ์ ๋ฌํด์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
2. DB ํต์ API
๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ์ ๋ ฅํ ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํ ๊น์?
์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํต์ API๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค.
- JDBC
์ง์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ํ๋ ๊ธฐ์ ์ ๋๋ค.
- JPA
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ฒด๋ฅผ ๋งคํํ๋ ๊ธฐ์ ์ ๋๋ค.
ORM์ผ๋ก ์ง์ SQL ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง ์๊ณ ,
๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์คํค๋ง๋ฅผ ๋งคํํ ์ ์์ต๋๋ค.
Repository๋ฅผ ๊ตฌํํ ๋ JpaRepository์ CrudRepository๋ฅผ ํ์ฉํ ์ ์๋๋ฐ,
๊ฐ๋จ CRUD ์์ ๋ฟ๋ง ์๋๋ผ JPA ๊ธฐ๋ฅ ๋ฑ์ ์ฌ์ฉํ๋ค๋ฉด
JpaRepository๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
3. ์๋ฒ ํ ํ๋ฆฟ ์์ง
์ฌ์ฉ์์ ํ๋ฉด์ ์๋ฒ๋ก๋ถํฐ ์ ๋ณด๋ฅผ ์ป๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํ ๊น์?
์ง์ ๋ ํ ํ๋ฆฟ ์์๊ณผ ๋ฐ์ดํฐ๊ฐ ํฉ์ณ์ ธ์ html ๋ฌธ์๋ฅผ ๋ง๋ค์ด์ฃผ๋ ์ํํธ์จ์ด์ธ
์๋ฒ ํ ํ๋ฆฟ ์์ง์ ํ์ฉํ๋ฉด ๋ฉ๋๋ค.
์ฌ๋ฌ ์ข ๋ฅ๊ฐ ์๋๋ฐ ๊ทธ ์ค์์ ์ ๋ ์ฃผ๋ก thymleaf๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
- JSP
- Thymleaf
- Mustache
4. redirect, forward
- redirect
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณํ๊ฐ ์๊ธฐ๋ ์์ ์ ํ์ ๋, ์ฌ์ฉํฉ๋๋ค.
- forward
์ผ๋ฐ์ ์ผ๋ก ํ์ด์ง๋ฅผ ์ด๋ํ ๋, ์ฌ์ฉํฉ๋๋ค.
5. ํ๋ ์์ํฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ
ํ๋ก๊ทธ๋จ์ ์ฃผ๋์ฑ์ด ๋๊ตฌ์๊ฒ ์๋๊ฐ์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
- ํ๋ ์์ํฌ
ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ์ ํ๋ฆ์ ์ ๊ณต
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๊ฐ๋ฐ์๊ฐ ํ์ํ ๊ธฐ๋ฅ์ ํธ์ถํ์ฌ ์ฌ์ฉํ๋ ๋๊ตฌ
6. ๋ก์ปฌ ์๋ฒ ์ฐ๊ฒฐ ๋ฐ ํ์ผ ๊ตฌ์ฑ
์ ๋ MVC ํจํด์ ํ์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์งํํ๊ธฐ ์ํด
controller, dto, entity, repository, service 5๊ฐ์ ๋๋ ํฐ๋ฆฌ๋ก ๋๋ด์ต๋๋ค.
- controller
์ฌ์ฉ์์ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๋ค.
ํด๋น ์์ฒญ์ ๋ํ ์๋ต์ ๋ฐํํ๋ค.
- dto
์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์ ๋ณด์ด๋ค.
controller์ service ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ์ฌ์ฉ๋๋ค.
- entity
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ค์ ์ ์ฅ๋๋ ๊ฐ์ฒด์ด๋ค.
- repository
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ด๋ จ๋ ์์
์ ์ํํ๋ค.
์ ์ฅ, ์ญ์ , ๊ฐ์ ธ์ค๊ธฐ ๋ฑ๋ฑ..
- service
controller์์ ์์ฒญ์ ๋ฐ๊ณ , ๊ทธ ์์ฒญ์ ๋ํ ์ค์ ์์
์ ์ํํ๋ค.
์ฐ์ , ๋ก์ปฌ ์๋ฒ์ ์ฐ๊ฒฐ์ด ์ ๋๋์ง๋ถํฐ ํ์ธํด๋ด
์๋ค.
@GetMapping("/") ์ฝ๋๋ HTTP GET ๋ฉ์๋๋ก ์ ๊ทผํ๋ '/' ๊ฒฝ๋ก์ ๋ํ ํธ๋ค๋ฌ ๋ฉ์๋๋ฅผ ์ ์ํฉ๋๋ค.
return "index"; ์ฝ๋๋ spring์ด "index"๋ผ๋ ์ด๋ฆ์ view๋ฅผ ์ฐพ์์ ์ฌ์ฉ์์๊ฒ ๋ฐํํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ทฐ๋ 'src/main/resources/templates' ํด๋ ์๋์ ์์นํฉ๋๋ค.
์ง๊ธ๊น์ง์ ์ํฉ๋ง์ผ๋ก ์ฝ๋๋ฅผ ์คํ์ํค๋ฉด localhost:8080์ผ๋ก ์ ์ํ์ ๋,
๋ก์ปฌ ์๋ฒ์ ์ฐ๊ฒฐ์ด ๋๊ณ Hello Jcowwk's Board ! ๊ธ์๊ฐ ๋ณด์ฌ์ง๊ฒ ๋ฉ๋๋ค.
์ฌ๊ธฐ๊น์ง ํ์ธํ์ผ๋ฉด ๋ค์์ผ๋ก ๋์ด๊ฐ๋๋ค.
7. Controller
HomeController๋ ํ ํ์ด์ง์ ๊ด๋ จ๋ ์ฒ๋ฆฌ๋ฅผ ์์ฑํ์๊ณ ,
ํ์๊ฐ์
์ ์ํด์๋ MemberController๋ฅผ ๋ง๋ค์ด์ ๋ฉค๋ฒ์ ๊ด๋ จ๋ ์ฒ๋ฆฌ๋ฅผ ํด์ค๋๋ค.
ํ ํ๋ฉด์์ ๋ก๊ทธ์ธํ๊ณ , ํ์๊ฐ์
์ ํด๋ฆญํ๋ฉด ํ์๊ฐ์
์ฐฝ์ผ๋ก ๋์ด๊ฐ๋ ๋ฐฉ์์ผ๋ก
ํ๋ฉด์ ๊ตฌ์ฑํด๋ณด๊ฒ ์ต๋๋ค.
- MemberController, index.html
index.html์ ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด, ํ์ฌ localhost์ ์ ์ํ์ ๋ ๋ณด์ด๋ ํ๋ฉด์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
ํ์๊ฐ์
์ ๋๋ ์ ๋๋ ํ์๊ฐ์
์ฐฝ์ผ๋ก ์ด๋ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ GET ๋งคํ์ ํ๊ณ ,
๋ก๊ทธ์ธ์ ๋๋ ์ ๋๋ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ id, pw๊ฐ ์๋ฒ๋ก ์ ๋ฌ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ POST ๋งคํ์ ํ์ต๋๋ค.
@GetMapping("member/joinForm")์ @GetMapping("/member/joinForm")๋ ๋์ผํ ๊ฒฝ๋ก๋ฅผ ๋ํ๋
๋๋ค.
ํ์ง๋ง ์ฒซ ๋ฒ์งธ์ ๊ฒฝ์ฐ์๋ ์๋ ๊ฒฝ๋ก, ๋ ๋ฒ์งธ๋ ์ ๋ ๊ฒฝ๋ก๋ฅผ ๋ํ๋ด๋๋ฐ ์์ ์ ์ํด์๋ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์์ ์บก์ณ๋ณธ์์๋ ์๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ์๋๋ฐ ์ ๋ ๊ฒฝ๋ก๋ก ๋ฐ๊ฟ์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ,
@controller ์ด๋
ธํ
์ด์
์ด ๋น ์ก๋๋ฐ ์ถ๊ฐํด์ ์ฝ๋๋ฅผ ์์ ํด๋ด
์๋ค!
์ฌ์ฉ์์ ์์ฒญ์ ๋ง๊ฒ controller์์ ์๋ต์ ํด์ค ๋ return ๊ฐ์ด "member/joinForm"๊ณผ "member/home"์ผ๋ก ๋์ด์์ต๋๋ค.
์ด๋ templates์ member ๋๋ ํฐ๋ฆฌ ์์ ์กด์ฌํ๋ joinForm.html, home.html์ผ๋ก ์ด๋ํ๋ผ๋ ์๋ฏธ์
๋๋ค.
templates์์ member ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์์ joinForm.html๊ณผ home.html์ ๋ง๋ค์ด์ฃผ๊ณ ์คํ์ ํ๋ฉด ๋์์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ก๊ทธ์ธ๊ณผ ํ์๊ฐ์
์ ๋๋ ์ ๋ ์ฐฝ์ด ์ ๋๋ก ๋ฌ๋ค๋ฉด ์ฑ๊ณต์
๋๋ค.
- MemberController, joinForm.html
joinForm.html๊ณผ MemberController์ ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
ํ์๊ฐ์
์ด ์๋ฃ๋๊ฑฐ๋ ์ทจ์๋ฅผ ๋๋ฅด๋ฉด ํ ํ๋ฉด์ผ๋ก ์ด๋ํ๊ฒ ๋ฉ๋๋ค.
๋ค์ ๋จ๊ณ๋ถํฐ๋ ํ์๊ฐ์
์ฐฝ์์ ๊ฐ์
์๋ฃ๋ฅผ ๋๋ฅด๊ฑฐ๋ ํ์ธ์ ๋๋ ์ ๋ ์คํ๋๋ ์์
์ ๋ก์ง์
๋ง๋ค์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
8. DTO
ํ์๊ฐ์
์ฐฝ์์ ํ์ธ ๋ฒํผ์ ๋๋ ์ ๋ id๊ฐ ์ค๋ณต๋ id์ธ์ง ํ์ธ ํ๋ ์์
๊ณผ,
๊ฐ์
์๋ฃ ๋ฒํผ์ ๋๋ ์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ์์
์ด ํ์ํฉ๋๋ค.
์ด ์์
์ ํ๊ธฐ ์ํด์๋ DTO๋ฅผ ํตํด ์ฌ์ฉ์์ ์
๋ ฅ์ ๋ฐ์ ํ,
Entity๋ก ๋ฐ๊พธ์ด์ค ๋ค์์ Repository๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ํด์ผํฉ๋๋ค.
์ด๋ฌํ ์์
์ ์ค์ ๋ก ํ๋ ๊ฒ์ด Service์
๋๋ค.
์ฐ์ DTO๋ถํฐ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
- MemberDTO, MemberController
ํ์๊ฐ์
์์ id, pw, name์ ์
๋ ฅํ ๊ฒ์
๋๋ค.
joinForm.html์์ <input ~ name = "">๋ผ๋ ๋ถ๋ถ์ด ์๋๋ฐ name์ ์
๋ ฅ๋ ๋ณ์๋ช
์
@ModelAttribute ์ด๋
ธํ
์ด์
์ผ๋ก ๋ด์์ ๊ฐ์ ๋ณ์๋ฅผ ๊ฐ์ง DTO ๋ณ์์ ๋งคํ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด ํ์ฌ๋ name์ ๊ฐ์ด joinId๋ก ๋์ด์๋ ๊ฒ์ memberEmail๋ก ๋ฐ๊พธ๋ฉด
์์ด๋์ ์
๋ ฅํ ๊ฐ์ memberEmail์ ์ ๋งคํ์ํฌ ์ ์์ต๋๋ค.
์ค๋ช
์ ํธ์๋ฅผ ์ํด html์ name๋ถ๋ถ์ ๋ชจ๋ ๋ค๋ฅด๊ฒ ํ๋๋ฐ DTO ๋ณ์ ์ด๋ฆ๊ณผ ๊ฐ๊ฒ ๋ฐ๊ฟ์ฃผ๋๋ก ํฉ์๋ค.
toMemberDTO ํจ์๋ MemberEntity๋ฅผ MemberDTO๋ก ๋ฐ๊ฟ์ฃผ๋ ํจ์์
๋๋ค.
๋ก๊ทธ์ธํ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ํ์ฌ ํ์๊ฐ์
๋ ์ฌ์ฉ์์ธ์ง ํ์ธํ๋ฉด์ ์ฌ์ฉ๋ฉ๋๋ค.
9. Entity
- MemberEntity
DTO๋ฅผ ๋ค ๋ง๋ค์์ผ๋ฉด Entity๋ ๋ง๋ค์ด์ค๋๋ค.
์ด์ ํ์๊ฐ์
์ ์ํ ์ฝ๋๋ฅผ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
10. Service
- MemberController, MemberService
ํ์๊ฐ์
์ฐฝ์ ๋ค์ด๊ฐ์ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ด์ฉ์ด @ModelAttribute ์ด๋
ธํ
์ด์
์ ํตํด memberDTO์ ๋งคํ๋ฉ๋๋ค.
memberDTO์ ๋ด๊ธด ๋ด์ฉ์ memberService๋ก ๋ณด๋ด์ ์์
์ ํด์ฃผ๊ณ , controller๋ ํ์ด์ง๋ฅผ ๋ฐํํฉ๋๋ค.
MemberService์์๋ ์์ด๋ ์ค๋ณต ํ์ธ์ ์ํ idCheck ๋ฉ์๋์ join ๋ฉ์๋์ ๋ก์ง์ ์์ฑํฉ๋๋ค.
ํ์ฌ idCheck ๋ฉ์๋๋ ํ์ธ์ ๋๋ ์ ๋ ํ์ธ์ด ์๋๋์ง ํ์ธ ์ฐจ ์ฝ๋๋ฅผ ๊ฐ๋จํ ํ์๊ณ ,
join ๋ฉ์๋๋ ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋๋ก ์ฝ๋๋ฅผ ์์ฑํ์ต๋๋ค.
์ฌ๊ธฐ๊น์ง ์ฝ๋๋ฅผ ์์ฑํ์ ๋, ์ด๋ฏธ ๊ฐ์
๋ ์์ด๋๋ก๋ ๊ฐ์
์ ํ ์ ์๋ ์ํฉ์
๋๋ค.
์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํด์๋ ๋ก์ง์ ์์ฑํ๋ฉด ๋ฉ๋๋ค.
11. Repository
- MemberRepository
JpaRepository๋ฅผ ์ฌ์ฉํ์ฌ MemberEntity์ ๋งคํ๋ ์ ๋ณด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ
์ด๋ธ์ ํต์ ์ ํด์ฃผ๋
MemberRepository์ ์ฝ๋๋ฅผ ์์ ๊ฐ์ด ์์ฑํฉ๋๋ค.
JpaRepository๋ฅผ extendsํ์ฌ save(), findById() ๋ฑ ๊ธฐ๋ณธ์ผ๋ก ๋ด์ฅ๋ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ค์ ํฌ์คํ
์์๋ ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ์
ํด๋ณด๊ฒ ์ต๋๋ค !
https://jcowwk.tistory.com/m/125