๐ณ ๋ ์์ธํ ๋ด์ฉ์ โ pdf ํ์ผ ์ฐธ์กฐ.
-
ํ๊ต์์ ๊ต์ก์ ๋ฐ์ผ๋ฉฐ ์ด์ฉํ ์ ๋ง์ ์นดํ๋ค๋ก ์์ํ ์์ด๋์ด.
-
ํ๊ต์ ์๋ ์ ๋ง์ ์นดํ๋ค ์ค์์ ์ด๋๊ฐ ๋ง์๊ณ , ์ด๋๊ฐ ๋ถ์๊ธฐ๊ฐ ์ข์ผ๋ฉฐ, ์ด๋๊ฐ ๊ฐ๊ฒฉ์ด ์๊น?
-
์์ ์ ์ํ๋ฐ๊ฒฝ์ ์๋ ์ ๋ง์ ๋ง๋
์นดํ
๋ฅผ ์ฐพ์๋ณผ ์ ์๋๋ก ํด๋ณด์!
์ฝ 1๊ฐ์ (20.11.15 ~ 20.12.22)
java
v1.8oracle db
,mybatis
apache tomcat
v8.5Spring mvc
v3,Spring Security
v3,maven
html
,css
,bootstrap4
js(es5)
,jquery
eclipse
,junit
trello
,github
๊ณ ๋ณ์ฒ
: ๋ฉ์ธ ๊ฐ๋ฐ์
- ํ์๊ฐ์ , ํ์์ ๋ณด์์ , ํ์ํํด, ์นดํ ๋ฑ๋ก/์์ /์ญ์ , ์์ ๋ฉ๋ด ์ถ๊ฐ
์ก์์ญ
: ๋ฉ์ธ ๊ฐ๋ฐ์ ๊ฒธ PL
- ์์ ๋น๋ฐ๋ฒํธ ๋ฐ๊ธ, ์ง์ญ๊ฒ์, ์ ํธ ๋ฆฌ์คํธ์์ผ๋ก ์ ๋ ฌ, ์ง๋์์ ์์น ํ์, ์นดํ ๊ฐ๋ต ์ ๋ณด, ๊ด๋ฆฌ์ ํ์ด์ง์ ์ฌ์ฅ ๊ถํ ๋ถ์ฌ, ๋ง์ดํฝ ์ถ๊ฐ/์ญ์
์ ์ฑํธ
: ๋ฉ์ธ ๊ฐ๋ฐ์ ๊ฒธ PM
- ์ ์ฒด์ ์ธ ์นUI ๊ตฌํ, ๋ ์ด์์ ๊ตฌํ, ๊ด๋ฆฌ์ ํ์ด์ง, ๋น์ฆํฝ ์กฐํ/๋ฑ๋ก/์ญ์ /์์
์ ์์ธ
: ๋ฉ์ธ ๊ฐ๋ฐ์
- ๋ก๊ทธ์ธ ๋ฐ ๋ก๊ทธ์์(Securtiy ์ ์ฉ), ์นดํ ์์ธ์ ๋ณด, ๋ฆฌ๋ทฐ(์ ํธ๋ ๋ฐ ํ์คํ) ์กฐํ/์์ฑ/์์ /์ญ์
๐ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ฐ์ ์์ ์ด 100% ๊ตฌํํ์ง ์๊ณ ์๋ก ๋์๊ฐ๋ฉฐ ๊ตฌํํ๋ค.
- ์ ์์ผ ๋ฐฉ์์ ์ฑํํ์ฌ ํ์ ์ ๋ง๋ค ์ค๊ณ, ๊ตฌํ, ํ ์คํ ์ ๋ฐ๋ณตํ์๋ค.
- ํฌ๊ฒ 1์ฐจ, 2์ฐจ ๊ตฌํ์ผ๋ก ๋๋์๋ค.
๐ท์ค๊ณ img(์ ๊ธฐ/ํผ์น๊ธฐ)
๐ถUsecase Diagram
ํ์๊ฐ์
์์ ๋น๋ฐ๋ฒํธ ๋ฐ๊ธ ๋ฐ ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ
์ง์ญ ๊ฒ์ ๋ฐ ์ ํธ๋์ ๋ฐ๋ฅธ ์ ๋ ฌ, ์นดํ ๊ฐ๋ต์ ๋ณด
์นดํ ์์ธ์ ๋ณด ๋ฐ ๋ฉ๋ด ํ์ธ
๋ฆฌ๋ทฐ ์์ฑ ๋ฐ ์ญ์
๊ด๋ฆฌ์ ํ์ด์ง(๊ถํ ๋ถ์ฌ)
๋ง์ดํฝ(์ฆ๊ฒจ์ฐพ๊ธฐ)
๋น์ฆํฝ(Editor's Pick)
์นดํ ๋ฑ๋ก
- ์นดํ๋ช ์ 10์ ์ด๋ด, ์นดํ ์ค๋ช ์ 200์ ์ด๋ด, ์ด์์๊ฐ์ ๋ฌธ์์ ๋ ฅ์ด ๋ถ๊ฐํ๊ณ 36:70๊ฐ์ด ์๊ฐ์ 24์ ๋ฅผ ๋๊ธธ ์ ์์ผ๋ฉฐ ๋ถ์ 60๋ถ์ ๋์ ์ ์๊ฒ ์กฐ๊ฑด์ ๊ฑธ์๋ค.
- ๊ณตํด์ผ์๋ ์ด์์ ํ๋ ํ์์ โ์ด์ํจโ์ ์ฒดํฌ๋ฅผ ํ๋ฉด ๊ณตํด์ผ ๋ฑ๋กํผ์ด ๋์ ์ผ๋ก ์์ฑ๋๋ค.
- ์นดํ๊ธฐ๋ณธ์ ๋ณด์ ์ด์์๊ฐ์ ๋ค๋ฅธ ํ ์ด๋ธ์ด๋ฏ๋ก ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฅผ ํ์๋ค.
ํ ํผ์น๊ธฐ/์ ๊ธฐ
์ด์ ๋ด์ฉ | ํด๊ฒฐ ๋ฐฉ์ |
---|---|
ํ ์ด๋ธ ์์ฑ ๋์ค, user๋ผ๋ ์ด๋ฆ์ ํ ์ด๋ธ์ ์์ฑํ ์ ์์์ ๋ฐ๊ฒฌํ๋ค. (์๋ฌ๋ช : ORA-00903: invalid table name) | Oracle SQL ํค์๋๋ช ์ด์ด์ ํ ์ด๋ธ๋ช ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. || ์ด์ํด๊ฒฐ ๋ฐฉ๋ฒ: ํ ์ด๋ธ ๋ช ์ user -> rs_user๋ก ๋ณ๊ฒฝํ๋ค. |
MyBatis(mapper)์์ CafeVO์ UserVO๋ฅผ JOINํ์ฌ ์ถ๋ ฅํ๋ ๊ณผ์ ์์, UserVO์ ์ธ์คํด์ค ๋ณ์ ์ค 'isEnabled' ๋ด์ฉ์ด ์ ๋๋ก ๋ฐํ๋์ง ์์ | mapper.xml์์ ๋ด ์ column๋ช ์ SQL ์ปฌ๋ผ๋ช ์ด ์๋, VO์ ์ธ์คํด์ค๋ช ์ผ๋ก ์ฃผ์๋ค. || ์ด์ํด๊ฒฐ ๋ฐฉ๋ฒ: ์์ column์ SQL ์ปฌ๋ผ๋ช ์ผ๋ก ์์ ํ๋ค. ํ์ง๋ง ๊ทผ๋ณธ์ ์ผ๋ก ์ธ์คํด์ค ๋ณ์ ๋ช ์ is๋ก ์์ํ๋ ๊ฒ์ ์ข์ง ์๋ค๋ ๊ฒ์ ํ๋จํ๋ค. ๊ทธ๋์ UserVO์ inEnabled ์ปฌ๋ผ์ enabled๋ก, rs_user ํ ์ด๋ธ์ is_enabled ์ปฌ๋ผ์ enabled๋ก ๋ณ๊ฒฝํ์๋ค. |
์นดํ ์ ๋ณด ์์ธ๋ณด๊ธฐ ํ์ด์ง ๊ตฌํ ์ค, main.jsp์์ cafeDetail.jsp๋ก ๋ฐ๋ก ์ด๋ํ๋๋ก ๋งํฌ("cafe-detail.do?cafeNo=9")๋ฅผ ๊ฑธ์ด ๊ฒฝ๋ก์ค์ ์ ํด์ฃผ์๋ค. ๊ทธ๋ฌ๋ ๋งํฌ๋ฅผ ํด๋ฆญํ๋ฉด "login-form.do" ๋ช ๋ น์ด๊ฐ ์ํ๋์ด, loginForm.jsp๋ก ์ด๋ํ์๋ค. | CafeController์์ cafe-detail.do ์์ฒญ ์, ์ฒ๋ฆฌํ๋ ๋ฉ์๋์ธ viewCafeDetail์ @Sercured("ROLE_MEMBER") ์กฐ๊ฑด์ ๊ฑธ์ด์ฃผ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ์กฐ๊ฑด์ผ๋ก ์ธํด, ๋ก๊ทธ์ธ์ด ๋์ง ์์ ์ํ๋ก cafe-detail.do ์ฌ์ฉ ์, ๋ก๊ทธ์ธ ํผ์ผ๋ก ์๋์ผ๋ก ์ด๋ํ์๋ค. || ํด๊ฒฐ ๋ฐฉ๋ฒ : ๋๊ตฌ๋ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก @Secure์กฐ๊ฑด์ ๋นผ์คฌ๋ค. |
๋ก๊ทธ์ธ ์๋ ์ค, ํจ์ค์๋ ๋ถ์ผ์น ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. | ํ์๊ฐ์ ์, ํ์๊ฐ์ form์์ ๋น๋ฐ๋ฒํธ ์ ๋น๋ฐ๋ฒํธ ํ์ธ ๋จ๊ณ์์ name์ ๊ฐ์ ๊ฐ์ธ " password"๋ก ์ฃผ์๋ค. ๊ทธ ๊ฒฐ๊ณผ ๋น๋ฐ๋ฒํธ์ ์ ๋ ฅ๋๋ ๊ฐ์ด ๋น๋ฐ๋ฒํธ์ ๋น๋ฐ๋ฒํธํ์ธ์ ์ ๋ ฅ๋ value๊ฐ์ด ์ด์ค์ผ๋ก ๋ค์ด๊ฐ๊ฒ ๋์๊ณ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. || ํด๊ฒฐ๋ฐฉ๋ฒ : ํ์๊ฐ์ ํผ์์ ํจ์ค์๋ ํ์ธ์ ํ ๋น๋์ด์๋ name="password"๋ฅผ ์ ๊ฑฐํ์ฌ, password์ ํ๋ฒ๋ง ๊ฐ์ด ํ ๋น๋๋๋ก ํด์ฃผ์๋ค. |
ํ์ด์ง ์ด๋ ์ค sql - invalid number ๋ฌธ์ ๊ฐ ๋ฐ์ํจ. ๊ทธ๋ฌ๋ sql ๋ฌธ์ ๊ฐ ์๋์์. jstl ํ๋ฆฐ ๊ฒ์ ์ฃผ์์ผ๋ก ์ฒ๋ฆฌํ์ฌ ๋ฐ์ํจ | <%-- --%>์ด๊ฑธ๋ก ์ฃผ์ ์ฒ๋ฆฌํด์ผํจ |
๋ฆฌ๋ทฐ ๋ฆฌ์คํธ๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ์ํด, review ํ ์ด๋ธ๊ณผ cafe ํ ์ด๋ธ์ ์กฐ์ธํ ํ, rnum๋ฅผ ๋ถ์ฌํ๊ณ , ์ด๋ฅผ ์ธ๋ผ์ธ ๋ทฐ๋ก ์ด์ฉํด ๋ค์ rs_user ํ ์ด๋ธ๊ณผ ์กฐ์ธํ๋ ๊ณผ์ ์์ "ORA-00918: column ambiguously defined" ์๋ฌ๊ฐ ์ง์์ ์ผ๋ก ๋ฐ์ํ์๋ค. | ์๋ธ์ฟผ๋ฆฌ(์ธ๋ผ์ธ๋ทฐ)์ SELECT ๋ฌธ์์ review ํ ์ด๋ธ์ review_content ์ปฌ๋ผ์ ๋ ๋ฒ ํธ์ถํ๊ธฐ ๋๋ฌธ์ด์๋ค. ๋๋ฌธ์ ์ ์ฒด ์ฟผ๋ฆฌ๋ฌธ ์คํ ์, ์ธ๋ผ์ธ ๋ทฐ์ ์๋ ๋ ๊ฐ์ review_content ์ปฌ๋ผ ์ค ์ด๋ ์ปฌ๋ผ์ ์ ํํด์ผ ํ ์ง ๋ชฐ๋ผ ์๋ฌ๊ฐ ๋ฐ์ํ์๋ค || ์ด์ํด๊ฒฐ ๋ฐฉ๋ฒ: ์๋ธ์ฟผ๋ฆฌ(์ธ๋ผ์ธ๋ทฐ)์ SELECT๋ฌธ์์ review_content๋ฅผ ํ ๋ฒ๋ง ๊ธฐ์ฌํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. |
Error setting null for parameter #1 with JdbcType OTHER.์ด๋ผ๋ ์ค๋ฅ๋ฉ์ธ์ง๊ฐ ๋ด๋ค. ์นดํ๋ฑ๋ก์ ๋์์ง๋ง ์ด์์๊ฐ์ ํฌํจํ ์นดํ๋ฑ๋ก์ด ์๋จ ->insert์ ์ฒซ๋ฒ์งธ ์ปฌ๋ผ์ null์ด ์ฝ์ ๋์๋ค๋ ๋ป | registerCafe๋ฉ์๋์์ cafeNo๋ฅผ registerCafeOperatingTimeForm๋ฉ์๋๋ก ๋ณด๋ด์ฃผ์๋ค. ๊ทธ ๋ค์ registerCafeOperatingTime๋ฉ์๋๋ก cafeNo๋ฅผ ๋ณด๋ด์ฃผ์ด์ผ ํ๋๋ฐ ๋ฐ๊ธฐ๋งํ๊ณ registerCafeOperatingTimeForm.jsp์์ ๋ณด๋ด์ฃผ๋ ์ฝ๋๋ฅผ ์์ฑํ์ง ์์๋ค. ์์งํ controller์์ ์๋์ผ๋ก ๋ณด๋ด์ฃผ๊ธฐ๋ ํ๋ ์ค ์์๋ค. |
Git Pull๋ฐ๊ณ Mergeํ๋ ๊ณผ์ ์์ ์ฝ๋๋ฅผ ์๋ชป ์์ | Mergeํ๋ ๊ณผ์ ์์ ์๋ชป์์ ํ์ฌ์ commit์ ์ผ๋ก Rollbackํ๋ ค ํ๋ค. Reset -> Hard ๊ธฐ๋ฅ์ผ๋ก ๋กค๋ฐฑ์ ํ์๋ค. ์ ๋ ํ๋ ์ฝ๋๊ฐ ๋ค ์ญ์ ๋์ด ๋ค์ ์งํํ์๋ค. |
SQL์์ Update๋ก ๋ฉค๋ฒ์์ ๋งค๋์ ๋ก ๋ณ๊ฒฝํ๋ ค ํ์ง๋ง, ๊ถํ์ ํน์ฑ์ Insert๋ฅผ ์ฌ์ฉํด์ผ ๋จ ์ฌ์ฉ ํ์ ๊ถํ์ ์ฌ๋ ค์ฃผ์๋ ์์ด๋๊ฐ ๋ค์ ๊ฒ์์ด ๋จ | ๊ถํ์ ์ญ์ ๊ฐ ์๋ ์ถ๊ฐ์ select count(*) from AUTHORITIES where username='sajang'//์ฌ์ฉํ์ฌ ์นด์ดํธ๋ก ๊ตฌ๋ณ |
๋ฆฌ๋ทฐ ๋ฑ๋กํ ๋, property table์ ํด๋น cafe_no์ ๊ฐ์ด update๋์ด ์ํฅ์ ์ฃผ์๋ค. ๋ฐ๋๋ก ๋ฆฌ๋ทฐ๋ฅผ ์ญ์ ํ ๋, property table์ ์ํฅ์ ์ฃผ์๋ ๊ฐ์ ๋๋๋ ค๋์ผํ๋ค. | ๋ฆฌ๋ทฐ ์์ฑ ์, ์ ๋ ฅ๋ ๊ฐ ํน์ฑ์ ๋ํ ํ๊ฐ๊ฐ์ ๋ํ ์ ๋ณด๊ฐ DB์ ์ ์ฅ๋์ด์์ง ์์์ ์ญ์ ์ ๊ทธ ์ ํน์ฑ ์ ๋ฐ์ดํธ ๊ฐ์ ์ฐพ์ ์ ์๋ค. || ํด๊ฒฐ๋ฐฉ๋ฒ: ๋ฆฌ๋ทฐ ์์ฑ ์, ๋ฆฌ๋ทฐ ๋๋ฒ์ ๋ง๋ ํน์ฑ๊ฐ์ด ์ ์ฅ๋๋ ํ ์ด๋ธ์ ๋ณ๋๋ก ๋ง๋ค์๋ค. ์ด๋ฅผ ํตํด ๋ฆฌ๋ทฐ ์์ฑํ ๋ ํ ์ด๋ธ์ ์ ๋ ฅ๋๊ณ , ์ญ์ ํ ๋ ์ด ๊ฐ์ ์ฐพ์ ์นดํ์์ ๋ค์ updateํด์ ์ญ์ ํ ์ ์์๋ค. |
header์์ญ์ ๋๋กญ๋ค์ด์ผ๋ก @Secured("ROLE_MANANGER")์ผ ๋, '์นดํ ๊ด๋ฆฌ'๋ฅผ ์ด๋ํ๋๋ก ํ๋ค. ๊ทธ๋ฐ๋ฐ ๋๋กญ๋ค์ด ํด๋ฆญ ํ, ํ๋ฒ ์ด๋ํ๊ฒ ๋๋ฉด, ์ด๋ํ ํ๋ฉด์์ ๋ค์ ๋๋กญ๋ค์ด ํด๋ฆญ์ด ๋จน์ง ์๋๋ค. (๋ค์ ํ์ผ๋ก ์ด๋ ํ ์ด๋ํด์ผ ๋๋กญ๋ค์ด ๋ฒํผ์ด ํ์ฑํ๊ฐ ๋๋ค.) - ์ด ๋, F12๋ฅผ ๋๋ฌ๋ณด๋ aria-expanded= false ๋ผ๋ ๋ด๊ฐ ์ฐ์ง ์๋ ์ฝ๋๊ฐ ์ ํ์์๋ค. | where username='sajang'//์ฌ์ฉํ์ฌ ์นด์ดํธ๋ก ๊ตฌ๋ณ๊ตฌ๊ธ๋ง์ ํตํด ์๋ฐ์คํฌ๋ฆฝํธ ์์ญ์ jQuery๋ก ์ ํ์๋ฅผ ์ง์ ํ์ฌ(๋๋กญ๋ค์ด ๋ฒํผ), ๋๋กญ๋ค์ด ๋ฒํผ ํด๋ฆญ ์ ํ์ฑํ๋๋๋ก ํ๋ ํจ์๋ฅผ ์ถ๊ฐํด์ฃผ์๋ค. |
์ด๋ฏธ์ง๋ฅผ ์ด์ฉํ์ฌ ๋ฑ๋ก ์ upload์๋ ์ ์ฅ์ด ์๋๊ณ ์ ์ฅ์ด ํฐ์ผ์ ์ ์ฅ์ด ๋จ (๋ง์ฝ ๋ค๋ฅธ ์ปด๋ ๋๋ค๋ฉด ๊ฐ์ธ ์ค์ ๋ฌธ์ ๊ฐ์.) | copy๋๋ ๋ถ๋ถ์์ file.getBytes()๋์ uploadFile๋ก ๋์ฒดํจ (ํ์ผ์ ์ ๋ก๋ํ๊ธฐ ์ํด, ์ปจํธ๋กค๋ฌ๋ฅผ ๊ฑฐ์ณ ์๋ฒ์ ํ์ผ์ด ์ ๋ก๋ ๋๊ณ , ๋ค์ ์ํฌ์คํ์ด์ค์ ์ด๋ฅผ ์นดํผํ๋๋ฐ, ์ด ๊ณผ์ ์์ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค. ๊ทธ๋์ ์ค์ ์ ๋ก๋ ๋ was์ ์๋ ์ด๋ฏธ์ง์ ์๋ ์ด๋ฏธ์ง๋ฅผ ๋ณต์ ํด์ ์ํฌ์คํ์ด์ค์ ๋ถ์ฌ๋๊ธฐ๋ก ํด๊ฒฐํ๋ค.) |
-
Best Practice
์ ํธ ํญ๋ชฉ ์ ํ ์๋ง๋ค ์ ๋ ฌ๋๋ ๊ธฐ๋ฅ
1, 2, 3์์ ์ ํธํญ๋ชฉ์ ๋ค ์ฒดํฌํ ํ ์ผ๊ด์ ์ผ๋ก ์ ๋ ฌํ๋ ๊ฒ์ด ์๋ ํ ์์์ ํญ๋ชฉ์ ์ฒดํฌํ ๋ ๋ง๋ค ์ ๋ ฌํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.
์ฒ์์๋ 1, 2, 3์์ ํญ๋ชฉ์ ์ฒดํฌํ ํ ์ ๋ ฌ๋ฒํผ์ ๋๋ฅด๋ฉด ์ผ๊ด์ ์ผ๋ก ์ ๋ ฌ๋๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์๋ค. ํ์ง๋ง ์ค์๊ฐ์ผ๋ก ํ ์์๋ฅผ ์ ํํ ๋ ๋ง๋ค ์ ๋ ฌ์ด ๋๋ค๋ฉด ์ฌ์ฉ์ ๊ฒฝํ์ธก๋ฉด์์ ๋์ฑ ์ข๋ค๊ณ ์๊ฐ์ด ๋ค์๋ค. ์ฒดํฌ์๋ง๋ค ์ ๋ ฌ๋๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉฐ ajax์ jquery์ ๋์ฑ ๋ฅ์ํด์ง ์ ์์๊ณ ์ ๋ ํธ-์ต์ ํผ์์ ๊ฐ์ ์ ํ ์ ๋ค์ ์์ ์ต์ ํผ์์ ์ ์์ ์ต์ ํผ์์ ์ ํํ ๊ฐ์ ์ ์ธํ๋ ๊ธฐ๋ฅ๊ณผ ๋์ ์ผ๋ก ์ธ ๊ฐ์ ์ต์ ํผ์ ์์ฑํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉฐ ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ป๊ฒ ์ง์ผ๋ ๊น ๊ณ ๋ฏผํด๋ณด๋ ์๊ฐ์ ๊ฐ์ง ์ ์์๋ค.
Ajax ํ์ฉ
์ ์ฒด์ ์ผ๋ก๋ ๋ฌด์กฐ๊ฑด jsp๋ฅผ ๋ง๋ค์ด์ ๋๊ธฐ์ ๋ฐฉ์๋ง ์ฌ์ฉํ๊ธฐ๋ณด๋ค๋ Ajax๋ฅผ ์ ์ฌ์ ์์ ํ์ฉํ์ฌ ๋ ๋์ ์น์ ๋ง๋ค ์ ์์๋ค. ๋ํ ์ฌ๋ฌ ๋น์ฆ๋์ค ๋ก์ง๋ค์ ํธ๋์ญ์ ์ฒ๋ฆฌํ์ฌ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๊ฐํํ๊ณ ์ค๋ฅ๋ฅผ ์ค์ผ ์ ์์๋ค.
๋น๋ฐ๋ฒํธ ์ํธํ (์ธ์ฝ๋ฉ)
ํ์๊ฐ์ ์ ํ ๋, ๋น๋ฐ๋ฒํธ๋ฅผ bcrypt์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ํธํํ์ฌ DB์ ์ ์ฅํ๋๋ก ๊ตฌํํ์๋ค. ์ ๋ ฅํ ๋น๋ฐ๋ฒํธ๋ฅผ UserServiceImpl์์ ๋ฐ์์ฌ ๋ BCryptPasswordEncoder๋ฅผ ์ฌ์ฉํ์ฌ ์ํธํ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ์ฅํ๊ฒ ํ์๋ค.
๋ฉ๋ด๋ฑ๋ก์ ํ ๋, ๊ธฐ์กด์ ์๋ ๋ฉ๋ด๋ฆฌ์คํธ๋ฅผ ๋ถ๋ฌ์ ๋ณด์ฌ์ฃผ๋๋ฐ ๋น ๋๊ธฐ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๋ฉ๋ด๋ฅผ ์ถ๊ฐํ๋ฉด ๋ฐ๋ก ๋ฆฌ์คํธ์ ๋ณด์ด๊ฒ๋ ๊ตฌํํ์๋ค.
๋ง์ง๋ง์ผ๋ก ํธ๋์ญ์ ์ ์ ์ฉํ์๋ค. ์นดํ๋ฑ๋ก ๋ฐ ์์ ์ ํ ๋, cafeVO์ cafeOperVO๊ฐ ๋์์ ๋ฑ๋ก๋๋๋ฐ ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฅผ ํ์ฌ ๋ ์ค ํ๋๋ผ๋ ์๋ชป ๋ฑ๋ก๋๋ฉด ์๋ฌ๊ฐ ๋์ ๋ฑ๋ก์ด ์๋๊ฒ ๊ตฌํํ์๋ค. ๊ทธ๋ฆฌ๊ณ ํ์๊ฐ์ ์์ ์ด๋ค ํ์์ด๋ ์ฒ์์๋ ROLE_MEMBER๊ถํ์ ์ฃผ์๋๋ฐ ํ์๊ฐ์ ๊ณผ ๊ถํ ๋ถ์ฌ ๊ธฐ๋ฅ ๋ ์ค์ ํ๋๋ผ๋ ์๋ฌ๊ฐ ๋๋ฉด ์๋๋์ง ์๊ฒ ํด์ฃผ์๋ค.
๋ฆฌ๋ทฐ ๋ฑ๋ก ๋ฐ ์ญ์ ๊ธฐ๋ฅ
๋ฆฌ๋ทฐ ๋ฑ๋ก ์ ๋งค๊ธด ์นดํ์ ํ๊ฐ๋ฅผ ๋ฆฌ๋ทฐ ์ญ์ ์ ๋ค์ rollbackํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.
์ฒ์ ERD๋ฅผ ์์ฑํ ๋๋ ์๊ฐํ์ง ๋ชปํ ์์ด๋์ด์๋ค. ๊ตฌํ์ ํ๋ค๋ณด๋, ๋ฆฌ๋ทฐ ๋ฑ๋ก ์์ ๋งค๊ฒจ์ง ์นดํ์ ๋ํ ํ๊ฐ๊ฐ์ด ๋ฆฌ๋ทฐ๋ฅผ ์ญ์ ํ๋ฉด rollback๋์ด์ผ ํ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ํ์ง๋ง ๋ฆฌ๋ทฐ ๋ฑ๋ก ์, ๋ฆฌ๋ทฐ ๋๋ฒ์ ๋ฆฌ๋ทฐ ์ปจํ ์ธ ๋ ๋ฆฌ๋ทฐ ํ ์ด๋ธ์, ํ๊ฐ ์ ์๋ ํ๊ฐ ํ ์ด๋ธ์ ๋ณ๋๋ก ์ ์ฅ๋์ด, ๋ฆฌ๋ทฐ ์ญ์ ์, ํด๋น ๋ฆฌ๋ทฐ ๋๋ฒ์ ๋ํ ํ๊ฐ๊ฐ์ ์ ์ ์๋ค๋ ๋ฌธ์ ์ ์ ๋ฐ๊ฒฌํ๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ๋ฆฌ๋ทฐ ๋ฑ๋ก ์, ๋ฆฌ๋ทฐ ๋๋ฒ์ ํด๋นํ๋ ์นดํ์ ๋ํ ํ๊ฐ ์ ์๋ฅผ ์ ์ฅํ๋ ํ ์ด๋ธ์ ์์ฑํ๋ค. ์ด๋ฅผ ํตํด, ๋ฆฌ๋ทฐ ์ญ์ ์, ๋ฆฌ๋ทฐ ๋๋ฒ์ ๋ง๋ ํ๊ฐ ์ ์๋ฅผ ํ ์ด๋ธ์์ ๊ฒ์ํ์ฌ, ํน์ฑ ํ ์ด๋ธ์์ ํด๋น ์นดํ ๋๋ฒ์ ๋ง๋ ๊ฐ์ ๋ค์ rollbackํ ์ ์์๋ค.
ํ์ด์ง ๊ธฐ๋ฅ
Paging bean์ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ๋ง๊ฒ ์ ์ฉํ ์ ์๊ฒ ๋ํ์ฌ ์์ง๋๋ฅผ ํฅ์ํ๋ค.
์์์ฑ ๊ณ์ธต์ธ Paging bean์์ ํ ํ์ด์ง ๋น ๋์ค๋ ์ฝํ ์ธ ์, ํ์ด์ง ๊ทธ๋ฃน์ ์ํ๋ ํ์ด์ง ์๋ฅผ instance variable ์ด๊ธฐํ ๋จ๊ณ์์ ๋ณ๋๋ก ์ค์ ํ์ง ์๊ณ , ์ถํ ๋น์ฆ๋์ค ๊ณ์ธต ๋ฐ ํ๋ ์ ํ ์ด์ ๊ณ์ธต ๋จ๊ณ์์ setter๋ฅผ ํตํด ์ค์ ํ๋๋ก ํ์๋ค. ์ด๋ฅผ ํตํด, ์ ์ผ ๋จผ์ ํ์ด์ง ๋น์ ์ ์ฉํ ์ฝ๋๋ฅผ ์ด์ฉํ์ฌ, ๊ฐ ๊ธฐ๋ฅ์ ์๋ง๊ณ , ์ฝ๊ฒ ์ ์ฉํ ์ ์์๋ค.
๊ฒ์ํ ๊ธฐ๋ฅ
-
์ด๋ฏธ์ง์ ๊ฒ์ํ์ ๊ธ์ ๋์์ ์ ์ด๋ฅผ ํ ์ ์๊ฒ ํ์๋ค. ์ด๋ฏธ์ง์ ํ์ผ ํ์์ ๊ด๋ จํ์ฌ ERD๋ฅผ ํ ์คํธ ํ ๋๋ง๋ค ๋ฐ๊พธ์์ผ๋ฉฐ Path๋ก ์ ์ด๋ฅผ ํ ์ ์์๋ค.
-
ํ์๋ค์ด ๊ตฌํํ ์์๋ฅผ ๊ฐ์ง๊ณ ๊ฒ์ํ ์ฉ์ผ๋ก ์ฝ๋๋ฅผ ์์ ํธ์งํ์ฌ ๊ถํ์ด๋ ์ฝ๋์ ์ถฉ๋์ ์ต์ํ ํ์ฌ ์ ์ฉํ์๋ค.
-
LESSONS LEARNED
- ์ฝ๋๋ฅผ ์์ฑํ ๋น์, ๊ตฌํ์๋ง ์ง์คํ ๋๋จธ์ง redirect๋ฐฉ์์ผ๋ก view๋ฅผ ๋ณด๋ด์ผํ๋๋ฐ forward ๋ฐฉ์์ผ๋ก ๋ณด๋ธ ๋ฉ์๋๊ฐ ์์๋ค. ๊ธฐ๋ฅ์ด ์๋ํ๋ ๊ฒ๋ ์ค์ํ์ง๋ง, ์์ ์ฑ ๋ฐ ๋ณด์์ฑ ๋ํ ์ค์ํ๋ค๊ณ ์๊ฐํ๋ค. ์ด๋ฌํ ๋ฌธ์ ๊ฐ ์์ผ๋ก ๋ฐ์ํ์ง ์๊ธฐ ์ํด์๋, ๊ผผ๊ผผํ ์ฝ๋๋ฅผ ์์ฑํ๋ฉฐ ์ฝ๋ ์์ฑ ํ ์ฌ๊ฒํ ์๊ฐ ๋ฐ ํ์ ๊ฐ์ ์ฝ๋ ๋ฆฌ๋ทฐ๊ฐ ๋์์ด ๋ ๊ฒ์ด๋ผ ์๊ฐํ๋ค.
- ERD๋ฅผ ๋๋ฆ ์ ์์ฑํ์๋ค๊ณ ์๊ฐํ์์ง๋ง ๊ตฌํ์ ์งํํ๋ฉฐ ์ค๊ณ์์ ์ค๋ฅ๋ฅผ ์ ์ง ์๊ฒ ๋ฐ๊ฒฌํ์๊ณ ์ด๋ฅผ ์์ ํ๋๋ฐ ๋ง์ ์๊ฐ์ ์๋ชจํ์๋ค.
- ๊ตฌํ ๊ณํ์ ์งฐ์ ๋ 1์ฐจ ๊ตฌํ์ ๋๋ฌด ๋ง์ ๊ธฐ๋ฅ์ ๋ฃ์ด๋์ด์ ๋ฐ๋๋ผ์ธ์ด ๋ค๊ฐ์ด์ ๋ฐ๋ผ ํ๋ค์๋ค. ๊ตฌํ ์๊ฐ์ ์ต๋ํ ์ ํํ๊ฒ ์์ธก, ์ฐ์ถํ๋ ์ฐ์ต์ ๋ง์ด ํ์ฌ ๋ฐ๋๋ผ์ธ์ ์ ์งํฌ ์ ์๋๋ก ๋ ธ๋ ฅํด์ผ๊ฒ ๋ค.
- ์ฝ๋๋ฅผ ์์ฑํ๋ฉด์ ๊ธฐ๋ฅ์ ๊ตฌํํด๋ด๋ ๊ฒ์ ๊ธ๊ธํด ์ฃผ์์ ๊ผผ๊ผผํ ์์ฑํ์ง ๋ชปํ์๋ค. ๊ทธ ๊ฒฐ๊ณผ, ํ์๋ค์ด ๋ด ์ฝ๋๋ฅผ ์ดํดํ๋๋ฐ ์์ด์ ์ด๋ ค์์ด ์์๊ณ ๋ง์ฐฐ๋ก ์ด์ด์ง ๋ปํ๋ค. ์ฃผ์์ ์ฝ๋์ ์ง์ ์ ์ธ ์ํฅ์ ๋ผ์น์ง ์์ ์ฌ์ํ๊ฒ ์ฌ๊ธฐ๋ ์ต๊ด์ด ์์๋๋ฐ ์ถํ ์ฝ๋๋ฅผ ์์ ํ๊ฑฐ๋ ๋์ค์ ๋ค์ ๊ณต๋ถ ํ ์ผ์ด ์๊ฒผ์ ๋ ๊ผญ ํ์ํ๊ณ ๋ค๋ฅธ ์ฌ๋์๊ฒ ๋ด ์ฝ๋๋ฅผ ์ดํด์ํฌ ๋ ๊ผญ ํ์ํ๋ค. ์๊ฐ์ด ๊ฑธ๋ฆฌ๋๋ผ๋ ์ฝ๋๋ฅผ ์ฌ๊ฒํ ํ๋ฉด์ ์ฃผ์๋ ์์ฑ์ ํ๋ค๋ฉด ์์ผ๋ก ์ฝ๋ฉ์ค๋ ฅ์ ํฐ ๋์์ด ๋ ๊ฒ์ด๋ค.
- ๋ฆฌ๋ทฐ ๋ฑ๋ก/์ญ์ ์, rollback ์ฒ๋ฆฌ๋ฅผ ์ํด ํ๊ฐ ํ ์ด๋ธ์ ๋ง๋ค์์ผ๋, ์ ๊ทํ๊ฐ ๋์ง ์์ ํ ์ด๋ธ์ ์์ฑํ๋ค. ๋ฆฌ๋ทฐ ํ ์ด๋ธ๊ณผ ํน์ฑ ํ ์ด๋ธ ์ฌ์ด์ ํ๊ฐ ํ ์ด๋ธ์ด ์ด์ด์ ธ์ผ ํ๋๋ฐ, ๋ฆฌ๋ทฐ ํ ์ด๋ธ์ Primary key๊ฐ ์๋ ์ผ๋ฐ ์ปฌ๋ผ์ ํ๊ฐ ํ ์ด๋ธ์ Foreign key์ด์ Primary key๋ก ์ค์ ํ๋ค. ์์ธ์ ๋ฆฌ๋ทฐ ํ ์ด๋ธ์์ ์ผ๋ฐ ์์ฑ์ด ๋ค๋ฅธ ์์ฑ๋ค์ ์์ ์ข ์ํ๋ ์ค๋ฅ์๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๊ธฐ์กด primary key(์นดํ๋๋ฒ, ์ ์ ์์ด๋)์ ๋ฆฌ๋ทฐ ๋๋ฒ๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค. ์์ผ๋ก ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๊ธฐ ์ํด์๋ table ์์ฑ ์, ERD ์ค๊ณ๋ถํฐ ์งํํด๋ณด๋ ๊ฒ์ด ์ค๋ฅ๋ฅผ ์ค์ผ ์ ์๋ ๋ฐฉ๋ฒ์ธ ๊ฒ์ ๋ฐฐ์ธ ์ ์์๋ค.
- ์ฝ๋ ์์ฑ์ ERD๊ตฌ์กฐ๊ฐ ์ ์ ๋ฆฌ๊ฐ ๋ ๊ณณ์ ๊ตฌํํ๊ธฐ ์ฌ์ ์ง๋ง ์ ๋งคํ ํ ์ด๋ธ์์๋ ๊ธฐ๋ฅ ๊ตฌํ์ด ํ๋ค์์ผ๋ฉฐ ๋ํ ERD์ ๋ฐ์ดํฐ ํ์ ์ ๋ฐ๋ฅธ ์ค๋ฅ๋ฅผ ๊ฒฝํํ์๋ค. ์ถํ์๋ ERD์ ๊ด๊ณ๋ ์ค์ํ์ง๋ง ๋ฐ์ดํฐ ํ์ ์๋ ์ด๋์ ๋ ๊ตฌํ์ ๊ณ ๋ คํ์ฌ ์งํํด์ผ ๋๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
- ์์ ์ ๊ธฐ์ต์ด ๋จ์์๋ ๊ณณ : Trello