Coder Social home page Coder Social logo

finalpj_roaststars's Introduction

๐Ÿณ ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ โ†‘ pdf ํŒŒ์ผ ์ฐธ์กฐ.

โ˜•RoastStars

  • ํŒ๊ต์—์„œ ๊ต์œก์„ ๋ฐ›์œผ๋ฉฐ ์ด์šฉํ•œ ์ˆ˜ ๋งŽ์€ ์นดํŽ˜๋“ค๋กœ ์‹œ์ž‘ํ•œ ์•„์ด๋””์–ด.

  • ํŒ๊ต์— ์žˆ๋Š” ์ˆ˜ ๋งŽ์€ ์นดํŽ˜๋“ค ์ค‘์—์„œ ์–ด๋””๊ฐ€ ๋ง›์žˆ๊ณ , ์–ด๋””๊ฐ€ ๋ถ„์œ„๊ธฐ๊ฐ€ ์ข‹์œผ๋ฉฐ, ์–ด๋””๊ฐ€ ๊ฐ€๊ฒฉ์ด ์Œ€๊นŒ?

  • ์ž์‹ ์˜ ์ƒํ™œ๋ฐ˜๊ฒฝ์— ์žˆ๋Š” ์ž…๋ง›์— ๋งž๋Š” ์นดํŽ˜๋ฅผ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋ณด์ž!

๐Ÿ“†๊ฐœ๋ฐœ๊ธฐ๊ฐ„


์•ฝ 1๊ฐœ์›” (20.11.15 ~ 20.12.22)

๊ฐœ๋ฐœ ์ผ์ •(์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ)
  • ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ์ผ์ • ๊ณ„ํš ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ์ผ์ • ๊ณ„ํš

  • ์ตœ์ข… ๊ฐœ๋ฐœ ์ผ์ • ์ตœ์ข… ๊ฐœ๋ฐœ ์ผ์ •

๐Ÿ“š๊ธฐ์ˆ ์Šคํƒ


  • java v1.8
  • oracle db, mybatis
  • apache tomcat v8.5
  • Spring 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
  • ํ† ์˜

์œ ์ฆˆ์ผ€์ด์Šค_1์ฐจ

  • ์ดˆ๊ธฐ UseCase Diagram

๋น„ํšŒ์› 1์ฐจ_UserCaseDiagram_ํฌํด์šฉ_๋น„ํšŒ์›

๊ณ ๊ฐ 1์ฐจ_UserCaseDiagram_ํฌํด์šฉ_๊ณ ๊ฐ

์‚ฌ์žฅ 1์ฐจ_UserCaseDiagram_ํฌํด์šฉ_์‚ฌ์žฅ

๊ด€๋ฆฌ์ž 1์ฐจ_UserCaseDiagram_ํฌํด์šฉ_๊ด€๋ฆฌ์ž

  • ์ตœ์ข… UseCase Diagram

๋น„ํšŒ์› ์ตœ์ข…_UsecaseDiagram_๋น„ํšŒ์›

๊ณ ๊ฐ ์ตœ์ข…_UsecaseDiagram_๊ณ ๊ฐ

์‚ฌ์žฅ ์ตœ์ข…_UsecaseDiagram_์‚ฌ์žฅ

๊ด€๋ฆฌ์ž ์ตœ์ข…_UsecaseDiagram_๊ด€๋ฆฌ์ž

๐Ÿ’ถERD
  • ํ† ์˜

ERD_1์ฐจ

  • ์ดˆ๊ธฐ ๋…ผ๋ฆฌ ERD

1์ฐจ_๋…ผ๋ฆฌERD

  • ์ดˆ๊ธฐ ๋ฌผ๋ฆฌ ERD

1์ฐจ_๋ฌผ๋ฆฌERD

  • ์ตœ์ข… ๋…ผ๋ฆฌ ERD

์ตœ์ข…_๋…ผ๋ฆฌERD

  • ์ตœ์ข… ๋ฌผ๋ฆฌ

์ตœ์ข…_๋ฌผ๋ฆฌERD

๐Ÿ’ถClass Diagram
  • ํ† ์˜

CD1 CD2

  • ์ดˆ๊ธฐ Class Diagram

1์ฐจ ClassDiagram

  • ์ตœ์ข… Class Diagram

ClassDiagram

๐Ÿ’ถFile List
  • ํ† ์˜

FileList

  • ์ตœ์ข… File List

์ตœ์ข… ํŒŒ์ผ๋ฆฌ์ŠคํŠธ1 ์ตœ์ข… ํŒŒ์ผ๋ฆฌ์ŠคํŠธ2

๐Ÿ’ถ๋ ˆ์ด์•„์›ƒ ๋ฐ UI ์„ค๊ณ„
  • UI ์„ค๊ณ„

UI ์„ค๊ณ„

  • ์ดˆ๊ธฐ ๋ ˆ์ด์•„์›ƒ

์ดˆ๊ธฐํ™”๋ฉด1 ์ดˆ๊ธฐํ™”๋ฉด2 ์ดˆ๊ธฐํ™”๋ฉด3 ์ดˆ๊ธฐํ™”๋ฉด4

  • ์ตœ์ข… ํ™”๋ฉด

์ตœ์ข…1 ์ตœ์ข…2 ์ตœ์ข…3 ์ตœ์ข…4

๐Ÿ“Šํ”„๋กœ์ ํŠธ ๋‚ด์šฉ ๋ฐ ์ฃผ์š” ๊ธฐ๋Šฅ


ํšŒ์›๊ฐ€์ž…
  • ํšŒ์›๊ฐ€์ž…

1 ํšŒ์›๊ฐ€์ž…

  • ์‚ฌ์žฅ/ ์ผ๋ฐ˜์œ ์ €๋ฅผ ์„ ํƒํ•ด์„œ ๊ฐ€์ž…ํ•ด์•ผ ํ•œ๋‹ค.(๊ด€๋ฆฌ์ž์— ์˜ํ•ด ์Šน์ธ์„ ๋ฐ›์•„์•ผ ํ•œ๋‹ค)

2  ์‚ฌ์žฅํšŒ์›๊ฐ€์ž…

์ž„์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐœ๊ธ‰ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ
  • ์ž„์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐœ๊ธ‰(์•„์ด๋””์™€ ์ด๋ฆ„์ด ์ผ์น˜ํ•  ์‹œ ๋ฐœ๊ธ‰ ๊ฐ€๋Šฅํ•˜๋‹ค) - ๋‚œ์ˆ˜๋ฐœ์ƒ๊ณผ ์•„์Šคํ‚ค์ฝ”๋“œ๋ฅผ ์ด์šฉ

3  ์ž„์‹œ ๋น„๋ฒˆ ๋ฐœ๊ธ‰

  • ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ

3.5 ๋น„๋ฒˆ๋ณ€๊ฒฝ

์ง€์—ญ ๊ฒ€์ƒ‰ ๋ฐ ์„ ํ˜ธ๋„์— ๋”ฐ๋ฅธ ์ •๋ ฌ, ์นดํŽ˜ ๊ฐ„๋žต์ •๋ณด
  • ์ง€์—ญ ๊ฒ€์ƒ‰ ํ›„ ์„ ํ˜ธ ํ•ญ๋ชฉ(1, 2, 3์ˆœ์œ„)์œผ๋กœ ์ง€์—ญ ๊ฒ€์ƒ‰๋œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ •๋ ฌ๋œ๋‹ค.(Ajax)
  • ์ง€๋„๋Š” ์นด์นด์˜ค๋งตapi๋ฅผ ์ด์šฉํ•˜์˜€๋‹ค.

4 ์ง€์—ญ๊ฒ€์ƒ‰ ๋ฐ ์นดํŽ˜ ๊ฐ„๋žต์ •๋ณด, ์„ ํ˜ธ๋„ ์ •๋ ฌ, ์ง€๋„

์นดํŽ˜ ์ƒ์„ธ์ •๋ณด ๋ฐ ๋ฉ”๋‰ด ํ™•์ธ
  • ์นดํŽ˜ ๊ฐ„๋žต์ •๋ณด, ๋งˆ์ดํ”ฝ ๋“ฑ์˜ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ์„ ํƒ๋œ ์นดํŽ˜์— ๋Œ€ํ•œ ์ƒ์„ธ์ •๋ณด์™€ ๋ฉ”๋‰ด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

5 ์นดํŽ˜ ์ƒ์„ธ๋ณด๊ธฐ, ๋ฉ”๋‰ด๋ณด๊ธฐ

๋ฆฌ๋ทฐ ์ž‘์„ฑ ๋ฐ ์‚ญ์ œ
  • ๋ฆฌ๋ทฐ ์ž‘์„ฑ ์‹œ, ํŠน์„ฑ๊ฐ’์— ํฌ์ธํŠธ๋กœ ํ‰๊ฐ€ํ•˜์—ฌ, ์นดํŽ˜ ํŠน์„ฑ์— ์ ์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.(์ด ์ ์ˆ˜๋กœ ์„ ํ˜ธ๋„ ์ •๋ ฌ)
  • ๋ณธ์ธ์ด ์ž‘์„ฑํ•œ ๋ฆฌ๋ทฐ๋งŒ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ญ์ œํ•˜๋ฉด ์ถ”๊ฐ€๋˜์—ˆ๋˜ ์นดํŽ˜์˜ ํŠน์„ฑ๊ฐ’์ด ๋‹ค์‹œ ์‚ฌ๋ผ์ง„๋‹ค.

6 ๋ฆฌ๋ทฐ์ž‘์„ฑ ๋ฐ ์‚ญ์ œ

๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€(๊ถŒํ•œ ๋ถ€์—ฌ)
  • ๊ด€๋ฆฌ์ž ์ „์šฉ ๊ธฐ๋Šฅ์œผ๋กœ์„œ ์‚ฌ์žฅ์œผ๋กœ ํšŒ์› ๊ฐ€์ž…ํ•œ ๊ณ ๊ฐ๋“ค์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ  ์‚ฌ์žฅ(๋งค๋‹ˆ์ €)๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

7 ์‚ฌ์žฅ๊ถŒํ•œ๋ถ€์—ฌ

๋งˆ์ดํ”ฝ(์ฆ๊ฒจ์ฐพ๊ธฐ)
  • ์นดํŽ˜ ๊ฐ„๋žต์ •๋ณด or ์ƒ์„ธ์ •๋ณด์—์„œ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. Ajax๋กœ ๊ตฌํ˜„ํ•˜์—ฌ โ˜†์„ ํด๋ฆญ ์‹œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ถ”๊ฐ€, ์ œ๊ฑฐ๋œ๋‹ค.

8 ๋งˆ์ดํ”ฝ

๋นˆ์ฆˆํ”ฝ(Editor's Pick)
  • ๋งŽ์€ ์นดํŽ˜๋“ค ์ค‘์—์„œ ํ™๋ณด๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ์œ„ํ•ด ์—๋””ํ„ฐ(๊ด€๋ฆฌ์ž)๊ฐ€ ์ง์ ‘ ๊ณ ๋ฅธ ์นดํŽ˜์˜ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒŒ์‹œํŒ
  • ๋ชจ๋“  ์œ ์ €(๋น„ํšŒ์› ํฌํ•จ)๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ์œผ๋‚˜, ์ˆ˜์ •/์‚ญ์ œ๋Š” ๊ด€๋ฆฌ์ž๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

9 ๋นˆ์ฆˆํ”ฝ

์นดํŽ˜ ๋“ฑ๋ก
  • ์นดํŽ˜๋ช…์€ 10์ž ์ด๋‚ด, ์นดํŽ˜ ์„ค๋ช…์€ 200์ž ์ด๋‚ด, ์šด์˜์‹œ๊ฐ„์€ ๋ฌธ์ž์ž…๋ ฅ์ด ๋ถˆ๊ฐ€ํ•˜๊ณ  36:70๊ฐ™์ด ์‹œ๊ฐ„์€ 24์‹œ ๋ฅผ ๋„˜๊ธธ ์ˆ˜ ์—†์œผ๋ฉฐ ๋ถ„์€ 60๋ถ„์„ ๋„˜์„ ์ˆ˜ ์—†๊ฒŒ ์กฐ๊ฑด์„ ๊ฑธ์—ˆ๋‹ค.
  • ๊ณตํœด์ผ์—๋„ ์šด์˜์„ ํ•˜๋Š” ํšŒ์›์€ โ€˜์šด์˜ํ•จโ€™์— ์ฒดํฌ๋ฅผ ํ•˜๋ฉด ๊ณตํœด์ผ ๋“ฑ๋กํผ์ด ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.
  • ์นดํŽ˜๊ธฐ๋ณธ์ •๋ณด์™€ ์šด์˜์‹œ๊ฐ„์€ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์ด๋ฏ€๋กœ ํŠธ๋žœ์žญ์…˜์ฒ˜๋ฆฌ๋ฅผ ํ•˜์˜€๋‹ค.

10 ์นดํŽ˜ ๋“ฑ๋ก

๋ฉ”๋‰ด ์ถ”๊ฐ€ ๋ฐ ํ™•์ธ
  • ๊ฐ€๊ฒฉ์€ ์ตœ์†Œ 100์› ๋‹จ์œ„๋กœ ์„ค์ •ํ–ˆ๋‹ค.

11 ๋ฉ”๋‰ด ์ถ”๊ฐ€ ๋ฐ ํ™•์ธ

๐Ÿ› ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…


ํ‘œ ํŽผ์น˜๊ธฐ/์ ‘๊ธฐ
์ด์Šˆ ๋‚ด์šฉ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ
ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋„์ค‘, 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์— ์žˆ๋Š” ์ด๋ฏธ์ง€์— ์žˆ๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋ณต์ œํ•ด์„œ ์›Œํฌ์ŠคํŽ˜์ด์Šค์— ๋ถ™์—ฌ๋†“๊ธฐ๋กœ ํ•ด๊ฒฐํ–ˆ๋‹ค.)

โš–ํ”„๋กœ์ ํŠธ ํšŒ๊ณ  ๋ฐ ํ‰๊ฐ€


  1. 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๋กœ ์ œ์–ด๋ฅผ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

    • ํŒ€์›๋“ค์ด ๊ตฌํ˜„ํ•œ ์š”์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ๊ฒŒ์‹œํŒ ์šฉ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ • ํŽธ์ง‘ํ•˜์—ฌ ๊ถŒํ•œ์ด๋‚˜ ์ฝ”๋“œ์˜ ์ถฉ๋Œ์„ ์ตœ์†Œํ™” ํ•˜์—ฌ ์ ์šฉํ•˜์˜€๋‹ค.

  2. LESSONS LEARNED

    • ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋‹น์‹œ, ๊ตฌํ˜„์—๋งŒ ์ง‘์ค‘ํ•œ ๋‚˜๋จธ์ง€ redirect๋ฐฉ์‹์œผ๋กœ view๋ฅผ ๋ณด๋‚ด์•ผํ•˜๋Š”๋ฐ forward ๋ฐฉ์‹์œผ๋กœ ๋ณด๋‚ธ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ, ์•ˆ์ •์„ฑ ๋ฐ ๋ณด์•ˆ์„ฑ ๋˜ํ•œ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ์•ž์œผ๋กœ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๊ผผ๊ผผํžˆ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉฐ ์ฝ”๋“œ ์ž‘์„ฑ ํ›„ ์žฌ๊ฒ€ํ†  ์‹œ๊ฐ„ ๋ฐ ํŒ€์› ๊ฐ„์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค.
    • ERD๋ฅผ ๋‚˜๋ฆ„ ์ž˜ ์ž‘์„ฑํ•˜์˜€๋‹ค๊ณ  ์ƒ๊ฐํ•˜์˜€์ง€๋งŒ ๊ตฌํ˜„์„ ์ง„ํ–‰ํ•˜๋ฉฐ ์„ค๊ณ„์ƒ์˜ ์˜ค๋ฅ˜๋ฅผ ์ ์ง€ ์•Š๊ฒŒ ๋ฐœ๊ฒฌํ•˜์˜€๊ณ  ์ด๋ฅผ ์ˆ˜์ •ํ•˜๋Š”๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋ชจํ•˜์˜€๋‹ค.
    • ๊ตฌํ˜„ ๊ณ„ํš์„ ์งฐ์„ ๋•Œ 1์ฐจ ๊ตฌํ˜„์— ๋„ˆ๋ฌด ๋งŽ์€ ๊ธฐ๋Šฅ์„ ๋„ฃ์–ด๋‘์–ด์„œ ๋ฐ๋“œ๋ผ์ธ์ด ๋‹ค๊ฐ€์˜ด์— ๋”ฐ๋ผ ํž˜๋“ค์—ˆ๋‹ค. ๊ตฌํ˜„ ์‹œ๊ฐ„์„ ์ตœ๋Œ€ํ•œ ์ •ํ™•ํ•˜๊ฒŒ ์˜ˆ์ธก, ์‚ฐ์ถœํ•˜๋Š” ์—ฐ์Šต์„ ๋งŽ์ด ํ•˜์—ฌ ๋ฐ๋“œ๋ผ์ธ์„ ์ž˜ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋ ฅํ•ด์•ผ๊ฒ ๋‹ค.
    • ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋‚ด๋Š” ๊ฒƒ์— ๊ธ‰๊ธ‰ํ•ด ์ฃผ์„์„ ๊ผผ๊ผผํžˆ ์ž‘์„ฑํ•˜์ง€ ๋ชปํ•˜์˜€๋‹ค. ๊ทธ ๊ฒฐ๊ณผ, ํŒ€์›๋“ค์ด ๋‚ด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ์–ด๋ ค์›€์ด ์žˆ์—ˆ๊ณ  ๋งˆ์ฐฐ๋กœ ์ด์–ด์งˆ ๋ป”ํ–ˆ๋‹ค. ์ฃผ์„์€ ์ฝ”๋“œ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š์•„ ์‚ฌ์†Œํ•˜๊ฒŒ ์—ฌ๊ธฐ๋Š” ์Šต๊ด€์ด ์žˆ์—ˆ๋Š”๋ฐ ์ถ”ํ›„ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๋‚˜์ค‘์— ๋‹ค์‹œ ๊ณต๋ถ€ ํ•  ์ผ์ด ์ƒ๊ฒผ์„ ๋•Œ ๊ผญ ํ•„์š”ํ•˜๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ๋‚ด ์ฝ”๋“œ๋ฅผ ์ดํ•ด์‹œํ‚ฌ ๋•Œ ๊ผญ ํ•„์š”ํ•˜๋‹ค. ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋”๋ผ๋„ ์ฝ”๋“œ๋ฅผ ์žฌ๊ฒ€ํ† ํ•˜๋ฉด์„œ ์ฃผ์„๋„ ์ž‘์„ฑ์„ ํ•œ๋‹ค๋ฉด ์•ž์œผ๋กœ ์ฝ”๋”ฉ์‹ค๋ ฅ์— ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋‹ค.
    • ๋ฆฌ๋ทฐ ๋“ฑ๋ก/์‚ญ์ œ ์‹œ, rollback ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ํ‰๊ฐ€ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์—ˆ์œผ๋‚˜, ์ •๊ทœํ™”๊ฐ€ ๋˜์ง€ ์•Š์€ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ–ˆ๋‹ค. ๋ฆฌ๋ทฐ ํ…Œ์ด๋ธ”๊ณผ ํŠน์„ฑ ํ…Œ์ด๋ธ” ์‚ฌ์ด์— ํ‰๊ฐ€ ํ…Œ์ด๋ธ”์ด ์ด์–ด์ ธ์•ผ ํ•˜๋Š”๋ฐ, ๋ฆฌ๋ทฐ ํ…Œ์ด๋ธ”์˜ Primary key๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ ์ปฌ๋Ÿผ์„ ํ‰๊ฐ€ ํ…Œ์ด๋ธ”์˜ Foreign key์ด์ž Primary key๋กœ ์„ค์ •ํ–ˆ๋‹ค. ์›์ธ์€ ๋ฆฌ๋ทฐ ํ…Œ์ด๋ธ”์—์„œ ์ผ๋ฐ˜ ์†์„ฑ์ด ๋‹ค๋ฅธ ์†์„ฑ๋“ค์„ ์™„์ „ ์ข…์†ํ•˜๋Š” ์˜ค๋ฅ˜์˜€๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ์กด primary key(์นดํŽ˜๋„˜๋ฒ„, ์œ ์ €์•„์ด๋””)์— ๋ฆฌ๋ทฐ ๋„˜๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ์•ž์œผ๋กœ ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ๋Š” table ์ƒ์„ฑ ์‹œ, ERD ์„ค๊ณ„๋ถ€ํ„ฐ ์ง„ํ–‰ํ•ด๋ณด๋Š” ๊ฒƒ์ด ์˜ค๋ฅ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ธ ๊ฒƒ์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
    • ์ฝ”๋“œ ์ž‘์„ฑ์‹œ ERD๊ตฌ์กฐ๊ฐ€ ์ž˜ ์ •๋ฆฌ๊ฐ€ ๋œ ๊ณณ์€ ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฌ์› ์ง€๋งŒ ์• ๋งคํ•œ ํ…Œ์ด๋ธ”์—์„œ๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ํž˜๋“ค์—ˆ์œผ๋ฉฐ ๋˜ํ•œ ERD์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๋”ฐ๋ฅธ ์˜ค๋ฅ˜๋ฅผ ๊ฒฝํ—˜ํ•˜์˜€๋‹ค. ์ถ”ํ›„์—๋Š” ERD์˜ ๊ด€๊ณ„๋„ ์ค‘์š”ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ ํƒ€์ž…์—๋„ ์–ด๋Š์ •๋„ ๊ตฌํ˜„์„ ๊ณ ๋ คํ•˜์—ฌ ์ง„ํ–‰ํ•ด์•ผ ๋˜๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

๐ŸŽž๋ฒˆ์™ธ : ๊ธฐ๋ก๋“ค


  • ์ž‘์—…์˜ ๊ธฐ์–ต์ด ๋‚จ์•„์žˆ๋Š” ๊ณณ : Trello

finalpj_roaststars's People

Contributors

yewool0818 avatar lastcow9000 avatar byoengchoel avatar treecmyk avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.