-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.json
More file actions
1 lines (1 loc) ยท 214 KB
/
Copy pathindex.json
File metadata and controls
1 lines (1 loc) ยท 214 KB
1
[{"content":"DDD START SERIES๋ ๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ ์ฑ
์ ์ฐธ๊ณ ํ์ฌ ์์ฑ๋ ์์ฝ(?) ๊ธ ์
๋๋ค.\n8.1 ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ํธ๋์ญ์
. ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ์ผ๊ด์ฑ์ด ๊นจ์ง๋ฉด ์๋๋ค.\n๊นจ์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ ค๋ฉด 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.\n A ์์ ํ๊ณ ์๋ ๋์ B์์ ์์ ํ ์ ์๊ฒ ๋ง๋๋ค. A๊ฐ ์กฐํ๋ฅผ ํ๊ณ B๊ฐ ๋ณ๊ฒฝ์ ํ๋ฉด A๋ B์ ์์ ์ด ๋๋๋ฉด ์ฌ์กฐํ๋ฅผ ํด์ ์์ ํ๋ค. ์ด ๋ฐฉ๋ฒ๋ค์ ์ ๊ทธ๋ฆฌ์ปคํธ์ ์์ฒด์ ํธ๋์ญ์
๊ณผ ๊ด๋ จ์ด ์๋ค.\nDBMS๊ฐ ์ง์ํ๋ ํธ๋์ญ์
๊ณผ ํจ๊ป ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ์ํ ์ถ๊ฐ์ ์ธ ํธ๋์ญ์
์ฒ๋ฆฌ ๊ธฐ๋ฒ์ด ํ์ํ๋ค.\n๋ํ์ ์ธ ํธ๋์ญ์
์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ ์ ์ ๊ธ๊ณผ ๋น์ ์ ์ ๊ธ์ ๋๊ฐ์ง ๋ฐฉ์์ด ์๋ค.\n8.2 ์ ์ ์ ๊ธ ์ ์ ์ ๊ธ์ ๋จผ์ ์ ๊ทธ๋ฆฌ์ปคํธ๋ฅผ ๊ตฌํ ์ค๋ ๋๊ฐ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ์ฌ์ฉ์ด ๋๋ ๋๊น์ง ๋ค๋ฅธ ์ค๋ ๋๊ฐ ํด๋น ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ์์ ํ์ง ๋ชปํ๊ฒ ๋ง๋ ๋ฐฉ์์ด๋ค.\n8.2.1 ์ ์ ์ ๊ธ๊ณผ ๊ต์ฐฉ ์ํ ์ ์ ์ ๊ธ์ ์ฌ์ฉํ ๋ ์ ๊ธ ์์์ ๋ฐ๋ฅธ ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ์ฃผ์ํด์ผํ๋ค.\n์ ์ ์ ๊ธ์ ๋ฐ๋ฅธ ๊ต์ฐฉ ์ํ๋ ์ฌ์ฉ์ ์๊ฐ ๋ง์๋ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.\n๋ํ ๊ต์ฐฉ ์ํ์ ๋น ์ง๋ ์ค๋ ๋๋ ๋น ๋ฅด๊ฒ ์ฆ๊ฐํ๋ค.\n์ด๋ฐ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ต๋ ๋๊ธฐ ์๊ฐ์ ์ง์ ํด์ผ ํ๋ค.\nSpring Data Jpa๋ @QueryHints ์ ๋
ธํ
์ด์
์ ์ฌ์ฉํ๋ค.\nDBMS์ ๋ฐ๋ผ ๊ต์ฐฉ ์ํ์ ๋น ์ง ์ปค๋ฅ์
์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๋ DBMS์ ๋ํด JPA๊ฐ ์ด๋ค ์์ผ๋ก ๋๊ธฐ ์๊ฐ์ ์ฒ๋ฆฌํ๋์ง ๋ฐ๋์ ํ์ธํด์ผ ํ๋ค.\n8.3 ๋น์ ์ ์ ๊ธ ์ ์ ์ ๊ธ์ด ๊ฐ๋ ฅํด ๋ณด์ด๊ธด ํ์ง๋ง ์ ์ ์ ๊ธ์ผ๋ก ๋ชจ๋ ํธ๋์ญ์
์ถฉ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ ๊ฒ์ ์๋๋ค.\n์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ์ํฉ์์๋ ์ ์ ์ ๊ธ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.\n์ด๋ฐ ๋ฌธ์ ๋ DBMS ๋ฐ์ ์์ ์ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธํ์ฌ ๋ณ๊ฒฝํ๋ค.\n๋ค์๊ณผ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ๋ฒ์ ์ ๋ฃ์ด ์์ ํ ๋ ๋ง๋ค ๋ฒ์ ์ผ๋ก ์ฌ์ฉํ ํ๋กํผํฐ ๊ฐ์ด 1์ฉ ์ฆ๊ฐํ๊ฒ ๊ตฌํํ๋ฉด ๋๋ค.\n์ด๋ ๊ฒ ๋๋ฉด ๋ค๋ฅธ ๋ ์ค๋ ๋๊ฐ์ ์๋ชป๋ ๋ฐ์ดํฐ ์์ ์ ๋ฐฉ์ง ํ ์ ์๋ค.\n8.4 ์คํ๋ผ์ธ ์ ์ ์ ๊ธ ์ ์ ์ ๊ธ์ด๋ ๋น์ ์ ์ ์ค์ผ๋ก ํด๊ฒฐํ ์ ์์๋ ํ์ํ ๊ฒ์ด ์คํ๋ผ์ธ ์ ์ ์ ๊ธ์ด๋ค.\n๋จ์ผ ํธ๋์ญ์
์์ ๋ง๋ ์ ์ ์ ๊ธ๊ณผ๋ ๋ฌ๋ฆฌ ์ฌ๋ฌ ํธ๋์ญ์
์์ ๋์ ๋ณ๊ฒฝ์ ๋ง๋๋ค.\n์ฒซ ๋ฒ์งธ ํธ๋์ญ์
์ ์์ํ๋ฉด ์คํ๋ผ์ธ ์ ๊ธ์ ์ ์ ํ๊ณ ๋ง์ง๋ง ํธ๋์ญ์
์์ ์ ๊ธ์ ํด์ ํ๋ค.\n์ ๊ธ ํด์ ์ ๊น์ง ๋ค๋ฅธ ์ฌ์ฉ์๋ ์ ๊ธ์ ํด์ ํ ์ ์๋ค.\n๊ทธ๋ฆผ์ ๋ณด๋ฉด A๊ฐ ๊ณผ์ 3์ ์์ ์์ฒญ์ ์ํํ์ง ์๊ณ ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํ๊ฒ ๋๋ฉด ์ ๊ธ์ ํด์ ํ์ง ์์ผ๋ฏ๋ก ๋ค๋ฅธ ์ฌ์ฉ์๋ ์์ํ ์ ๊ธ์ ๊ตฌํ ์ ์๋ค.\n๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์คํ๋ผ์ธ ์ ์ ๋ฐฉ์์๋ ์ ๊ธ ์ ํจ ์๊ฐ์ด ํ์ํ๋ค.\n์ ํจ์๊ฐ์ด ์ง๋๋ฉด ์๋์ผ๋ก ์ ๊ธ์ ํด์ ํด ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ์ ๊ธ์ ๊ตฌํ ์ ์๋๋ก ํด์ผ ํ๋ค.\n์คํ๋ผ์ธ ์ ์ ์ ๊ธ์ ์ํ ๋ฐฉ๋ฒ์ผ๋ก๋\nLockManager ์ธํฐํ์ด์ค์ ๊ด๋ จ ํด๋์ค, DB๋ฅผ ์ด์ฉํ LockManager ๊ตฌํ ๋ฐฉ๋ฒ์ด ์๋ค.\nREFERENCE ๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ\n ","permalink":"https://www.springboot.kr/posts/java/start-ddd/ep8-start-ddd/","summary":"DDD START SERIES๋ ๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ ์ฑ
์ ์ฐธ๊ณ ํ์ฌ ์์ฑ๋ ์์ฝ(?) ๊ธ ์
๋๋ค.\n8.1 ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ํธ๋์ญ์
. ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ์ผ๊ด์ฑ์ด ๊นจ์ง๋ฉด ์๋๋ค.\n๊นจ์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ ค๋ฉด 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.\n A ์์ ํ๊ณ ์๋ ๋์ B์์ ์์ ํ ์ ์๊ฒ ๋ง๋๋ค. A๊ฐ ์กฐํ๋ฅผ ํ๊ณ B๊ฐ ๋ณ๊ฒฝ์ ํ๋ฉด A๋ B์ ์์ ์ด ๋๋๋ฉด ์ฌ์กฐํ๋ฅผ ํด์ ์์ ํ๋ค. ์ด ๋ฐฉ๋ฒ๋ค์ ์ ๊ทธ๋ฆฌ์ปคํธ์ ์์ฒด์ ํธ๋์ญ์
๊ณผ ๊ด๋ จ์ด ์๋ค.\nDBMS๊ฐ ์ง์ํ๋ ํธ๋์ญ์
๊ณผ ํจ๊ป ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ์ํ ์ถ๊ฐ์ ์ธ ํธ๋์ญ์
์ฒ๋ฆฌ ๊ธฐ๋ฒ์ด ํ์ํ๋ค.","title":"[DDD START SERIES] EP.8 ์ ๊ทธ๋ฆฌ๊ฑฐํธ ํธ๋์ญ์
๊ด๋ฆฌ"},{"content":"DDD START SERIES๋ ๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ ์ฑ
์ ์ฐธ๊ณ ํ์ฌ ์์ฑ๋ ์์ฝ(?) ๊ธ ์
๋๋ค.\n7.1 ์ฌ๋ฌ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๊ฐ ํ์ํ ๊ธฐ๋ฅ ํ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ๋ฃ๊ธฐ ์ ๋งคํ ๋๋ฉ์ธ ๊ธฐ๋ฅ์ ์ต์ง๋ก ํน์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ๊ตฌํํ๋ฉด ์ ๋๋ค.\n์ต์ง๋ก ๊ตฌํํ ๊ฒฝ์ฐ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ์์ ์ ์ฑ
์ ๋ฒ์๋ฅผ ๋์ด์๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.\n๋๋ฌธ์ ์ฝ๋๊ฐ ๊ธธ์ด์ง๊ณ ์ธ๋ถ์ ๋ํ ์์กด์ด ๋์์ง๊ฒ ๋๋ฉฐ ์ฝ๋๋ฅผ ๋ณต์กํ๊ฒ ๋ง๋ค์ด ์์ ์ ์ด๋ ต๊ฒ ๋ง๋ ๋ค.\n๊ฒ๋ค๊ฐ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ๋ฒ์๋ฅผ ๋์ด์๋ ๋๋ฉ์ธ ๊ฐ๋
์ด ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ์จ์ด๋ค์ด ๋ช
์์ ์ผ๋ก ๋๋ฌ๋์ง ์๊ฒ ๋๋ค.\n์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ฌ์ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ฉ์ธ ๊ธฐ๋ฅ์ ๋ณ๋์ ์๋น์ค๋ก ๋ง๋๋ ๊ฒ์ด๋ค.\n7.2 ๋๋ฉ์ธ ์๋น์ค ๋๋ฉ์ธ ์๋น์ค๋ ๋๋ฉ์ธ ์์ญ์ ์์นํ ๋๋ฉ์ธ ๋ก์ง์ ํํํ ๋ ์ฌ์ฉํ๋ค.\n์ฃผ๋ก ์๋์ ๊ฐ์ ๊ฒฝ์ฐ์ ๋๋ฉ์ธ ์๋น์ค๋ฅผ ์์ฑํ๋ค.\n ๊ณ์ฐ ๋ก์ง - ์ฌ๋ฌ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๊ฐ ํ์ํ ๊ณ์ฐ ๋ก์ง. ํ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ๋ฃ๊ธฐ์ ๋ค์ ๋ณต์กํ ๋ก์ง. ์ธ๋ถ ์์คํ
์ฐ๋์ด ํ์ํ ๋๋ฉ์ธ ๋ก์ง - ๊ตฌํํ๊ธฐ ์ํด ํ ์์คํ
์ ์ฌ์ฉํด์ผ ํ๋ ๋๋ฉ์ธ ๋ก์ง. 7.2.1 ๊ณ์ฐ ๋ก์ง๊ณผ ๋๋ฉ์ธ ์๋น์ค ํ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ๋ฃ๊ธฐ ์ ๋งคํ ๋๋ฉ์ธ ๊ฐ๋
์ ๊ตฌํํ๋ ค๋ฉด ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ์ต์ง๋ก ๋ฃ๊ธฐ๋ณด๋ค๋ ๋๋ฉ์ธ ์ ๋ฒ์ค๋ฅผ ์ด์ฉํด ๋๋ฉ์ธ ๊ฐ๋
์ ๋ช
์์ ์ผ๋ก ๋ค์ด๋ธ๋ค.\n์์ฉ ์์ญ์ ์๋น์ค๊ฐ ์์ฉ ๋ก์ง์ ๋ค๋ฃฌ๋ค๋ฉด ๋๋ฉ์ธ ์๋น์ค๋ ๋๋ฉ์ธ ๋ก์ง์ ๋ค๋ฃฌ๋ค.\n๋๋ฉ์ธ ์์ญ์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ ๋ฒจ๋ฅ์ ๊ฐ์ ๊ตฌ์ฑ์์์ ๋๋ฉ์ธ ์๋น์ค๋ฅผ ๋น๊ตํ ๋ ๋ค๋ฅธ ์ ์ ๋๋ฉ์ธ ์๋น์ค๋ ์ํ ์์ด ๋ก์ง๋ง ๊ตฌํํ๋ค๋ ์ ์ด๋ค.\n๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋น์ค ๊ตฌํ์ ํ์ํ ์ํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ฌ๋ฐ๋๋ค.\n๋๋ฉ์ธ ์๋น์ค๋ ๋๋ฉ์ธ์ ์๋ฏธ๊ฐ ๋๋ฌ๋๋ ์ฉ์ด๋ฅผ ํ์
๊ณผ ๋ฉ์๋ ์ด๋ฆ์ผ๋ก ๊ฐ๋๋ค.\n์ ๊ทธ๋ฆฌ๊ฑฐํธ ๊ฐ์ฒด์ ๋๋ฉ์ธ ์๋น์ค๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ์์ฉ ์๋ฒ์ค ์ฑ
์์ด๋ค.\n์ฃผ์ํ ์ ์ ๋๋ฉ์ธ ์๋น์ค๋ฅผ ์๊ทธ๋ฆฌ๊ฑฐํธ์ ์ฃผ์
ํด์๋ ์ ๋๋ค.\n์ฃผ์
ํ๋ค๋ ๊ฑด ๊ณณ ์์กดํ๋ค๋ ๊ฒ์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ด๋ค.\n์ด๋ ํ๋ ์์ํฌ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฐ๋ฐ์์ ์์ฌ์ ์ฑ์ฐ๋ ๊ฒ์ ๋ถ๊ณผํ๋ค.\n๋๋ฉ์ธ ์๋น์ค๋ ๋๋ฉ์ธ ๋ก์ง์ ์ํํ๋ ๊ฒ์ด์ง ์์ฉ ๋ก์ง์ ์ํํ๋ ๊ฒ์ด ์๋๋ค.\nํธ๋์ญ์
์ฒ๋ฆฌ ๊ฐ์ ๋ก์ง์ ์์ฉ ๋ก์ง์ด๋ฏ๋ก ๋๋ฉ์ธ ์๋น์ค๊ฐ ์๋ ์์ฉ ์๋น์ค์์ ์ฒ๋ฆฌํด์ผ ํ๋ค.\n7.2.2 ์ธ๋ถ ์์คํ
์ฐ๋๊ณผ ๋๋ฉ์ธ ์๋น์ค 7.2.3 ๋๋ฉ์ธ ์๋น์ค์ ํจํค์ง ์์น ๋๋ฉ์ธ ์๋น์ค์ ๊ฐ์๊ฐ ๋ง๊ฑฐ๋ ์ํฐํฐ๋ ๋ฐธ๋ฅ์ ๊ฐ์ ๋ค๋ฅธ ๊ตฌ์ฑ์์์ ๋ช
์์ ์ผ๋ก ๊ตฌ๋ถํ๊ณ ์ถ๋ค๋ฉด domain ํจํค์ง ๋ฐ์ model, service, repository ์ ๊ฐ์ ํ์ ํจํค์ง๋ฅผ ๊ตฌ๋ถํ์ฌ ์์น ์์ผ๋ ๋๋ค.\n7.2.4 ๋๋ฉ์ธ ์๋น์ค์ ์ธํฐํ์ด์ค์ ํด๋์ค ๋๋ฉ์ธ ์๋น์ค์ ๋ก์ง์ด ๊ณ ์ ๋์ด ์์ง ์์ ๊ฒฝ์ฐ ๋๋ฉ์ธ ์๋น์ค ์์ฒด๋ฅผ ์ธํฐํ์ด์ค๋ก ๊ตฌํํ๊ณ ์ด๋ฅผ ๊ตฌํํ ํด๋์ค๋ฅผ ๋ ์๋ ์๋ค.\nํนํ ๋๋ฉ์ธ ๋ก์ง์ ์ธ๋ถ ์์คํ
์ด๋ ๋ณ๋ ์์ง์ ์ด์ฉํด์ ๊ตฌํํ ๋ ์ธํฐํ์ด์ค์ ํด๋์ค๋ฅผ ๋ถ๋ฆฌํ๊ฒ ๋๋ค.\nREFERENCE ๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ\n ","permalink":"https://www.springboot.kr/posts/java/start-ddd/ep7-start-ddd/","summary":"DDD START SERIES๋ ๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ ์ฑ
์ ์ฐธ๊ณ ํ์ฌ ์์ฑ๋ ์์ฝ(?) ๊ธ ์
๋๋ค.\n7.1 ์ฌ๋ฌ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๊ฐ ํ์ํ ๊ธฐ๋ฅ ํ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ๋ฃ๊ธฐ ์ ๋งคํ ๋๋ฉ์ธ ๊ธฐ๋ฅ์ ์ต์ง๋ก ํน์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ๊ตฌํํ๋ฉด ์ ๋๋ค.\n์ต์ง๋ก ๊ตฌํํ ๊ฒฝ์ฐ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ์์ ์ ์ฑ
์ ๋ฒ์๋ฅผ ๋์ด์๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.\n๋๋ฌธ์ ์ฝ๋๊ฐ ๊ธธ์ด์ง๊ณ ์ธ๋ถ์ ๋ํ ์์กด์ด ๋์์ง๊ฒ ๋๋ฉฐ ์ฝ๋๋ฅผ ๋ณต์กํ๊ฒ ๋ง๋ค์ด ์์ ์ ์ด๋ ต๊ฒ ๋ง๋ ๋ค.\n๊ฒ๋ค๊ฐ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ๋ฒ์๋ฅผ ๋์ด์๋ ๋๋ฉ์ธ ๊ฐ๋
์ด ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ์จ์ด๋ค์ด ๋ช
์์ ์ผ๋ก ๋๋ฌ๋์ง ์๊ฒ ๋๋ค.\n์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ฌ์ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ฉ์ธ ๊ธฐ๋ฅ์ ๋ณ๋์ ์๋น์ค๋ก ๋ง๋๋ ๊ฒ์ด๋ค.","title":"[DDD START SERIES] EP.7 ๋๋ฉ์ธ ์๋น์ค"},{"content":"OCP๋? OCP (Open-Closed Principle)๋ ์ํํธ์จ์ด ๋์์ธ ์์น ์ค ํ๋๋ก, ์ํํธ์จ์ด ์ํฐํฐ(ํด๋์ค, ๋ชจ๋, ํจ์ ๋ฑ)๋ ํ์ฅ์๋ ์ด๋ ค ์์ด์ผ ํ๊ณ ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค๋ ์์น์ ๋ํ๋
๋๋ค. ์ด ์์น์ ๋ก๋ฒํธ C. ๋งํด(Robert C. Martin)์ด ๊ฐ๋ฐํ SOLID ์์น ์ค ํ๋๋ก, ์ํํธ์จ์ด ์์คํ
์ ์ ์ง๋ณด์ํ๊ณ ํ์ฅํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๋ฐ ๊ธฐ์ฌํฉ๋๋ค.\nOCP์ ์ฃผ์ ๊ฐ๋
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.\nํ์ฅ์๋ ์ด๋ ค ์์ด์ผ ํจ(Open for Extension): ์ํํธ์จ์ด ์ํฐํฐ(ํด๋์ค ๋๋ ๋ชจ๋)๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์์ด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ์๋ก์ด ์๊ตฌ ์ฌํญ์ด๋ ๊ธฐ๋ฅ ์ถ๊ฐ์ ๋์ํ๊ธฐ ์ํ ํ์ฅ ๊ฐ๋ฅ์ฑ์ ์๋ฏธํฉ๋๋ค.\n๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํจ(Closed for Modification): ์ํํธ์จ์ด ์ํฐํฐ๋ ์ด๋ฏธ ๋์ ์ค์ธ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์์ผ ํฉ๋๋ค. ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ์์ ํ๊ธฐ ์ํด์๋ ์ด๋ฏธ ์์ฑ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.\n์คํ๋ง ํ๋ ์์ํฌ๋ OCP ์์น์ ๋ฐ๋ฅด๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์คํ๋ง์ ์ธํฐํ์ด์ค, ์ถ์ ํด๋์ค, ์์กด์ฑ ์ฃผ์
(Dependency Injection), AOP(Aspect-Oriented Programming) ๋ฑ์ ํตํด ์์คํ
์ ํ์ฅ ๊ฐ๋ฅํ๊ณ ๋ณ๊ฒฝ์ ๋ซํ ํํ๋ก ๊ตฌ์ฑํฉ๋๋ค. ์ด๋ฌํ ๋์์ธ์ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ง๋ณด์ํ๊ณ ํ์ฅํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด์ฃผ๋ฉฐ, ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ๊ธฐ์กด ๊ธฐ๋ฅ์ ์์ ํ ๋ ์ฝ๋์ ์์ ์ฑ๊ณผ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.\n๊ทธ๋ผ ์ด๋ป๊ฒ ํ๋ฉด ์ข์ ์ ์์๊น?\n์์ ๋ก ์ํ์ ์กฐํ๋ฅผ ์์ฒญํ๋ ๋ฉ์๋๋ฅผ ์์ฑ ์ค ๊ฐ ์ํ์ ์๊ตฌ์ฌํญ์ ๋ง๋ ์ปท์คํ๋ฅผ ์ค์ ํ ๋๋ฅผ ์๋ก ๋ค์ด ๋ณผ ์์ ์ด๋ค.\nOCP ์ฒดํ ํด๋ณด๊ธฐ ์ถ์ํ ์ฐ์ ๋ค์๊ณผ ๊ฐ์ด BankCutOff๋ผ๋ interface๋ก ์ถ์ํ๋ฅผ ๊ตฌํํ๋ค.\npublic interface BankCutOff { boolean isSameBank(Bank bank); boolean isCutOff(); } ๊ทธ๋ค์์ผ๋ก ์ํ์ ํ๋ณํ enum์ ์์ฑํด ์ฃผ๊ณ \nimport lombok.AllArgsConstructor; import lombok.Getter; @AllArgsConstructor @Getter public enum Bank { HANA, SC, WOORI, ; } ์ถ์ํ ๊ตฌํ ๊ทธ๋ค์์ผ๋ก BankCutOff๋ฅผ ๊ตฌํํ๋ ๊ตฌํ์ฒด 3๊ฐ์ง๋ฅผ ๊ตฌํํด ๋ณด์.\n@Service @Slf4j public class HanaBankCutOff implements BankCutOff { private static final String BANK_NAME = \u0026#34;HANA_BANK\u0026#34;; @Override public boolean isSameBank(Bank bank) { return bank == Bank.HANA; } @Override public boolean isCutOff() { log.info(\u0026#34;ํ๋ ์ํ ์ปท์คํ ์คํ\u0026#34;); return true; } } @Service @Slf4j public class ScBankCutOff implements BankCutOff { @Override public boolean isSameBank(Bank bank) { return bank == Bank.SC; } @Override public boolean isCutOff() { log.info(\u0026#34;์ ์ผ ์ํ ์ปท์คํ ์คํ\u0026#34;); return false; } } @Service @Slf4j public class WooriBankCutOff implements BankCutOff { @Override public boolean isSameBank(Bank bank) { return bank == Bank.WOORI; } @Override public boolean isCutOff() { log.info(\u0026#34;์ฐ๋ฆฌ ์ํ ์ปท์คํ ์คํ\u0026#34;); return true; } } ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ ํ\nํธ๋ค๋ฌ ๊ตฌํ ๋ง์ง๋ง์ผ๋ก ์๋์ ๊ฐ์ ํธ๋ค๋ฌ๋ฅผ ํ๋ ๊ตฌํํด ๋ณด์\n@RequiredArgsConstructor @Component public class BankCutOffHandler { private final Set\u0026lt;BankCutOff\u0026gt; bankCutOffs; public boolean getBankCutOff(Bank bank) { BankCutOff cutOff = bankCutOffs.stream() .filter(bankCutOff -\u0026gt; bankCutOff.isSameBank(bank)) .findFirst() .orElseThrow(() -\u0026gt; new IllegalArgumentException(\u0026#34;BAD REQUEST\u0026#34;)); return cutOff.isCutOff(); } } ํ
์คํธ ์ฝ๋ ์์ฑ ํ
์คํธ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ ํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด๋ฉด~~~~~~\n๊ฒฐ๊ณผ ์ ์คํ๋๋ ๊ฑธ ์ ์ ์๋ค.\n","permalink":"https://www.springboot.kr/posts/spring/ocp-pracitce/","summary":"OCP๋? OCP (Open-Closed Principle)๋ ์ํํธ์จ์ด ๋์์ธ ์์น ์ค ํ๋๋ก, ์ํํธ์จ์ด ์ํฐํฐ(ํด๋์ค, ๋ชจ๋, ํจ์ ๋ฑ)๋ ํ์ฅ์๋ ์ด๋ ค ์์ด์ผ ํ๊ณ ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค๋ ์์น์ ๋ํ๋
๋๋ค. ์ด ์์น์ ๋ก๋ฒํธ C. ๋งํด(Robert C. Martin)์ด ๊ฐ๋ฐํ SOLID ์์น ์ค ํ๋๋ก, ์ํํธ์จ์ด ์์คํ
์ ์ ์ง๋ณด์ํ๊ณ ํ์ฅํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๋ฐ ๊ธฐ์ฌํฉ๋๋ค.\nOCP์ ์ฃผ์ ๊ฐ๋
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.\nํ์ฅ์๋ ์ด๋ ค ์์ด์ผ ํจ(Open for Extension): ์ํํธ์จ์ด ์ํฐํฐ(ํด๋์ค ๋๋ ๋ชจ๋)๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์์ด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ์๋ก์ด ์๊ตฌ ์ฌํญ์ด๋ ๊ธฐ๋ฅ ์ถ๊ฐ์ ๋์ํ๊ธฐ ์ํ ํ์ฅ ๊ฐ๋ฅ์ฑ์ ์๋ฏธํฉ๋๋ค.","title":"์คํ๋ง์ผ๋ก OCP ์ผ๋ฌด์ง๊ฒ ์ฒดํํด๋ณด๊ธฐ"},{"content":"DDD START SERIES๋ ๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ ์ฑ
์ ์ฐธ๊ณ ํ์ฌ ์์ฑ๋ ์์ฝ ๊ธ ์
๋๋ค.\n6.1 ํํ ์์ญ๊ณผ ์์ฉ ์์ญ ๋๋ฉ์ธ์ด ์ ๊ธฐ๋ฅ์ ํ๋ ค๋ฉด ์ฌ์ฉ์์ ๋๋ฉ์ธ์ ์ฐ๊ฒฐํด ์ฃผ๋ ๋งค๊ฐ์ฒด๊ฐ ํ์ํ๋ค.\n์์ฉ ์์ญ๊ณผ ํํ ์์ญ์ด ์ฌ์ฉ์์ ๋๋ฉ์ธ์ ์ฐ๊ฒฐํด ์ฃผ๋ ๋งค๊ฐ์ฒด ์ญํ ์ ํ๋ค.\n์ฌ์ฉ์ โ ํํ ์์ญ โ ์์ฉ ์์ญ โ ๋๋ฉ์ธ ์์ญ\nํํ ์์ญ์ ์ฌ์ฉ์์ ์์ฒญ์ ํด์ํ๋ค.\nํด์ ํ ์ํ๋ ๊ธฐ๋ฅ์ ํ๋ณํ์ฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์์ฉ ์๋น์ค๋ฅผ ์คํํ๋ค.\n์ค์ ์ฌ์ฉ์๊ฐ ์ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ ์์ฉ ์์ญ์ ์์นํ ์๋น์ค๋ค.\nex) ์ฌ์ฉ์๊ฐ ํ์ ๊ฐ์
์ ์์ฒญํ๋ค๋ฉด ์ค์ ์์ฒญ์ ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ฃผ์ฒด๋ ์์ฉ ์๋น์ค์ ์์นํ๋ค.\n์์ฉ ์๋น์ค๋ ๊ธฐ๋ฅ์ ์คํํ๋๋ฐ ํ์ํ ์
๋ ฅ๊ฐ์ ๋ฉ์๋ ์ธ์๋ก ๋ฐ๊ณ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๋ค.\nํํ ์์ญ์ ์์ฉ ์๋น์ค๊ฐ ์๊ตฌํ๋ ํ์์ผ๋ก ์ฌ์ฉ์ ์์ฒญ์ ๋ณํํ๋ค.\n6.2 ์์ฉ ์๋น์ค์ ์ญํ ๊ณต์ฉ ์๋น์ค๋ ์ฌ์ฉ์๊ฐ ์์ฒญํ ๊ธฐ๋ฅ์ ์คํํ ๊ทธ๋ฌ๊ธฐ ์ํด ๋ฆฌํฌ์งํฐ๋ฆฌ์์ ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํ๋ค.\nํํ ์์ญ ์
์ฅ์์ ๋๋ฉ์ธ ์์ญ๊ณผ ์ฐ๊ฒฐํด ์ฃผ๋ ๋ธ๋ฆฟ์ง(์์ฉ ์์ญ) ์ญํ ์ด๋ค.\n์์ฉ ์๋น์ค๋ ์ฃผ๋ก ๋๋ฉ์ธ ๊ฐ์ฒด ๊ฐ์ ํ๋ฆ์ ์ ์ดํ๊ธฐ์ ๋จ์ํ ํํ๋ฅผ ๊ฐ์ง๋ค.\nex) 1. ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ๊ตฌํ๋ค. 2. ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ๋๋ฉ์ธ ๊ธฐ๋ฅ์ ์คํํ๋ค. 3. ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๋ค. ๋ง์ฝ ์์ฉ ์๋น์ค๊ฐ ๋ณต์กํ๋ค๋ฉด ์์ฉ ์๋น์ค์์ ๋๋ฉ์ธ ๋ก์ง์ ์ผ๋ถ๋ฅผ ๊ตฌํํ๊ณ ์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.\n์์ฉ ์๋น์ค๊ฐ ๋๋ฉ์ธ ๋ก์ง์ ๊ตฌํํ๋ฉด ์ฝ๋ ์ค๋ณต, ๋ก์ง ๋ถ์ฐ ๋ฑ ์ฝ๋ ํ์ง์ ์ ์ข์ ์ํฅ์ ์ค ์ ์๋ค.\n๋ํ ์์ฉ ์๋น์ค๋ ํธ๋์ญ์
์ฒ๋ฆฌ๋ ๋ด๋นํ๋ฉฐ ์์ฉ ์๋น์ค๋ ๋๋ฉ์ธ์ ์ํ ๋ณ๊ฒฝ์ ํธ๋์ญ์
์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค.\nํธ๋์ญ์
์ธ ์ฃผ์ ์ญํ ๋ก ์ ๊ทผ ์ ์ด์ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ฐ ์๋ค.\n6.2.1 ๋๋ฉ์ธ ๋ก์ง ๋ฃ์ง ์๊ธฐ ์์ฉ ์๋น์ค๋ ๋๋ฉ์ธ ๋ก์ง์ ๊ตฌํํ๋ฉด ์ ๋๋ค.\n๋๋ฉ์ธ ๋ก์ง์ ๋๋ฉ์ธ ์์ญ๊ณผ ์์ฉ ์์ญ์ ๋ถ์ฐ ๊ตฌํํ๋ฉด ์ฝ๋ ํ์ง์ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.\n ์์ง๋๊ฐ ๋จ์ด์ง๋ค.\n ์ฌ๋ฌ ์์ฉ ์๋น์ค์์ ๋์ผํ ๋ก์ง์ ๊ตฌํํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.\n ์ด๋ฌํ ๋ฌธ์ ์ ๋ค์ ์์ง๋๊ฐ ๋จ์ด์ง๊ณ ์ฝ๋ ์ค๋ณต์ด ๋ฐ์ํ๋ ์ฝ๋๋ฅผ ๋ง๋ค๊ฒ ๋๋ค.\n๊ทธ๋ผ ์ฝ๋ ๋ณ๊ฒฝ์ด ์ด๋ ต๊ณ ์ํํธ์จ์ด์ ๊ฐ์น๊ฐ ๋จ์ด์ง๊ฒ ๋๋๋ฐ ๋จ์ด์ง์ง ์๊ณ ๊ฐ์น๋ฅผ ๋์ด๊ธฐ ์ํด์ ์์ ๋ฌธ์ ์ ๋ค์ ์ ์ธํ๊ณ ๊ตฌํํ๋ฉด ์์ง๋๋ฅผ ๋์ด๊ณ ์ฝ๋์ ์ค๋ณต์ ๋ง์ ์ ์๋ค.\n6.3 ์์ฉ ์๋น์ค์ ๊ตฌํ ์์ฉ ์๋น์ค๋ ํํ ์์ญ๊ณผ ๋๋ฉ์ธ ์์ญ์ ์ฐ๊ฒฐํ ๋งค๊ฐ์ฒด ์ญํ ์ ํ๋ค.(์ด๋ ๋์์ธ ํจํด์ ํผ์ฌ๋์ ๊ฐ์ ์ญํ ์ ํ๋ค.)\n์์ฉ ์๋น์ค๋ ๋ณต์กํ ๋ก์ง์ ํ์ง ์ํํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ ์ด๋ ต์ง ์๋ค.\n6.3.1 ์์ฉ ์๋น์ค์ ํฌ๊ธฐ ์์ฉ ์๋น์ค๋ ๊ตฌํ์ด ์ด๋ ต์ง ์์ง๋ง ์๊ฐํ ๊ฒ ๋ช ๊ฐ ์๋๋ฐ ๊ทธ์ค ํ๋๊ฐ ์์ฉ ์๋น์ค์ ํฌ๊ธฐ๋ค.\n ์์ฉ ์๋น์ค ํด๋์ค์ ๋๋ฉ์ธ์ ๋ชจ๋ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ\n ๊ตฌ๋ถ๋๋ ๊ธฐ๋ฅ๋ณ๋ก ์์ฉ ์๋น์ค ํด๋์ค๋ฅผ ๋ฐ๋ก ๊ตฌํํ๊ธฐ\n ํ ๋๋ฉ์ธ ๊ด๋ จ ๊ธฐ๋ฅ์ ํ๋์ ํด๋์ค์ ๊ตฌํํ๋ฉด ๋์ผํ ๋ก์ง์ ๋ํ ์ค๋ณต์ ์์จ ์ ์๋ค.\n์ด๊ฒ ์ฅ์ ์ด์ง๋ง ๋จ์ ์ ํด๋์ค์ ๊ธฐ๋ฅ์ด ๋ชฐ๋ ค ์์ด ํด๋์ค๊ฐ ์ปค์ง ์๊ฐ ์๋ค.\n๊ทธ๋ผ ๊ฒฐ๊ตญ์ ์ฐ๊ด์ฑ์ด ์๋ ์ฝ๋๋ผ๋ฆฌ ๋ญ์ณ์ ์ฝ๋๊ฐ ๋ณด๊ธฐ ํ๋ค ์ ์๋ค.\n๋ํ ํ ํด๋์ค์ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด ์์ฐํ ๋ถ๋ฆฌํ๋ ๊ฒ ์ข์ ๋ณด์์๋ ์ต๊ด์ ์ผ๋ก ๊ธฐ์กด ์ฝ๋์ ์ต์ง๋ก ๋ผ์ ๋ฃ๊ฒ ๋๋ค.\n์ด๊ฒ์ ์ฝ๋๋ฅผ ์ ์ ์ฝํ๊ฒ ๋ง๋ค์ด ์ฝ๋ ํ์ง์ ๋ฎ์ถ๋ค.\n๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ตฌ๋ถ๋๋ ๊ธฐ๋ฅ๋ณ๋ก ์๋น์ค ํด๋์ค๋ฅผ ๊ตฌํํ๋ ๋ฐฉ์์ ํ ์์ฉ ์๋น์ค ํด๋์ค์ ํ ๊ฐ ๋ด์ง 2~3๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.\n์ด ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ํด๋์ค๋ ๋ง์์ง์ง๋ง ์ฝ๋์ ํ์ง์ ์ผ์ ์์ค ์ ์ง๋๋ค.\n๋ํ ๊ฐ ํด๋์ค ๋ณ๋ก ํ์ํ ์์กด ๊ฐ์ฒด๋ง ํฌํจํ๋ฏ๋ก ๋ค๋ฅธ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ฝ๋์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.\n๊ฐ ๊ธฐ๋ฅ๋ง๋ค ๋์ผํ ๋ก์ง์ ๊ตฌํํ ๊ฒฝ์ฐ ๋ณ๋์ ํด๋์ค๋ฅผ ๊ตฌํํด ์ฌ์ฉํ ์ ์๋ค.\nex)\npublic final userServiceHelper { public static User findBy(String name) { // ~~~~ } } 6.3.2 ์์ฉ ์๋น์ค์ ์ธํฐํ์ด์ค์ ํด๋์ค ์ธํฐํ์ด์ค๊ฐ ํ์ํ ๊ฒฝ์ฐ๋ ๊ตฌํ์ฒด๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ์ธ๋ฐ ํ์ง๋ง ์์ฉ ์๋น์ค๋ ๊ตฌํ์ฒด๊ฐ ๋ ๊ฐ์ธ ๊ฒฝ์ฐ๋ ๋๋ฌผ๋ค.\n์ด๋ฌํ ์ด์ ๋ก ์ธํด ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ฅผ ํ๊ณ ๊ตฌํํ๋ฉด ์์ค ํ์ผ๋ง ๋ง์์ง๊ณ ๊ตฌํ ํด๋์ค์ ๋ํ ๊ฐ์ ์ฐธ์กฐ๊ฐ ์ฆ๊ฐํด ์ ์ฒด ๊ตฌ์กฐ๊ฐ ๋ณต์กํด์ง๊ฒ ๋๋ค.\n๋ฐ๋ผ์ ์ธํฐํ์ด์ค๊ฐ ๋ช
ํํ๊ฒ ํ์ํ๊ธฐ ์ ๊น์ง๋ ์์ฉ ์๋น์ค์ ๋ํ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข์ ์ ํ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.\n6.3.3. ๋ฉ์๋ ํ๋ผ๋ฏธํฐ์ ๊ฐ ๋ฆฌํด ์์ฉ ์๋น์ค๋ก์ ๊ฐ ์ ๋ฌ์์ ํ๋ผ๋ฏธํฐ๊ฐ 2๊ฐ ์ด์์ธ ๊ฒฝ์ฐ ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ ๋ฌํ๋ ๊ฒ์ด ํธ๋ฆฌํ๋ค.\n๋ํ ํํ ์์ญ์์ ์์ฉ ์๋น์ค์ ๊ฒฐ๊ณผ๋ก ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ ์์ฉ ์๋น์ค์ ์์์ ๊ฒฐ๊ณผ๋ก ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฆฌํดํ๋ค.\nex) ์ํ ์ฃผ๋ฌธ ํ ์ฃผ๋ฌธ์ ์ธ ๋ด์ญ์ ์กฐํํ๊ธฐ ์ํด ์ฃผ๋ฌธ๋ฒํธ๋ฅผ ๋ฆฌํดํ๋ค.\n๊ฑฐ๊ธฐ์ ์๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ๋ฆฌํดํ ์๋ ์์ง๋ง ํ์ํ ๊ฐ๋ง ์ฌ์ ์ ํ ๋ฆฌํดํ๋ ๊ฒ์ด ์ข์ผ๋ฉฐ ์์ง๋๋ฅผ ๋์ผ์์๋ค.\n6.3.4 ํํ ์์ญ์ ์์กดํ์ง ์๊ธฐ ์์ฉ ์๋น์ค์ ํ๋ผ๋ฏธํฐ ํ์
์ ๊ฒฐ์ ํ ๋๋ ํํ ์์ญ๊ณผ ๊ด๋ จ๋ ํ์
์ ์ฌ์ฉํ๋ฉด ์ ๋๋ค.\n๊ทธ ์๋ก HttpServletRequest ๋ HttpSession์ ์์ฉ ์๋น์ค๋ก ์ ๋ฌํ๋ฉด ์ ๋๋ค.\n์ด๋ ๊ฒ ๋๋ฉด ๋จ๋
์ผ๋ก ํ
์คํธํ๊ธฐ๊ฐ ์ด๋ ค์์ง๋ฉฐ ํํ ์์ญ์ด ๋ณ๊ฒฝ๋๋ฉด ์์ฉ ์๋น์ค ์์ญ๋ ๋ณ๊ฒฝํด์ผ ํ ์ ์๋ค.\n๋ ํฐ ๋ฌธ์ ๋ ์์ฉ ์๋น์ค๊ฐ ํํ ์์ญ์ ๋์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ํํ ์์ญ์ ์์ง๋๊ฐ ๊นจ์ง๊ฒ ๋ผ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ ์ง ๋ณด์ ๋น์ฉ์ด ๋ฐ์ํ๋ค.\n์ด๋ฌํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ ค๋ฉด ์์ฉ ์๋น์ค๊ฐ ํํ ์์ญ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ง ์๋๋ก ํด์ผ ํ๋ค.\n6.3.5 ํธ๋์ญ์
์ฒ๋ฆฌ ํธ๋์ญ์
์ ํ๋ ์์ํฌ๊ฐ ์ ๊ณตํ๋ ํธ๋์ญ์
๊ธฐ๋ฅ์ ์ ๊ทน ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.\n์คํ๋ง์์ ์ ๊ณตํ๋ @Transaction์ ์ฌ์ฉํด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ํธ๋์ญ์
์ฒ๋ฆฌ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์ ์งํ ์ ์๋ค.\n6.4 ํํ ์์ญ ํํ ์์ญ์ ์ญํ 3๊ฐ์ง\n ์ฌ์ฉ์์๊ฒ ํ๋ฉด ์ ๊ณต ๋ฐ ์ ์ด.\n ์ฌ์ฉ์์ ์์ฒญ์ ๋ง๋ ์์ฉ ์๋น์ค ์ ๋ฌ ๋ฐ ๊ฒฐ๊ณผ ์ ๊ณต.\n ์ฌ์ฉ์์ ์ธ์
๊ด๋ฆฌ.\n 6.5 ๊ฐ ๊ฒ์ฆ ๊ฐ ๊ฒ์ฆ ์ ๋จ์ผ๋ก ๊ฒ์ฆํ์ง ์๊ณ ์ฌ๋ฌ ๊ฐ๋ฅผ ํ ๋ฒ์ ๊ฒ์ฌํ๊ณ ์๋ฌ ๋ชฉ๋ก์ ์ถ๊ฐํ์ฌ ์ฌ์ฉ์์๊ฒ ๋ฒ๊ฑฐ๋ก์์ ์ ๊ณตํ์ง ์์ ์ ์๋ค.\n์คํ๋ง์์๋ Validator ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ธฐ์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ๊ฒ์ฆ๊ธฐ๋ฅผ ๋ง๋ค ์ ์๋ค.\nLayer ๋ณ ๊ฒ์ฆ์ ๋ฒ์\n ํํ ์์ญ - ํ์ ๊ฐ, ๊ฐ์ ํ์, ๋ณ์ ๊ฒ์ฆ.\n ์์ฉ์๋น์ค - ๋ฐ์ดํฐ์ ์ ๋ฌด ์กด์ฌ, ๋
ผ๋ฆฌ์ ์ค๋ฅ ๊ฒ์ฆ.\n ํ์ง๋ง ์ด ์ฑ
์ ๊ธ์ด์ด๋ ์์ฆ ์์ฉ ์๋น์ค์์ ๋ชจ๋ ๊ฑธ ์ฒ๋ฆฌํ๋ค๊ณ ํ๋ฉฐ ์ด๋ ์ฝ๋๊ฐ ๋์ด๊ฐ๋ ๋ถํธํจ์ด ์์ง๋ง ์์ฉ ์๋น์ค์ ์์ฑ๋ ๋์์ง๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ๋งํ๋ค.\n6.6. ๊ถํ ๊ฒ์ฌ ๊ถํ ๊ฒ์ฌ๋ ๋ณดํต ์ธ ๊ณณ์์ ์ด๋ฃจ์ด์ง๋ค.\n ํํ ์์ญ\n ์์ฉ ์๋น์ค\n ๋๋ฉ์ธ\n ํํ ์์ญ์ ๊ธฐ๋ณธ์ ์ธ ์ธ์ฆ๋ ์ฌ์ฉ์๋ฅผ ๊ฒ์ฌํ๋ค.\n์๋ก ํ์์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ ๋ ์ด์ ๊ด๋ จ๋ URL๋ก ์ ๊ทผํ ์ฌ์ฉ์๊ฐ ์ธ์ฆ๋ ์ฌ์ฉ์์ธ์ง ํ์ธํ๋ค.\n๋ง์ฝ URL๋ก ์ ์๋ ์ ๊ทผ์ ์ ์ดํ ์ ์๋ ๊ฒฝ์ฐ ์์ฉ ์๋น์ค์์ ๋ฉ์๋ ๋จ์๋ก ๊ถํ ๊ฒ์ฌ๋ฅผ ์ํํ๋ค.\n๊ผญ ์ฝ๋์ ๊ฒ์ฌ๊ฐ ์๋๋๋ผ๋ ์คํ๋ง ์ํ๋ฆฌํฐ AOP ํ์ฉํ ๊ฒ์ค๋ ์ฌ์ฉํ ์ ์๋ค.\n๊ฐ๋ณ ๋๋ฉ์ธ ๊ฐ์ฒด ๋จ์๋ก์ ๊ฒ์ฌ์ ๊ฒฝ์ฐ ๊ตฌํ์ด ๋ณต์กํด์ง๋ค.\n์คํ๋ง ์ํ๋ฆฌํฐ ๊ฐ์ ๋ณด์ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด ํ๋ ์์ํฌ์ ํตํฉํ ์๋ ์๋ค.\nํ์ง๋ง ๋ณด์ ํ๋ ์์ํฌ๋ฅผ ํ์ฅํ๋ ค๋ฉด ํ๋ ์์ํฌ์ ๋ํ ๋์ ์ดํด๋๊ฐ ํ์ํ๋ค.\n๊ทธ๋ ์ง ์๋ค๋ฉด ์ง์ ๊ตฌํํ๋ ๊ฒ์ด ์ฝ๋ ์ ์ง ๋ณด์์ ์ ๋ฆฌํ๋ค.\n6.7 ์กฐํ ์ ์ฉ ๊ธฐ๋ฅ๊ณผ ์์ฉ ์๋น์ค ์กฐํ์ ๊ธฐ๋ฅ๋ง ์๋ ์๋น์ค๋ ์ฐจ๋ผ๋ฆฌ ๊ตฌํํ์ง ์๋ ๊ฒ ์ข์ ์๋ ์๋ค.\n๋ฐ๋ก ํํ ์์ญ์ ๊ตฌํํด๋ ๋ฌธ์ ๊ฐ ์๋ค.\nREFERENCE ๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ\n ","permalink":"https://www.springboot.kr/posts/java/start-ddd/ep6-start-ddd/","summary":"DDD START SERIES๋ ๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ ์ฑ
์ ์ฐธ๊ณ ํ์ฌ ์์ฑ๋ ์์ฝ ๊ธ ์
๋๋ค.\n6.1 ํํ ์์ญ๊ณผ ์์ฉ ์์ญ ๋๋ฉ์ธ์ด ์ ๊ธฐ๋ฅ์ ํ๋ ค๋ฉด ์ฌ์ฉ์์ ๋๋ฉ์ธ์ ์ฐ๊ฒฐํด ์ฃผ๋ ๋งค๊ฐ์ฒด๊ฐ ํ์ํ๋ค.\n์์ฉ ์์ญ๊ณผ ํํ ์์ญ์ด ์ฌ์ฉ์์ ๋๋ฉ์ธ์ ์ฐ๊ฒฐํด ์ฃผ๋ ๋งค๊ฐ์ฒด ์ญํ ์ ํ๋ค.\n์ฌ์ฉ์ โ ํํ ์์ญ โ ์์ฉ ์์ญ โ ๋๋ฉ์ธ ์์ญ\nํํ ์์ญ์ ์ฌ์ฉ์์ ์์ฒญ์ ํด์ํ๋ค.\nํด์ ํ ์ํ๋ ๊ธฐ๋ฅ์ ํ๋ณํ์ฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์์ฉ ์๋น์ค๋ฅผ ์คํํ๋ค.\n์ค์ ์ฌ์ฉ์๊ฐ ์ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ ์์ฉ ์์ญ์ ์์นํ ์๋น์ค๋ค.","title":"[DDD START SERIES] EP.6 ์์ฉ ์๋น์ค์ ๊ตฌํ"},{"content":"DDD START SERIES๋ ๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ ์ฑ
์ ์ฐธ๊ณ ํ์ฌ ์์ฑ๋ ์์ฝ ๊ธ ์
๋๋ค.\nEP 3.1 ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๊ณตํต๋ ๋ชจ๋ธ์ ์ ๊ทธ๋ฆฌ์ปคํธ ๋จ์๋ก ๋ฌถ์ด์ ํํํ๋ค. ๋ณด๊ธฐ๋ ์ฌ์์ง๊ณ ์ข๋ค.\n์์ ์์ค์์ ๋ชจ๋ธํ ๋ชจ๋ธ์ ์ ๋ฆฌํ๋ฉด ๋๋ฉ์ธ์ ๋ณต์กํ ๊ด๊ณ๊ฐ ๋ ์ดํด๊ฐ ์ ๋๋ค.\n์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ๋จ์๋ก ๋ฌถ์ผ๋ฉด ์ดํดํ๋ ๊ฒ๋ฟ์๋๋ผ ์ผ๊ด์ฑ ๊ด๋ฆฌ์ ๊ธฐ์ค์ด ๋๋ค. ๋ณต์ก๋๋ฅผ ์ค์ด๊ณ ๋ณ๊ฒฝ ์๊ฐ์ ์ค์ด๋ค๊ฒ ๋ง๋ ๋ค.\n์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ก ๋ฌถ์ธ ๋๋ฉ์ธ๋ค์ ํจ๊ป ์์ฑํ๊ณ ํจ๊ป ์ ๊ฑฐํ๋ค.\n์ฃผ๋ฌธ์ผ๋ก ๋ฌถ์ธ ์งํฉ์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ ํ์์ด๋ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ์์ญ์ ์นจ๋ฒํ์ง ์๋๋ค.\n๊ฒฝ๊ณ๋ฅผ ์ค์ ํ ๋ ๊ธฐ๋ณธ์ ๋๋ฉ์ธ์ ๊ท์น๊ณผ ์๊ตฌ์ฌํญ์ด๋ค.\n๊ฐ์ด ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ๋ ๊ฐ์ ์ ๊ทธ๋ฆฌ๊ฑฐ์๋์ ์ํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค\n์ฒ์ ๋๋ฉ์ธ์ ๋ง๋ค๋ฉด ํฐ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ก ๋ณด์ด๋ ๊ฒ์ด ๋ง์ง๋ง ์ด๋์ ๋ ๋๋ฉ์ธ์ ๋ํ ์ดํด๊ฐ ์์ด๋ฉด ์ ๊ทธ๋ฆฌ์งํธ์ ์ค์ ํฌ๊ธฐ๋ ์ค์ด๋ ๋ค.\n์ ๊ทธ๋ฆฌ๊ฑฐ๋ชจ๋ฅผ ์ ์ชผ๊ฐ ๋ฌถ์ด์ผ ์ ์งํ์ ์ฉ์ดํ๋ค. ์ ๊ทธ๋ฆฌ์ํธ๋ ๊ฐ์ ์ญํ ๊ตฐ์ง์ ๋ฃ์ ์ ์๋ค.\nEP 3.2 ์ ๊ทธ๋ฆฌ์ปคํธ ๋ฃจํธ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ ์ฌ๋ฌ ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋๋ค.\n๊ทธ๋ ๊ธฐ์ ํ ๊ฐ์ฒด๋ง ์ํ๊ฐ ์ ์์ด๋ฉด ์ ๋๊ณ ๋ชจ๋๊ฐ ์ ์์ด์ฌ์ผ ํ๋ค.\n3.2.1 ๋๋ฉ์ธ ๊ท์น๊ณผ ์ผ๊ด์ฑ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ๋ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ์ผ๊ด์ฑ์ด ๊นจ์ง์ง ์๋๋กํ๋๊ฒ์ด๋ค.\n์ด๋ฅผ ์ํด ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ๋ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๊ฐ ํด์ผํ ๋๋ฉ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.\n์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ๊ฐ ์ ๊ณตํ๋ ๋ฉ์๋๋ ๋๋ฉ์ธ๊ท์น์ ๋ฐ๋ผ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ์ํ ๊ฐ์ฒด์ ์ผ๊ด์ฑ์ด ๊นจ์ง์ง ์๋๋ก ๊ตฌํํ๋ค.\n์ ๊ทธ๋ฆฌ๊ฑฐํธ ์ธ๋ถ์์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ์ํ ๊ฐ์ฒด๋ฅผ ์ง์ ๋ณ๊ฒฝํ๋ฉด ์๋๋ค.\n์ด๊ฒ์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ๊ฐ ๊ฐ์ ํ๋ ๊ท์น์ ์ ์ฉํ ์ ์์ด ๋ชจ๋ธ์ ์ผ๊ด์ฑ์ ๊นฌ๋ค.\n๋ถํ์ํ ์ค๋ณต์ ํผํ๊ณ . ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ๋ฅผ ํตํด์๋ง ๋๋ฉ์ธ ๋ก์ง์ ๊ตฌํํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ๋๊ฐ์ง ์ต๊ด์ด ํ์ํ๋ค.\n set ๋ฉ์๋๋ public์ผ๋ก ๋ง๋ค์ง ๋ง๋ผ. ๋ฒจ๋ฅ ํ์
์ ๋ถ๋ณ์ผ๋ก ๋ง๋ ๋ค. (๋ถ๋ณํ์
์ ์ธ๋ถ์์ ์์ ์ด ๋ถ๊ฐํ๋ค.) ๊ทธ๋ ๊ธฐ์ ๋ณ๊ฒฝํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋ก์ด ๋ฒจ๋ฅ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ ๋ฟ์ด๋ค.\n๊ทธ๋ผ ๊ฒฐ๊ตญ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ๋ฅผ ์จ์ผ ํ๊ธฐ์ ๊ฐ์ฒด์ ์ผ๊ด์ฑ์ด ์ ์ง๋๋ค.\n3.2.2 ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ์ ๊ธฐ๋ฅ ๊ตฌํ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ๋ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ์กฐํฉํด์ ๊ธฐ๋ฅ์ ์์ฑํ๊ฒ ๋๋ค.\n์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ์์ ์กฐํฉ์ํด ๊ธฐ๋ฅ์ ๋ง๋ค๊ณ ์ธ๋ถ์์ ๊ฐ์ ธ๋ค ์ฐ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋๋ก ํ์.\n๋ง์ฝ ์ธ๋ถ์์๋ ์ฌ์ฉํ๊ณ ์ถ์ง ์๋ค๋ฉด ์ ๊ทผ์ ์ด์๋ฅผ protected๋ก ์ ์ธํ์ฌ ๋ง์๋ณด์.\n3.2.3 ํธ๋์ญ์
์ ๋ฒ์ ํธ๋์ญ์
์ ๋ฒ์๋ ์์์๋ก ์ข๋ค. ํธ๋์ญ์
๋น 1๊ฐ์ ํ
์ด๋ธ๋ก ์ก๊ณ ๊ฐ๋๊ฒ์ด ์ฑ๋ฅ์ ์ข๋ค.\nํ๋์ ํธ๋์ญ์
์๋ ํ๋์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ๊ทธ๋ฃน๋ง ์๋ ์๋๊ฒ์ด ์ข๋ค.\n๊ฑฐ๊ธฐ๋ค ๋ค๋ฅธ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ๊ธฐ๋ฅ์ ์์กดํ๊ฒ ๋๋ฉด ์ฝ๋์ ๊ฒฐํฉ๋๊ฐ ์ฆ๊ฐํ๊ณ ์์ ๋น์ฉ๋ ์ฆ๊ฐํ๋ค.\n๋ถ๋์ดํ๊ฒ ํ ํธ๋์ญ์
์ผ๋ก ๋๊ฐ์ด์์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ์จ์ผ ํ๋๊ฒฝ์ฐ ์ง์ ์์ ํ์ง ๋ง๊ณ ์์ฉ ์๋ฒ์ค์์ ์์ ํ๋๋ก ๊ตฌํํ๋ค.\n๋ฌผ๋ก ์์ธ๋ ์๋ค.\nex) ํ ํ์ค, ๊ธฐ์ ์ ์ฝ, UI ๊ตฌํ์ ํธ๋ฆฌ.\n3.3 ๋ฆฌํฌ์งํฐ๋ฆฌ์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ ๋ ํฌ์งํ ๋ฆฌ์ ์์ด๋ค. / ๊ฐ๋
์ ์ผ๋ก ๋ค๊ฐ.\n์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ ๊ฐ๋
์ ์ผ๋ก ํ๋์ด๋ฏ๋ก ๋ฆฌํฌ์งํฐ๋ฆฌ๋ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ์ ์ฒด๋ฅผ ์ ์ฅ์์ ์์ํํด์ผํ๋ค.\n์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ฃจํธ ๋ง๊ณ ์ด ์ ์ฒด ๊ทธ๋ฃน์ ๋ชจ๋ ๊ฐ์ ์ ์ฅ ๋ณ๊ฒฝํด์ผํ ๋ฆฌํฌ์งํฐ๋ฆฌ๊ฐ\n๋ง์ฝ ์์ ํ ์ ๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฉด ํ๋๋ ๊ฐ์ด ์ฌ๋ฐ๋ฅด์ง ์์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ๊ธฐ๋ฅ์ ์คํํ๋ ๋์ค NPE์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.\nโข์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ ๋ฆฌ๋ชจ๋ฆฌํฐ๋ฆฌ์ ์์ ๋งบ์ด์ํจ๋ค. ์ ๋ ค๊ตฌํธ์ ๊ทธ๋ฃน ์ ์ฒด๋ฅผ ์์ํํ์.\n3.4 3.4 ID๋ฅผ ์ด์ฉํ ์ ๊ทธ๋ฆฌ์ปคํธ ๋ค๋ฅธ ์ ๊ทธ๋ฆฌ์ปคํธ๋ฅผ ์ฐธ์กฐํ๋ค๋ ๊ฒ์ ๋ค๋ฅธ ์ ๊ทธ๋ฆฌ์ปคํธ ๋ฃจํธ๋ฅผ ์ฐธ์กฐ ํ๋ค๋ ๊ฒ์ด๋ค.\n์๋ก ์ฃผ๋ฌธ์์ ํ์์ ์ฐธ์กฐํ๊ธฐ ์ํด ์ ๊ทธ๋ฆฌ์ปคํธ ๋ฃจํธ ๋ฉค๋ฒ๋ฅผ ํ๋๋ก ์ฐธ๊ณ ํ ์์๋ค.\nํ์ง๋ง ํ๋๋ฅผ ์ด์ฉํ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ์ฐธ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ 3๊ฐ์ง์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์๋ค.\n์ฒซ๋ฒ์งธ๋ก ์ ๊ทธ๋ฆฌ์ปคํธ๋ฅผ ์ฐธ์กฐํ ๋ ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ ํธ๋ฆฌํจ ๋๋ฌธ์ ์ค์ฉํ ์ ์๋ค.\n์ ๊ทธ๋ฆฌ์ปคํธ ๋ด๋ถ์์ ๋ค๋ฅธ ์ ๊ทธ๋ฆฌ์ปคํธ ๊ฐ์ฒด์ ์ ๊ทผ ํ ์ ์์ผ๋ฉด ์ํ๋ฅผ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.\nํธ๋์ ์
๋ฒ์๋ก ์ ๊ทธ๋ฆฌ์ปคํธ๊ฐ ๊ด๋ฆฌํ๋ ๋ฒ์๋ ์๊ธฐ ์์ ์ผ๋ก ํด์ผ ํ๋ค.\n๊ทผ๋ฐ ์ ๊ทผ ํ ์ ์์ผ๋ฉด ๋ค๋ฅธ ์ ๋ฅผ ์์ ํ๊ณ ์ ํ๋ ์ ํน์ ๋น ์ง ์ ์๊ณ ์ด๋ฌํ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐํฉ๋๋ฅผ ๋์ธ๋ค.\n๋๋ฒ์งธ๋ก JPA๋ฅผ ์ฌ์ฉํ ๋ ์ฆ์ ๋ก๋ฉ์ ๊ฒฝ์ฐ์๋ ์กฐํ ์ฑ๋ฅ์๋ ์ ๋ฆฌํ์ง๋ง ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ธฐ๋ฅ์ ์คํํ๋ ๊ฒฝ์ฐ ์๋ ๋ถํ์ํ ๊ฐ์ฒด๋ฅผ ํจ๊ป ๋ก๋ฉํ๊ธฐ์ ์ง์ฐ ๋ก๋ฉ์ด ์ ๋ฆฌํ ์ ์๋ค.\n์ธ๋ฒ์งธ๋ก ํ์ฅ์ผ๋ก ๋จ์ผ ๊ธฐ์ ์ ๋ฌธ์ ๋ ๋ฐ์ํ ์ ์๋ค. ๋ง์ง์๋ฅผ ์ฐ๋ค ๋ชฝ๊ณ ๋ฅผ ์จ์ ๋ค ๋ค๋ฅธ ๊ธฐ์ ์ ์ฐ๋ ๊ฒฝ์ฐ๊ฐ ์์์ ์๋ค.\n์ด๋ฐ ๋ฌธ์ ๋ค์ ์ํํ ๋ ์ฐ๋ ๊ฒ์ด ID๊ฐ์ ์ด์ฉํด ๋ค๋ฅธ ์ ๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ด๋ค.\n์ด๋ DB์ ์ธ๋ํค์ ๋น์ทํ๋ค.\n๊ฐ์ฒด์ ์ฐธ์กฐ๋ง ์ด๋ฃจ์ด์ง๋ฉด ๋๊ธฐ์ ์ด๋ ๊ฒฝ๊ณ๋ฅผ ๋ช
ํํ๊ฒ ํ๊ณ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ค.\n์ ๊ทธ๋ฆฌ์ปคํธ๊ฐ์ ์์กด์ ์ ๊ฑฐํ๋ฏ๋ก ์์ง๋๋ฅผ ๋์ฌ์ฃผ๋ ํจ๊ณผ๊ฐ ์์ผ๋ฉฐ ๊ตฌํ ๋ณต์ก๋๋ ๋ํ ๋ฎ์์ง๋ค.\n์ฐธ์กฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์์ฉ ์๋น์ค ๋จ๊ณ์์ ID๋ฅผ ์ฐธ์กฐํ์ฌ ๋ก๋ฉํ๋ฉด ์ ๊ทธ๋ฆฌ๊ฑฐํธ ์์ค์์๋ ์ง์ฐ ๋ก๋ฉ๊ณผ ๋น์ทํ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป๋๋ค.\nID ์ฐธ์กฐ ๋ฐฉ์์ ๋ณต์ก๋๋ฅผ ๋ฎ์ถ๊ณ ๋ค๋ฅธ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ์์ ํ๋ ๋ฌธ์ ๋ฅผ ๊ทผ์์ ์ผ๋ก ๋ฐฉ์งํ ์ ์๋ค.\n๋ํ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋ง๋ค ๋ค๋ฅธ ๊ตฌํ ๊ธฐ์ ์ ์ฌ์ฉํ ์๋ ์์ด ํ์ฅ์ด ์ฉ์ดํ๋ค.\n3.4.1 ID๋ฅผ ์ด์ฉํ ์ฐธ์กฐ์ ์กฐํ ์ฑ๋ฅ ๋ค๋ฅธ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ID๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋ฉด ์ฐธ์กฐํ๋ ์ฌ๋ฌ๊ฐ์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ์ฝ์๋ ์๋์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.\nN+1์ ์กฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ณ ์ด๋ ํํ ๋ง์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ธฐ์ ์ ์ฒด ์กฐํ ์๋๋ฅผ ๋๋ฆฌ๊ฒ ๋ง๋ ๋ค.\n์ด๋ฐ ๋ฌธ์ ๋ฅผ ์ํด ์กฐ์ธ์ ์ฌ์ฉํ๋ค.\nํ์ง๋ง ์กฐ์ธ์ ID ์ฐธ์กฐ ๋ฐฉ์์ ๊ฐ์ฒด ์ฐธ์กฐ ๋ฐฉ์์ผ๋ก ๋ฐ๊พธ๊ธฐ์ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ์ฉ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.\nํน์ฌ๋ ์๋ก ๋ค๋ฅธ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์กฐํ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด ์บ์๋ฅผ ์ ์ฉํ๊ฑฐ๋ ์กฐํ ์ ์ฉ ์ ์ฅ์๋ฅผ ๋ฐ๋ก ๊ตฌ์ฑํ๋๋ก ํ๋ค.\n3.5 ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๊ฐ ์งํฉ ์ฐ๊ด ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ๋ํ์ ์ธ ์ฐ๊ด ๊ด๊ณ๋ก๋ 1-N, M-N ๊ฐ ์๋ค.\n๋ํ์ ์ธ ์๋ก ์นดํ
๊ณ ๋ฆฌ์ ์ํ์ผ๋ก ์์๋ฅผ ๋ค ์ ์๋๋ค.\n1-N ๊ด๊ณ๋ Set์ผ๋ก ํํํ ์ ์๋ค.\nํ์ง๋ง 1-N์ set์ผ๋ก ์ค๊ณํด๋์ผ๋ฉด ์ํ์ ๊ณ์๊ฐ ์๋ง ๊ฑด์ผ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์๋ค.\n๊ทธ๋ ๊ธฐ์ ์ค์ ๊ตฌํ์๋ ๋ฐ์ํ์ง ์๊ณ ๊ฑฐ๊พธ๋ก ์ํ์ ์นดํ
๊ณ ๋ฆฌ๋ฅผ ๊ตฌํํ๋ค.\nM-N์ ๊ฐ๋
์ ์ผ๋ก ์์ชฝ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ์ปฌ๋ ์
์ผ๋ก ์ฐ๊ด์ ๋ง๋ ๋ค.\n๊ฐ๋
์๋ ์๋ฐฉํฅ์ผ๋ก ์กด์ฌํ์ง๋ง ์ค์ ๊ตฌํ์๋ ์ํ์์ ์นดํ
๊ณ ๋ฆฌ๋ก์ ๋จ๋ฐฉํฅ M-N ์ฐ๊ด๋ง ์ ์ฉํ๋ฉด ๋๋ค.\n3.6 ์๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ํฉํ ๋ฆฌ๋ก ์ฌ์ฉํ๊ธฐ ์ํ์ ๋ฑ๋กํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋ ์ ๊ทธ๋ฆฌ ๊ฑฐ์ค๋ฅผ ๋ถ๋ฆฌํ์ฌ Store์ produce๋ฅผ ๋ถ๋ฆฌํด Store์์ product๋ฅผ ์์ฑํ๋ ํฉํ ๋ฆฌ๋ฅผ ๊ตฌํํ ์ ์๋ค.\n์ด๋ ๊ฒ ํ๋ฉด Store์ ์ฝ๋๋ง ๋ณ๊ฒฝํ๋ฉด, ์์ฉ ์๋น์ค๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค.\n๊ทธ๋ก ์ธํด ๋๋ฉ์ธ์ ์์ง ๋๋ ๋์์ง๋ค. ์ด๊ฒ์ด ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ํฉํ ๋ฆฌ๋ก ์ฌ์ฉํ ๋์ ์ฅ์ ์ด๋ค.\n์ ๊ทธ๋ฆฌ๊ฑฐํธ ์์์ ๋ค๋ฅธ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ์์ฑํด์ผ ํ ๋ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ํ์ฉํด ๋ณด์.\n๊ทธ๋ฌ๋ฉด ๋ค๋ฅธ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ์์ฑํ ๋ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ ๊ณตํ๋ฉด์ ๋์์ ์ค์ํ ๋๋ฉ์ธ ๋ก์ง์ ํจ๊ป ๊ตฌํํ ์ ์๋ค.\nREFERENCE ๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ\n ","permalink":"https://www.springboot.kr/posts/java/start-ddd/ep3-start-ddd/","summary":"DDD START SERIES๋ ๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ ์ฑ
์ ์ฐธ๊ณ ํ์ฌ ์์ฑ๋ ์์ฝ ๊ธ ์
๋๋ค.\nEP 3.1 ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๊ณตํต๋ ๋ชจ๋ธ์ ์ ๊ทธ๋ฆฌ์ปคํธ ๋จ์๋ก ๋ฌถ์ด์ ํํํ๋ค. ๋ณด๊ธฐ๋ ์ฌ์์ง๊ณ ์ข๋ค.\n์์ ์์ค์์ ๋ชจ๋ธํ ๋ชจ๋ธ์ ์ ๋ฆฌํ๋ฉด ๋๋ฉ์ธ์ ๋ณต์กํ ๊ด๊ณ๊ฐ ๋ ์ดํด๊ฐ ์ ๋๋ค.\n์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ๋จ์๋ก ๋ฌถ์ผ๋ฉด ์ดํดํ๋ ๊ฒ๋ฟ์๋๋ผ ์ผ๊ด์ฑ ๊ด๋ฆฌ์ ๊ธฐ์ค์ด ๋๋ค. ๋ณต์ก๋๋ฅผ ์ค์ด๊ณ ๋ณ๊ฒฝ ์๊ฐ์ ์ค์ด๋ค๊ฒ ๋ง๋ ๋ค.\n์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ก ๋ฌถ์ธ ๋๋ฉ์ธ๋ค์ ํจ๊ป ์์ฑํ๊ณ ํจ๊ป ์ ๊ฑฐํ๋ค.\n์ฃผ๋ฌธ์ผ๋ก ๋ฌถ์ธ ์งํฉ์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ ํ์์ด๋ ์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ์์ญ์ ์นจ๋ฒํ์ง ์๋๋ค.\n๊ฒฝ๊ณ๋ฅผ ์ค์ ํ ๋ ๊ธฐ๋ณธ์ ๋๋ฉ์ธ์ ๊ท์น๊ณผ ์๊ตฌ์ฌํญ์ด๋ค.","title":"[DDD START SERIES] EP.3 ์ ๊ทธ๋ฆฌ๊ฑฐํธ"},{"content":"์ฐ์ ์๊ฐ์ด ๋๋ ๊ณต๋ถ๋ฐฉ๋ฒ์ผ๋ก\n ์ฑ
์ ์ ๋ฆฌํ๋ฉด์ ๊ณต๋ถํ๋ค. ๋ฌด์์ ๊ณต๋ถ๋ฅผํ๊ณ ์ ๋ฆฌํ๋ค. ์ฝ๋ฌ๋
ธํธ ํ๊ธฐ๋ฒ 1๋ฒ์ ๋ก์ธ๊ฒ๊ฐ์. ๋งค๋ฒ ์๋ํด๋ ๋ฌธ์ ์ ๋ฆฌํ๋ค ์ง์ณ์ ์ํ๊ฒ๋จ.\n2๋ฒ์ ์์ ์ ํด๋ดค๋๋ฐ ํจ๊ณผ๊ฐ ๋๋ฆ์๊ณ ์ง์ค์ด ์๋จ.\n3๋ฒ๋ ์ ๊น ํ๋ค ๋ง์๋๋ฐ. ๋ค์ ์๋ํด๋ณผ์์ .\n1๋ฒ์ ๋ก์ด๋ 2,3๋ฒ์ ๋์ ํ๊ณ ๋ค์ ์ ๋ค์ ํฌ์คํ
ํด๋ณด๋๋กํ๊ฒ ์.\n","permalink":"https://www.springboot.kr/posts/blahblah/2023-08-06-blah/","summary":"์ฐ์ ์๊ฐ์ด ๋๋ ๊ณต๋ถ๋ฐฉ๋ฒ์ผ๋ก\n ์ฑ
์ ์ ๋ฆฌํ๋ฉด์ ๊ณต๋ถํ๋ค. ๋ฌด์์ ๊ณต๋ถ๋ฅผํ๊ณ ์ ๋ฆฌํ๋ค. ์ฝ๋ฌ๋
ธํธ ํ๊ธฐ๋ฒ 1๋ฒ์ ๋ก์ธ๊ฒ๊ฐ์. ๋งค๋ฒ ์๋ํด๋ ๋ฌธ์ ์ ๋ฆฌํ๋ค ์ง์ณ์ ์ํ๊ฒ๋จ.\n2๋ฒ์ ์์ ์ ํด๋ดค๋๋ฐ ํจ๊ณผ๊ฐ ๋๋ฆ์๊ณ ์ง์ค์ด ์๋จ.\n3๋ฒ๋ ์ ๊น ํ๋ค ๋ง์๋๋ฐ. ๋ค์ ์๋ํด๋ณผ์์ .\n1๋ฒ์ ๋ก์ด๋ 2,3๋ฒ์ ๋์ ํ๊ณ ๋ค์ ์ ๋ค์ ํฌ์คํ
ํด๋ณด๋๋กํ๊ฒ ์.","title":"๋ํํ
๋ง๋ ๊ณต๋ถ๋ฐฉ๋ฒ ์ฐพ์๋ณด๊ธฐ"},{"content":"๊ทผํฉ ์ผ์ ํ๊ณ ์๋ค. GOOGLE ๊ฒ์ ๋ณด๋ค CHAT GPT๊ฐ ํธํ๋ค. TDD, ํด๋ฆฐ์ฝ๋๋ฅผ ์๊ฐํ๋ค. ATDD, ํด๋ฆฐ์ฝ๋๋ฅผ ์๊ฐํ๊ณ ์๋ค. ์๋ก์ด ์ง์ ์๋ค. ์์ดํ๋ ํ๊ตญ์ ์๋ค. ์์ธํ ๊ฒ์๋ฌผ์ ๊ณง ์ฌ๋ฆด์์ ์ด๋ค.\n","permalink":"https://www.springboot.kr/posts/blahblah/2023-07-27-blah/","summary":"๊ทผํฉ ์ผ์ ํ๊ณ ์๋ค. GOOGLE ๊ฒ์ ๋ณด๋ค CHAT GPT๊ฐ ํธํ๋ค. TDD, ํด๋ฆฐ์ฝ๋๋ฅผ ์๊ฐํ๋ค. ATDD, ํด๋ฆฐ์ฝ๋๋ฅผ ์๊ฐํ๊ณ ์๋ค. ์๋ก์ด ์ง์ ์๋ค. ์์ดํ๋ ํ๊ตญ์ ์๋ค. ์์ธํ ๊ฒ์๋ฌผ์ ๊ณง ์ฌ๋ฆด์์ ์ด๋ค.","title":"์ค๋๋ง์ ๊ธ"},{"content":"์ด์ ์ฐ๋๋ ๋ฐ๋๊ณ ์ฑ
์ ๋ณด๊ณ ์ ๋ฆฌ๋ ํ๋ ๊ฒ์ด ๋ ๊ฑฐ ๊ฐ์์ ์ฑ
์์ฝํ๋ ๋ฒ์ ์ฐพ์๋ดค๋ค.\n๋ธ๋ก๊ทธ์ ์ฑ
์ ์ฝ๊ณ ์์ฝํ ๋ ๋๋ฌด ๋ง์ ๋ด์ฉ์ ๋ด์ผ๋ ค ํด์ ์๊ฐ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๊ณ ์ ๋ฆฌ๋ฅผ ํ๊ณ ๋์๋ ๊ธ์ธ ๊น๋จน์ด ๋ค์ ์ฑ
์ ๋ณด๋ ์ง๊ฒฝ์ด๋ ์ฑ
์ ์ ์์ฝํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ดค๋ค.\n\n ํ ๋ฒ๋ง ์ฝ์ด๋ ์ฑ
๋ด์ฉ ๋ค ๊ธฐ์ตํ๋ ๊ธฐ์ ์ ๋
์ ๋ฉ๋ชจ ๋ฒ | ๊น์ตํ @ican ๋ช
์ง๋ ๊ต์, ๊ธฐ๋กํ์\n ๋ด์ฉ์ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.\n ๋ฉ๋ชจ์ 2๊ฐ์ง ํจ๋ฅ ์ธ๋ถ๋ก๋ถํฐ ๋ค์ด์ค๋ ๊ฒ์ ํจ๊ณผ์ ์ผ๋ก ํก์ ๋ด ์์ ์๋ ๊ฒ์ ๋์ง์ด ๋ด๊ธฐ ๋ฉ๋ชจ๋ ๋ด ์์ ์๋ ์๊ฐ์ ๊ตฌ์ฒด์ ์ผ๋ก ๋์ง์ด๋ด๋ ์ต๊ณ ์ ์๋จ์ด๋ค.\nํ์ง๋ง ๋ฉ๋ชจ๋ฅผ ํ๋ ๊ฒ์๋ ์ข
๋ฅ๊ฐ ์๋๋ฐ ๋ด๊ฐ ๊ธฐ์กด์ ์ฐ๋ ๋ฐฉ์์ ์๊ธฐ์ฌ์ฒ๋ผ ์น ๋ค ์ ์ด๋ฒ๋ฆฌ๋ ๋ฐฉ์์ด์๋ค.\n์ด ์๊ธฐ์ฌ์ฒ๋ผ ๋๋ฌด ๋ง์ ๋ด์ฉ์ ์ ๊ฒ ๋๋ฉด ํต์ฌ์ ๋์น ์ ์๋ค.\n๊ทธ๋ฌ๊ธฐ ์ํด์๋ ๋ง์ด ์ฐ๋ ค๋ ์์ฌ์ ๋ฒ๋ฆฌ๊ณ ์ ๋ง ํต์ฌ์ด ๋๋ ์ก๊ธฐ์ค๊ฐ ๋ฌด์์ธ์ง๋ฅผ ์๊ฐํด์ ๋ฉ๋ชจํ๋ ค๋ ์ต๊ด์ด ํ์ํ๋ค.\n๋ค๋ฅธ ๋ฌด์ธ๊ฐ๋ฅผ ๋ฉ๋ชจํ๊ณ ์ถ์ด๋ ์ฐธ๊ณ ๋ฑ ํค์๋ 2๊ฐ๋ง ๋ฉ๋ชจ๋ฅผ ํ์ ๊ทธ๋ ๊ฒ๋๋ฉด ์ ๋ง ํ์ํ ์ ๋ณด๊ฐ ๋ฌด์์ธ์ง ์๊ฐํ๊ฒ ๋๊ณ ๊ฐ์น ์๋ ๊ธฐ๋ก์ ๋ฝ์๋ผ์์๋ค.\nํ ์ฑํฐ๋ฅผ ์์ฝํ ๋ ๋
ธํธ ๋ฐ์ชฝ์ ๋๊ธฐ์ง ์๊ณ ํต์ฌ ํค์๋๋ง ๋ฉ๋ชจํ๋ฉด์ ์ฝ์ผ๋ฉด ์ฑ
์ ํฐ ๋งฅ๋ฝ์ด ๋ช
ํํ ์กํ๊ฒ ๋๋ค.\n๊ทธ๋ฆฌ๊ณ ์ด ๋ฉ๋ชจ๋ฅผ ๋ฐํ์ผ๋ก ์๊ธฐํ๊ฐ ํ์ํ๋ค.\n์ฆ ์ง์์ ๋ด ๊ฒ์ผ๋ก ๋ง๋๋ ๊ฒ์ด๋ค.\n ์ง์์ ๋ด๊ฒ์ผ๋ก ๋ง๋๋ ๋ฉ๋ชจ ๋ฒ ๋ง์ด ์ ์ง ๋ง๋ผ ํต์ฌ ํค์๋๋ฅผ ๋ด ๋ฐฉ์์ผ๋ก ์ฐพ์๋ด๋ผ ๊ทธ๋ฌ๊ธฐ ์ํด์ ์ฑ
์์ ์ป์ ์ง์์ ์์ ์ ์๊ฐ์ ๋ง๋์ด ์ ๋ฆฌํ๋ ๊ฒ์ด๋ค.\n์์ ์ ์๊ฐ์ ๋ง๋ ์ ๋ฆฌํ ๋ฉ๋ชจ๋ ๋์ ๊ธฐ์ต์ ๋จ๋ ๋ฉ๋ชจ๋ก ๋จ์ ์์๋ค.\n ์ฑ
์ ๋งฅ๋ฝ ์ฝ๊ธฐ ๋ฉ๋ชจ ๋ฒ ๋ ํ์ด์ง๋ฅผ ์ฝ์ ํ ์ฑ
์์ ๋์ ๋ผ๋ผ ํต์ฌ ํค์๋๋ฅผ ๋ ์ฌ๋ ค๋ผ ์์ ์ ์ฑ
์๋ง ๋๊ฒ ๋๋ฉด ํต์ฌ์ ์ฐพ์ง ์๊ฒ ๋๋ค.\n๊ทธ๋ ๊ธฐ์ ์ฑ
์ ์ฝ๋ค ๊ณ ๊ฐ๋ฅผ ๋ค๊ณ ํต์ฌ์ ๋ ์ฌ๋ฆฐ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ์ฅ ๋ค์ ์ฅ์ ํต์ฌ ํค์๋๋ฅผ ์ฐ๊ฒฐํด ๋งฅ๋ฝ์ ์ฝ๋๋ค.\n์ฑ
์ ๋ณด๋ฉด์ ์ ์ง ์๊ณ ์ฝ๋ ๊ฒ์ด ๋๋๋ฉด ๋ฉ๋ชจ๋ฅผ ํ๋ค. ๊ทธ ๋ฉ๋ชจ์ ๋ด์ฉ์ ๋ด๊ฐ ํนํ ๋ด์ฉ์ ๋ฉ๋ชจํ๊ธฐ ๋๋ฌธ์ 80% ์ด์ ๊ธฐ์ตํ ์ ์๋ค.\n์ฑ
์ ๋ณด๋ค \u0026lsquo;์!\u0026lsquo;ํ๊ณ ๋ ์ค๋ฅธ ๊ฒ๋ง์ด ์๊ธฐํํ ์ ์๋ ์ง์์ด๊ธฐ ๋๋ฌธ์ ๊ทธ ์ง์์ ํก์ํ ์ ์๋ค.\n๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ๊ณ ๋ฏผ ํด๊ฒฐ ๋ฉ๋ชจ ๋ฒ์ด๋ผ๋ ๊ฒ์ด ์๋๋ฐ ํ๋ฒ ์๊ฐ ํด๋ณด๋ ค ํ๋๋ฐ ์ด๊ฒ ๊ฐ๋ฐ์ ์ผ๋ก ๋์์ด ๋ ๋งํ ๋ฉ๋ชจ ๋ฒ์ด๋ผ ํ๋ฒ ๋ณด๊ณ ๋์ด๊ฐ๋ ๋์์ง ์์ ๊ฒ ๊ฐ๋ค.\n ๊ณ ๋ฏผ ํด๊ฒฐ ๋ฉ๋ชจ ๋ฒ ๊ณ ๋ฏผํ๊ฒ ๋ ๋ฐฐ๊ฒฝ ๋ฐ์ ์์ธ ํด๊ฒฐ ๋ฐฉ์ ๋ณดํต ๊ฐ๋ฐ ๋์ค ๋งํ๋ ๋ถ๋ถ์ด๋ ์๋ฌ ์ฒ๋ฆฌ ๋ฑ ๊ณ ๋ฏผ์ ํ๊ฒ ๋ ๊ฒฝ์ฐ\n๊ณ ๋ฏผํ๊ฒ ๋ ๋ฐฐ๊ฒฝ์ ์์ฑํ๊ณ ๋ฐ์ ์์ธ์ ๋ํด ์ ์ด ๋ณธ๋ค.\n๊ทธ๋ ๊ฒ ๋๋ฉด ๋ด ํ์ฌ ๊ณ ๋ฏผ์ ๊ฐ๊ดํํด์ ๋ณผ ์ ์๋๋ฐ ์ด ๊ณ ๋ฏผ์ ๊ฐ๊ดํํด๋ณด๋ฉด ํด๊ฒฐ ๋ฐฉ๋ฒ๋ ๋ ์ฌ๋ฆด ์ ์์ ๊ฒ ๊ฐ๋ค.\n๋ฌผ๋ก ์์ง ๊ฒฝํํ์ง ๋ชปํ๊ณ ๋ฃ๊ณ ๋ณด๊ธฐ๋ง ํ ๋ด์ฉ์ด๋ผ ํ ๋ฒ ์ค์ฒํด๋ด์ผ ์์ ์์ผ๋ ์ด์ ๋ถํฐ ํด๋ณด๋ คํ๋ค.\n\u0026mdash; ๋ \u0026mdash;\n","permalink":"https://www.springboot.kr/posts/blahblah/2023-01-08/","summary":"์ด์ ์ฐ๋๋ ๋ฐ๋๊ณ ์ฑ
์ ๋ณด๊ณ ์ ๋ฆฌ๋ ํ๋ ๊ฒ์ด ๋ ๊ฑฐ ๊ฐ์์ ์ฑ
์์ฝํ๋ ๋ฒ์ ์ฐพ์๋ดค๋ค.\n๋ธ๋ก๊ทธ์ ์ฑ
์ ์ฝ๊ณ ์์ฝํ ๋ ๋๋ฌด ๋ง์ ๋ด์ฉ์ ๋ด์ผ๋ ค ํด์ ์๊ฐ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๊ณ ์ ๋ฆฌ๋ฅผ ํ๊ณ ๋์๋ ๊ธ์ธ ๊น๋จน์ด ๋ค์ ์ฑ
์ ๋ณด๋ ์ง๊ฒฝ์ด๋ ์ฑ
์ ์ ์์ฝํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ดค๋ค.\n\n ํ ๋ฒ๋ง ์ฝ์ด๋ ์ฑ
๋ด์ฉ ๋ค ๊ธฐ์ตํ๋ ๊ธฐ์ ์ ๋
์ ๋ฉ๋ชจ ๋ฒ | ๊น์ตํ @ican ๋ช
์ง๋ ๊ต์, ๊ธฐ๋กํ์\n ๋ด์ฉ์ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.\n ๋ฉ๋ชจ์ 2๊ฐ์ง ํจ๋ฅ ์ธ๋ถ๋ก๋ถํฐ ๋ค์ด์ค๋ ๊ฒ์ ํจ๊ณผ์ ์ผ๋ก ํก์ ๋ด ์์ ์๋ ๊ฒ์ ๋์ง์ด ๋ด๊ธฐ ๋ฉ๋ชจ๋ ๋ด ์์ ์๋ ์๊ฐ์ ๊ตฌ์ฒด์ ์ผ๋ก ๋์ง์ด๋ด๋ ์ต๊ณ ์ ์๋จ์ด๋ค.","title":"๊ธฐ์ ์ ๋
์ ๋ฉ๋ชจ ๋ฒ"},{"content":"์ํด ์ฒซ ์ฃผ ํธ๋ํฐ ๋ณด๋ค๊ฐ ์๋ผ๋์์ ์ฐํด๋ ์ฑ
์ด ๋ค์ด์๊ธธ๋ ํ๋ค๋ฅ ๊ฐ์ ์ฌ ์์.\n์๋ฐ ํผ์ฆ๋ฌ\n์๋ฐ ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ\n์ด๋ ๊ฒ 2๊ฐ ์๋๋ฐ ๋ ๋ค ์ ํ์ด๋ผ ๋ชป ๊ตฌํ๋ ๊ฑด๋ฐ ์๋ผ๋์ ๋ค์ด์๊ธธ๋ ํ๋ค๋ฅ ๊ฐ์ ์ฌ ์๋ค.\n๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ์ ์์ ์ ๊ฐ์ ํผ์ฆ๋ก๋ ๋
ธ์์ ๊ฐ์ ์ฌ๊ณ ์ง์ ์๋ค.\n์ง์ ๋์์ค๋ ๊ธธ์ ํฌ๋ก์ผ์ ํ๊ธธ๋ ๋๋ฌด ๋จน๊ณ ์ถ์์ง๋ง ์ฐธ๊ณ ์ง์ ์์ ๋ง์๋ ๊ฑธ ๋จน์๋ค.\n์ด์ ์ด๊ฑฐ ์ฐ๊ณ ๋ฐ์ ๋๊ฐ์ ๊ฐ์์ง ์ฐ์ฑ
ํด์ผ ํ๋๋ฐ ์ง๊ธ ๋ฏธ์ธ๋จผ์ง ๋ฏธ์ณ์ ์กฐ๊ธ๋ง ์ฐ์ฑ
ํ๊ณ ๊ธ๋ฐฉ ๋ค์ด์์ผ ํ ๊ฑฐ ๊ฐ๋ค.\n๋ฏธ์ธ๋จผ์ง ์ด๋์ ๋๊ฐ๊ธฐ๊ฐ ์ซ์\n๋ฌดํผ ์ผ ๋๋๊ณ ์ง์ ์์ ๋งค์ผ ๊ณต๋ถํ๊ธฐ ๋งค์ผ ์ด๋ํ๊ธฐ ์ค์ฒ ์ค์ธ๋ฐ ์ ๋์ผ๋ฉด ์ข๊ฒ ๋ค.\n์๋ก ์ฐ๊ฒ๋ค ๋ง์๋ฐ ๋นจ๋ฆฌ ํด์น์ฐ๊ณ ์ถ๋ค.\n\u0026mdash; ๋ \u0026mdash;\n","permalink":"https://www.springboot.kr/posts/blahblah/2023-01-07/","summary":"์ํด ์ฒซ ์ฃผ ํธ๋ํฐ ๋ณด๋ค๊ฐ ์๋ผ๋์์ ์ฐํด๋ ์ฑ
์ด ๋ค์ด์๊ธธ๋ ํ๋ค๋ฅ ๊ฐ์ ์ฌ ์์.\n์๋ฐ ํผ์ฆ๋ฌ\n์๋ฐ ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ\n์ด๋ ๊ฒ 2๊ฐ ์๋๋ฐ ๋ ๋ค ์ ํ์ด๋ผ ๋ชป ๊ตฌํ๋ ๊ฑด๋ฐ ์๋ผ๋์ ๋ค์ด์๊ธธ๋ ํ๋ค๋ฅ ๊ฐ์ ์ฌ ์๋ค.\n๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ์ ์์ ์ ๊ฐ์ ํผ์ฆ๋ก๋ ๋
ธ์์ ๊ฐ์ ์ฌ๊ณ ์ง์ ์๋ค.\n์ง์ ๋์์ค๋ ๊ธธ์ ํฌ๋ก์ผ์ ํ๊ธธ๋ ๋๋ฌด ๋จน๊ณ ์ถ์์ง๋ง ์ฐธ๊ณ ์ง์ ์์ ๋ง์๋ ๊ฑธ ๋จน์๋ค.\n์ด์ ์ด๊ฑฐ ์ฐ๊ณ ๋ฐ์ ๋๊ฐ์ ๊ฐ์์ง ์ฐ์ฑ
ํด์ผ ํ๋๋ฐ ์ง๊ธ ๋ฏธ์ธ๋จผ์ง ๋ฏธ์ณ์ ์กฐ๊ธ๋ง ์ฐ์ฑ
ํ๊ณ ๊ธ๋ฐฉ ๋ค์ด์์ผ ํ ๊ฑฐ ๊ฐ๋ค.","title":"์ํด ์ฒซ ๊ธ"},{"content":"2022๋
๋๋์๋ณด๊ธฐ ์๋ฐ๊ธฐ (1~6์) ์๋
5์์ ๋๋ง์ ๊ฐ์ ๋๋ต 10๊ฐ์ ์ ๋๋ฅผ ๋๋ง์์ ์ด๋ค ์๋ค.(์ด ๋๋ ๋ชฐ๋๋๋ฐ ๋์์ค๊ธฐ ๋ช ๋ฌ ์ ๋ถํฐ ๊ฑฑ์ ์ด ๋์แแ)\n๊ทธ๋ ๊ฒ ๋์ ์ฐ์ฐจ๋ ์๋๊ณ ๊ฑฐ์ง 1๋
์ ์ฌ์๋ค๊ณ ํ๋ ๋ถ์ํ ๋ง์์ด ์ ๋ค๋์ผ ์ ๋ค ์๊ฐ ์์๋ค.\n๊ทธ๋์ ์ด๋ฉด์ ๊ตญ๋ฆฝ๋์๊ด์ ์ถํด๊ทผํ๋ฉฐ ๊ณต๋ถ๋ ํ๊ณ ํ๊ตญ์์ ์ฑ๊ฒจ๊ฐ ๊ฐ๋ฐ ์ฑ
๋ ์ฝ๊ณ ์๊ฐ์ ์ ๋ฒ๋ฆฌ๋ ค ํ๊ฑฐ ๊ฐ๋ค.\n๋ง์ง๋ง ์ฆ์์ ํ์์ ์ ์ ๊ฐ ๋ณธ ๊ณณ์ ๋์๋ค๋๋ฉด์ ๊ท๊ตญํ๋ ๋ ์ ๊ธฐ๋ค๋ ธ๋ค.\n์ด๋๊ฐ ์ ์ผ ์ฌ๋ฐ์๋ ๊ฑฐ ๊ฐ๋ค. ๋ ์จ๋ ๋ฅ์ง ์๊ณ ์์ํด์ ๋์๋ค๋๊ธฐ๊ฐ ์ข์์๋ค.\n๊ทธ๋ฌ๋ฉด์๋ ํ์ผ์๋ ๋์๊ด์ ์ถ๊ทผ ๋์ฅ์ ์ฐ์๋ค.\n์ฃผ๋ง์ ์ ์ธํ๊ณ ๋งค์ผ ์ถ๊ทผ ๋์ฅ์ ์ฐ์ผ๋ฉด์ 1์ธต์ ์๋ ์นดํ์ ๋ค๋ฆฌ๋ฉด ๋งํ์ง ์์๋ ์๋ฉ๋ฆฌ์นด๋
ธ๋ก ์ค๋นํด ์คฌ๋ค. (๊ฐ๊ฒฉ์ ํ๊ตญ ๋์ผ๋ก 2000์ ์ ๋)\n๊ทธ๋ฆฌ๊ณ ์ฃผ๋ง์ด ๋๋ฉด ์์ดํ๋ ๋ฐ๋ฌผ๊ด์๋ ๊ฐ๊ณ ๋ฏธ์ ๊ด์๋ ๋์๊ธฐ๋ ๋ง๋ค๋ฌ ๊ฐ๋ค.\n๊ทธ๋ ๊ฒ ํ๊ตญ์ ๋์์ค๋ฉด ํ์ํ ๊ฒ๋ค์ ๊ณต๋ถํ๊ณ ์ค๋นํ๋ฉฐ ์ง๋ด๋ค 2์ ๋ง์ ํ๊ตญ์ ๋ค์ด์ค๊ฒ ๋์๋ค.\nํ๊ตญ์ ๋์์ค๊ณ ๋์๋ ์ผ์ฃผ์ผ ์ ๋๋ ์ฌ๊ณ ๊ทธ๋ค์๋ถํฐ ํ์ฌ๋ฅผ ๊ตฌํ๋ ค๊ณ ์ฌ๊ธฐ์ ๊ธฐ ์ด๋ ฅ์๋ฅผ ๋ฃ๊ธฐ ์์ํ๋ค.\n์์งํ ํ๊ตญ์ ๋์์ฌ ๋ ๊ฑฑ์ ์ด ์ข ๋ผ์ ํน์ ์๋๋ฉด ์ด๋ป๊ฒ ํ์ง ์ด๋ฐ ์๊ฐ์ ์กฐ๊ธ ๋ง์ด ํ๊ธฐ๋ ํ๋๋ฐ ๊ฒฐ๊ตญ์ ๋ญ ์ง๊ธ ์ ๋ค๋๊ณ ์์ด์ ๋คํ์ธ ๊ฒ ๊ฐ๋ค.\n๊ทธ๋์ 3์์ ํ์ฌ ์
์ฌ์ผ์ ์ ํ๊ณ 4์์ ์ถ๊ทผ์ ํ๊ธฐ๋ก ํ๊ณ ๋จ์ 3์์ ์ฌ๋ฉด์ ์ง๋ด๋ ์
์ฌ์ผ์ด ๋ค๊ฐ์ ์
์ฌํ๊ฒ ๋์๋ค.\n์
์ฌ๋ฅผ ํ๊ณ ํ์ฌ์ ์ ์ํ๋ฉฐ ์ ์ง๋ด๋ค ํ๋ฐ๊ธฐ์ฏค๋ถํฐ ์ ์ข์ ๋ฌธ์ ๋ค์ด ์๊ฒผ๋ค\u0026hellip;\n๋ฌธ์ ์ ์์์ 6์ 1์ผ ์ด๋ช
์ด ์๊ธด๊ฒ๋ถํฐ ๋ฌธ์ ๊ฐ ์์๋ฌ๋ค..\nํ๋ฐ๊ธฐ (7~12์) ์ด๋ช
์ด ์๊ธฐ๊ณ ์ฒ์์ ๊ต์ฅํ ํ๋ค๊ฒ ๋ณด๋๋ค. ์์์ฑ ์ด๋ช
์ด์๋ ๊ฑฐ ๊ฐ์๋ฐ ์ด๊ธฐ๋ผ ๊ทธ๋ฐ์ง ๊ท์์ ์\u0026mdash; ์๋ฆฌ๊ฐ ๋๋ฌด ์ฌ๊ฐํด์ ์ผ์์ํ์ ํ ์ ์์ ์ ๋์๋ค.\n์ง์ง ์ด๋ ๊ฒ๋ ๋ชป ์ฐ๋ค๋ ์๊ฐ์ ๋๋ฌด ๋ง์ด ํ๊ฑฐ ๊ฐ๋ค. ๊ทธ๋งํผ ํ๋ค์๋ ๊ฑฐ ๊ฐ์๋ฐ ์ด๊ฒ๋ ์๊ฐ์ด ์ง๋๋ ์๋ฆฌ๋ ๋ง์ด ์ค์๋ค. ๊ทผ๋ฐ ์ฌ์ ํ ์ด๋ช
์๋ฆฌ๋ ์์ด์ ์ ์ ๋ ๋ถํธํ๋ค.\n๊ทธ๋ ๊ฒ ์๊ฐ์ด ์ง๋ ์ด๋ช
์ด ์ต์ํด์ง ์ฆ์ ๋์ ๊ฒ์ ๋ฌผ์ฒด๊ฐ ๋์๋ค๋๊ธฐ ์์ํ๋๋ฐ ์ฐพ์๋ณด๋ ๋น๋ฌธ์ฆ์ด๋ผ๊ณ ํ๋ค.\n์ฒ์ ๊ฐ ๋ณ์์์ ๊ทธ๋ฅ ๋ช ๋ฌ ์ง๋๋ฉด ์์ด์ง ๊ฑฐ๋ผ ํ๋๋ฐ ์ ์์ด์ ธ ๋ค๋ฅธ ๋ณ์์ ๊ฐ์ ๊ฒ์ฌ๋ฅผ ๋ฐ์ผ๋ ๊ทธ๋ฅ ์ด๋ช
์ฒ๋ผ ํ์ ๋ฌ๊ณ ์ด์์ผ ํ๋ค๊ณ ํ๋ค.\n๊ทธ๋๋ ์ด๋ช
๋ณด๋ค๋ ์คํธ๋ ์ค๊ฐ ๋ ๋ฐ์๋๋ฐ ์ง์ฆ ๋๊ธด ํ๋ค. ์ฒ์์ ๋ ํ๋ฆฌ์ธ ์ค ์๊ณ ์์ ํ๊ณต์ ํ์ ์ ์ ๋ ์์ ์ ๋๋ ๋ง์ด๋ค.\n๋น๋ฌธ์ฆ์ด ์๊ธฐ๊ณ ๋์๋ถํฐ๋ ์ด์ ์์ ์ ๋ชธ์ด ๋์ด๊ฐ์ ์ธ์ ํ๊ณ ์ด๋์ ํ๊ธฐ ์์ํ๋ค. (๋์ถฉ 10์๋ถํฐ ์์ํด์ 3๊ฐ์์งธ๊ฐ ๋ผ๊ฐ๊ณ ์ด๋ ๋ง์ด ๋น ์ก๋ค.)\n๊ทธ๋ฌ๋ ๋์ค ์ฝ๋ก๋์ ๊ฑธ๋ฆฌ๊ณ ๋ง์๋ค. ์๋
์ ์ฝ๋ก๋ ์๋ ๋๋ง์์ ์ง๋ด ์ฝ๋ก๋ ๊ฑฑ์ ์์ด ์ด๊ณ ํ๊ตญ์ ์์๋ ๊ทธ๋ฅ ์ ๊ฑธ๋ฆฌ๊ธธ๋ ์ ๊ฑธ๋ฆด ์ค ์์๋๋ฐ ๊ฒฐ๊ตญ ๊ฑธ๋ฆฌ๊ณ ์ผ ๋ง์๋ค.\n๊ทผ๋ฐ ๋ญ 2,3์ผ ์ด๋๊ณ ๋์ด์๋ค..(์ฃฝ๋ ์ค ์์์ใ
ใ
)\n์ฝ๋ก๋๊ฐ ๋ค ์์น๋๊ณ ํ ๋ฌ์ธ๊ฐ ์๋ค๊ฐ ๋์ ๋ฌธ์ ๊ฐ ๋ ์๊ฒผ๋๋ฐ ์ธ์ ๋ถํด๊ฐ ์๋ ค๊ณ ๋ถ ๋๊ณ ์ปคํผ์น๊ณ ๋ ๊ฐ๊ณ ๋์ฐ๋ฉด ๊น๊นํ ๊ณต๊ฐ์์๋ ๋์์ ๋ฒ์ฉ๋ฒ์ฉ๊ฑฐ๋ฆฌ๋ ๊ฒ ๋ณด์๋ค.\nํน์๋ ํด์ ๋์ ๋ ๋ดค๋๋ฐ ์ด๋์ด ๋ฐฉ์์ ์๋๋ฐ๋ ๋ฒ์ฉ๋ฒ์ฉ ๊ฑฐ๋ฆฌ ๊ธธ๋ ์ฐพ์๋ณด๋ ๊ด์์ฆ์ด๋ผ๊ณ ํด์ ๋ค์๋ ์๊ณผ์ ๊ฐ์ ๋ ์ด์ ๋ก ์น๋ฃ๋ฅผ ๋ฐ์๋ค. ์น๋ฃ๋ฅผ ๋ฐ๊ณ ๋์๋ ์์ด ๋ฒ์ฉ๊ฑฐ๋ฆฌ๋ ๊ด์์ฆ์ ์ฌ๋ผ์ก๋๋ฐ ๋น๋ฌธ์ฆ์ ๋จ์์๋ค.\n๊ทธ ๋ค๋ก๋ ๋ชธ ์๊ฐํด์ ์ด๋์ ํ๋๋ผ ๊ณต๋ถ ์ชฝ์ ์๊ฐ์ด ์ค์ด๋ค์์ง๋ง ๋ชธ์ด ํ๋๋์ฉ ์ด์ํด์ง๋ ๊ฑฐ ๋ณด๋ฉด ์ฐ์ ์์๊ฐ ๊ฑด๊ฐ์ด ๋๋ ๊ฒ ๋ง๋ ๊ฑฐ ๊ฐ๋ค.\n๋ด๋
์๋ ์ข์ ์ผ๋ง ๊ฐ๋ํ์ผ๋ฉด ํ๋ ๋์ ์์ฃผ ํฐ ๋ฐ๋์ด๋ค.\n-๋-\n","permalink":"https://www.springboot.kr/posts/blahblah/2022-12-22/","summary":"2022๋
๋๋์๋ณด๊ธฐ ์๋ฐ๊ธฐ (1~6์) ์๋
5์์ ๋๋ง์ ๊ฐ์ ๋๋ต 10๊ฐ์ ์ ๋๋ฅผ ๋๋ง์์ ์ด๋ค ์๋ค.(์ด ๋๋ ๋ชฐ๋๋๋ฐ ๋์์ค๊ธฐ ๋ช ๋ฌ ์ ๋ถํฐ ๊ฑฑ์ ์ด ๋์แแ)\n๊ทธ๋ ๊ฒ ๋์ ์ฐ์ฐจ๋ ์๋๊ณ ๊ฑฐ์ง 1๋
์ ์ฌ์๋ค๊ณ ํ๋ ๋ถ์ํ ๋ง์์ด ์ ๋ค๋์ผ ์ ๋ค ์๊ฐ ์์๋ค.\n๊ทธ๋์ ์ด๋ฉด์ ๊ตญ๋ฆฝ๋์๊ด์ ์ถํด๊ทผํ๋ฉฐ ๊ณต๋ถ๋ ํ๊ณ ํ๊ตญ์์ ์ฑ๊ฒจ๊ฐ ๊ฐ๋ฐ ์ฑ
๋ ์ฝ๊ณ ์๊ฐ์ ์ ๋ฒ๋ฆฌ๋ ค ํ๊ฑฐ ๊ฐ๋ค.\n๋ง์ง๋ง ์ฆ์์ ํ์์ ์ ์ ๊ฐ ๋ณธ ๊ณณ์ ๋์๋ค๋๋ฉด์ ๊ท๊ตญํ๋ ๋ ์ ๊ธฐ๋ค๋ ธ๋ค.\n์ด๋๊ฐ ์ ์ผ ์ฌ๋ฐ์๋ ๊ฑฐ ๊ฐ๋ค.","title":"์ด๋ฒ ์ฐ๋์ ์๋ ์ผ ๋๋์๋ณด๊ธฐ (๋น๊ณ . 2022๋
)"},{"content":"DDD START SERIES๋ ๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ ์ฑ
์ ์ฐธ๊ณ ํ์ฌ ์์ฑ๋ ์์ฝ ๊ธ ์
๋๋ค.\nEP 2.1 ๋ค ๊ฐ์ ์์ญ ์ํคํ
์ฒ๋ฅผ ์ค๊ณํ ๋ ์ถํํ๋ ์ ํ์ ์ธ ๋ค ๊ฐ์ง์ ์์ญ\n ํํ ์์ฉ ๋๋ฉ์ธ ์ธํ๋ผ์คํธ๋ญ์ฒ ์ด๋ฏธ์ง ์ฐธ์กฐ Layered Architecture\nํ๋ฆ๋ ํํ -\u0026gt; ์์ฉ -\u0026gt; ๋๋ฉ์ธ -\u0026gt; ์ธํ๋ผ์คํธ๋ญ์ฒ\nํํ, ์์ฉ, ๋๋ฉ์ธ ์์ญ์ ๊ตฌํ ๊ธฐ์ ์ ์ฌ์ฉํ ์ฝ๋๋ฅผ ์ง์ ๋ง๋ค์ง ์๋๋ค.\n๋์ ์ธํ๋ผ์คํธ๋ญ์ฒ ์์ญ์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ํ์ํ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋ค.\nEP 2.2 ๊ณ์ธต ๊ตฌ์กฐ ์ํคํ
์ฒ ๊ฒ์ธต ๊ตฌ์กฐ๋ ๊ทธ ํน์ฑ์ ์์ ๊ณ์ธต์์ ํ์ ๊ณ์ธต์ผ๋ก์ ์์กด๋ง ์กด์ฌํ๊ณ ํ์ ๊ณ์ธต์ ์์ ๊ณ์ธต์ ์์กดํ์ง ์๋๋ค.\n์๋ฅผ ๋ค์ด ํํ ๊ณ์ธต์ ์์ฉ ๊ณ์ธต์ ์์กดํ๊ณ ์์ฉ ๊ณ์ธต์ด ๋๋ฉ์ธ ๊ณ์ธต์ ์์กดํ์ง๋ง, ๋ฐ๋๋ก ์ธํ๋ผ์คํธ๋ญ์ฒ ๊ณ์ธต์ด ๋๋ฉ์ธ์ ์์กดํ๊ฑฐ๋ ๋๋ฉ์ธ์ด ์์ฉ ๊ณ์ธต์ ์์กดํ์ง ์๋๋ค.\n๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์๊ฒฉํ๊ฒ ์ ์ฉํ๋ค๋ฉด ์์ ๊ณ์ธต์ ๋ฐ๋ก ์๋ ๊ณ์ธต์๋ง ์์กด์ ๊ฐ์ ธ์ผ ํ์ง๋ง ๊ตฌํ์ ํธ๋ฆฌํจ์ ์ํด ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ ์ฐํ๊ฒ ์ ์ฉํ๊ธฐ๋ ํ๋ค.\nEP 2.3 DIP (์์กด์ฑ ์ญ์ ์์น) DIP๋ ์ ์์ค ๋ชจ๋์ด ๊ณ ์์ค ๋ชจ๋์ ์์กดํ๋๋ก ๋ฐ๊พผ๋ค.\nSOLID programming for Arduino: The Dependency Inversion Principle\nDIP๋ฅผ ์ ์ฉํ๋ฉด ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ ์์ค ๋ชจ๋์ด ๊ณ ์์ค ๋ชจ๋์ ์์กดํ๊ฒ ๋๋ค. ๊ณ ์์ค ๋ชจ๋์ด ์ ์์ค ๋ชจ๋์ ์ฌ์ฉํ๋ ค๋ฉด ๊ณ ์์ค ๋ชจ๋์ด ์ ์์ค ๋ชจ๋์ ์์กดํด์ผ ํ๋๋ฐ, ๋ฐ๋๋ก ์ ์์ค ๋ชจ๋์ด ๊ณ ์์ค ๋ชจ๋์ ์์กดํ๋ค๊ณ ํด์ ์ด๋ฅผ DIP(Dependency Inversion Principle)๋ผ ํ๋ค.\n2.3.1 DIP ์ฃผ์์ฌํญ DIP๋ฅผ ์๋ชป ์๊ฐํ๋ฉด ๋จ์ํ ์ธํฐํ์ด์ค์ ๊ตฌํ ํด๋์ค๋ฅผ ๋ถ๋ฆฌํ๋ ์ ๋๋ก ๋ฐ์๋ค์ผ ์ ์๋ค.\nDIP์ ํต์ฌ์ ๊ณ ์์ค ๋ชจ๋์ด ์ ์์ค ๋ชจ๋์ ์์กดํ์ง ์๋๋ก ํ๊ธฐ ์ํจ์ธ๋ฐ DIP๋ฅผ ์ ์ฉํ ๊ฒฐ๊ณผ ๊ตฌ์กฐ๋ง ๋ณด๊ณ ์ ์์ค ๋ชจ๋์์ ์ธํฐํ์ด์ค๋ฅผ ์ถ์ถํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.\nDIP๋ฅผ ์ ์ฉํ ๋ ํ์ ๊ธฐ๋ฅ์ ์ถ์ํํ ์ธํฐํ์ด์ค๋ ๊ณ ์์ค ๋ชจ๋ ๊ด์ ์์ ๋์ถํ๋ค.\n2.3.2 DIP์ ์ํคํ
์ฒ ์ธํ๋ผ์คํธ๋ญ์ฒ ์์ญ์ ๊ตฌํ ๊ธฐ์ ์ ๋ค๋ฃจ๋ ์ ์์ค ๋ชจ๋์ด๊ณ ์์ฉ ์์ญ๊ณผ ๋๋ฉ์ธ ์์ญ์ ๊ณ ์์ค ๋ชจ๋์ด๋ค.\n์ธํ๋ผ์คํธ๋ญ์ฒ ๊ณ์ธต์ด ๊ฐ์ฅ ํ๋จ์ ์์นํ๋ ๊ณ์ธตํ ๊ตฌ์กฐ์ ๋ฌ๋ฆฌ ์ํคํ
ํฐ์ DIP๋ฅผ ์ ์ฉํ๋ฉด\n[ ์ธํ๋ผ์คํธ๋ญ์ฒ ] | | | | v | [ ์์ฉ ] | | | v v [ ๋๋ฉ์ธ ] ๋ค์๊ณผ ๊ฐ์ด ์ธํ๋ผ์คํธ๋ญ์ฒ ์์ญ์ด ์์ฉ ์์ญ๊ณผ ๋๋ฉ์ธ ์์ญ์ ์์กดํ๋ ๊ตฌ์กฐ๊ฐ ๋๋ค.\n์ธํ๋ผ์คํธ๋ญ์ฒ์ ์์นํ ํด๋์ค๊ฐ ๋๋ฉ์ธ์ด๋ ์์ฉ ์์ญ์ ์ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ๊ตฌํํ๋ ๊ตฌ์กฐ๊ฐ ๋๋ฏ๋ก ๋๋ฉ์ธ๊ณผ ์์ฉ ์์ญ์ ๋ํ ์ํฅ์ ์ฃผ์ง ์๊ฑฐ๋ ์ต์ํํ๋ฉด์ ๊ตฌํ ๊ธฐ์ ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.\nEP 2.4 ๋๋ฉ์ธ ์์ญ์ ์ฃผ์ ๊ตฌ์ฑ์์ Entity Value Aggregate Repository Domain Service 2.4.1 Entity And Value ๋๋ฉ์ธ ๋ชจ๋ธ์ ์ํฐํฐ๋ ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ผ๊ธฐ๋ณด๋ค๋ ๋ฐ์ดํฐ์ ํจ๊ป ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฐ์ฒด์ด๋ค.\n๋๋ฉ์ธ ๊ด์ ์์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ๊ธฐ๋ฅ ๊ตฌํ์ ์บก์ํํด์ ๋ฐ์ดํฐ๊ฐ ์์๋ก ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋ง๋๋ค.\n๋๋ฉ์ธ ๋ชจ๋ธ์ ์ํฐํฐ๋ ๋ ๊ฐ ์ด์์ ๋ฐ์ดํฐ๊ฐ ๊ฐ๋
์ ์ผ๋ก ํ๋์ธ ๊ฒฝ์ฐ ๋ฒจ๋ฅ ํ์
์ ์ด์ฉํด์ ํํํ ์ ์๋ค๋ ๊ฒ์ด๋ค.\nRDBMS์ ๊ฐ์ ๊ด๊ณํ DB๋ ๋ฒจ๋ฅ ํ์
์ ์ ๋๋ก ํํํ๊ธฐ ํ๋ค๋ค.\nEP.1dใ
์ ์ค๋ช
ํ ๊ฒ์ฒ๋ผ ๋ฒจ๋ฅ๋ ๋ถ๋ณ์ผ๋ก ๊ตฌํํ ๊ฒ์ ๊ถ์ฅํ๋ฉฐ, ์ํฐํฐ์ ๋ฒจ๋ฅ ํ์
๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ๋๋ ๊ฐ์ฒด ์์ฒด๋ฅผ ์์ ํ ๊ต์ฒดํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.\n2.4.2 Aggregate ๋๋ฉ์ธ์ด ๋ณต์กํด์ง๋ ๋๋ฉ์ธ ๋ชจ๋ธ์์ ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ๋ฐ ๋์์ด ๋๋ ๊ฒ์ด Aggregate ๋ค.\nModeling Aggregates with DDD and Entity Framework\n๊ทธ๋ฆผ์์ ๋ณด์ด๋ฏ์ด Aggregate๋ ๊ด๋ จ ๊ฐ์ฒด๋ฅผ ํ๋๋ก ๋ฌถ์ ๊ตฐ์ง์ด๋ค.\nAggregate๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ณ ๊ฐ์ฒด๊ฐ ์๋ ๊ด๋ จ ๊ฐ์ฒด๋ฅผ ๋ฌถ์ด์ ๊ฐ์ฒด ๊ตฐ์ง ๋จ์๋ก ๋ชจ๋ธ์ ๋ฐ๋ผ๋ณผ ์ ์๊ฒ ๋๋ค. ๊ฐ๋ณ ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๊ฐ ์๋ Aggregate ๊ฐ์ ๊ด๊ณ๋ก ๋๋ฉ์ธ ๋ชจ๋ธ์ ์ดํดํ๊ณ ๊ตฌํํ๊ฒ ๋๋ฉฐ, ์ด๋ฅผ ํตํด ํฐ ํ์์ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๊ด๋ฆฌํ ์ ์๋ค.\n2.4.3 Repository ๋ฌผ๋ฆฌ์ ์ธ ์ ์ฅ์์ ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ๋ณด๊ดํ๊ธฐ ์ํ ๋๋ฉ์ธ ๋ชจ๋ธ์ด Repository ๋ค. Entity๋ Value๊ฐ ์๊ตฌ์ฌํญ์์ ๋์ถ๋๋ ๋๋ฉ์ธ ๋ชจ๋ธ์ด๋ผ๋ฉด Repository๋ ๊ตฌํ์ ์ํ ๋๋ฉ์ธ ๋ชจ๋ธ์ด๋ค.\n2.5 ์์ฒญ ์ฒ๋ฆฌ ํ๋ฆ ํํ (Controller) โ ์์ฉ (Service) -\u0026gt; ๋๋ฉ์ธ (Danain object) -\u0026gt; ์ธํ๋ผ์คํธ๋ญ์ฒ (Repository)\n๋ธ๋ผ์ฐ์ -\u0026gt; (http) -\u0026gt; Controller -\u0026gt; Service -\u0026gt; Domain Object / Repository\nService์์ Domain ์์ญ์ ๊ฐ์ฒด์ ๊ธฐ๋ฅ Repository๋ ๊ฐ์ฒด ๋ฆฌํด.\nService์์๋ ํธ๋์ญ์
๊ด๋ฆฌ๋ฅผ ์ํด์ผ ํ๋ค.\n2.6 ์ธํ๋ผ์คํธ๋ญ์ฒ ๊ฐ์ ์ธํ๋ผ์คํธ๋ญ์ฒ๋ ์์ ์์ ๊ณ์ธต ๋ชจ๋๋ฅผ ์ง์ํ๋ค.\nํํ, ์์ฉ, ๋๋ฉ์ธ ์์ญ..\n์์ฉ๊ณผ ๋๋ฉ์ธ ์์ญ์์ ๊ตฌํ ๊ธฐ์ ์ ๋ํ ์์กด์ ๊ฐ์ ธ๊ฐ๋ ๊ฒ์ด ๋์์ง ์๋ค๊ณ ์๊ฐํ๋ค.\nํํ ์์ญ์ ์ธํ๋ผ์คํธ๋ญ์ฒ ์์ญ๊ณผ ์์์ด๋ฃฌ๋ค.\n์ธํ๋ผ์คํธ๋ญ์ฒ์ ์์ญ์ ๋ค๋ฅธ ์์ญ๊ณผ ์ ์กฐํฉํด์ ์ฌ์ฉํด์ผํ๋ค.\n์ฐ์ฐ์ฑ์ด ์ฆ๊ฐ ๋ ์ ์๋ค.\n2.7 ๋ชจ๋ ๊ตฌ์ฑ ์ํคํ
์ฒ์ ์๊ฐ ์์ญ์ ๋ณ๋ ํจํค์ง์ ์์นํ๋ค.\n๋๋ฉ์ธ์ด ํฌ๋ฉด ํ์ ๋๋ฉ์ธ์ผ๋ก ๋๋๊ณ ๋๋ฉ์ธ๋ง๋ค ๋ณ๋์ ํจํค์ง๋ฅผ ๊ตฌ์ฑํ๋ค.\n๋๋ฉ์ธ ๋ชจ๋ธ์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ค์ ํจํค์ง๋ฅผ ๊ตฌ์ฑํ๋ค.\nex) ๋๋ฉ์ธ์ด ์ฌ๋ฌ๊ฐ์ธ ๊ฒฝ์ฐ ๋๋ฉ์ธ ํจํค์ง๋ฅผ ๋๋๋ค.\n์ ๊ทธ๋ฆฌ๊ฑฐํธ, ๋ชจ๋ธ, ๋ ํฌ์งํ ๋ฆฌ๋ ๊ฐ์ ์์ญ์ ์์น์ํจ๋ค.\nex)\ndomain.order domain.service application.product application.category ๋จ์ง ์์ ์ผ๋ฟ ์ ํด์ง ๊ท์น์ ์๋ค..\n๋ชจ๋ ๊ตฌ์ฑ์ ์ ํด์ง ์ ๋ต์ ์์ง๋ง. ์ ๋งํ๋ฉด ์ ๋ถ๋ฆฌํ์.\nREFERENCE ๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ\n ","permalink":"https://www.springboot.kr/posts/java/start-ddd/ep2-start-ddd-model/","summary":"DDD START SERIES๋ ๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ ์ฑ
์ ์ฐธ๊ณ ํ์ฌ ์์ฑ๋ ์์ฝ ๊ธ ์
๋๋ค.\nEP 2.1 ๋ค ๊ฐ์ ์์ญ ์ํคํ
์ฒ๋ฅผ ์ค๊ณํ ๋ ์ถํํ๋ ์ ํ์ ์ธ ๋ค ๊ฐ์ง์ ์์ญ\n ํํ ์์ฉ ๋๋ฉ์ธ ์ธํ๋ผ์คํธ๋ญ์ฒ ์ด๋ฏธ์ง ์ฐธ์กฐ Layered Architecture\nํ๋ฆ๋ ํํ -\u0026gt; ์์ฉ -\u0026gt; ๋๋ฉ์ธ -\u0026gt; ์ธํ๋ผ์คํธ๋ญ์ฒ\nํํ, ์์ฉ, ๋๋ฉ์ธ ์์ญ์ ๊ตฌํ ๊ธฐ์ ์ ์ฌ์ฉํ ์ฝ๋๋ฅผ ์ง์ ๋ง๋ค์ง ์๋๋ค.\n๋์ ์ธํ๋ผ์คํธ๋ญ์ฒ ์์ญ์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ํ์ํ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋ค.\nEP 2.2 ๊ณ์ธต ๊ตฌ์กฐ ์ํคํ
์ฒ ๊ฒ์ธต ๊ตฌ์กฐ๋ ๊ทธ ํน์ฑ์ ์์ ๊ณ์ธต์์ ํ์ ๊ณ์ธต์ผ๋ก์ ์์กด๋ง ์กด์ฌํ๊ณ ํ์ ๊ณ์ธต์ ์์ ๊ณ์ธต์ ์์กดํ์ง ์๋๋ค.","title":"[DDD START SERIES] EP.2 ์ํคํ
์ฒ ๊ฐ์"},{"content":"DDD START SERIES๋ ๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ ์ฑ
์ ์ฐธ๊ณ ํ์ฌ ์์ฑ๋ ์์ฝ ๊ธ ์
๋๋ค.\nEP.1.1 ๋๋ฉ์ธ ์ด๋? ์๋ฅผ ๋ค์ด ๊ฐ๋ฐ์ ์
์ฅ์์ ์จ๋ผ์ธ ์์ ์ ๊ตฌํํด์ผ ํ ์ํํธ์จ์ด์ ๋์์ด ๋ ์ ์๋ค.\n์จ๋ผ์ธ ์์ ์ ์จ๋ผ์ธ์ผ๋ก ์ฑ
์ ํ๋งคํ๋ ๋ฐ ํ์ํ ์ํ ์กฐํ, ๊ตฌ๋งค, ๊ฒฐ์ , ๋ฐฐ์ก ์ถ์ ๋ฑ ๊ธฐ๋ฅ์ด ํ์ํ๋ค.\n์ด๋ ์จ๋ผ์ธ ์์ ์ ์ํํธ์จ์ด๋ก ํด๊ฒฐํ๊ณ ์ ํ๋ ๋ฌธ์ ์์ญ, ์ฆ ๋๋ฉ์ธ์ ํด๋นํ๋ค.\nํ ๋๋ฉ์ธ์ ๋ค์ ํ์ ๋๋ฉ์ธ์ผ๋ก ๋๋ ์ ์๋ค.\nExample\n ---- [์ ์ฐ] / / [์ฃผ๋ฌธ] ------ [ํ์] \\ | \\ | ---- [ํ์] ๋ฌด์กฐ๊ฑด ๊ณ ์ ๋ ํ์ ๋๋ฉ์ธ์ด ์กด์ฌํ๋ ๊ฒ์ ์๋๊ณ ํ์์ ๋ฐ๋ผ ๋๋ ์ ์๋ค. (์์ ์๋ ์๊ณ ์์ ์๋ ์๋ค.)\nEP.1.2 ๋๋ฉ์ธ ์ ๋ฌธ๊ฐ์ ๊ฐ๋ฐ์ ๊ฐ ์ง์ ๊ณต์ ์ฒซ ๋จ์ถ๊ฐ ์๋ชป ๋ผ์์ง๋ฉด ๋ชจ๋ ๋จ์ถ๊ฐ ์๋ชป ๋ผ์์ง๋ฏ์ด ์๊ตฌ์ฌํญ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ์ง ๋ชปํ๋ฉด ์๊ตฌํ์ง ์์ ์๋ฑํ ๊ธฐ๋ฅ์ ๋ง๋ค๊ฒ ๋๋ค.\n์๋ชป ๊ฐ๋ฐํ ์ฝ๋๋ฅผ ์์ ํ๊ธฐ ์ํด์๋ ๋ง์ ๋
ธ๋ ฅ์ด ๋ ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์๊ตฌ์ฌํญ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํด ํด์ผํ๋ค.\n๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋๋ฉ์ธ ์ ๋ฌธ๊ฐ ๋งํผ์ ์๋์ง๋ง ์ดํด๊ด๊ณ์์ ๊ฐ๋ฐ์๋ ๋๋ฉ์ธ ์ง์์ ๊ฐ์ถฐ์ผ ํ๋ค.\n์ ํ ๊ฐ๋ฐ๊ณผ ๊ด๋ จ๋ ๋๋ฉ์ธ ์ ๋ฌธ๊ฐ, ๊ด๊ณ์, ๊ฐ๋ฐ์๊ฐ ๊ฐ์ ์ง์์ ๊ณต์ ํ๊ณ ์ง์ ์ํตํ ์๋ก ๋๋ฉ์ธ ์ ๋ฌธ๊ฐ๊ฐ ์ํ๋ ์ ํ์ ๋ง๋ค ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.\n๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ์์ ๋๋ฉ์ธ ์ ๋ฌธ๊ฐ๋ ๊ทธ๋งํผ ์ค์ํ๋ค.\nGarbage in, Garbage out์ ๊ธฐ์ต ํ๋ผ.\nEP.1.3 ๋๋ฉ์ธ ๋ชจ๋ธ ๋๋ฉ์ธ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ด๊ณ์๋ค์ด ๋์ผํ ๋ชจ์ต์ผ๋ก ๋๋ฉ์ธ์ ์ดํดํ๊ณ ๋๋ฉ์ธ ์ง์์ ๊ณต์ ํ๋ ๋ฐ ๋์์ด ๋๋ค.\n๋๋ฉ์ธ์ ์ดํดํ๋ ค๋ฉด ๋๋ฉ์ธ์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ๊ณผ ๋๋ฉ์ธ์ ์ฃผ์ ๋ฐ์ดํฐ ๊ตฌ์ฑ์ ํ์
ํด์ผ ํ๋๋ฐ ์ด๋ฐ ๋ฉด์์ ๊ธฐ๋ฅ๊ณผ ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ๋ณด์ฌ์ฃผ๋ ๊ฐ์ฒด ๋ชจ๋ธ์ ๋๋ฉ์ธ์ ๋ชจ๋ธ๋งํ๊ธฐ์ ์ ํฉํ๋ค.\n๋๋ฉ์ธ ๋ชจ๋ธ์ ๊ฐ์ฒด๋ก๋ง ๋ชจ๋ธ๋งํ ์ ์๋ ๊ฒ์ ์๋๋ค.\n๊ด๊ณ๊ฐ ์ค์ํ ๋๋ฉ์ธ์ด๋ผ๋ฉด ๊ทธ๋ํ๋ฅผ ์ด์ฉํด์ ๋๋ฉ์ธ์ ๋ชจ๋ธ๋งํ ์ ์๋ค.\n์ํ ๊ณต์์ ํ์ฉํด์ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๋ง๋ค ์๋ ์๋ค. ๋๋ฉ์ธ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋๋ค๋ฉด ํํ ๋ฐฉ์์ด ๋ฌด์์ธ์ง๋ ์ค์ํ์ง ์๋ค.\n๋๋ฉ์ธ ๋ชจ๋ธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋๋ฉ์ธ ์์ฒด๋ฅผ ์ดํดํ๊ธฐ ์ํ ๊ฐ๋
๋ชจ๋ธ์ด๋ค.\n๊ฐ๋
๋ชจ๋ธ๊ณผ ๊ตฌํ ๋ชจ๋ธ์ ์๋ก ๋ค๋ฅธ ๊ฒ์ด์ง๋ง ๊ตฌํ ๋ชจ๋ธ์ด ๊ฐ๋
๋ชจ๋ธ์ ์ต๋ํ ๋ฐ๋ฅด๋๋ก ํ ์๋ ์๋ค.\nEP.1.4 ๋๋ฉ์ธ ๋ชจ๋ธ ํจํด ์๊ธฐํ
์ฒ ๊ตฌ์ฑ (์๋ณธ)\n๋๋ฉ์ธ ๋ชจ๋ธ ํจํด์ ์ํคํ
์ฒ ๊ตฌ์ฑ์ ๋๋ฉ์ธ ๊ณ์ธต์ ๊ฐ์ฒด ์งํฅ ๊ธฐ๋ฒ์ผ๋ก ๊ตฌํํ๋ ํจํด์ ๋งํ๋ค.\n๋๋ฉ์ธ ๊ณ์ธต์ ๋๋ฉ์ธ์ ํต์ฌ ๊ท์น์ ๊ตฌํํ๋ค. ์ฃผ๋ฌธ ๋๋ฉ์ธ์ ๊ฒฝ์ฐ \u0026lsquo;์ถ๊ณ ์ ์ ๋ฐฐ์ก์ง๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค\u0026rsquo; ๋ผ๋ ๊ท์น๊ณผ \u0026lsquo;์ฃผ๋ฌธ ์ทจ์๋ ๋ฐฐ์ก ์ ์๋ง ํ ์ ์๋ค\u0026rsquo;๋ผ๋ ๊ท์น์ ๊ตฌํํ ์ฝ๋๊ฐ ๋๋ฉ์ธ ๊ณ์ธต์ ์์นํ๊ฒ ๋๋ค.\n์ด๋ฐ ๋๋ฉ์ธ ๊ท์น์ ๊ฐ์ฒด ์งํฅ ๊ธฐ๋ฒ์ผ๋ก ๊ตฌํํ๋ ํจํด์ด ๋๋ฉ์ธ ๋ชจ๋ธ ํจํด์ด๋ค.\nEP.1.5 ๋๋ฉ์ธ ๋ชจ๋ธ ๋์ถ ์๋ฌด๋ฆฌ ๋ฐ์ด๋ ๊ฐ๋ฐ์๋ผ ํ ์ง๋ผ๋ ๋๋ฉ์ธ์ ๋ํ ์ดํด ์์ด ์ฝ๋ฉ์ ์์ํ ์๋ ์๋ค.\n๊ธฐํ์, ์ ์ค์ผ์ด์ค, ์ฌ์ฉ์ ์คํ ๋ฆฌ์ ๊ฐ์ ์๊ตฌ์ฌํญ๊ณผ ๊ด๋ จ์์์ ๋ํ๋ฅผ ํตํด ๋๋ฉ์ธ์ ์ดํดํ๊ณ ์ด๋ฅผ ๋ฐํ์ผ๋ก ๋๋ฉ์ธ ๋ชจ๋ธ ์ด์์ ๋ง๋ค์ด์ผ ๋น๋ก์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.\n๊ทธ๋ฆฌ๊ณ ๋์ ๋ง๋ ๋ชจ๋ธ์ ์๊ตฌ์ฌํญ ์ ๋ จ์ ์ํด ๋๋ฉ์ธ ์ ๋ฌธ๊ฐ๋ ๋ค๋ฅธ ๊ฐ๋ฐ์์์ ๋
ผ์ํ๋ ๊ณผ์ ์์ ๊ณต์ ํ๊ธฐ๋ ํ๋ค.\nEP.1.6 ์ํฐํฐ์ ๋ฒจ๋ฅ ์๊ตฌ์ฌํญ์์ ๋์ถํ ๋ชจ๋ธ์ ํฌ๊ฒ ์ํฐํฐ์ ๋ฒจ๋ฅ๋ก ๊ตฌ๋ถํ ์ ์๋ค.\n์ํฐํฐ์ ๋ฒจ๋ฅ๋ฅผ ์ ๋๋ก ๊ตฌ๋ถํด์ผ ๋๋ฉ์ธ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ค๊ณํ๊ณ ๊ตฌํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด ๋์ ์ฐจ์ด๋ฅผ ๋ช
ํํ๊ฒ ์ดํดํ๋ ๊ฒ์ ๋๋ฉ์ธ์ ๊ตฌํํ๋ ๋ฐ ์์ด ์ค์ํ๋ค.\n1.6.1 ์ํฐํฐ ์ํฐํ
์ ๊ฐ์ฅํฐ ํน์ง์ ์๋ณ์๋ฅผ ๊ฐ์ง๋ ๊ฒ์ด๋ค.\n์๋ณ์๋ ์ํฐํฐ ๊ฐ์ฒด๋ง๋ค ๊ณ ์ ํด์ ๊ฐ ์ํฐํฐ๋ ์๋ก ๋ค๋ฅธ ์๋ณ์๋ฅผ ๊ฐ๋๋ค. ์๋ฅผ ๋ค์ด ์ฃผ๋ฌธ ๋๋ฉ์ธ์์ ๊ฐ ์ฃผ๋ฌธ์ ์ฃผ๋ฌธ๋ฒํธ๋ฅผ ๊ฐ์ง๊ณ ์๋๋ฐ ์ด ์ฃผ๋ฌธ๋ฒํธ๋ ๊ฐ ์ฃผ๋ฌธ๋ง๋ค ์๋ก ๋ค๋ฅด๋ค. ๋ฐ๋ผ์ ์ฃผ๋ฌธ๋ฒํธ๊ฐ ์ฃผ๋ฌธ์ ์๋ณ์๊ฐ ๋๋ค.\n์ฃผ๋ฌธ์์ ๋ฐฐ์ก์ง ์ฃผ์๊ฐ ๋ฐ๋๊ฑฐ๋ ์ํ๊ฐ ๋ท๊พธ๋๋ผ๋ ์ฃผ๋ฌธ๋ฒํธ๊ฐ ๋ฐ๋์ง ์๋ ๊ฒ์ฒ๋ผ ์ํฐํฐ์ ์๋ณ์๋ ๋ฐ๋์ง ์๋๋ค. ์ํฐํฐ๋ฅผ ์์ฑํ๊ณ ์์ฑ์ ๋ฐ๊พธ๊ณ ์ญ์ ํ ๋๊น์ง ์๋ณ์๋ ์ ์ง๋๋ค.\n1.6.2 ์ํฐํฐ์ ์๋ณ์ ์์ฑ ์ํฐํฐ์ ์๋ณ์๋ฅผ ์์ฑํ๋ ์์ ์ ๋๋ฉ์ธ์ ํน์ง๊ณผ ์ฌ์ฉํ๋ ๊ธฐ์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.\n ํน์ ๊ท์น์ ๋ฐ๋ผ ์์ฑ UUID๋ Nano ID์ ๊ฐ์ ๊ณ ์ ์๋ณ์ ์์ฑ๊ธฐ ์ฌ์ฉ ๊ฐ์ ์ง์ ์
๋ ฅ ์ผ๋ จ๋ฒํธ ์ฌ์ฉ(์ํ์ค๋ DB์ ์๋ ์ฆ๊ฐ ์ปฌ๋ผ ์ฌ์ฉ) 1.6.3 ๋ฒจ๋ฅ ํ์
๋ฒจ๋ฅ ํ์
์ ๊ฐ๋
์ ์ผ๋ก ์์ ํ ํ๋๋ฅผ ํํํ ๋ ์ฌ์ฉํ๋ค.\n๋ฒจ๋ฅ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ๋๋ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ๋ณด๋ค๋ ๋ณ๊ฒฝํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณ ์๋ก์ด ๋ฐธ๋ฅ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ ์ ํธํ๋ค. (๋ถ๋ณ ๊ฐ์ฒด๋ ์ฐธ์กฐ ํฌ๋ช
์ฑ๊ณผ ์ค๋ ๋์ ์์ ํ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.)\n๋ฒจ๋ฅ ํ์
์ ๋ถํ์ผ๋ก ๊ตฌํํ๋ ์ฌ๋ฌ ์ด์ ๊ฐ ์๋๋ฐ ๊ฐ์ฅ ์ค์ํ ์ด์ ๋ ์์ ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ค๋ ๋ฐ ์๋ค.\n1.6.4 ์ํฐํฐ ์๋ณ์์ ๋ฐธ๋ฅ ํ์
๋๋ฉ์ธ์์ ํน๋ณํ ์๋ฏธ๋ฅผ ์ง๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ์๋ณ์๋ฅผ ์ํ ๋ฒจ๋ฅ ํ์
์ ์ฌ์ฉํด์ ์๋ฏธ๊ฐ ์ ๋๋ฌ๋ ์ ์๋๋ก ํ์.\n1.6.5 ๋๋ฉ์ธ ๋ชจ๋ธ์ set ๋ฉ์๋ ๋ฃ์ง ์๊ธฐ ์ ๊ทผ ๋ฒ์๋ฅผ private์ผ๋ก ์ ์ธํ ๊ฒฝ์ฐ ์ธ๋ถ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ๋ชฉ์ ์ผ๋ก set ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.\n๋ถ๋ณ ๋ฒจ๋ฅ ํ์
์ ์ฌ์ฉํ๋ฉด ์์ฐ์ค๋ฝ๊ฒ ๋ฒจ๋ฅ ํ์
์๋ set ๋ฉ์๋๋ฅผ ๊ตฌํํ์ง ์๋๋ค.\nset ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ ํน๋ณํ ์ด์ ๊ฐ ์๋ค๋ฉด ๋ถ๋ณ ํ์
์ ์ฅ์ ์ ์ด๋ฆด ์ ์๋๋ก ๋ฒจ๋ฅ ํ์
์ ๋ถ๋ณ์ผ๋ก ๊ตฌํํ๋ค.\nEP.1-7 ๋๋ฉ์ธ ์ฉ์ด์ ์ ๋น์ฟผํฐ์ค ์ธ์ด ์ฝ๋๋ฅผ ์์ฑํ ๋ ๋๋ฉ์ธ์์ ์ฌ์ฉํ๋ ์ฉ์ด๋ ๋งค์ฐ ์ค์ํ๋ค.\n๋๋ฉ์ธ์์ ์ฌ์ฉํ๋ ์ฉ์ด๋ฅผ ์ฝ๋์ ๋ฐ์ํ์ง ์์ผ๋ฉด ๊ทธ ์ฝ๋๋ ๊ฐ๋ฐ์์๊ฒ ์ฝ๋์ ์๋ฏธ๋ฅผ ํด์ํด์ผ ํ๋ ๋ถ๋ด์ ์ค๋ค.\n์ฝ๋๋ฅผ ๋๋ฉ์ธ ์ฉ์ด๋ก ํด์ํ๊ฑฐ๋ ๋๋ฉ์ธ ์ฉ์ด๋ฅผ ์ฝ๋๋ก ํด์ํ๋ ๊ณผ์ ์ด ์ค์ด๋ ๋ค.\n์ด๋ ์ฝ๋์ ๊ฐ๋
์ฑ์ ๋์ด๊ณ ์ฝ๋๋ฅผ ๋ถ์ํ๋๊ณ ์ดํดํ๋ ์๊ฐ์ ์ค์ฌ์ค๋ค.\n์ต๋ํ ๋๋ฉ์ธ ์ฉ์ด๋ฅผ ์ฌ์ฉํด์ ๋๋ฉ์ธ ๊ท์น์ ์ฝ๋๋ก ์์ฑํ๊ฒ ๋๋ฏ๋ก ๋ฒ๊ทธ๋ํ ์ค์ด ๋ค๊ฒ ๋๋ค.\n๋๋ฉ์ธ ์ฉ์ด์ ์๋ง์ ๋จ์ด๋ฅผ ์ฐพ๋ ์๊ฐ์ ์๊น์ํ์ง ๋ง์.\nREFERENCE ๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ\n ","permalink":"https://www.springboot.kr/posts/java/start-ddd/chp1-start-ddd-model/","summary":"DDD START SERIES๋ ๋๋ฉ์ธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ ์ฑ
์ ์ฐธ๊ณ ํ์ฌ ์์ฑ๋ ์์ฝ ๊ธ ์
๋๋ค.\nEP.1.1 ๋๋ฉ์ธ ์ด๋? ์๋ฅผ ๋ค์ด ๊ฐ๋ฐ์ ์
์ฅ์์ ์จ๋ผ์ธ ์์ ์ ๊ตฌํํด์ผ ํ ์ํํธ์จ์ด์ ๋์์ด ๋ ์ ์๋ค.\n์จ๋ผ์ธ ์์ ์ ์จ๋ผ์ธ์ผ๋ก ์ฑ
์ ํ๋งคํ๋ ๋ฐ ํ์ํ ์ํ ์กฐํ, ๊ตฌ๋งค, ๊ฒฐ์ , ๋ฐฐ์ก ์ถ์ ๋ฑ ๊ธฐ๋ฅ์ด ํ์ํ๋ค.\n์ด๋ ์จ๋ผ์ธ ์์ ์ ์ํํธ์จ์ด๋ก ํด๊ฒฐํ๊ณ ์ ํ๋ ๋ฌธ์ ์์ญ, ์ฆ ๋๋ฉ์ธ์ ํด๋นํ๋ค.\nํ ๋๋ฉ์ธ์ ๋ค์ ํ์ ๋๋ฉ์ธ์ผ๋ก ๋๋ ์ ์๋ค.\nExample\n ---- [์ ์ฐ] / / [์ฃผ๋ฌธ] ------ [ํ์] \\ | \\ | ---- [ํ์] ๋ฌด์กฐ๊ฑด ๊ณ ์ ๋ ํ์ ๋๋ฉ์ธ์ด ์กด์ฌํ๋ ๊ฒ์ ์๋๊ณ ํ์์ ๋ฐ๋ผ ๋๋ ์ ์๋ค.","title":"[DDD START SERIES] EP.1 ๋๋ฉ์ธ ๋ชจ๋ธ ์์ํ๊ธฐ"},{"content":"MDC(Mapped Diagnostic Context) MDC๋ ๋ก๊ทธ๋ฅผ ๋ ์ ์ถ์ ํ ์ ์๋๋ก ํ๋ ์ ๋ณด๋ฅผ ๋ก๊ทธ ๋ฉ์ธ์ง์ ์ฐ์์์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ์ ํ๋ค.\nMap์ผ๋ก ๋์์ผ๋ฉฐ ThreadLocal ์ฌ์ฉ์ผ๋ก ์ธํด Thread ๋จ์๋ก ์์ฑ๋๋ค.\nSlf4j MDC๋ฅผ ์ฌ์ฉ ๊ธฐ์ค์ผ๋ก org.slf4j.MDC ํด๋์ค ์์ static์ผ๋ก ์ ์ธ๋ MDCAdapter ๋ฅผ ์ฐพ์ ๋ณผ ์ ์๋ค.\nMDCAdapter๋ ์ธํฐํ์ด์ค๋ก ๋์๋๋ฐ Adapter๋ฅผ implements ํ๋ ํด๋์ค๋ฅผ ์ฐพ์ ๋ณด๋ฉด LogbackMDCAdapter ๊ฐ ๋ณด์ธ๋ค.\n์ฌ๊ธฐ์ ๋ณด๋ฉด\npublic class LogbackMDCAdapter implements MDCAdapter { ... final ThreadLocal\u0026lt;Map\u0026lt;String, String\u0026gt;\u0026gt; copyOnThreadLocal = new ThreadLocal\u0026lt;Map\u0026lt;String, String\u0026gt;\u0026gt;(); ... } ์ด๋ ๊ฒ ThreadLocal๋ก ์ ์ธ๋ ๊ฑธ ์ฐพ์ ์ ์๋ค.\nLogback ์ค์ ํ๊ธฐ MDC๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ Logback ์ค์ ์ด ํ์ํ๋ค.\n์ด ์ค์ ์ Spring WebFlux ๊ธฐ์ค ์ด๋ค.\napplication.yml logging: config: classpath:logback/logback.xml logback.xml logback.xml์์๋ MDC์์ ์ค์ ํ ๊ฐ์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค.\n์ค์ ํ ๊ฐ์ ์ฌ์ฉํ๊ธฐ ์ํด [%X{uuid}]๋ผ๋ ๊ฐ์ ๋ฐ์ ์ค์ ํ์ผ์ ๋ช
์ํด ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;configuration\u0026gt; \u0026lt;property name=\u0026#34;LOG_DIR\u0026#34; value=\u0026#34;../\u0026#34; /\u0026gt; \u0026lt;appender name=\u0026#34;CONSOLE\u0026#34; class=\u0026#34;ch.qos.logback.core.ConsoleAppender\u0026#34;\u0026gt; \u0026lt;layout class=\u0026#34;ch.qos.logback.classic.PatternLayout\u0026#34;\u0026gt; \u0026lt;Pattern\u0026gt; [%-5level] [%thread] [%X{uuid}] %d{yyyy-MM-dd HH:mm:ss.SSS} : %30logger{5} - %msg%n \u0026lt;/Pattern\u0026gt; \u0026lt;/layout\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;appender name=\u0026#34;SYSLOG\u0026#34; class=\u0026#34;ch.qos.logback.core.rolling.RollingFileAppender\u0026#34;\u0026gt; \u0026lt;file\u0026gt;${LOG_DIR}/syslog/syslog.log\u0026lt;/file\u0026gt; \u0026lt;layout class=\u0026#34;ch.qos.logback.classic.PatternLayout\u0026#34;\u0026gt; \u0026lt;Pattern\u0026gt; [%-5level] [%thread] [%X{uuid}] %d{yyyy-MM-dd HH:mm:ss.SSS} : %30logger{5} - %msg%n \u0026lt;/Pattern\u0026gt; \u0026lt;/layout\u0026gt; \u0026lt;rollingPolicy class=\u0026#34;ch.qos.logback.core.rolling.TimeBasedRollingPolicy\u0026#34;\u0026gt; \u0026lt;fileNamePattern\u0026gt;${LOG_DIR}/syslog/syslog.%d{yyyy-MM-dd}.%i.log\u0026lt;/fileNamePattern\u0026gt; \u0026lt;timeBasedFileNamingAndTriggeringPolicy class=\u0026#34;ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP\u0026#34;\u0026gt; \u0026lt;maxFileSize\u0026gt;10MB\u0026lt;/maxFileSize\u0026gt; \u0026lt;/timeBasedFileNamingAndTriggeringPolicy\u0026gt; \u0026lt;/rollingPolicy\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;appender name=\u0026#34;ACCESSLOG\u0026#34; class=\u0026#34;ch.qos.logback.core.rolling.RollingFileAppender\u0026#34;\u0026gt; \u0026lt;file\u0026gt;${LOG_DIR}/accesslog/accesslog.log\u0026lt;/file\u0026gt; \u0026lt;layout class=\u0026#34;ch.qos.logback.classic.PatternLayout\u0026#34;\u0026gt; \u0026lt;Pattern\u0026gt; [%thread] [%X{uuid}] %msg%n \u0026lt;/Pattern\u0026gt; \u0026lt;/layout\u0026gt; \u0026lt;rollingPolicy class=\u0026#34;ch.qos.logback.core.rolling.TimeBasedRollingPolicy\u0026#34;\u0026gt; \u0026lt;fileNamePattern\u0026gt;${LOG_DIR}/accesslog/accesslog.%d{yyyy-MM-dd}.%i.log\u0026lt;/fileNamePattern\u0026gt; \u0026lt;timeBasedFileNamingAndTriggeringPolicy class=\u0026#34;ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP\u0026#34;\u0026gt; \u0026lt;maxFileSize\u0026gt;10MB\u0026lt;/maxFileSize\u0026gt; \u0026lt;/timeBasedFileNamingAndTriggeringPolicy\u0026gt; \u0026lt;/rollingPolicy\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;root level=\u0026#34;info\u0026#34;\u0026gt; \u0026lt;appender-ref ref=\u0026#34;CONSOLE\u0026#34; /\u0026gt; \u0026lt;appender-ref ref=\u0026#34;SYSLOG\u0026#34; /\u0026gt; \u0026lt;/root\u0026gt; \u0026lt;logger name=\u0026#34;kr.springboot.mdc\u0026#34; level=\u0026#34;debug\u0026#34; additivity=\u0026#34;false\u0026#34;\u0026gt; \u0026lt;appender-ref ref=\u0026#34;CONSOLE\u0026#34; /\u0026gt; \u0026lt;/logger\u0026gt; \u0026lt;logger name=\u0026#34;access-log\u0026#34; level=\u0026#34;info\u0026#34; additivity=\u0026#34;false\u0026#34;\u0026gt; \u0026lt;appender-ref ref=\u0026#34;ACCESSLOG\u0026#34; /\u0026gt; \u0026lt;/logger\u0026gt; \u0026lt;/configuration\u0026gt; Spring WebFlux MDC ์ค์ ํ๊ธฐ WebFilter ํํฐ์์๋ ๋ค์ด์ค๋ ์์ฒญ์ ์ฐ๋ ๋์ MDC๋ฅผ ์ค์ ํ ์ ์๋ค.\npackage kr.springboot.mdc.filter; import org.slf4j.MDC; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebFilterChain; import reactor.core.publisher.Mono; import reactor.util.context.Context; import java.util.UUID; public class MdcLoggingFilter implements WebFilter { private static final String MDC_UUID = \u0026#34;uuid\u0026#34;; @Override public Mono\u0026lt;Void\u0026gt; filter(ServerWebExchange exchange, WebFilterChain chain) { return chain.filter(exchange).contextWrite(context -\u0026gt; { final String uuid = UUID.randomUUID().toString(); MDC.put(MDC_UUID, uuid); return Context.of(MDC_UUID, uuid); }); } } @Configuration ์ฌ๊ธฐ์ MDC์์ ์ค์ ํ ๊ฐ์๋ค ์ด๊ธฐํ ํ๊ธฐ ์ํด copyToMdc Method์์ Clear๋ฅผ ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.\npackage kr.springboot.mdc.config; import kr.springboot.mdc.filter.MdcLoggingFilter; import lombok.RequiredArgsConstructor; import org.reactivestreams.Subscription; import org.slf4j.MDC; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import reactor.core.CoreSubscriber; import reactor.core.publisher.Hooks; import reactor.core.publisher.Operators; import reactor.util.context.Context; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.util.Map; import java.util.stream.Collectors; /** * @link https://www.novatec-gmbh.de/en/blog/how-can-the-mdc-context-be-used-in-the-reactive-spring-applications/ */ @Configuration public class MdcContextLifterConfiguration { public static final String MDC_CONTEXT_REACTOR_KEY = MdcContextLifterConfiguration.class.getName(); @PostConstruct @SuppressWarnings(\u0026#34;unchecked\u0026#34;) public void contextOperatorHook() { Hooks.onEachOperator(MDC_CONTEXT_REACTOR_KEY, Operators.lift((scannable, subscriber) -\u0026gt; new MdcContextLifter(subscriber))); } @Bean public MdcLoggingFilter mdcLoggingFilter() { return new MdcLoggingFilter(); } @PreDestroy public void cleanupHook() { Hooks.resetOnEachOperator(MDC_CONTEXT_REACTOR_KEY); } /** * Helper that copies the state of Reactor [Context] to MDC on the #onNext function. */ @RequiredArgsConstructor public static class MdcContextLifter\u0026lt;T\u0026gt; implements CoreSubscriber\u0026lt;T\u0026gt; { private final CoreSubscriber\u0026lt;T\u0026gt; coreSubscriber; @Override public void onSubscribe(Subscription subscription) { coreSubscriber.onSubscribe(subscription); } @Override public void onNext(T t) { copyToMdc(coreSubscriber.currentContext()); coreSubscriber.onNext(t); } @Override public void onError(Throwable throwable) { coreSubscriber.onError(throwable); } @Override public void onComplete() { coreSubscriber.onComplete(); } @Override public Context currentContext() { return coreSubscriber.currentContext(); } /** * Extension function for the Reactor [Context]. Copies the current context to the MDC, if context is empty clears the MDC. * State of the MDC after calling this method should be same as Reactor [Context] state. * One thread-local access only. */ void copyToMdc(Context context) { if (context != null \u0026amp;\u0026amp; !context.isEmpty()) { Map\u0026lt;String, String\u0026gt; map = context.stream() .collect(Collectors.toMap(e -\u0026gt; e.getKey().toString(), e -\u0026gt; e.getValue().toString())); MDC.setContextMap(map); } else { MDC.clear(); } } } } ํ์ธํ๊ธฐ ๋ชจ๋ ์ค์ ์ด ๋๋ฌ๋ค๋ฉด ํ๋ฒ ํ์ธํด๋ณด์.\n์์ ๋ http ์์ฒญ์ ํ๋ ์์ ๋ก ์ค์ ์ ๋ก๊ทธ๋ ๋ค์๊ณผ ๊ฐ๋ค.\n์ 2022-09-04 19:57:30.184 INFO 80170 --- [ctor-http-nio-3] k.springboot.mdc.service.MdcTestService : MonoLiftFuseable 2022-09-04 19:57:30.597 DEBUG 80170 --- [ctor-http-nio-3] r.netty.http.client.HttpClientConnect : [ec54d609-1, L:/192.168.0.102:56393 - R:jsonplaceholder.typicode.com/104.21.4.48:443] Handler is being applied: {uri=https://jsonplaceholder.typicode.com/todos/1, method=GET} 2022-09-04 19:57:30.668 DEBUG 80170 --- [ctor-http-nio-3] r.n.http.client.HttpClientOperations : [ec54d609-1, L:/192.168.0.102:56393 - R:jsonplaceholder.typicode.com/104.21.4.48:443] Received response (auto-read:false) : [Date=Sun, 04 Sep 2022 10:57:32 GMT, Content-Type=application/json; charset=utf-8, Transfer-Encoding=chunked, Connection=keep-alive, X-Powered-By=Express, X-Ratelimit-Limit=1000, X-Ratelimit-Remaining=998, X-Ratelimit-Reset=1661768056, Vary=Origin, Accept-Encoding, Access-Control-Allow-Credentials=true, Cache-Control=max-age=43200, Pragma=no-cache, Expires=-1, X-Content-Type-Options=nosniff, Etag=W/\u0026#34;53-hfEnumeNh6YirfjyjaujcOPPT+s\u0026#34;, Via=1.1 vegur, CF-Cache-Status=HIT, Age=212, Report-To={\u0026#34;endpoints\u0026#34;:[{\u0026#34;url\u0026#34;:\u0026#34;https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=VHZ%2FwY%2BQiIfRRLg5C3uCqwdSSrFXtNQxmXjyt5H%2BXaHYGdJvYCILHF93IOQ3WZ47SO1oQ3Jprb9%2B5wkSD2qRBiX9%2BugQ8LmGFBFtFph%2BVsnPM1XYeH%2Bn04NhHvGLh8z5LDoazC1MrjROk1h5suPb\u0026#34;}],\u0026#34;group\u0026#34;:\u0026#34;cf-nel\u0026#34;,\u0026#34;max_age\u0026#34;:604800}, NEL={\u0026#34;success_fraction\u0026#34;:0,\u0026#34;report_to\u0026#34;:\u0026#34;cf-nel\u0026#34;,\u0026#34;max_age\u0026#34;:604800}, Server=cloudflare, CF-RAY=74563473a915b46a-HKG, alt-svc=h3=\u0026#34;:443\u0026#34;; ma=86400, h3-29=\u0026#34;:443\u0026#34;; ma=86400] 2022-09-04 19:57:30.691 DEBUG 80170 --- [ctor-http-nio-3] r.n.http.client.HttpClientOperations : [ec54d609-1, L:/192.168.0.102:56393 - R:jsonplaceholder.typicode.com/104.21.4.48:443] Received last HTTP packet ํ [INFO ] [reactor-http-nio-3] [4e3955e6-5206-4def-ab71-92e71e36d490] 2022-09-04 19:59:39.895 : k.s.m.s.MdcTestService - MonoLiftFuseable [DEBUG] [reactor-http-nio-3] [4e3955e6-5206-4def-ab71-92e71e36d490] 2022-09-04 19:59:40.771 : r.n.h.c.HttpClientConnect - [ef905c50-1, L:/192.168.0.102:56408 - R:jsonplaceholder.typicode.com/104.21.4.48:443] Handler is being applied: {uri=https://jsonplaceholder.typicode.com/todos/1, method=GET} [DEBUG] [reactor-http-nio-3] [4e3955e6-5206-4def-ab71-92e71e36d490] 2022-09-04 19:59:40.866 : r.n.h.c.HttpClientOperations - [ef905c50-1, L:/192.168.0.102:56408 - R:jsonplaceholder.typicode.com/104.21.4.48:443] Received response (auto-read:false) : [Date=Sun, 04 Sep 2022 10:59:42 GMT, Content-Type=application/json; charset=utf-8, Transfer-Encoding=chunked, Connection=keep-alive, X-Powered-By=Express, X-Ratelimit-Limit=1000, X-Ratelimit-Remaining=998, X-Ratelimit-Reset=1661768056, Vary=Origin, Accept-Encoding, Access-Control-Allow-Credentials=true, Cache-Control=max-age=43200, Pragma=no-cache, Expires=-1, X-Content-Type-Options=nosniff, Etag=W/\u0026#34;53-hfEnumeNh6YirfjyjaujcOPPT+s\u0026#34;, Via=1.1 vegur, CF-Cache-Status=HIT, Age=342, Report-To={\u0026#34;endpoints\u0026#34;:[{\u0026#34;url\u0026#34;:\u0026#34;https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=sUgBVCk8BU2qNiYJR7r7Dnf%2FlH87NAt8NWnHDj2KgiVFL%2Fc6OMFFGUhJnEy5vBize%2F%2BMLuwJIkGpKmHrRz%2Bs%2FE%2B22b6wilr6XFjQyTiFNdzWHQSVVgQYG1asn0oXHOlsqdHwTzQBzX7%2BT6vp9rUF\u0026#34;}],\u0026#34;group\u0026#34;:\u0026#34;cf-nel\u0026#34;,\u0026#34;max_age\u0026#34;:604800}, NEL={\u0026#34;success_fraction\u0026#34;:0,\u0026#34;report_to\u0026#34;:\u0026#34;cf-nel\u0026#34;,\u0026#34;max_age\u0026#34;:604800}, Server=cloudflare, CF-RAY=745637a159013d76-HKG, alt-svc=h3=\u0026#34;:443\u0026#34;; ma=86400, h3-29=\u0026#34;:443\u0026#34;; ma=86400] [DEBUG] [reactor-http-nio-3] [4e3955e6-5206-4def-ab71-92e71e36d490] 2022-09-04 19:59:40.913 : r.n.h.c.HttpClientOperations - [ef905c50-1, L:/192.168.0.102:56408 - R:jsonplaceholder.typicode.com/104.21.4.48:443] Received last HTTP packet ์ค์ ํ ๋๋ก ์ฐ๋ ๋ ์์ UUID์ ๊ฐ์ด ์ฐํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.\nUUID๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉด ๋ก๊ทธ๋ฅผ ํ์ธํ๊ธฐ ์ฌ์์ง๋ค.\nREFERENCE https://www.novatec-gmbh.de/en/blog/how-can-the-mdc-context-be-used-in-the-reactive-spring-applications/\n","permalink":"https://www.springboot.kr/posts/spring/webflux-and-mdc/","summary":"MDC(Mapped Diagnostic Context) MDC๋ ๋ก๊ทธ๋ฅผ ๋ ์ ์ถ์ ํ ์ ์๋๋ก ํ๋ ์ ๋ณด๋ฅผ ๋ก๊ทธ ๋ฉ์ธ์ง์ ์ฐ์์์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ์ ํ๋ค.\nMap์ผ๋ก ๋์์ผ๋ฉฐ ThreadLocal ์ฌ์ฉ์ผ๋ก ์ธํด Thread ๋จ์๋ก ์์ฑ๋๋ค.\nSlf4j MDC๋ฅผ ์ฌ์ฉ ๊ธฐ์ค์ผ๋ก org.slf4j.MDC ํด๋์ค ์์ static์ผ๋ก ์ ์ธ๋ MDCAdapter ๋ฅผ ์ฐพ์ ๋ณผ ์ ์๋ค.\nMDCAdapter๋ ์ธํฐํ์ด์ค๋ก ๋์๋๋ฐ Adapter๋ฅผ implements ํ๋ ํด๋์ค๋ฅผ ์ฐพ์ ๋ณด๋ฉด LogbackMDCAdapter ๊ฐ ๋ณด์ธ๋ค.\n์ฌ๊ธฐ์ ๋ณด๋ฉด\npublic class LogbackMDCAdapter implements MDCAdapter { ... final ThreadLocal\u0026lt;Map\u0026lt;String, String\u0026gt;\u0026gt; copyOnThreadLocal = new ThreadLocal\u0026lt;Map\u0026lt;String, String\u0026gt;\u0026gt;(); .","title":"MDC Logback"},{"content":"์ด๋ช
์ ๊ฑธ๋ ธ๋ค.\n์๋ฆฌ๊ฐ ๋๋ค.\n24์๊ฐ ๋๋ค.\n์๋ฌด๊ฒ๋ ๋ชปํ๋ค.\n์๋ฆฌ๊ฐ ๋๋ค.\n๋งํ๋ค.\n์ด๋ช
์ ๊ฑธ๋ ธ๋ค.\n","permalink":"https://www.springboot.kr/posts/blahblah/2022-06-09/","summary":"์ด๋ช
์ ๊ฑธ๋ ธ๋ค.\n์๋ฆฌ๊ฐ ๋๋ค.\n24์๊ฐ ๋๋ค.\n์๋ฌด๊ฒ๋ ๋ชปํ๋ค.\n์๋ฆฌ๊ฐ ๋๋ค.\n๋งํ๋ค.\n์ด๋ช
์ ๊ฑธ๋ ธ๋ค.","title":"์ด๋ช
์ ๊ฑธ๋ ธ๋ค."},{"content":"์ง๊ธ์ 5์2์ผ 12์ 40๋ถ.\n์ด๋ฒ์ฃผ ๋ต๊ฐ๋ต๊ฐ ๋๋ฉด์ ์๊ฐํด๋ด.\n๊ฐ๋
๊ณต๋ถ -\u0026gt; ๋ธ๋ก๊ทธ ๊ธ ์์ฑ\n์ฝ๋๊ณต๋ถ -\u0026gt; ๊นํ๋ธ์ ์ปค๋ฐ\n๊ฐ๋
์ ์ธ ๊ณต๋ถ์ ์ฝ๋ ๋ณํ\nํํํํํํํํํํํํํํํํํํํํํํํํํํํํํํํํํํํํ\n๋ค์์ฃผ๋ ํ์ดํ
. ์ ์๋๊ฐ์ ๊ทธ๋ ๊ฒ ํผ๊ณคํ์ง๊ฐ ์๋ค.\n๊ณต๋ถ ์์ํ์.\n","permalink":"https://www.springboot.kr/posts/blahblah/2022-05-02/","summary":"์ง๊ธ์ 5์2์ผ 12์ 40๋ถ.\n์ด๋ฒ์ฃผ ๋ต๊ฐ๋ต๊ฐ ๋๋ฉด์ ์๊ฐํด๋ด.\n๊ฐ๋
๊ณต๋ถ -\u0026gt; ๋ธ๋ก๊ทธ ๊ธ ์์ฑ\n์ฝ๋๊ณต๋ถ -\u0026gt; ๊นํ๋ธ์ ์ปค๋ฐ\n๊ฐ๋
์ ์ธ ๊ณต๋ถ์ ์ฝ๋ ๋ณํ\nํํํํํํํํํํํํํํํํํํํํํํํํํํํํํํํํํํํํ\n๋ค์์ฃผ๋ ํ์ดํ
. ์ ์๋๊ฐ์ ๊ทธ๋ ๊ฒ ํผ๊ณคํ์ง๊ฐ ์๋ค.\n๊ณต๋ถ ์์ํ์.","title":"๋ต๊ฐ๋ต๊ฐ"},{"content":"๋ธ๋ฌํน(Blocking) ๋ธ๋ฌํน์ ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ ์ด๊ถ๋ ๋ค ๋๊ฒจ์ฃผ๊ณ ์์
์ด ๋๋ ํ์ ๋๋ ค ๋ฐ๋ ๊ฒ์ ๋งํ๋ค.\n์์ ๋ 2๊ฐ์ ํด๋์ค๋ก ์งํ๋๋ฉฐ Data, Main์ผ๋ก ์งํ ๋๋ค.\n๋ธ๋ฌํน ์์ DataSync Class\npublic class DataSync { private int id; private long simulationDuration; public DataSync(int id, long simulationDuration) { this.id = id; this.simulationDuration = simulationDuration; } public String get() { try { Thread.sleep(this.simulationDuration); } catch (InterruptedException e) { e.printStackTrace(); } return \u0026#34;data-\u0026#34; + id; } } MainSync Class\npublic class MainSync { public static void main(String[] args) { long startTime, endTime; DataSync dataSync1 = new DataSync(1, 5000); // 5s DataSync dataSync2 = new DataSync(2, 2000); // 2s DataSync dataSync3 = new DataSync(3, 3000); // 3s startTime = System.currentTimeMillis(); System.out.println(\u0026#34;Start\u0026#34;); String d1 = dataSync1.get(); printData(d1); String d2 = dataSync2.get(); printData(d2); String d3 = dataSync3.get(); printData(d3); endTime = System.currentTimeMillis(); System.out.println(\u0026#34;Done\u0026#34;); System.out.print(\u0026#34;Execution time (ms): \u0026#34; + (endTime - startTime)); } private static void printData(Object data) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(\u0026#34;Synchronously printing \u0026#34; + data); } } ์ด ์์ ์ ์ถ๋ ฅ๊ฐ์ ๋ณด๊ฒ๋๋ฉด ์์ฐจ๋ก ์ถ๋ ฅ์ด ๋๊ฑธ ๋ณผ ์ ์๋ค.\nStart Synchronously printing data-1 Synchronously printing data-2 Synchronously printing data-3 Done Execution time (ms): 13046 ์ด๋ฐ ๋ฐฉ์์ ๋ธ๋ฌํน ๋ฐฉ์์ด๋ผ ํ๋ค.\n๋๋ธ๋ฌํน(Non-Blocking) ๋ธ๋ฌํน๊ณผ ๋ค๋ฅด๊ฒ ์ ์ด๊ถ์ ๊ณ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ์์
์ ์๋ฃ์ฌ๋ถ์ ์๊ด์์ด ๋ค๋ฅธ ์์
์ ์ํํ ์ ์๋๊ฒ์ ๋งํ๋ค.\n์์ ๋ 2๊ฐ์ ํด๋์ค๋ก ์งํ๋๋ฉฐ Data, Main์ผ๋ก ์งํ ๋๋ค.\n๋๋ธ๋ฌํน ์์ DataASync Class\npublic class DataAsync implements Supplier\u0026lt;String\u0026gt; { private int id; private long simulationDuration; public DataAsync(int id, long simulationDuration) { this.id = id; this.simulationDuration = simulationDuration; } @Override public String get() { try { Thread.sleep(this.simulationDuration); } catch (InterruptedException e) { e.printStackTrace(); } return \u0026#34;data-\u0026#34; + id; } } MainAsync Class\npublic class MainAsync { public static void main(String[] args) { long startTime, endTime; CountDownLatch latch = new CountDownLatch(3); DataAsync dataAsync1 = new DataAsync(1, 5000); // 5s DataAsync dataAsync2 = new DataAsync(2, 2000); // 2s DataAsync dataAsync3 = new DataAsync(3, 3000); // 3s startTime = System.currentTimeMillis(); System.out.println(\u0026#34;Start\u0026#34;); try { CompletableFuture.supplyAsync(dataAsync1).thenAccept(d1 -\u0026gt; { printData(d1); latch.countDown(); }); CompletableFuture.supplyAsync(dataAsync2).thenAccept(d2 -\u0026gt; { printData(d2); latch.countDown(); }); CompletableFuture.supplyAsync(dataAsync3).thenAccept(d3 -\u0026gt; { printData(d3); latch.countDown(); }); latch.await(); } catch (Exception e) { e.printStackTrace(); } endTime = System.currentTimeMillis(); System.out.println(\u0026#34;Done\u0026#34;); System.out.print(\u0026#34;Execution time (ms): \u0026#34; + (endTime - startTime)); } private static void printData(String data) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(\u0026#34;Synchronously printing \u0026#34; + data); } } ๋๋ธ๋ฌํน์ ์คํ๋ ์์ ์ ์ถ๋ ฅ๊ฐ์ ํ์ธํ๋ฉด ์์ ๋ธ๋ฌํน ๋ฐฉ์๊ณผ๋ ๋ค๋ฅด๊ฒ ์์ฐจ์ ์ผ๋ก ์งํ๋์ง ์๊ณ ๋จผ์ ์คํ์ด ๋๋๋ ์์ผ๋ก ์ถ๋ ฅ๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.\nStart Synchronously printing data-2 Synchronously printing data-3 Synchronously printing data-1 Done Execution time (ms): 6015 ์ด๋ฐ ๋ฐฉ์์ ๋๋ธ๋ฌํน์ด๋ผํ๋ค.\n์ฐธ์กฐ java-selector-is-asynchronous-or-non-blocking-architecture lamngockhuong/java-blocking-vs-no-blocking-example - ๋ - 500๋ฏธํฐ\n ","permalink":"https://www.springboot.kr/posts/etc/blocking-n-non-blocking/","summary":"๋ธ๋ฌํน(Blocking) ๋ธ๋ฌํน์ ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ ์ด๊ถ๋ ๋ค ๋๊ฒจ์ฃผ๊ณ ์์
์ด ๋๋ ํ์ ๋๋ ค ๋ฐ๋ ๊ฒ์ ๋งํ๋ค.\n์์ ๋ 2๊ฐ์ ํด๋์ค๋ก ์งํ๋๋ฉฐ Data, Main์ผ๋ก ์งํ ๋๋ค.\n๋ธ๋ฌํน ์์ DataSync Class\npublic class DataSync { private int id; private long simulationDuration; public DataSync(int id, long simulationDuration) { this.id = id; this.simulationDuration = simulationDuration; } public String get() { try { Thread.sleep(this.simulationDuration); } catch (InterruptedException e) { e.","title":"๋ธ๋ฌํน. ๋๋ธ๋ฌํน."},{"content":" Java์ Kotlin์์ retainAll ์ฌ์ฉํ๊ธฐ What is retainAll Method? retainAll ๋ฉ์๋๋ ๋ฌด์์ผ๊น?\nRetainAll() ๋ฉ์๋๋ ์ง์ ๋ ์ปฌ๋ ์
์ ํฌํจ๋์ง ์์ ๋ชจ๋ ๋ฐฐ์ด ๋ชฉ๋ก ์์๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ๋ฉ์๋์ ๋งค๊ฐ ๋ณ์๋ก ์ ๋ฌ๋ ์ปฌ๋ ์
๋ชฉ๋ก์ ๋ชจ๋ ์์์ ์ผ์นํ๋ ํ์ฌ ์ปฌ๋ ์
์ธ์คํด์ค์ ๋ชจ๋ ์ผ์น ์์๋ฅผ ์ ์งํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฉ์๋์ด๋ค.\n์๋์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ดํด๊ฐ ๋ ์ฝ๋ค.\nretain ์ a์ b์ ๊ณตํต๋ ๊ฐ๋ง์ ์ ์ธํ ๋ชจ๋ ๊ฐ์ ์์จ ์ ์๋ค.\n๊ทธ๋์ ์ด๋ป๊ฒ ์ฐ๋ ๊ฑด๋ฐ? a, b๋ผ๋ ์ปฌ๋ ์
์ธ์คํด์ค๊ฐ ์กด์ฌํ ๋ a.retainAll(b) ์ด๋ฐ ์์ผ๋ก ์ฌ์ฉํ๋ฉด ๋๋ค.\n์ฝํ๋ฆฐ ์ฝ๋๋ฅผ ์์ ๋ก ๋ด๋ณด์.\nfun main(args: Array\u0026lt;String\u0026gt;) { val listExampleIntArrayString = listRetainAllExample(intArrayOf(1, 2, 2, 1), intArrayOf(2, 2)).map { it.toString() }.toTypedArray() .contentToString() println(\u0026#34;list example int array =\u0026gt; \u0026#34; + listExampleIntArrayString) val setExampleIntArrayString = setRetainAllExample(intArrayOf(1, 2, 2, 1), intArrayOf(2, 2)).map { it.toString() }.toTypedArray() .contentToString() println(\u0026#34;set example int array =\u0026gt; \u0026#34; + setExampleIntArrayString) } // Runtime 461 ms Memory 43.1 MB fun listRetainAllExample(nums1: IntArray, nums2: IntArray): IntArray { val nums1List = nums1.distinct().toMutableList() val nums2List = nums2.distinct().toMutableList() nums1List.retainAll(nums2List) return nums1List.toIntArray() } // Runtime 363 ms Memory 42.4 MB fun setRetainAllExample(nums1: IntArray, nums2: IntArray): IntArray { var nums1Set = nums1.toMutableSet() val nums2Set = nums2.toMutableSet() nums1Set.retainAll(nums2Set) return nums1Set.toIntArray() } ์์ ์ฝ๋๋ฅผ ๋ณด๊ฒ ๋๋ฉด [1, 2, 2, 1], [2, 2]๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์ ์ค๋ณต์ด ์ ๊ฑฐ๋ ๊ฐ๋ค์ ์ถ๋ ค IntArray๋ก ๋ค์ ๋ฐํํ๋ ์์ ์ด๋ค.\n์์ ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ปฌ๋ ์
์ธ์คํด์ค์ธ List์ Set์ผ๋ก ์์ ๋ฅผ ๋ ๋ค.\n๋จ ์ฌ๊ธฐ์ List๋ฅผ ํตํด retainAll์ ํ ๋ ์ค๋ณต ์ ๊ฑฐ๋ฅผ ์ํ๋ ๊ฒฝ์ฐ distinct()๋ฅผ ์ฌ์ฉํด ์ค๋ณต์ ๊ฑฐ๋ฅผ ํ๋ฒ ํด์ฃผ๊ณ ๋ฆฌ์คํธ๋ก ๋ณ๊ฒฝ ํ retainAll์ ์คํํ์๋ค.\n์ค๋ณต์ด ์ ๊ฑฐ๋์ง ์์์ ๊ฒฝ์ฐ์ ๊ฒฐ๊ด๊ฐ์ ๋ค์๊ณผ ๊ฐ๋ค.\nlist example int array =\u0026gt; [2, 2] set example int array =\u0026gt; [2] distinct()๋ฅผ ์ฌ์ฉํด ์ค๋ณต ์ ๊ฑฐ๋ฅผ ํ ๊ฒฐ๊ด๊ฐ์ ๋ค์๊ณผ ๊ฐ๋ค.\nlist example int array =\u0026gt; [2] set example int array =\u0026gt; [2] ์๋ฐ์์ List๋ก retainAll์ ์ฌ์ฉํ ์ฝ๋ ์์ \npublic class AboutRetainAll { public static void main(String[] args) { System.out.println(retainAll(new int[]{1, 2, 2, 1}, new int[]{2, 2})); } public static int[] retainAll(int[] nums1, int[] nums2) { Set\u0026lt;Integer\u0026gt; nums1Set = Arrays.stream(nums1).boxed().collect(Collectors.toSet()); Set\u0026lt;Integer\u0026gt; nums2Set = Arrays.stream(nums2).boxed().collect(Collectors.toSet()); nums1Set.retainAll(nums2Set); return nums1Set.stream().mapToInt(x -\u0026gt; x).toArray(); } } END ์ด๋ ๊ฒ ํด์ retainAll ๋ฉ์๋์ ์์๋ดค๋ค. ์์ฃผ ์จ๋จน์ ์ ์๊ธธ ๐\nReference ใDataStructureใThe difference among methods addAll(),retainAll() and removeAll() kotlin-stdlib / kotlin.collections / retainAll retainAll-java.util.Collection- ","permalink":"https://www.springboot.kr/posts/java/about-retain-all/","summary":"Java์ Kotlin์์ retainAll ์ฌ์ฉํ๊ธฐ What is retainAll Method? retainAll ๋ฉ์๋๋ ๋ฌด์์ผ๊น?\nRetainAll() ๋ฉ์๋๋ ์ง์ ๋ ์ปฌ๋ ์
์ ํฌํจ๋์ง ์์ ๋ชจ๋ ๋ฐฐ์ด ๋ชฉ๋ก ์์๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ๋ฉ์๋์ ๋งค๊ฐ ๋ณ์๋ก ์ ๋ฌ๋ ์ปฌ๋ ์
๋ชฉ๋ก์ ๋ชจ๋ ์์์ ์ผ์นํ๋ ํ์ฌ ์ปฌ๋ ์
์ธ์คํด์ค์ ๋ชจ๋ ์ผ์น ์์๋ฅผ ์ ์งํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฉ์๋์ด๋ค.\n์๋์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ดํด๊ฐ ๋ ์ฝ๋ค.\nretain ์ a์ b์ ๊ณตํต๋ ๊ฐ๋ง์ ์ ์ธํ ๋ชจ๋ ๊ฐ์ ์์จ ์ ์๋ค.\n๊ทธ๋์ ์ด๋ป๊ฒ ์ฐ๋ ๊ฑด๋ฐ? a, b๋ผ๋ ์ปฌ๋ ์
์ธ์คํด์ค๊ฐ ์กด์ฌํ ๋ a.","title":"Java์ Kotlin์์ retainAll ์ฌ์ฉํ๊ธฐ"},{"content":"(๋๋ง ์ด๋์ชฝ ์ข์ ๊ณณ)\n๋ฒ์จ 3๋ฒ์งธ ๊ฐ๋ฐ์ผ์ง 3์ผ ์ ์ธ๊ฐ ์ฐ๊ณ ์ ์ผ๋๋ฐ ์ค๋ ๋ค์ ์ผ์ง๋ฅผ ์์ฑํ๊ฒ ๋๋ค.\n์ฐ์ 2๋ฒ์งธ ์ผ์ง ํ ์์๋ ์ผ๋ค์ ์ธ์ฆ ์ชฝ์ ๊ตฌ๊ธ ๋ฉ์ผ์ ํตํด ๋ฉ์ผ์ ์ธ์ฆํ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๋๋ฐ ์ผ๋ฐ ์ฌ์ฉ์๋ฅผ ์ํ ๋ชฉ์ ๋ ์์ง๋ง ๊ฒ์๋ฌผ์ ์ฌ๋ ค์ฃผ๋ ๋ฉ์ธ ์ฌ์ฉ์๋ค์ ์ํ ๊ฒ์ฆ์ ์ํด ์ถ๊ฐํ๋ค.\n๊ทธ๋ฆฌ๊ณ ์ ์ ์๊ฐํ๋ ์ฝํ๋ฆฐ ์ ์ ํ๊ธฐ๋ก ํ๋ค. ์ฝํ๋ฆฐ ์ ์ ํ๊ณ ๊ทธ๋ฅ ์ ๋ถ ์๋ฐ๋ก ํ๊ธฐ๋ก ํ๋๋ฐ ๊ทธ๋ฅ ํ๋๋ก ์ญ ํ๋ ๊ฒ ์ข์ ๊ฑฐ ๊ฐ์์ ๊ทธ๋ ๊ฒ ํ๊ธฐ๋ก ํด์ ์ฝํ๋ฆฐ ์ ๋ค์ ๊ธฐํ์..\n๊ทธ๋ฆฌ๊ณ ํ๋ก ํธ์ชฝ์ ํด๋ณด๋ ค๋ค๊ฐ ๊ทธ๋ง ์ฐธ์ง ๋ชปํ๊ณ ๊บผ๋ฒ๋ ธ๋ค. ํ๋ฌํฐ๋ก ํด๋ด์ผ๊ฒ ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋์ ์คํ์ผ์ด ์ข ๋ฌ๋ผ์ ์ ์ ํด๋ดค์ ๋ ๊ทธ๋ ๊ฒ ์ง๋ฃจํ์ง ์์๋๋ฐ ๋ ํ๋ค ๋ณด๋ฉด ํน์ ๋ชจ๋ฅด๊ฒ ์ง๋ง.\n๊ทธ๋ฆฌ๊ณ ์ ์ ๋งํ๋ DB, Kafka, Logstash๋ฅผ ์์
์ฉ ํผ์์์ ๋ ๋ฒ๋ ธ๋ค. AWS Lightsail๋ก ์ฎ๊ฒจ๋ฒ๋ ธ๋๋ฐ 1์ฝ์ด 1๊ธฐ๊ฐ 5์ฒ ์์ง๋ฆฌ๋ค. 3๊ฐ์ ๋ฌด๋ฃ๋ผ๊ณ ํด์ ํ์์ธ๋ฏํ๋ค ์ฒ์์ ๋ค ์ธํ
ํด์ ์๋์ํค๋ ์นดํ์นด์์ ๋ฉ๋ชจ๋ฆฌ ์์ ์๋ฌ๊ฐ ๋ฌ๋ค. ๊ทธ๋์ Memory swap ๊ฑธ๊ณ 3๊ธฐ ๊ฐ๊น์ง ๋๋ ธ๋ค. ๊ทธ๋ฌ๋๋ swap ๊ฑธ๋ฆฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง๊ตฌ ์ด๋ค.\n์ด์ ์์
์ฉ ์ปดํจํฐ์์๋ ์๋ฒ ๊ฐ๋ฐ๋ง ํ๊ฒ ๋๋๋ฐ. ์ด๊ฒ๋ ๋ถ๋ฆฌํ๊ณ ์ถ์๋ฐ ๋ด๊ฐ ์ฃผ๋ก ์ง์์ ์์
ํ์ง ์๊ณ ๋์๊ด์ด๋ ์นดํ์์ ์์
ํ๋ค ๋ณด๋ ๋์ค์ปค๋ฒ๋ฆฌ์ ์ฐ๊ฒฐํ ์ ์๋ ์ธ๋ถ ํฌํธ ์ฌ๋ ๊ฒ ์ฝ์ง ์๋ค. ๊ณต๊ณต ์์ดํ์ด๋ ํ
๋๋ง์ ํด์ ํ๋ฉด ํฌํธ๋ฅผ ์ด ์๊ฐ ์๋ค. ๊ทธ๋์ ๊ทธ๋ฅ ๋ค ํ ์ปดํจํฐ์์ ๋๋ฆฌ๊ณ ์๋ค.\n๊ทธ๋์ ์ด์ ๋จ์ ๊ฑด ์ ์ ์๋น์ค์ ํ์ ๊ธฐ๋ฅ์ ๋ฃ์ด์ฃผ๋ ๊ฑฐ๋ ํฌ์คํธ ์๋น์ค๋ ๋ฏธ๋์ด ์๋น์ค ๊ฐ๋ฐ์ด ๋จ์๋ค.\nํฌ์คํธ ์๋น์ค์์๋ ๊ฒ์๋ฌผ์ ์ฌ๋ฆฌ๊ณ ๋๊ธ ์ ๋? ๊ด๋ฆฌํด ์ฃผ๋ ์๋น์ค์ด๊ณ ๋ฏธ๋์ด๋ ๋ง ๊ทธ๋๋ก ๋ฏธ๋์ด ์๋น์ค์ธ๋ฐ ๋ฏธ๋์ด ์๋น์ค๋ฅผ S3๋ Object storage์ ์ฌ๋ฆด๊น ์๊ฐํ๋๋ฐ ๊ทธ๋ฅ ๊ฐ๊ฒฉ ๋๋ฌธ์ ์ ํ๊ธฐ๋ก ํ๋ค. ์ด๊ฑด ์ฌ๋น๋ก ์ด์ ์์ ์ด๊ธฐ ๋๋ฌธ์..\n๋ญ ๋จ์ ์๋น์ค๋ค์ ๊ฐ๋ฐํ๋ฉด์ feign์ผ๋ก ๋ฌถ์ด์ค API๋ค์ด ์์ผ๋ฉด ๋ ๊ฐ๋ฐํ๊ฒ ๋ ์ง๋ ๋ชจ๋ฅด์ง๋ง ์ฐ์ ์ง๊ธ ์ ์์๋ ์ธ์ฆ ์ชฝ๊ณผ ์ ์ ๋ ๋ง๋ฌด๋ฆฌ๊ฐ ๋ผ๊ฐ๋ ๋๋์ด๋ค.\n- ๋ - (๋๋ง ์ฌ๋๊ณณ ์ฅ์ ํ๋)\n","permalink":"https://www.springboot.kr/posts/devnote/thecarbtoon-3/","summary":"(๋๋ง ์ด๋์ชฝ ์ข์ ๊ณณ)\n๋ฒ์จ 3๋ฒ์งธ ๊ฐ๋ฐ์ผ์ง 3์ผ ์ ์ธ๊ฐ ์ฐ๊ณ ์ ์ผ๋๋ฐ ์ค๋ ๋ค์ ์ผ์ง๋ฅผ ์์ฑํ๊ฒ ๋๋ค.\n์ฐ์ 2๋ฒ์งธ ์ผ์ง ํ ์์๋ ์ผ๋ค์ ์ธ์ฆ ์ชฝ์ ๊ตฌ๊ธ ๋ฉ์ผ์ ํตํด ๋ฉ์ผ์ ์ธ์ฆํ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๋๋ฐ ์ผ๋ฐ ์ฌ์ฉ์๋ฅผ ์ํ ๋ชฉ์ ๋ ์์ง๋ง ๊ฒ์๋ฌผ์ ์ฌ๋ ค์ฃผ๋ ๋ฉ์ธ ์ฌ์ฉ์๋ค์ ์ํ ๊ฒ์ฆ์ ์ํด ์ถ๊ฐํ๋ค.\n๊ทธ๋ฆฌ๊ณ ์ ์ ์๊ฐํ๋ ์ฝํ๋ฆฐ ์ ์ ํ๊ธฐ๋ก ํ๋ค. ์ฝํ๋ฆฐ ์ ์ ํ๊ณ ๊ทธ๋ฅ ์ ๋ถ ์๋ฐ๋ก ํ๊ธฐ๋ก ํ๋๋ฐ ๊ทธ๋ฅ ํ๋๋ก ์ญ ํ๋ ๊ฒ ์ข์ ๊ฑฐ ๊ฐ์์ ๊ทธ๋ ๊ฒ ํ๊ธฐ๋ก ํด์ ์ฝํ๋ฆฐ ์ ๋ค์ ๊ธฐํ์.","title":"TheCarbtoon ๊ฐ๋ฐ์ผ์ง - 3"},{"content":"(์ง๋ด๊ณ ์๋ ๊ณณ์ ๊ฐ๊น์ด ํ๊ต ์ด๋์ฅ?)\nํ.. 10์ผ ์ ์ฏค ๊ฐ๋ฐ์ผ์ง 1์ ์ฌ๋ ธ๋๋ฐ ๊ทธ ๋ค๋ก ๋ชธ์ด ์ข ์ ์ข์์ ์ผ์ฃผ์ผ ์ฐ ๊ฑฐ ๊ฐ๋ค.\n์ง๊ธ ์งํ ์ํฉ์ ๋ชจ๋ ์๋น์ค๋ค๋ผ๋ฆฌ jwt๋ฅผ ํตํด ์ฌ์ฉ์๋ฅผ ํ์ธํ ์ ์๊ฒ ๋๊ณ ์ธ์ฆ ์๋น์ค์ ์ ์ ์๋น์ค์ ๊ฐ๋ฐ์ด ์ผ์ถ ์งํ๋ผ๊ฐ๊ณ ์๋๋ฐ. ์์ฆ ๋๋ ์๊ฐ์ด ์๋ฌด๋ ๊ทธ๋ฆผ์ ์ฌ๋ฆด ์ ์๊ฒ ๋ง๋ค๊ณ ์นด์นด์ค ํ์ด๋ก ํ์์ ๋ฐ์ ์ ์๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์ถ๋ค.\n์ฌ๋ฏธ๋ก ๊ทธ๋ฆฌ๋ ์ฌ๋์ด๋๋ผ๋ ํ์์ ๋ฐ๋ ๊ฑด ๋์์ง ์๋ค๊ณ ์๊ฐํ๋ค. ์์ ์ ๊ฒฐ๊ณผ๋ฌผ์ ์ฐ๋ฌผ์ด๋๊น\n์๋ฌดํผ ์์ง ์๊ฐ ์ค์ธ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์ ์ถํ์ ์ถ๊ฐ๋ ์๋ ์๊ณ ์๋ ์๋ ์๋ค.\n๊ทธ๋ฆฌ๊ณ ์ธ์ฆ ์๋น์ค์ ์ ์ ์๋น์ค์ ์ ์ ๋ ์๋ก ๊ณต์ ํ๋ค. ๋จ DB๋ ๋ค๋ฆ. ์ธ์ฆ์ ๋ชฝ๊ณ ๋ก ์ ์ ๋ mysql๋ก ๋์ด์๋ค.\n๊ทธ๋ฆฌ๊ณ ์ธ์ฆ ์๋น์ค์์๋ ํ์๊ฐ์
, ํ ํฐ ๋ฐ๊ธ, ๋ฆฌํ๋ ์ ํ ํฐ ๋ฐ๊ธ ์ ๋?์ ์ญํ ์ ํ๊ณ ์๊ณ ๋๋จธ์ง ์ ์ ์ ๊ด๋ จ๋ API๋ค์ ์ ์ ์๋น์ค์์ ๋งก์์ ํ๊ณ ์๊ฒ ๊ฐ๋ฐ ์ค์ด๋ค.\n๊ทธ๋์ ์๋ก feign์ ์ฌ์ฉํด ์๋ก ๋ฐ๋๋ ๊ฐ๋ค์ ๋ํด ์
๋ฐ์ดํธ๊ฐ ๋ ์ ์๊ฒ ๋ง๋ค์ด ๋๊ธด ํ๋๋ฐ. ๋์ค์ k8s๋ฅผ ๋ฃ์ผ๋ฉด ์ด๋ป๊ฒ ๋ ์ง ์๊ฐ๋ ์ข ํด๋ด์ผ๊ฒ ๋ค.\n์ฐ์ ํ์ฌ ์งํ ์ํฉ์ ์ด๋ฌํ๊ณ ์ฌ๋งํ๋ฉด ๋น ๋ฅธ ์๊ฐ ๋ด์ ๋นก์ธ๊ฐํด์ ์ผ์ฐ ๋๋ด๊ณ ์ถ๋ค.\nํ๋ก ํธ๋ ํด์ผ ํ๋๋ฐ jquery๋ก ํ ์ง svelte๋ฅผ ํ ์ง ๊ณ ๋ฏผ ์ค์ด๋ค..\nํ๋ก ํธ์๋ ์์ง์ด ์๋ ๊ฒ ๊ฐ๋ค. ์ฌ๋ฏธ๊ฐ ์์ด..\n๊ทธ๋ฆฌ๊ณ ๋ฐฑ์๋๊ฐ ๋๋๋ฉด ์ฌ์ฉ์๋ค๋ ๋ชจ์งํด์ผ ๋ค ๋ฉ์ผ ๋ณด๋ด๊ณ ์ชฝ์ง ๋ณด๋ด๊ณ ํด์ผ ํด์ ๋ฐ์ ๊ฒ ๊ฐ๋ค.\n- ๋ - (๋๋ง์ ํ์ดํ์ด ์๋จผ์ ์๋ ๋ํคํธํ
์์)\n","permalink":"https://www.springboot.kr/posts/devnote/thecarbtoon-2/","summary":"(์ง๋ด๊ณ ์๋ ๊ณณ์ ๊ฐ๊น์ด ํ๊ต ์ด๋์ฅ?)\nํ.. 10์ผ ์ ์ฏค ๊ฐ๋ฐ์ผ์ง 1์ ์ฌ๋ ธ๋๋ฐ ๊ทธ ๋ค๋ก ๋ชธ์ด ์ข ์ ์ข์์ ์ผ์ฃผ์ผ ์ฐ ๊ฑฐ ๊ฐ๋ค.\n์ง๊ธ ์งํ ์ํฉ์ ๋ชจ๋ ์๋น์ค๋ค๋ผ๋ฆฌ jwt๋ฅผ ํตํด ์ฌ์ฉ์๋ฅผ ํ์ธํ ์ ์๊ฒ ๋๊ณ ์ธ์ฆ ์๋น์ค์ ์ ์ ์๋น์ค์ ๊ฐ๋ฐ์ด ์ผ์ถ ์งํ๋ผ๊ฐ๊ณ ์๋๋ฐ. ์์ฆ ๋๋ ์๊ฐ์ด ์๋ฌด๋ ๊ทธ๋ฆผ์ ์ฌ๋ฆด ์ ์๊ฒ ๋ง๋ค๊ณ ์นด์นด์ค ํ์ด๋ก ํ์์ ๋ฐ์ ์ ์๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์ถ๋ค.\n์ฌ๋ฏธ๋ก ๊ทธ๋ฆฌ๋ ์ฌ๋์ด๋๋ผ๋ ํ์์ ๋ฐ๋ ๊ฑด ๋์์ง ์๋ค๊ณ ์๊ฐํ๋ค. ์์ ์ ๊ฒฐ๊ณผ๋ฌผ์ ์ฐ๋ฌผ์ด๋๊น","title":"TheCarbtoon ๊ฐ๋ฐ์ผ์ง - 2"},{"content":"Spring Cloud Stream Binder Kafka๋ฅผ ์ํ ๊ธ.\n๋ฒ์ ์ด ์ฌ๋ผ์ค๋ฉด์ @OUTPUT ์ด๋
ธํ
์ด์
์ด Deprecated ๋ผ์ ์ฐพ์๋ดค๋๋ฐ StreamBridge๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค ํ๋ค.\n์ผ๋จ ์ฒ์๋ถํฐ ๋ด๋ด
์๋ค.\nimplementation group: \u0026#39;org.springframework.cloud\u0026#39;, name: \u0026#39;spring-cloud-stream-binder-kafka\u0026#39;, version: \u0026#39;3.2.1\u0026#39; ๋ฅผ ์ถ๊ฐํ๋ฉด 5๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ถ๊ฐ ๋๋ค.\nGradle: org.springframework.cloud:spring-cloud-function-context:3.2.1 Gradle: org.springframework.cloud:spring-cloud-function-core:3.2.1 Gradle: org.springframework.cloud:spring-cloud-stream:3.2.1 Gradle: org.springframework.cloud:spring-cloud-stream-binder-kafka:3.2.1 Gradle: org.springframework.cloud:spring-cloud-stream-binder-kafka-core:3.2.1 ๊ทธ๋ผ ์์ํด๋ณด์.\n์ฐ์ application.yml์ cloud kafka๋ฅผ ์ค์ ํด์ค์๋ค.\ncloud: function: definition: consumer;producer stream: kafka: bindings: producer-out-0: producer: configuration: key: serializer: org.apache.kafka.common.serialization.StringSerializer consumer-in-0: consumer: configuration: key: deserializer: org.apache.kafka.common.serialization.StringDeserializer value: deserializer: com.example.studyspringboot.cloud.stream.binder.kafka.MessageDeserializer # (2) binder: brokers: localhost:9094 bindings: producer-out-0: # (1) destination: carbtoon.test.service # topic contentType: application/json consumer-in-0: destination: carbtoon.test.service # topic consumer: use-native-decoding: true # (3) ์ปค์คํ
deserializer๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํ์ฑํ๋ฅผ ์ํด true๋ก ์ค์ ํฉ๋๋ค. ์ค์ ์ด ๋๋๋ค๋ฉด Producer๋ฅผ ์ํ ํด๋์ค๋ฅผ ํ๋ ์์ฑ.\n @RequiredArgsConstructor @Component public class KafkaProducer { private final StreamBridge streamBridge; // StreamBridge๋ฅผ ์ฃผ์
ํด์ฃผ์. @Async public void send(SpringbootKRPayload payload) { streamBridge.send(\u0026#34;producer-out-0\u0026#34;, MessageBuilder // โ application.yml์ (1)๊ณผ ๊ฐ์์ผํฉ๋๋ค. // send์ ์ฒซ๋ฒ์งธ String parameter ์ด๋ฆ์ String bindingName ์
๋๋ค. .withPayload(payload) .setHeader(KafkaHeaders.MESSAGE_KEY, UUID.randomUUID().toString()) .build()); } } ์ด๋ ๊ฒ Producer๊ฐ ์์ฑ์ด ๋๋๋ฉด ๋ค์์ผ๋ก๋ Consumer ํด๋์ค๋ฅผ ์์ฑ.\n @Component public class KafkaConsumer { @Bean public Consumer\u0026lt;Message\u0026gt; consumer() { return message -\u0026gt; System.out.println(message); } } ๊ทธ๋ฆฌ๊ณ ํ
์คํธ๋ฅผ์ํ Payload๋ฅผ ํ๋ ๋ง๋ญ๋๋ค.\n @Getter @Setter @ToString public class SpringbootKRPayload { private String host; private String title; private String name; @JsonProperty(\u0026#34;payload_type\u0026#34;) private PayloadType payloadType; @Builder public SpringbootKRPayload(String host, String title, String name, PayloadType payloadType) { this.host = host; this.title = title; this.name = name; this.payloadType = payloadType; } } public enum PayloadType { CREATED, UPDATED, DELETED } ๊ทธ๋ฆฌ๊ณ application.yml์ (2)์ ํ์ํ ์ปค์คํ
deserializer ํด๋์ค๋ฅผ ํ๋ ๋ง๋ญ๋๋ค.\npublic class MessageDeserializer implements Deserializer\u0026lt;SpringbootKRPayloadDeserializer\u0026gt; { private final ObjectMapper objectMapper = new ObjectMapper(); @Override public SpringbootKRPayloadDeserializer deserialize(String topic, byte[] data) { try { return objectMapper.readValue(new String(data), SpringbootKRPayloadDeserializer.class); } catch (IOException e) { throw new SerializationException(e); } } } ์์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ application.yml์ (3)์ true๋ก ์ค์ ํด ์ฃผ์ด์ผํฉ๋๋ค.\n๊ทธ๋ฆฌ๊ณ ๋ค์์ผ๋ก ์์ ์ฝ๋์ค Deserializer๋ฅผ ์ํ SpringbootKRPayloadDeserializer๋ฅผ ๋ง๋ค์ด ์ค๋๋ค.\npublic class SpringbootKRPayloadDeserializer { @JsonProperty(\u0026#34;payload_type\u0026#34;) private String payloadType; @JsonProperty(\u0026#34;host\u0026#34;) private String host; @JsonProperty(\u0026#34;name\u0026#34;) private String name; @JsonProperty(\u0026#34;title\u0026#34;) private String title; } ๊ทธ๋ฆฌ๊ณ ํ
์คํธ๋ฅผ ์ํ ์ค์ผ์ค๋ฌ๋ฅผ ํ๋ ๋ง๋ค์ด ๋ด
๋๋ค. (์ค์ผ์ค๋ฌ๋ฅผ ๋ง๋ค์์ผ๋ application์ @EnableScheduling ์ถ๊ฐ)\n @RequiredArgsConstructor @Component public class Scheduler { private KafkaProducer kafkaProducer; @Scheduled(cron = \u0026#34;*/5 * * * * *\u0026#34;) public void sendMessage() { kafkaProducer.send(SpringbootKRPayload.builder() .host(\u0026#34;SPRINGBOOT.KR\u0026#34;) .title(\u0026#34;SPRING CLOUD STREAM KAFKA\u0026#34;) .name(\u0026#34;JINWOO-LEE\u0026#34;) .payloadType(PayloadType.CREATED) .build()); } } ์ด์ ์คํํ๋ฉด??\nGenericMessage [payload=SpringbootKRPayloadDeserializer( payloadType=CREATED, host=SPRINGBOOT.KR, name=JINWOO-LEE, title=SPRING CLOUD STREAM KAFKA), headers={deliveryAttempt=1, kafka_timestampType=CREATE_TIME, kafka_receivedTopic=carbtoon.test.service, skip-input-type-conversion=true, kafka_offset=158, scst_nativeHeadersPresent=true, kafka_consumer=org.apache.kafka.clients.consumer.KafkaConsumer@15d20e35, source-type=streamBridge, id=6a8cd101-3ac7-59ef-3d54-0429e761a4e8, kafka_receivedPartitionId=0, contentType=application/json, kafka_receivedTimestamp=1642531182377, kafka_groupId=anonymous.fa9c0bcf-ba1b-4a0e-be4e-4f997785cf91, timestamp=1642531182464}] ์ฑ๊ณต์ด๋ค.\n์ฐธ์กฐ\n Spring Cloud Stream With Kafka ","permalink":"https://www.springboot.kr/posts/spring/spring-cloud-stream-binder-kafka/","summary":"Spring Cloud Stream Binder Kafka๋ฅผ ์ํ ๊ธ.\n๋ฒ์ ์ด ์ฌ๋ผ์ค๋ฉด์ @OUTPUT ์ด๋
ธํ
์ด์
์ด Deprecated ๋ผ์ ์ฐพ์๋ดค๋๋ฐ StreamBridge๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค ํ๋ค.\n์ผ๋จ ์ฒ์๋ถํฐ ๋ด๋ด
์๋ค.\nimplementation group: \u0026#39;org.springframework.cloud\u0026#39;, name: \u0026#39;spring-cloud-stream-binder-kafka\u0026#39;, version: \u0026#39;3.2.1\u0026#39; ๋ฅผ ์ถ๊ฐํ๋ฉด 5๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ถ๊ฐ ๋๋ค.\nGradle: org.springframework.cloud:spring-cloud-function-context:3.2.1 Gradle: org.springframework.cloud:spring-cloud-function-core:3.2.1 Gradle: org.springframework.cloud:spring-cloud-stream:3.2.1 Gradle: org.springframework.cloud:spring-cloud-stream-binder-kafka:3.2.1 Gradle: org.springframework.cloud:spring-cloud-stream-binder-kafka-core:3.2.1 ๊ทธ๋ผ ์์ํด๋ณด์.\n์ฐ์ application.yml์ cloud kafka๋ฅผ ์ค์ ํด์ค์๋ค.\ncloud: function: definition: consumer;producer stream: kafka: bindings: producer-out-0: producer: configuration: key: serializer: org.","title":"StreamBridge ์ฌ์ฉํ๊ธฐ"},{"content":"์ค๋์ ELK๋ ์จ๋ฆํ๋ค. ์๋๋ฉด ๋ด๊ฐ ์ง๊ธ ํด์ธ์ ์์ผ๋๊น ์จ๋ฆํ๋ค.\n์ฐ์ ์ง๊ธ ๊ฐ๋ฐํ ๋ ์ฐ๋ ๊ฑด 5๋
๋์ ๋งฅ๋ถ ๋์ผ์ฝ์ด์ 8๊ธฐ๊ฐ์ธ๋ฐ\nํ๋ก์ ํธ๋ฅผ MSA๋ก ํ๋๊น ์๋น์ค๋ง 5๊ฐ๋ฅผ ๋๋ฆฌ๊ณ ๋์ปค ์์ ์ปจํ
์ด๋๋ ์ฌ๋ฌ๊ฐ ๋์ฐ๊ณ ์นดํ์นด๋ ํค๊ณ ํ๋๊น ํ๋ฃจ๋ ๋น ์ง์์ด ๋นํ๊ธฐ ์ด๋ฅ์ ์๋ํ๋ค.\n๊ฑฐ๊ธฐ๋ค elk๊ฐ ํ์ํ๊ฒ ๋๋๋ฐ ๋งจ๋ ์ด๋ฅํ๋ ๋งฅ๋ถ์ ๋ญ๊ฐ๋ฅผ ๋ํ๊ธฐ ์ซ์ด์ ํ๊ตญ ์ง์ ์๋ rpi์ elk ์ค์น๋ฅผ ์๋ํ๋ค.\n๊ฒฐ๊ตญ์ ๋๊ธด ํ๋๋ฐ ek๋ง ๋๋ค l๋นผ๊ณ ใ
ใ
\nek๋ rpi์ ๊น๊ณ logstash๋ ๋งฅ์ ๊น์๋ค.\n๊ทธ๋ฆฌ๊ณ ์ฐ๊ฒฐํ๋ ๋ฐ ์ ๋ฅผ ์ข ๋จน์๋ค. ์นดํ์นด ๋๋ฌธ์. ๊ฒฐ๊ตญ ๋ค ๋๊ธด ํ๋๋ฐ.\n4์๊ฐ ์ ๋ ์ก์๋จนํ ๊ฑฐ ๊ฐ๋ค. ๋ด์ผ๋ถํฐ๋ ๋ค์ ์๋ฒ ๊ฐ๋ฐ ์์์ด๋ค.\n- ๋ - ","permalink":"https://www.springboot.kr/posts/blahblah/fight-with-elk/","summary":"์ค๋์ ELK๋ ์จ๋ฆํ๋ค. ์๋๋ฉด ๋ด๊ฐ ์ง๊ธ ํด์ธ์ ์์ผ๋๊น ์จ๋ฆํ๋ค.\n์ฐ์ ์ง๊ธ ๊ฐ๋ฐํ ๋ ์ฐ๋ ๊ฑด 5๋
๋์ ๋งฅ๋ถ ๋์ผ์ฝ์ด์ 8๊ธฐ๊ฐ์ธ๋ฐ\nํ๋ก์ ํธ๋ฅผ MSA๋ก ํ๋๊น ์๋น์ค๋ง 5๊ฐ๋ฅผ ๋๋ฆฌ๊ณ ๋์ปค ์์ ์ปจํ
์ด๋๋ ์ฌ๋ฌ๊ฐ ๋์ฐ๊ณ ์นดํ์นด๋ ํค๊ณ ํ๋๊น ํ๋ฃจ๋ ๋น ์ง์์ด ๋นํ๊ธฐ ์ด๋ฅ์ ์๋ํ๋ค.\n๊ฑฐ๊ธฐ๋ค elk๊ฐ ํ์ํ๊ฒ ๋๋๋ฐ ๋งจ๋ ์ด๋ฅํ๋ ๋งฅ๋ถ์ ๋ญ๊ฐ๋ฅผ ๋ํ๊ธฐ ์ซ์ด์ ํ๊ตญ ์ง์ ์๋ rpi์ elk ์ค์น๋ฅผ ์๋ํ๋ค.\n๊ฒฐ๊ตญ์ ๋๊ธด ํ๋๋ฐ ek๋ง ๋๋ค l๋นผ๊ณ ใ
ใ
\nek๋ rpi์ ๊น๊ณ logstash๋ ๋งฅ์ ๊น์๋ค.\n๊ทธ๋ฆฌ๊ณ ์ฐ๊ฒฐํ๋ ๋ฐ ์ ๋ฅผ ์ข ๋จน์๋ค.","title":"ELK๋ ์จ๋ฆํ๋ "},{"content":"@Authenticationprincipal !์ด ์ด๋
ธํ
์ด์
์ Package org.springframework.security.core.annotation ์ ์๋ ์ด๋
ธํ
์ด์
์
๋๋ค.\ndocs.spring.io์์ ํ์ธํด ๋ณด๋ฉด ์ด ์ด๋
ธํ
์ด์
์ Authentication.getPrincipal()๋ฉ์๋ ์ธ์๋ฅผ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋๋ค๊ณ ํ๋๋ฐ Authentication ์ธํฐํ์ด์ค์ ๋ํด์๋ ๋ค์์ ๋ค๋ฃจ๊ณ ์ฐ์ ์ด ๋ฉ์๋๋ง ํ์ธํด ๋ณด๊ฒ ๋๋ฉด\ngetPrincipal\n์ธ์ฆ ์ค์ธ ์ฃผ์ฒด์ ID์
๋๋ค.\n์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๊ฐ ์๋ ์ธ์ฆ ์์ฒญ์ ๊ฒฝ์ฐ, ์ด ์ฌ์ฉ์ ์ด๋ฆ์ด ๋ฉ๋๋ค.\nํธ์ถ์๋ ์ธ์ฆ ์์ฒญ์ ์ฃผ์ฒด๋ฅผ ์ฑ์์ผ ํฉ๋๋ค.\nAuthenticationManager ๊ตฌํ์ฒด๋ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ ์ ์๋ ์ฃผ์ฒด๋ก์ ๋ ํ๋ถํ ์ ๋ณด๋ฅผ ํฌํจํ๋ ์ธ์ฆ์ ๋ฐํํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.\n๋ง์ ์ธ์ฆ ๊ณต๊ธ์๊ฐ UserDetails ๊ฐ์ฒด๋ฅผ ์ฃผ์ฒด๋ก ๋ง๋ญ๋๋ค.\n๋ผ๊ณ ํ๋ค. ๊ทธ๋ผ ์ด์ @Authenticationprincipal์ ๋ํด ํ๋ฒ ํ์ธํด๋ณด์.\nSpring Security๋ฅผ ์ฌ์ฉํ ๋ @AuthenticationPrincipal์ ์ฌ์ฉ์๊ฐ ์ธ์ฆ๋ ๊ฒฝ์ฐ principal๋ฅผ ์ฃผ์
ํ๊ณ \n์ฌ์ฉ์๊ฐ ์ธ์ฆ๋์ง ์์ ๊ฒฝ์ฐ null์ ์ฃผ์
ํ๋๋ฐ ๋๋ถ๋ถ์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ UserDetails์ ์์๋ฐ์ ์ปค์คํ
์ผ๋ก ์ ์ ๋ํ
์ผ์ ๋ง๋ค๊ณ ์์ํ๊ธฐ์ ์๋ ์ฝ๋์์๋ TestUserDetails๋ก ๋ฐ์ ์ ์๋ค.\n@RestController public class UserController { @GetMapping(\u0026#34;/username\u0026#34;) public String getUserName(@AuthenticationPrincipal TestUserDetails testUserDetails) { return testUserDetails.getUsername(); } } ๋ง์ฝ์ @Authenticationprincipal๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด SecurityContextHolder๋ฅผ ์ฌ์ฉํด Principal๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.\n@RestController public class UserController { @GetMapping(\u0026#34;/username\u0026#34;) public String getUserName(@AuthenticationPrincipal TestUserDetails testUserDetails) { SecurityContext context = SecurityContextHolder.getContext(); Authentication authentication = context.getAuthentication(); TestUserDetails testUserDetails = (TestUserDetails) authentication.getPrincipal(); return testUserDetails.getUsername(); } } ์ฐธ์กฐ\n Annotation Type AuthenticationPrincipal Interface Authentication [Spring Boot] How to stub @AuthenticationPrincipal argument with Spring-Security in Unit Tests Spring Security: Authentication and Authorization In-Depth - ๋ - ","permalink":"https://www.springboot.kr/posts/spring/authenticationprincipal-security/","summary":"@Authenticationprincipal !์ด ์ด๋
ธํ
์ด์
์ Package org.springframework.security.core.annotation ์ ์๋ ์ด๋
ธํ
์ด์
์
๋๋ค.\ndocs.spring.io์์ ํ์ธํด ๋ณด๋ฉด ์ด ์ด๋
ธํ
์ด์
์ Authentication.getPrincipal()๋ฉ์๋ ์ธ์๋ฅผ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋๋ค๊ณ ํ๋๋ฐ Authentication ์ธํฐํ์ด์ค์ ๋ํด์๋ ๋ค์์ ๋ค๋ฃจ๊ณ ์ฐ์ ์ด ๋ฉ์๋๋ง ํ์ธํด ๋ณด๊ฒ ๋๋ฉด\ngetPrincipal\n์ธ์ฆ ์ค์ธ ์ฃผ์ฒด์ ID์
๋๋ค.\n์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๊ฐ ์๋ ์ธ์ฆ ์์ฒญ์ ๊ฒฝ์ฐ, ์ด ์ฌ์ฉ์ ์ด๋ฆ์ด ๋ฉ๋๋ค.\nํธ์ถ์๋ ์ธ์ฆ ์์ฒญ์ ์ฃผ์ฒด๋ฅผ ์ฑ์์ผ ํฉ๋๋ค.\nAuthenticationManager ๊ตฌํ์ฒด๋ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ ์ ์๋ ์ฃผ์ฒด๋ก์ ๋ ํ๋ถํ ์ ๋ณด๋ฅผ ํฌํจํ๋ ์ธ์ฆ์ ๋ฐํํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.\n๋ง์ ์ธ์ฆ ๊ณต๊ธ์๊ฐ UserDetails ๊ฐ์ฒด๋ฅผ ์ฃผ์ฒด๋ก ๋ง๋ญ๋๋ค.","title":"@Authenticationprincipal์ ๋ํ์ฌ"},{"content":"์ด๋ฒ ๊ฒ์๋ฌผ์ JPA๋ฅผ ์ฌ์ฉํ ๋ querydsl ์์ด ์ฌ๋ฌ ์ํฐํฐ๋ฅผ join ํ๋ ๋ฐฉ๋ฒ์ด๋ค.\n๋จ ์กฐ๊ฑด์ผ๋ก ์ํฐํฐ ์ค ๋ค๋ฅธ ์ํฐํฐ ๊ฐ์ ์ค๊ฐ์ ์ญํ ์ ํ๋ ์ํฐํฐ๊ฐ ํ์ํ๋ค ๋งคํ์ด ๋์ด ์์ด์ผ ํ๋ค.\n์ฝ๋๋ก ๋ณด์\n@Entity public class Company { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = \u0026#34;company\u0026#34;, fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) @JoinColumn(name = \u0026#34;company_id\u0026#34;) private List\u0026lt;Product\u0026gt; products = new ArrayList\u0026lt;\u0026gt;(); @OneToOne(mappedBy = \u0026#34;company\u0026#34;, fetch = FetchType.LAZY) private Employee employee; } @Entity public class Employee { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = \u0026#34;company_id\u0026#34;) private Company company; } @Entity public class Product { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; } ์ด ์ฝ๋๋ฅผ ๋ณด๋ฉด Company๋ 2๊ฐ์ ๋ค๋ฅธ ์ํฐํฐ์ ์ฐ๊ฒฐ๋ผ์๋ ์ํ์ด๋ค.\n์ด ์ํ์์ ๋ณธ๋ค๋ฉด Product์ Employee๋ ์๋ก ๊ด๊ณ๊ฐ ์๋ ์ํฐํฐ์ฒ๋ผ ๋ณด์ด์ง๋ง\nCompany๋ผ๋ ์ค๊ฐ์ ์ํฐํฐ๋ฅผ ํตํด ์๋ก ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํ๋ค.\n์ฌ์ฉ๋ฐฉ๋ฒ์ ์ด๋ฌํ๋ค ๋ฐ์ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ๋ณด์.\n@Repository public interface EmployeeRepository extends JpaRepository\u0026lt;Employee, Long\u0026gt; { List\u0026lt;Employee\u0026gt; findByCompany_Products_Name(String productsName); } ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ ํฌ์งํ ๋ฆฌ๋ EmployeeRepository์ด๋ค.\n๋ฉ์๋๋ฅผ ๋ณด๋ฉด findBy ํ์ Employee์ ์๋ Company๋ฅผ ๋ถ๋ฌ์ค๊ณ _๋ฅผ ์ฌ์ฉํด Company ์์ ์๋ Products๋ฅผ ๋ถ๋ฌ์จ๋ค.\n๊ทธ ํ _๋ฅผ ์ฌ์ฉํด Product ์์ name๊น์ง ๋ถ๋ฌ์จ๋ค. ๊ทธ๋ ๊ฒ ํด์ ์์ฑ๋ ๋ฉ์๋๋ findByCompany_Products_Name์ด๋ค\n์ด๋ ๊ฒ ๋ฉ์๋๊ฐ ์์ฑ๋๋ฉด ์คํ๋๋ ์ฟผ๋ฆฌ๋ Product์ name์ ์ฐพ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ ๋ค\n๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.\nHibernate: select employee0_.id as id1_1_, employee0_.company_id as company_3_1_, employee0_.name as name2_1_ from employee employee0_ left outer join company company1_ on employee0_.company_id=company1_.id left outer join product products2_ on company1_.id=products2_.company_id where products2_.name=? employee๋ก ์์ํด์ company๋ฅผ left outer join ๊ทธ๋ฆฌ๊ณ product๋ฅผ left outer join ํด์ product name์ ์ฐพ๋ ๊ฑธ ๋ณผ ์ ์๋ค.\n๋จ ์ฌ์ฉ์ ์ฃผ์ํ ์ ์ ์ํฐํฐ ๋ด๋ถ์ ๋งคํ์ ์ํด์ค์ผ ํ๋ค๋ ๊ฒ์ด๋ค.\n๋ง์ฝ ์ ์ํ์์ Company์ Product๊ฐ ์๊ณ Product ์ํฐํฐ ์์ ๋จ๋ฐฉํฅ์ผ๋ก ๋ผ์์ ๊ฒฝ์ฐ์๋ ์๋๋ค.\n- ๋ - ","permalink":"https://www.springboot.kr/posts/spring/jpa-multiple-mapping-domain-join/","summary":"์ด๋ฒ ๊ฒ์๋ฌผ์ JPA๋ฅผ ์ฌ์ฉํ ๋ querydsl ์์ด ์ฌ๋ฌ ์ํฐํฐ๋ฅผ join ํ๋ ๋ฐฉ๋ฒ์ด๋ค.\n๋จ ์กฐ๊ฑด์ผ๋ก ์ํฐํฐ ์ค ๋ค๋ฅธ ์ํฐํฐ ๊ฐ์ ์ค๊ฐ์ ์ญํ ์ ํ๋ ์ํฐํฐ๊ฐ ํ์ํ๋ค ๋งคํ์ด ๋์ด ์์ด์ผ ํ๋ค.\n์ฝ๋๋ก ๋ณด์\n@Entity public class Company { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = \u0026#34;company\u0026#34;, fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) @JoinColumn(name = \u0026#34;company_id\u0026#34;) private List\u0026lt;Product\u0026gt; products = new ArrayList\u0026lt;\u0026gt;(); @OneToOne(mappedBy = \u0026#34;company\u0026#34;, fetch = FetchType.","title":"JPA ๋ค์ค ๋งคํ ์ํฐํฐ Querydsl ์์ด Join ํ๊ธฐ"},{"content":"JPA N+1์ ๋ง์ด ๊ฒช์ด๋ณธ ๋ฌธ์ ์ผ๋ฏํ๋ฐ.\n์ฌ์ด ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ๋ fetch join ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค.\n์ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง์ด ์ฐ์ด๋ 3๊ฐ์ง๋ฅผ ์๊ฐํ๋ค.\n @NamedEntityGraph ์ @EntityGraph ๋ฅผ ์ฌ์ฉํด ํด๊ฒฐํ๊ธฐ Querydsl ์ ์ฌ์ฉํด ํด๊ฒฐํ๊ธฐ JPQL ์ ์ฌ์ฉํด ํด๊ฒฐํ๊ธฐ ๋๋ ์ฌ๊ธฐ ์ค์์ 1๋ฒ๊ณผ ๋น์ทํ๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค.\n์ฝ๋๋ฅผ ๋ณด์\n์ฐ์ Entity ํด๋์ค๋ค๋ถํฐ ๋ณด์ Company์ Product๊ฐ ์๋ค.\n@Entity public class Company { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = \u0026#34;company\u0026#34;, fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) private List\u0026lt;Product\u0026gt; products = new ArrayList\u0026lt;\u0026gt;(); @Builder public Company(Long id, String name, List\u0026lt;Product\u0026gt; products) { this.id = id; this.name = name; this.products = products; } public void setProducts(List\u0026lt;Product\u0026gt; products) { this.products = products; } } @Entity public class Product { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = \u0026#34;company_id\u0026#34;) private Company company; @Builder public Product(Long id, String name, Company company) { this.id = id; this.name = name; this.company = company; } public void setCompany(Company company) { this.company = company; } } ๋ค์์ผ๋ก Repository๋ฅผ ๋ณด์\n@Repository public interface CompanyRepository extends JpaRepository\u0026lt;Company, Long\u0026gt; { @Override List\u0026lt;Company\u0026gt; findAll(); } ๋ฐ์ดํฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.\nCompany Table\n id Name 7 Coke 8 Nike Product Table\n id Name company_id 9 CocaCola 7 10 Sprite 7 11 ZeroCola 7 12 Shoes 8 ์ฐ์ ์ด๋ ๊ฒ ๋ผ์๋ ์ฝ๋๋ฅผ ํ
์คํธ ๋๋ ค๋ณด์.\n@SpringBootTest public class JpaNPlusOneTest { @Autowired CompanyRepository companyRepository; @Test void findCompanyTest() { companyRepository.findAll(); } } Hibernate: select company0_.id as id1_0_, company0_.name as name2_0_ from company company0_ Hibernate: select products0_.company_id as company_3_1_0_, products0_.id as id1_1_0_, products0_.id as id1_1_1_, products0_.company_id as company_3_1_1_, products0_.name as name2_1_1_ from product products0_ where products0_.company_id=? Hibernate: select products0_.company_id as company_3_1_0_, products0_.id as id1_1_0_, products0_.id as id1_1_1_, products0_.company_id as company_3_1_1_, products0_.name as name2_1_1_ from product products0_ where products0_.company_id=? ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ฒ ๋๋ฉด company๋ฅผ ์ฐพ๊ณ ์ฐพ์ company๋ฅผ 1๊ฐ์ฉ product์์ ๊ฒ์ํ๋ค.\n๊ทธ๋ผ ์ด์ ์ฌ๊ธฐ์ Repository ์์ ์ด๋ฒ์ ๊ธ์์ ๋งํ๊ณ ์ถ์ @EntityGraph(attributePaths = {\u0026quot;products\u0026quot;}, type = EntityGraph.EntityGraphType.LOAD) ์ด๋
ธํ
์ด์
์ ๋ถ์ด๊ณ ์คํํด ๋ณด์\n@Repository public interface CompanyRepository extends JpaRepository\u0026lt;Company, Long\u0026gt; { @EntityGraph(attributePaths = {\u0026#34;products\u0026#34;}, type = EntityGraph.EntityGraphType.LOAD) @Override List\u0026lt;Company\u0026gt; findAll(); } Hibernate: select company0_.id as id1_0_0_, products1_.id as id1_1_1_, company0_.name as name2_0_0_, products1_.company_id as company_3_1_1_, products1_.name as name2_1_1_, products1_.company_id as company_3_1_0__, products1_.id as id1_1_0__ from company company0_ left outer join product products1_ on company0_.id=products1_.company_id ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด 3๋ฒ์ ์กฐํ์์ 1๋ฒ์ ์กฐํ๋ก ํด๊ฒฐ๋ ๊ฒ์ ๋ณผ ์๊ฐ ์๋ค.\n๊ธ ์์์ ์๊ฐํ 1๋ฒ์ ๋ด์ฉ ์ค @NamedEntityGraph๋ฅผ ์ฌ์ฉํ์ง ์๊ณ @EntityGraph๋ง์ผ๋ก๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.\n๋ ๊ฐ๊ฒฐํด ํธํด์ง ์ ์๋ค.\n์ฐธ๊ณ ๋ก @EntityGraph์ ์๋ type์ผ๋ก๋ 2๊ฐ์ง๊ฐ ์๋๋ฐ\nEnum Constant Detail LOAD EntityGraph.EntityGraphType LOAD\njavax.persistence.loadgraph ์์ฑ์ ์ฌ์ฉํ์ฌ ์ํฐํฐ ๊ทธ๋ํ๋ฅผ ์ง์ ํ ๋ ์ํฐํฐ ๊ทธ๋ํ์ ์์ฑ ๋
ธ๋์ ์ํด ์ง์ ๋ ์์ฑ์ FetchType.EAGER๋ก ์ฒ๋ฆฌ๋๊ณ ์ง์ ๋์ง ์์ ์์ฑ์ ์ง์ ๋ ๋๋ ๊ธฐ๋ณธ FetchType์ ๋ฐ๋ผ ์ฒ๋ฆฌ๋ฉ๋๋ค.\nFETCH EntityGraph.EntityGraphType FETCH\njavax.persistence.fetchgraph ์์ฑ์ ์ฌ์ฉํ์ฌ ์ํฐํฐ ๊ทธ๋ํ๋ฅผ ์ง์ ํ ๋ ์ํฐํฐ ๊ทธ๋ํ์ ์์ฑ ๋
ธ๋์ ์ํด ์ง์ ๋ ์์ฑ์ FetchType.EAGER๋ก ์ฒ๋ฆฌ๋๊ณ ์ง์ ๋์ง ์์ ์์ฑ์ FetchType.LAZY๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.\n๋ผ๊ณ Enum EntityGraph.EntityGraphType ์ฌ๊ธฐ์ ๋์๋ค\n์ด๊ธ [Spring Data] @EntityGraph๋ก lazy ํจ์น ๊ฐ์ด ๋ถ๋ฌ์ค๊ธฐ (fetch-graph ์ปค์คํฐ๋ง์ด์ง) ๋ ์ฐธ์กฐ ํ๋ค.\n- ๋ - ","permalink":"https://www.springboot.kr/posts/spring/jpa-n-plus-1-problem-with-entity-graph/","summary":"JPA N+1์ ๋ง์ด ๊ฒช์ด๋ณธ ๋ฌธ์ ์ผ๋ฏํ๋ฐ.\n์ฌ์ด ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ๋ fetch join ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค.\n์ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง์ด ์ฐ์ด๋ 3๊ฐ์ง๋ฅผ ์๊ฐํ๋ค.\n @NamedEntityGraph ์ @EntityGraph ๋ฅผ ์ฌ์ฉํด ํด๊ฒฐํ๊ธฐ Querydsl ์ ์ฌ์ฉํด ํด๊ฒฐํ๊ธฐ JPQL ์ ์ฌ์ฉํด ํด๊ฒฐํ๊ธฐ ๋๋ ์ฌ๊ธฐ ์ค์์ 1๋ฒ๊ณผ ๋น์ทํ๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค.\n์ฝ๋๋ฅผ ๋ณด์\n์ฐ์ Entity ํด๋์ค๋ค๋ถํฐ ๋ณด์ Company์ Product๊ฐ ์๋ค.\n@Entity public class Company { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = \u0026#34;company\u0026#34;, fetch = FetchType.","title":"JPA N+1๋ฌธ์ ์ @EntityGraph"},{"content":"๋๋ ์ต๊ทผ ์นดํฐ์ ๋ณผ ์ ์๋ ์๋น์ค๋ฅผ ๋ง๋ค๊ณ ์๋ค.\n์ด๋ฆ์ TheCarbToon.\n์คํ๋ง ํด๋ผ์ฐ๋๋ฅผ ์ฌ์ฉํด ์๋น์ค๋ค์ ๋ฌถ์ด ๊ฐ๋ฐ์ ์งํ ์ค์ด๋ค.\n|-------------------------------------------| | | | Auth(java)---\\ | | | \\ | | | \\ | | User(java)-------------- Gateway(java) | | | / | | | | / | | | Media(kotlin)-/ | | | | | | | | | | | Discovery(java) ------------| | | | |-------------------------------------------| ํ์ฌ ์งํ์ ์ด๋ฌํ๊ณ ์๋น์ค๊ฐ ์ถ๊ฐ๋ ์๋ ์๋ค๊ณ ์๊ฐํ๋ค.\n์ค๋์ด ์ด์ 3์ผ์ฐจ๊ฐ ๋๋ ๋ ์ธ๋ฐ ๊ฐ์๊ธฐ ์ผ์ง๋ฅผ ์์ฑํ๋ ์ด์ ๋ ์๋ ํ๋ก์ ํธ๋ฅผ ์์ํ ๋ ์ผ์ง๋ ์์ฑํ๋ฉด์ ํด์ผ์ง ํ๋๋ฐ ๋ง์ ์์ํ๋ ๋ฐ์๊ธฐ๋ ํ๊ณ ๊ฐ๋ฐํ๋๋ผ ๋ฐ๋น ์ ์ ์ง ์์๋๋ฐ ์ค๋ ๊ฐ์๊ธฐ ์นดํ์นด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋์ค์ ๋ฌธ๋ฉ ์๊ฐ์ด ๋ค์ด ์์ฑํ๊ฒ ๋๋ค.\n์ผ๋จ ๋์ค์ปค๋ฒ๋ฆฌ์ ๊ฒ์ดํธ์จ์ด๊น์ง๋ ์ผ์ถ ๋ ๊ฒ ๊ฐ๋ค.\n1,2์ผ ์ฐจ์ ์ธ์ฆ์๋ฒ์์ ๋ฐ๊ธ๋ ํ ํฐ์ผ๋ก ํํฐ์์ ๊ฑฐ๋ฅด๋ ์์
์ ํ๋๋ผ ์๊ฐ์ด ๊ธ๋ฐฉ ๊ฐ ๊ฑฐ ๊ฐ๋ค.\n์ง๊ธ ์งํ ์ค์ธ ๋ถ๋ถ์ ์ธ์ฆ๊ณผ ์ ์ ๋ถ๋ถ์ด๊ณ ์ธ์ฆ ๋ถ๋ถ๊ณผ ์ ์ ๋ถ๋ถ์ ๋ถ๋ฆฌํด ๋ฐ๋ก ๊ด๋ฆฌํ๋ ค ํ๋ค.\nํ์ง๋ง ์ ์ ๋ฅผ ์ ์ฅํ๋ DB๋ ์ธ์ฆ๊ณผ ์ ์ ์ ๋ฐ๋ก ์๊ณ ์ธ์ฆ์ ๋ชฝ๊ณ ๋ก ๋ค์ด์๊ณ ์ ์ ๋ mysql๋ก ๋ค์ด๊ฐ ์๋ค.\n์ด์ ๋ ์ธ์ฆ ๋ถ๋ถ์ ์ธ์ฆ๋ง ๋ฐ๋ก ์ฒ๋ฆฌํ๊ณ ์ ์ ๊ด๋ฆฌ๋ ์ ์ ์๋น์ค์์๋ง ํ๊ณ ์ถ์ด์์ด๋ค.\n์ธ์ฆ ์๋น์ค์์ ์ ์ ๋ฅผ ์์ฑ์ ๋ฐ๊ณ ์์ฑ์ด ๋๋ฉด ์ ์ ์๋น์ค์์ ๋๊ฐ์ ์ ์ ๋ฅผ ์์ฑํ๋ค.\n๊ทธ๋ฆฌ๊ณ ํ ํฐ ๋ฐ๊ธ์ ์ ์ธํ ๋๋จธ์ง ์ ์ ์ ๊ด๋ จ๋ API๋ค์ ์ ๋ถ ์ ์ ์๋น์ค์์ ๊ด๋ฆฌํ๊ฒ ํ๋ค.\n๋ฌผ๋ก ์ ์ ์๋น์ค์์ ๋ณ๊ฒฝ๋ ์ฌํญ๋ค์ ์ธ์ฆ์๋ฒ์๋ ์ ์ฉ๋๊ฒ ํ๋ ค ํ๋ค.\n๊ทธ๋์ ์ง๊ธ ์ธ์ฆ ๋ถ๋ถ์์๋ ํ์๊ฐ์
, ํ ํฐ ๋ฐ๊ธ์ด ๋๊ณ ๋ชจ๋ ์๋น์ค๋ค์ ์ธ์ฆ์์ ๋ฐ๊ธ๋ ํ ํฐ์ผ๋ก ํํฐ๋ก ๊ฑฐ๋ฅธ๋ค.\n์ ์ ์๋น์ค๋ ๊ณ์ ๋ค๋ฌ๊ณ ์๋ ์ค์ด๊ณ ๊ณ์ ํ
์คํธ๋ฅผ ์งํ ์ค์ด๋ค.\n์ค๋์ ์ฌ๊ธฐ๊น์ง๋ง ํด์ผ๊ฒ ๋ค.\n๋์ค์ ๊ฐ๋ฐ์ด ๋ค ๋๋๋ฉด ๋ค ์ ๋ฆฌํด์ ์ฌ๋ฆด ์๊ฐ์ด๋ค.\n๋ชจ๋ ์ฝ๋๋ ์ฌ๊ธฐ์์ ๋ณผ์์๋ฐ\n- ๋ - ","permalink":"https://www.springboot.kr/posts/devnote/thecarbtoon-1/","summary":"๋๋ ์ต๊ทผ ์นดํฐ์ ๋ณผ ์ ์๋ ์๋น์ค๋ฅผ ๋ง๋ค๊ณ ์๋ค.\n์ด๋ฆ์ TheCarbToon.\n์คํ๋ง ํด๋ผ์ฐ๋๋ฅผ ์ฌ์ฉํด ์๋น์ค๋ค์ ๋ฌถ์ด ๊ฐ๋ฐ์ ์งํ ์ค์ด๋ค.\n|-------------------------------------------| | | | Auth(java)---\\ | | | \\ | | | \\ | | User(java)-------------- Gateway(java) | | | / | | | | / | | | Media(kotlin)-/ | | | | | | | | | | | Discovery(java) ------------| | | | |-------------------------------------------| ํ์ฌ ์งํ์ ์ด๋ฌํ๊ณ ์๋น์ค๊ฐ ์ถ๊ฐ๋ ์๋ ์๋ค๊ณ ์๊ฐํ๋ค.","title":"TheCarbtoon ๊ฐ๋ฐ์ผ์ง - 1"},{"content":"์ํ ๋๋๊ทธ๋ฅผ ๋ดค๋ค.\n๋ณด๋๋ฐ ์ด๋ฐ ๋์ฌ๊ฐ ๋์๋ค.\nPretty(์ฌ์ฃผ) - The servants tell me youโve studied everything, from Latin to geology. Brown(๋จ์ฃผ) - Well, a little education is a dangerous thing. (์ฌ์ค education ๋ณด๋ค๋ knowledge๋ ์ด์ธ๋ฆฐ๋ค๊ณ ์๊ฐํ๋๋ฐ education ์.. ๋ชจ๋ฅด๊ฒ ๋ค)\n(๋ฐ์ค ๋ธ๋ผ์ด (Basil Brown) ๊ณ ๊ณ ํ์)\n์ด ๋์ฌ๋ฅผ ๋ณด๋ฉด์ ์ํ ๋ด์์๋ ๋์ด๊ฐ ์๋ ์ฌ๋์ด์ง๋ง ๋์์์ด ๊ณต๋ถ๋ฅผ ํ๋ค๋ ์ ๊ทธ๋ฐ ๊ฒ ์ ๋บ๋ ๊ฑฐ ๊ฐ๋ค.\n๋จ์ ์ฃผ์ธ๊ณต์ด ๊ณต๋ถ์ ๋ํด ์ง์ฐฉ(?) ์๋ ์ง์ฐฉ์ ํ๋ ์ด์ ๋ ์ง์๊ณผ ํ์ฅ ๊ฒฝํ์ ๋ง์ง๋ง ํ๋ ฅ์ด ๋ฎ์\n์ฌํ์ ์ผ๋ก ๋ฌด์๋นํ๋ ๊ทธ๋ฐ ๊ฒ ๋๋ฌธ์ด ์๋๊น?\n์ค์ ๋ก ๋ธ๋ผ์ด์ ์ ๋ฌผ ๋ฐ๊ตด์์ ์ฒ์ ๊ณต๋ก์๋ก ์ธ์ ์ ๋ฐ์ง ๋ชปํ๋๋ฐ ์ง๊ธ์ ์ธ์ ์ด ๋ ์ํ๋ค.\n๋ธ๋ผ์ด ์ฒ๋ผ ๋ฉ์ง์ฌ๋์ด ๋์.\n","permalink":"https://www.springboot.kr/posts/blahblah/the-dig/","summary":"์ํ ๋๋๊ทธ๋ฅผ ๋ดค๋ค.\n๋ณด๋๋ฐ ์ด๋ฐ ๋์ฌ๊ฐ ๋์๋ค.\nPretty(์ฌ์ฃผ) - The servants tell me youโve studied everything, from Latin to geology. Brown(๋จ์ฃผ) - Well, a little education is a dangerous thing. (์ฌ์ค education ๋ณด๋ค๋ knowledge๋ ์ด์ธ๋ฆฐ๋ค๊ณ ์๊ฐํ๋๋ฐ education ์.. ๋ชจ๋ฅด๊ฒ ๋ค)\n(๋ฐ์ค ๋ธ๋ผ์ด (Basil Brown) ๊ณ ๊ณ ํ์)\n์ด ๋์ฌ๋ฅผ ๋ณด๋ฉด์ ์ํ ๋ด์์๋ ๋์ด๊ฐ ์๋ ์ฌ๋์ด์ง๋ง ๋์์์ด ๊ณต๋ถ๋ฅผ ํ๋ค๋ ์ ๊ทธ๋ฐ ๊ฒ ์ ๋บ๋ ๊ฑฐ ๊ฐ๋ค.\n๋จ์ ์ฃผ์ธ๊ณต์ด ๊ณต๋ถ์ ๋ํด ์ง์ฐฉ(?) ์๋ ์ง์ฐฉ์ ํ๋ ์ด์ ๋ ์ง์๊ณผ ํ์ฅ ๊ฒฝํ์ ๋ง์ง๋ง ํ๋ ฅ์ด ๋ฎ์","title":"์ด์คํ ์ง์์ ์ํํ๋ค."},{"content":"Field testService in com.example.TestController required a single bean, but 3 were found: - testServiceImpl1: defined in file [build/classes/java/main/com/example/TestServiceImpl1.class] - testServiceImpl2: defined in file [build/classes/java/main/com/example/TestServiceImpl2.class] - testServiceImpl3: defined in file [build/classes/java/main/com/example/TestServiceImpl3.class] Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed @Primary, @Qualifier ์ด๋ฐ ๋ฌธ์ ์์ ์๊ธฐ๋ ์คํ๋ง ์๋ฌ๋ค.\n๋น์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ ์๊ธฐ๋ ๋ฌธ์ ์ธ๋ฐ\n๋ฐ์ด ๋ณด๋ฉด ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก 3๊ฐ์ง๋ฅผ ์ ์ํด ์ค๋ค.\n Consider marking one of the beans as @Primary updating the consumer to accept multiple beans using @Qualifier to identify the bean that should be consumed ์์ ์ฝ๋๋ก ํ์ธํด๋ณด์\nTestController\n@RequiredArgsConstructor @RestController public class TestController { private final TestService testService; @GetMapping(\u0026#34;\u0026#34;) public String test() { return String.valueOf(testService.test()); } } TestService\npublic interface TestService { int test(); } @Service public class TestServiceImpl1 implements TestService { @Override public int test() { return 1; } } @Service public class TestServiceImpl2 implements TestService { @Override public int test() { return 2; } } @Service public class TetServiceImpl3 implements TestService { @Override public int test() { return 3; } } ์ด๋ ๊ฒ ๋ผ์์ ๋ ์คํ ์ ๊ฒ์๊ธ ์๋จ์ ์๋ฌ๋ฅผ ๋ง๋ ์ ์๋ค.\n@Primary ๊ทธ๋ผ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด ๋ณธ๋ค.\n@Primary @Service public class TestServiceImpl1 implements TestService { @Override public int test() { return 1; } } ๋ด๊ฐ ์ํ๋ ํด๋์ค์ @Primary๋ฅผ ๋ถ์ฌ์ฃผ๊ณ ํ์ธํ๋ฉด ๊ทธ ํด๋์ค๋ก ์คํ์ด ๋๋ค.\n๋๋ TestServiceImpl1์ ๋ถ์ฌ์คฌ์ผ๋ 1์ด ๋์จ๋ค.\nList ๋ค์์ผ๋ก ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ List๋ก ๋ง๋ค์ด ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.\n@RequiredArgsConstructor @RestController public class TestController { private final List\u0026lt;TestService\u0026gt; testServiceList; @GetMapping(\u0026#34;\u0026#34;) public String test() { return String.valueOf(testServiceList.get(1).test()); } } ์ด๋ ๊ฒ ํ๊ฒ ๋๋ฉด 3๊ฐ์ ํด๋์ค ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ฐ ์ฌ๊ธฐ์ get()์ผ๋ก ์ธ๋ฑ์ค ๊ฐ์ ๋ฃ์ด์ ๊ฐ์ ธ์ค๋ฉด ๋๋ค.\n๋ฆฌ์คํธ์ ๋ค์ด๊ฐ๋ ์์๋ ํด๋์ค ์ด๋ฆ์์ด๋ค.\n๋ฐ๋ก ๋ช
์ํ์ง ์์๋ TetServiceImpl1 -\u0026gt; tetServiceImpl1, TetServiceImpl2 -\u0026gt; tetServiceImpl2 ์ด๋ ๊ฒ ๋๋ค.\n@Qualifier ๋ง์ง๋ง์ผ๋ก ์ธ ๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก๋ @Qualifier๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.\n์ธ ๋ฒ์งธ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง์ ๋ฐฉ๋ฒ์ด ์๋ค.\n@RestController public class TestController { @Autowired @Qualifier(\u0026#34;testServiceImpl3\u0026#34;) private TestService testService; @GetMapping(\u0026#34;\u0026#34;) public String test() { return String.valueOf(testService.test()); } } ์์ ์ฝ๋์ฒ๋ผ @Autowired๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ @Qualifier(\u0026quot;\u0026quot;) ๋ช
์ํด ์ฃผ๋ฉด ๋๋ค.\n์์ฑ์๋ฅผ ํตํ ์ฃผ์
์ ๊ฒฝ์ฐ์๋ ๋ฐ์์ฒ๋ผ ์ฌ์ฉํ๋ฉด ๋๋ค.\n@RestController public class TestController { private final TestService testService; public TestController(@Qualifier(\u0026#34;testServiceImpl3\u0026#34;) TestService testService) { this.testService = testService; } @GetMapping(\u0026#34;\u0026#34;) public String test() { return String.valueOf(testService.test()); } } ๋ง์ง๋ง์ผ๋ก Lombok์ @RequiredArgsConstructor์ ๊ฐ์ด ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๊ฐ ์์ง๋ง ์ด ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํ๋ก์ ํธ์ ๋ฃจํธ ํด๋์ ๋ฐ์ lombok.config ํ์ผ์ ๋ง๋ค์ด์ฃผ๊ณ ์๋์ ๋ด์ฉ์ ์ ์ด์ฃผ๋ฉด ๋๋ค.\nlombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier ์์ฑ์ด ๋๋ฌ๋ค๋ฉด RequiredArgsConstructor์ ํจ๊ป ์ฌ์ฉํด ๋ณด์\n@RequiredArgsConstructor @RestController public class TestController { @Qualifier(\u0026#34;testServiceImpl3\u0026#34;) private final TestService testService; @GetMapping(\u0026#34;\u0026#34;) public String test() { return String.valueOf(testService.test()); } } ์ด๋ ๊ฒ ํด์ฃผ๋ฉด ๊ณ ๋ฏผ์ด ํด๊ฒฐ๋๋ค.\n๋ง์ง๋ง์ผ๋ก ๊ธฐ๋ณธ์ผ๋ก ์ค์ ๋๋ ์ด๋ฆ ๋ง๊ณ ๋ณธ์ธ์ด ์ํ๋ ์ด๋ฆ์ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ ์๋์ ๊ฐ์ด ์ฌ์ฉํ์\n@Qualifier(\u0026#34;test1\u0026#34;) @Service public class TestServiceImpl1 implements TestService { @Override public int test() { return 1; } } @Qualifier(\u0026#34;test2\u0026#34;) @Service public class TestServiceImpl2 implements TestService { @Override public int test() { return 2; } } ๋ง์ง๋ง @RequiredArgsConstructor \u0026amp; @Qualifier์ ์ฐธ์กฐ ๋งํฌ\nSPRING + LOMBOK + @QUALIFIER OR INJECTION JUST BECAME A BIT EASIER (PART 2 OF 2)\n- ๋ - ","permalink":"https://www.springboot.kr/posts/spring/required-a-single-bean-but-3-were-found/","summary":"Field testService in com.example.TestController required a single bean, but 3 were found: - testServiceImpl1: defined in file [build/classes/java/main/com/example/TestServiceImpl1.class] - testServiceImpl2: defined in file [build/classes/java/main/com/example/TestServiceImpl2.class] - testServiceImpl3: defined in file [build/classes/java/main/com/example/TestServiceImpl3.class] Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed @Primary, @Qualifier ์ด๋ฐ ๋ฌธ์ ์์ ์๊ธฐ๋ ์คํ๋ง ์๋ฌ๋ค.\n๋น์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ ์๊ธฐ๋ ๋ฌธ์ ์ธ๋ฐ\n๋ฐ์ด ๋ณด๋ฉด ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก 3๊ฐ์ง๋ฅผ ์ ์ํด ์ค๋ค.","title":"required a single bean, but 3 were found ํด๊ฒฐ๋ฒ"},{"content":"๋ธ๋ก๊ทธ ์๋กญ๊ฒ ๋ง๋ค๊ธฐ ์ฑ๊ณต\n","permalink":"https://www.springboot.kr/posts/blahblah/renew-blog/","summary":"๋ธ๋ก๊ทธ ์๋กญ๊ฒ ๋ง๋ค๊ธฐ ์ฑ๊ณต","title":"๋ธ๋ก๊ทธ ์๋กญ๊ฒ ๋ง๋ค๊ธฐ ์ฑ๊ณต"},{"content":"๊ฒจ์ธ์ด ๋๋๋ฉด ๋ด์ด ์จ๋ค. ๋ด์ด ์จ๋ค. ๋ด์ด ์ฌ๊น? ์ ๋ด์ผ๊น? ๋ด์ ์งง์๋ฐ ์ฌ๋ฆ์๋๋ฉด ๊ฒจ์ธํ๋ฉด์๋๋? ์ฌ๋ฆ์ ์๋๋? ๊ฒจ์ธ์?\n","permalink":"https://www.springboot.kr/posts/blahblah/2021-12-27-blahblah/","summary":"๊ฒจ์ธ์ด ๋๋๋ฉด ๋ด์ด ์จ๋ค. ๋ด์ด ์จ๋ค. ๋ด์ด ์ฌ๊น? ์ ๋ด์ผ๊น? ๋ด์ ์งง์๋ฐ ์ฌ๋ฆ์๋๋ฉด ๊ฒจ์ธํ๋ฉด์๋๋? ์ฌ๋ฆ์ ์๋๋? ๊ฒจ์ธ์?","title":"๋ธ๋ผ๋ธ๋ผ"},{"content":"Chapter 5. ์ฑ
์ ํ ๋นํ๊ธฐ ๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์ ์ ์ ํด๊ฒฐํ ์ ์๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ฑ
์์ ์ด์ ์ ๋ง์ถ๋ ๊ฒ์ด๋ค.\n์ฑ
์์ ์ด์ ์ ๋ง์ถฐ์ ์ค๊ณํ ๋ ์ง๋ฉดํ๋ ๊ฐ์ฅ ํฐ ์ด๋ ค์์ ์ด๋ค ๊ฐ์ฒด์๊ฒ ์ด๋ค ์ฑ
์์ ํ ๋นํ ์ง๋ฅผ ๊ฒฐ์ ํ๊ธฐ๊ฐ ์ฝ์ง ์๋ค๋ ๊ฒ์ด๋ค.\n์ฑ
์ ํ ๋น ๊ณผ์ ์ ์ผ์ข
์ ํธ๋ ์ด๋์คํ ํ๋์ด๋ค. ๋์ผํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ค์ํ ์ฑ
์ ํ ๋น ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ฉฐ ์ด๋ค ๋ฐฉ๋ฒ์ด ์ต์ ์ธ์ง๋ ์ํฉ๊ณผ ๋ฌธ๋งฅ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.\n๋ฐ๋ผ์ ์ฌ๋ฐ๋ฅธ ์ฑ
์์ ํ ๋นํ๊ธฐ ์ํด์๋ ๋ค์ํ ๊ด์ ์์ ์ค๊ณ๋ฅผ ํ๊ฐํ ์ ์์ด์ผ ํ๋ค.\n์ด๋ฒ ์ฅ์์๋ GRASP ํจํด์ ๋ฐฐ์ฐ๊ณ ์์ง๋์ ๊ฒฐํฉ๋ ์บก์ํ ๊ฐ์ ๋ค์ํ ๊ธฐ์ค์ ๋ฐ๋ผ ์ฑ
์์ ํ ๋นํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํธ๋ ์ด๋์คํ ํ ์ ์๋ ๊ธฐ์ค์ ๋ฐฐ์ธ ๊ฒ์ด๋ค.\nGRASP Pattern์ด๋?\n๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ์์ ์ฑ
์ ์ค์ฌ์ ์ค๊ณ๋ก ์ ํํ๊ธฐ ์ํด์๋ ๋ค์์ ๋ ๊ฐ์ง ์์น์ ๋ฐ๋ผ์ผ ํ๋ค.\n ๋ฐ์ดํฐ๋ณด๋ค ํ๋์ ๋จผ์ ๊ฒฐ์ ํ๋ผ ํ๋ ฅ์ด๋ผ๋ ๋ฌธ๋งฅ ์์์ ์ฑ
์์ ๊ฒฐ์ ํ๋ผ ๋ฐ์ดํฐ๋ณด๋ค ํ๋์ ๋จผ์ ๊ฒฐ์ ํ๋ผ ","permalink":"https://www.springboot.kr/posts/object/chapter5/","summary":"Chapter 5. ์ฑ
์ ํ ๋นํ๊ธฐ ๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์ ์ ์ ํด๊ฒฐํ ์ ์๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ฑ
์์ ์ด์ ์ ๋ง์ถ๋ ๊ฒ์ด๋ค.\n์ฑ
์์ ์ด์ ์ ๋ง์ถฐ์ ์ค๊ณํ ๋ ์ง๋ฉดํ๋ ๊ฐ์ฅ ํฐ ์ด๋ ค์์ ์ด๋ค ๊ฐ์ฒด์๊ฒ ์ด๋ค ์ฑ
์์ ํ ๋นํ ์ง๋ฅผ ๊ฒฐ์ ํ๊ธฐ๊ฐ ์ฝ์ง ์๋ค๋ ๊ฒ์ด๋ค.\n์ฑ
์ ํ ๋น ๊ณผ์ ์ ์ผ์ข
์ ํธ๋ ์ด๋์คํ ํ๋์ด๋ค. ๋์ผํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ค์ํ ์ฑ
์ ํ ๋น ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ฉฐ ์ด๋ค ๋ฐฉ๋ฒ์ด ์ต์ ์ธ์ง๋ ์ํฉ๊ณผ ๋ฌธ๋งฅ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.\n๋ฐ๋ผ์ ์ฌ๋ฐ๋ฅธ ์ฑ
์์ ํ ๋นํ๊ธฐ ์ํด์๋ ๋ค์ํ ๊ด์ ์์ ์ค๊ณ๋ฅผ ํ๊ฐํ ์ ์์ด์ผ ํ๋ค.","title":"[์ค๋ธ์ ํธ OBJECTS] Chapter 5. ์ฑ
์ ํ ๋นํ๊ธฐ"},{"content":"Chapter 4. ์ค๊ณ ํ์ง๊ณผ ํธ๋ ์ด๋์คํ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ํต์ฌ์ ์ญํ ,์ฑ
์,ํ๋ ฅ์ด๋ค.\nํ๋ ฅ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฐ์ฒด๋ค ์ฌ์ด์ ์ํธ์์ฉ ์ด๋ค. ์ฑ
์์ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ํ๋ ฅ ํ๊ธฐ ์ํด ์ํํ๋ ํ๋์ด๊ณ ์ญํ ์ ๋์ฒด ๊ฐ๋ฅํ ์ฑ
์์ ์งํฉ์ด๋ค.\n์ฑ
์ ์ฃผ๋ ์ค๊ณ๋ผ๋ ์ด๋ฆ์ ๋์ค๋ ๊ฒ์ฒ๋ผ ์ ์
์ค ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ฑ
์์ด๋ค.\n์ฑ
์์ด ๊ฐ์ฒด์งํฅ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์ ํ์ง์ ๊ฒฐ์ ํ๋ค.\n๊ฐ์ฒด์งํฅ ์ค๊ณ๋ ์ฌ๋ฐ๋ฅธ ๊ฐ์ฒด์๊ฒ ์ฌ๋ฐ๋ฅธ ์ฑ
์์ ํ ๋นํ๋ฉด์ ๋ฎ์ ๊ฒฐํฉ๋์ ๋์ ์์ง๋๋ฅผ ๊ฐ์ง ๊ตฌ์กฐ๋ฅผ ์ฐฝ์กฐํ๋ ํ๋์ด๋ค.\n๊ฐ์ฒด์งํฅ ์ค๊ณ์ ๊ดํ ๋ ๊ฐ์ง ๊ด์ ์ด ์์ฌ ์๋ค.\n ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ํต์ฌ์ด ์ฑ
์์ด๋ผ๋ ๊ฒ. ์ฑ
์์ ํ ๋นํ๋ ์์
์ด ์์ง๋์ ๊ฒฐํฉ๋ ๊ฐ์ ์ค๊ณ ํ์ง๊ณผ ๊น์ด ์ฐ๊ด๋ผ ์๋ค๋ ๊ฒ. ํ๋ฅญํ ์ค๊ณ๋ ํฉ๋ฆฌ์ ์ธ ๋น์ฉ์์์ ๋ณ๊ฒฝ์ ์์ฉํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.\n๊ฐ์ฒด๋ฅผ ๋จ์ํ ๋ฐ์ดํฐ์ ์งํฉ์ผ๋ก ๋ฐ๋ผ๋ณด๋ ์๊ฐ์ ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌํ์ ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค์ ๋
ธ์ถ์ํค๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณ๊ธฐ ๋๋ฌธ์ ์ค๊ณ๊ฐ ๋ณ๊ฒฝ์ ์ทจ์ฝํด ์ง๋ค.\n์ด๋ฐ ๋ฌธ์ ๋ฅผ ํผํ ์ ์๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด ๊ฐ์ฒด์ ์ฑ
์์ ์ด์ ์ ๋ง์ถ๋ ๊ฒ์ด๋ค.\n๊ฐ์ฒด์งํฅ ์ค๊ณ์์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ด์ฉํด ์์คํ
์ ๊ฐ์ฒด๋ก ๋ถํ ํ ์ ์๋ค.\n ์ํ๋ฅผ ๋ถํ ์ ์ค์ฌ์ถ์ผ๋ก ์ผ๋ ๋ฐฉ๋ฒ. ์ฑ
์์ ๋ถํ ์ ์ค์ฌ์ถ์ผ๋ก ์ผ๋ ๋ฐฉ๋ฒ. ํ๋ฅญํ ๊ฐ์ฒด์งํฅ ์ค๊ณ๋ ๋ฐ์ดํฐ๊ฐ ์๋๋ผ ์ฑ
์์ ์ด์ ์ ๋ง์ถฐ์ผ ํ๋ค.\n๊ฐ์ฒด์ ์ํ๋ ๊ตฌํ์ ์ํ๋ค. ๊ตฌํ์ ๋ถ์์ ํ๊ธฐ ๋๋ฌธ์ ๋ณํ๊ธฐ ์ฝ๋ค.\n์ํ๋ฅผ ๊ฐ์ฒด ๋ถํ ์ ์ค์ฌ์ถ์ผ๋ก ์ผ์ผ๋ฉด ๊ตฌํ์ ๊ดํ ์ธ๋ถ์ฌํญ์ด ๊ฐ์ฒด์ ์ธํฐํ์ด์ค์ ์์กดํ๋ ๋ชจ๋ ๊ฐ์ฒด์๊ฒ ๋ณ๊ฒฝ์ ์ํฅ์ด ํผ์ง๋ค.\n๋ฐ๋ผ์ ๋ฐ์ดํฐ์ ์ด์ฒจ์ ๋ง์ถ ์ค๊ณ๋ ๋ณ๊ฒฝ์ ์ทจ์ฝํ ์๋ฐ์ ์๋ค.\n๊ฐ์ฒด์ ์ฑ
์์ ์ธํฐํ์ด์ค์ ์ํ๋ค. ๊ฐ์ฒด๋ ์ฑ
์์ ๋๋ฌ๋ด๋ ์์ ์ ์ธ ์ธํฐํ์ด์ค ๋ค๋ก ์ฑ
์์ ์ํํ๋๋ฐ ํ์ํ ์ํ๋ฅผ ์บก์ํํด ๊ตฌํ ๋ณ๊ฒฝ์ ๋ํ ํ์ฅ์ด ์ธ๋ถ๋ก ํผ์ ธ๋๊ฐ๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.\n์ฑ
์์ ์ด์ ์ ๋ง์ถ๋ฉด ์๋์ ์ผ๋ก ๋ณ๊ฒฝ์ ์์ ์ ์ธ ์ค๊ณ๋ฅผ ์ป์ ์ ์๋ค.\n์บก์ํ ์ํ์ ํ๋์ ํ๋์ ๊ฐ์ฒด์ ๋ชจ์ผ๋ ์ด์ ๋ ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌํ์ ์ธ๋ถ๋ก๋ถํฐ ๊ฐ์ถ๊ธฐ ์ํด์๋ค.\n๊ฐ์ฒด์งํฅ์ด ๊ฐ๋ ฅํ ์ด์ ๋ ํ ๊ณณ์์ ์ผ์ด๋ ๋ณ๊ฒฝ์ด ์ ์ฒด ์์คํ
์ ์ํฅ์ ๋ผ์น์ง ์๋๋ก ํ๊ธํจ๊ณผ๋ฅผ ์ ์ ํ๊ฒ ์กฐ์ ํ ์ ์๋ ์ฅ์น๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ด๋ค.\n๋ณ๊ฒฝ์ด๋ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ถ๋ถ์ ๊ตฌํ์ด๋ผ ํ๊ณ ์๋์ ์ผ๋ก ์์ ์ ์ธ ๋ถ๋ถ์ ์ธํฐํ์ด์ค๋ผ ํ๋ค.\n๊ฐ์ฒด๋ฅผ ์ค๊ณํ๊ธฐ ์ํด ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์์ด๋์ด๋ ๋ณ๊ฒฝ์ ์ ๋์ ๋ฐ๋ผ ๊ตฌํ๊ณผ ์ธํฐํ์ด์ค๋ฅผ ๋ถ๋ฆฌํ๊ณ ์ธ๋ถ์์๋ ์ธํฐํ์ด์ค์๋ง ์์กดํ๋๋ก ๊ด๊ณ๋ฅผ ์กฐ์ ํ๋ ๊ฒ์ด๋ค.\n๋ณต์ก์ฑ์ ๋ค๋ฃจ๊ธฐ ์ํ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋๊ตฌ๋ ์ถ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฃผ์ํ ์ถ์ํ ๋ฐฉ๋ฒ์ ์บก์ํ๋ค.\nํ์ง๋ง ๋ณต์ก์ฑ์ด ์ ์บก์ํ๋ ๊ฒ์ด๋ผ๊ณ ๋ณด์ฅํ ์๋ ์๋ค. ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํตํด ์ ๋ฐ์ ์ผ๋ก ์ป์ ์ ์๋ ์ฅ์ ์ ์ค์ง ์ค๊ณ ๊ณผ์ ๋์ ์บก์ํ๋ฅผ ๋ชฉํ๋ก ์ธ์ํ ๋ ๋ฌ์ฑ๋ ์ ์๋ค.\n์ค๊ณ๊ฐ ํ์ํ ์ด์ ๋ ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ด๊ณ ์บก์ํ๊ฐ ์ค์ํ ์ด์ ๋ ๋ถ์์ ํ ๋ถ๋ถ๊ณผ ์์ ์ ์ธ ๋ถ๋ถ์ ๋ถ๋ฆฌํด ๋ณ๊ฒฝ์ ์ํฅ์ ํต์ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.\n์บก์ํ๋ ์ด๋ค ๊ฒ์ ์จ๊ธด๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ๋ป๋ฐ์ ํผํด๊ฐ ๋ฐ์ํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ ์ฌ์ ์ ๋ฐฉ์งํด ๋ณ๊ฒฝ์ผ๋ก ๋ถํฐ ์์ ๋ก์์ง๋ ๊ฒ์ด๋ค.\n์บก์ํ๋ ์ฐ๋ฆฌ๋ฅผ ์ข์ ์ฝ๋๋ก ์๋ดํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ์ค์ํ ์ 1์๋ฆฌ๋ค.\n์์ง๋์ ๊ฒฐํฉ๋ ์์ง๋๋ ๋ชจ๋์ ํฌํจ๋ ๋ด๋ถ ์์๋ค์ด ์ฐ๊ด๋ผ ์๋ ์ ๋๋ฅผ ๋ํ๋ธ๋ค. ๋ชจ๋ ๋ด์ ์์๋ค์ด ํ๋์ ๋ชฉ์ ์ ์ํด ๊ธด๋ฐํ๊ฒ ํ๋ ฅํ๋ค๋ฉด ๋์ ์์ง๋๋ฅผ ๊ฐ์ง๊ณ ์๋ก ๋ค๋ฅธ ๋ชฉ์ ์ ์ถ๊ตฌํ๋ฉด ๋ฎ์ ์์ง๋๋ฅผ ๊ฐ์ง๋ค.\n๊ฐ์ฒด์งํฅ์ ๊ด์ ์์ ์์ง๋๋ ๊ฐ์ฒด ๋๋ ํด๋์ค์ ์ผ๋ง๋ ๊ด๋ จ ๋์ ์ฑ
์๋ค์ ํ ๋นํ๋์ง ๋ํ๋ธ๋ค.\n๊ฒฐํฉ๋๋ ์์กด์ฑ์ ์ ๋๋ฅผ ๋ํ๋ด๋ฉฐ ๋ค๋ฅธ ๋ชจ๋์ ๋ํด ์ผ๋ง๋ ๋ง์ ์ง์์ ๊ฐ๊ณ ์๋์ง๋ฅผ ๋ํ๋ด๋ ์ฒ๋๋ค. ์ด๋ค ๋ชจ๋์ด ๋ค๋ฅธ ๋ชจ๋์ ๋ํด ๋๋ฌด ์์ธํ ๋ถ๋ถ๊น์ง ์๊ณ ์๋ค๋ฉด ๋ ๋ชจ๋์ ๋์ ๊ฒฐํฉ๋๋ฅผ ๊ฐ์ง๊ณ ๋ค๋ฅธ ๋ชจ๋์ ๋ํด ๊ผญ ํ์ํ ์ง์๋ง ์๊ณ ์๋ค๋ฉด ๋ฎ์ ๊ฒฐํฉ๋๋ฅผ ๊ฐ์ง๋ค.\n๊ฒฐํฉ๋๋ ๊ฐ์ฒด ๋๋ ํด๋์ค๊ฐ ํ๋ ฅ์ ํ์ํ ์ ์ ํ ์์ค์ ๊ด๊ณ๋ง์ ์ ์งํ๊ณ ์๋์ง ๋ํ๋ธ๋ค.\n์ข์ ์ค๊ณ๋ ๋์ ์์ง๋์ ๋ฎ์ ๊ฒฐํฉ๋๋ฅผ ๊ฐ์ง ๋ชจ๋๋ก ๊ตฌ์ฑ๋ ์ค๊ณ๋ฅผ ์๋ฏธํ๋ฉฐ ์ค๋์ ๊ธฐ๋ฅ์ ์ํํ๋ฉด์ ๋ด์ผ์ ๋ณ๊ฒฝ์ ์์ฉํ ์ ์๋ ์ค๊ณ์ด๋ค.\n๋์ ์์ง๋์ ๋ฎ์ ๊ฒฐํฉ๋๋ฅผ ๊ฐ์ง ์ค๊ณ๋ฅผ ์ถ๊ตฌํด์ผ ํ๋ ์ด์ ๋ ์ค๊ณ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ด๋ค.\n๋ณ๊ฒฝ์ ๊ด์ ์์ ์์ง๋๋ ๋ณ๊ฒฝ์ด ๋ฐ์ํ ๋ ๋ชจ๋ ๋ด๋ถ์์ ๋ฐ์ํ๋ ๋ณ๊ฒฝ์ ์ ๋๋ก ์ธก์ ํ ์ ์๋ค.\n๋์ ๊ฒฐํฉ๋(High coupling)์ ๋ฎ์ ๊ฒฐํฉ๋(Low coupling)\n์์ง๋๊ฐ ๋์์๋ก ๋ณ๊ฒฝ์ ๋์๊ณผ ๋ฒ์๊ฐ ๋ช
ํํด์ง๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ฌ์์ง๋ค.\n๊ฒฐํฉ๋๋ ํ ๋ชจ๋์ด ๋ณ๊ฒฝ๋๊ธฐ ์ํด์ ๋ค๋ฅธ ๋ชจ๋์ ๋ณ๊ฒฝ์ ์๊ตฌํ๋ ์ ๋๋ก ์ธก์ ํ ์ ์๋ค.\n๊ฒฐํฉ๋๊ฐ ๋์ผ๋ฉด ๋์์๋ก ํจ๊ป ๋ณ๊ฒฝํด์ผ ํ๋ ๋ชจ๋์ ์๊ฐ ๋์ด๋๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝํ๊ธฐ ์ด๋ ค์์ง๋ค.\n๋ฎ์ ๊ฒฐํฉ๋๋ฅผ ๊ฐ์ง ์ค๊ณ๋ ๋ชจ๋์ ๋ณ๊ฒฝํ์ ๋ ์ค์ง ํ๋์ ๋ชจ๋๋ง ์ํฅ์ ๋ฐ์ง๋ง ๋์ ๊ฒฐํฉ๋๋ฅผ ๊ฐ์ง ์ค๊ณ๋ ๋ชจ๋์ ๋ณ๊ฒฝํ์ ๋ ๋ค๋ฅธ ๋ชจ๋์ ๋์์ ๋ณ๊ฒฝํด์ผ ํ๋ค.\nํด๋์ค์ ๊ตฌํ์ด ์๋ ์ธํฐํ์ด์ค์ ์์กดํ๋๋ก ์ฝ๋๋ฅผ ์์ฑํด์ผ ๋ฎ์ ๊ฒฐํฉ๋๋ฅผ ์ป์ ์ ์๋ค.\n์ธํฐํ์ด์ค์ ๋ํด ํ๋ก๊ทธ๋๋ฐํ๋ผ\nWhat Does It Mean to Program to Interfaces?\n๊ฒฐํฉ๋๊ฐ ๋์๋ ์๊ด ์๋ ๊ฒฝ์ฐ๋ ์์ง๋ง ์ง์ ์ฅ์ฑํ ์ฝ๋์ ๊ฒฝ์ฐ์๋ ํญ์ ๋ถ์์ ํ๋ฉฐ ์ธ์ ๋ผ๋ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ์์ฑํ ๊ทธ ์๊ฐ๋ถํฐ ์ฝ๋๋ฅผ ์์ ํ ์ค๋น๋ฅผ ํด์ผํ๋ค.\n๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ง์ ์์ฑํ ์ฝ๋์ ๊ฒฝ์ฐ์๋ ๋ฎ์ ๊ฒฐํฉ๋๋ฅผ ์ ์งํ๋ ค ๋
ธ๋ ฅํด์ผ ํ๋ค.\n์์ง๋์ ๊ฒฐํฉ๋๋ ๋ณ๊ฒฝ๊ณผ ๊ด๋ จ์ด ๊น๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ์ ๊ด์ ์์ ๋ฐ๋ผ๋ณด๋ ๊ฒ์ ์ค๊ณ์ ๋ํด ์๊ฐ์ ํฌ๊ฒ ๋ณํ์ํฌ ์ ์๋ค.\n์บก์ํ์ ์ ๋๋ ์์ง๋์ ๊ฒฐํฉ๋์ ์ํฅ์ ๋ฏธ์น๋ค.\n์บก์ํ๋ฅผ ์งํค๋ฉด ๋ชจ๋์์ ์์ง๋๋ ๋ฎ์์ง๊ณ ๋ชจ๋ ์ฌ์ด์ ๊ฒฐํฉ๋๋ ๋ฎ์์ง๋ค.\nํ์ง๋ง ์บก์ํ๋ฅผ ์๋ฐํ๋ฉด ๋ชจ๋ ์์ ์์ง๋๋ ๋ฎ์์ง๊ณ ๋ชจ๋ ์ฌ์ด์ ๊ฒฐํฉ๋๋ ๋์์ง๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์ง๋์ ๊ฒฐํฉ๋๋ฅผ ๊ณ ๋ คํ๊ธฐ ์ ์ ๋จผ์ ์บก์ํ๋ฅผ ํญ์์ํค๊ธฐ ์ํด ๋
ธ๋ ฅํด์ผํ๋ค.\n๋ฐ์ดํฐ ์ค์ฌ์ ์์คํ
์ ๋ฌธ์ ์ ๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ๊ฐ ๊ฐ์ง ๋ํ์ ์ธ ๋ฌธ์ ์ ์\n ์บก์ํ ์๋ฐ ๋์ ๊ฒฐํฉ๋ ๋ฎ์ ์์ง๋ ์ด๋ ๊ฒ 3๊ฐ์ง๋ก ์์ฝํ ์ ์๋ค.\n์บก์ํ ์๋ฐ ๊ฐ์ฒด์๊ฒ ์ค์ํ ๊ฒ์ ์ฑ
์์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ตฌํ์ ์บก์ํํ ์ ์๋ ์ ์ ํ ์ฑ
์์ ํ๋ ฅ์ด๋ผ๋ ๋ฌธ๋งฅ์ ๊ณ ๋ คํ ๋๋ง ์ป์ ์ ์๋ค.\nํ๋ ฅ์ ๊ดํด ๊ณ ๋ฏผํ์ง ์๊ณ ์ค๊ณ๋ฅผ ํ๋ฉด ์บก์ํ๋ฅผ ์๋ฐํ๋ ๊ณผ๋ํ ์ ๊ทผ์์ ์์ ์๋ฅผ ๊ฐ์ง๊ฒ ๋๋ ๊ฒฝํฅ์ด ์๋ค.\n๊ฐ์ฒด๊ฐ ์ฌ์ฉ๋ ๋ฌธ๋งฅ์ ์ถ์ธกํ ์๋ฐ์ ์๋ ๊ฒฝ์ฐ ๊ฐ๋ฐ์๋ ์ด๋ค ์ํฉ์์๋ ํด๋น ๊ฐ์ฒด๊ฐ ์ฌ์ฉ๋ ์ ์๊ฒ ์ต๋ํ ๋ง์ ์ ๊ทผ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๊ฒ ๋๋ ๊ฒ์ด๋ค.\n์ด๋ ๊ฒ ์ ๊ทผ์์ ์์ ์์ ๊ณผ๋ํ๊ฒ ์์กดํ๋ ์ค๊ณ ๋ฐฉ์์ ์ถ์ธก์ ์ํ ์ค๊ณ ์ ๋ต(design by guessing strategy)๋ผ๊ณ ํ๋ค.\n๋ง์ฐํ ์ถ์ธก์ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ๋ฅผ ํ๊ฒ ๋๋ฉด ํ๋ก๊ทธ๋๋จธ๋ ๋ด๋ถ ์ํ๋ฅผ ๋๋ฌ๋ด๋ ๋ฉ์๋๋ฅผ ์ต๋ํ ๋ง์ด ์ถ๊ฐํด์ผ ํ๋ค๋ ์๋ฐ์ ์๋ฌ๋ฆฌ๊ฒ ๋๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋๋ถ๋ถ์ ๋ด๋ถ ๊ตฌํ์ด ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค์ ๊ทธ๋๋ก ๋
ธ์ถ๋๋ค.\n๊ทธ ๊ฒฐ๊ณผ ์บก์ํ์ ์์น์ ์๋ฐํ๋ ๋ณ๊ฒฝ์ ์ทจ์ฝํ ์ค๊ณ๋ฅผ ํ๊ฒ ๋๋ค.\n๋์ ๊ฒฐํฉ๋ ๊ฐ์ฒด ๋ด๋ถ์ ๊ตฌํ์ด ๊ฐ์ฒด์ ์ธํฐํ์ด์ค์ ๋๋ฌ๋๋ค๋ ๊ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌํ์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.\n๊ฒฐํฉ๋ ์ธก๋ฉด์์ ๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ๊ฐ ๊ฐ์ง๋ ๋ ๋ค๋ฅธ ๋จ์ ์ ์ฌ๋ฌ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ค์ ์ฌ์ฉํ๋ ์ ์ด ๋ก์ง์ด ํน์ ๊ฐ์ฒด ์์ ์ง์ค๋๊ธฐ ๋๋ฌธ์ ํ๋์ ์ ์ด ๊ฐ์ฒด๊ฐ ๋ค์์ ๋ฐ์ดํฐ ๊ฐ์ฒด์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋๋ค๋ ๊ฒ์ด๋ค.\n์ด ๊ฒฐํฉ๋๋ก ์ธํด ์ด๋ค ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋๋ผ๋ ์ ์ด ๊ฐ์ฒด๋ฅผ ํจ๊ป ๋ณ๊ฒฝํ ์๋ฐ์ ์๋ค.\n๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ๋ ์ ์ฒด ์์คํ
์ ํ๋์ ๊ฑฐ๋ํ ์์กด์ฑ ๋ฉ์ด๋ฆฌ๋ก ๋ง๋ค์ด ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ด๋ค ๋ณ๊ฒฝ์ด๋ผ๋ ์ผ๋จ ๋ฐ์ํ๊ณ ๋๋ฉด ์์คํ
์ ์ฒด๊ฐ ์๋์น ์๋ฐ์ ์๋ค.\n๋ฎ์ ์์ง๋ ์๋ก ๋ค๋ฅธ ์ด์ ๋ก ๋ณ๊ฒฝ๋๋ ์ฝ๋๊ฐ ํ๋์ ๋ชจ๋ ์์ ๊ณต์กดํ ๋ ๋ชจ๋์ ์์ง๋๊ฐ ๋ฎ๋ค๊ณ ๋งํ๋ค.\n๋ฎ์ ์์ง๋๋ ๋ ๊ฐ์ง ์ธก๋ฉด์์ ์ค๊ณ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํจ๋ค.\n ๋ณ๊ฒฝ์ ์ด์ ๊ฐ ์๋ก ๋ค๋ฅธ ์ฝ๋๋ค์ ํ๋์ ๋ชจ๋ ์์ ๋ญ์ณ๋์๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ๊ณผ ์๋ฌด ์๊ด์ด ์๋ ์ฝ๋๋ค์ด ์ํฅ์ ๋ฐ๊ฒ ๋๋ค. ์ด๋ค ์ฝ๋๋ฅผ ์์ ํ ํ์ ์๋ฌด๋ฐ ์๊ด๋ ์๋ ์ฝ๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ชจ๋์ ์์ง๋๊ฐ ๋ฎ์ ๋ ๋ฐ์ํ๋ ๋ํ์ ์ธ ์ฆ์์ด๋ค.\n ํ๋์ ์๊ตฌ์ฌํญ ๋ณ๊ฒฝ์ ๋ฐ์ํ๊ธฐ ์ํด ๋์์ ์ฌ๋ฌ ๋ชจ๋์ ์์ ํด์ผ ํ๋ค. ์์ง๋๊ฐ ๋ฎ์ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋ชจ๋์ ์์นํด์ผ ํ ์ฑ
์์ ์ผ๋ถ๊ฐ ์๋ฑํ ๊ณณ์ ์์นํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ด๋ค.\n ์ด๋ค ์๊ตฌ์ฌํญ ๋ณ๊ฒฝ์ ์์ฉํ๊ธฐ ์ํด ํ๋ ์ด์์ ํด๋์ค๋ฅผ ์์ ํด์ผ ํ๋ ๊ฒ์ ์ค๊ณ์ ์์ง๋๊ฐ ๋ฎ๋ค๋ ์ฆ๊ฑฐ์ด๋ค.\n๋จ์ผ ์ฑ
์ ์์น\n๋จ์ผ ์ฑ
์ ์์น-์ฑ
์ ๊ณ ๋ฆฝ์ํค๊ธฐ(์ต์ํ์ ์ฑ
์์ ๊ฐ์ ธ๋ผ)\n์บก์ํ๋ฅผ ์ง์ผ๋ผ ์บก์ํ๋ ์ค๊ณ์ ์ 1์๋ฆฌ๋ค.\n๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ๊ฐ ๋ฎ์ ์์ง๋์ ๋์ ๊ฒฐํฉ๋๋ก ๋ฌธ์ ๊ฐ ์๊ธฐ๊ฒ ๋ ๊ทผ๋ณธ์ ์ธ ์์ธ์ ๋ฐ๋ก ์บก์ํ์ ์์น์ ์๋ฐํ๊ธฐ ๋๋ฌธ์ด๋ค.\n๊ฐ์ฒด๋ ์์ ์ด ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋์ง๋ฅผ ๋ด๋ถ์ ์บก์ํํ๊ณ ์ธ๋ถ์ ๊ณต๊ฐํด์๋ ์๋๋ค.\n์ค์ค๋ก์ ์ํ๋ฅผ ์ฑ
์์ ธ์ผ ํ๋ฉฐ ์ธ๋ถ์์๋ ์ธํฐํ์ด์ค์ ์ ์๋ ๋ฉ์๋๋ฅผ ํตํด์๋ง ์ํ์ ์ ๊ทผํ ์ ์์ด์ผ ํ๋ค.\n์ค์ค๋ก ์์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฑ
์์ง๋ ๊ฐ์ฒด ์ํ์ ํ๋์ ๊ฐ์ฒด๋ผ๋ ํ๋์ ๋จ์๋ก ๋ฌถ๋ ์ด์ ๋ ๊ฐ์ฒด ์ค์ค๋ก ์์ ์ ์ํ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ฒ ํ๊ธฐ ์ํด์๋ค.\n๊ฐ์ฒด๋ ๋จ์ํ ๋ฐ์ดํฐ ์ ๊ณต์๊ฐ ์๋๋ค. ๊ฐ์ฒด ๋ด๋ถ์ ์ ์ฅ๋๋ ๋ฐ์ดํฐ๋ณด๋ค ๊ฐ์ฒด๊ฐ ํ๋ ฅ์ ์ฐธ์ฌํ๋ฉด์ ์ํํ ์ฑ
์์ ์ ์ํ๋ ์คํผ๋ ์ด์
์ด ๋ ์ค์ํ๋ค.\n๊ฐ์ฒด๋ฅผ ์ค๊ณํ ๋ ๋๊ฐ์ ๊ฐ๋ณ์ ์ธ ์ง๋ฌธ์ผ๋ก ๋ถ๋ฆฌํด์ผ ํ๋ค.\n ์ด ๊ฐ์ฒด๊ฐ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ํฌํจํด์ผ ํ๋๊ฐ? ์ด ๊ฐ์ฒด๊ฐ ๋ฐ์ดํฐ์ ๋ํด ์ํํด์ผ ํ๋ ์คํผ๋ ์ด์
์ ๋ฌด์์ธ๊ฐ? ๋ ์ง๋ฌธ์ ์กฐํฉํ๋ฉด ๊ฐ์ฒด ๋ด๋ถ ์ํ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์๊ณผ ์ ์ฅ๋ ์ํ์ ๋ํด ํธ์ถํ ์ ์๋ ์คํผ๋ ์ด์
์ ์งํฉ์ ์ป์ ์ ์๋ค.\n์ฆ ์๋ก์ด ๋ฐ์ดํฐ ํ์
์ ๋ง๋ค ์ ์๋ค.\n์บก์ํ์ ์ง์ ํ ์๋ฏธ ์บก์ํ๋ ๋ณ๊ฒฝ๋ ์ ์๋ ์ด๋ค ๊ฒ์ด๋ผ๋ ๊ฐ์ถ๋ ๊ฒ์ ์๋ฏธํ๋ค.\n๋ด๋ถ ์์ฑ์ ์ธ๋ถ๋ก๋ถํฐ ๊ฐ์ถ๋ ๊ฒ์ ๋ฐ์ดํฐ ์บก์ํ๋ผ๊ณ ๋ถ๋ฆฌ๋ ์บก์ํ์ ํ ์ข
๋ฅ์ผ ๋ฟ์ด๋ค.\n์บก์ํ๋ผ๋ ๊ฒ์ ๋ณํ ์ ์๋ ์ด๋ค ๊ฒ์ด๋ผ๋ ๊ฐ์ถ๋ ๊ฒ์ด๋ค.\n๊ทธ๊ฒ์ด ์์ฑ์ ํ์
์ด๊ฑด ์ ์ฑ
์ ์ข
๋ฅ๊ฑด ์๊ด ์์ด ๋ด๋ถ ๊ตฌํ์ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ์ธ๋ถ์ ๊ฐ์ฒด๊ฐ ์ํฅ์ ๋ฐ๋๋ค๋ฉด ์บก์ํ๋ฅผ ์๋ฐํ ๊ฒ์ด๋ค.\n์ค๊ณ์์ ๋ณํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ๊ณ ๋ คํ๊ณ ๋ณํ๋ ๊ฐ๋
์ ์บก์ํํด์ผ ํ๋ค.\n๋์ ๊ฒฐํฉ๋ ์บก์ํ ์๋ฐ์ผ๋ก ๋ด๋ถ ๊ตฌํ์ด ์ธ๋ถ๋ก ๋
ธ์ถ๋ ๊ฒฝ์ฐ ํด๋์ค ์ฌ์ด์ ๊ฒฐํฉ ๋๋ ๋์ ์๋ฐ์ ์๋ค.\n๋ ๊ฐ์ฒด ์ฌ์ด์ ๊ฒฐํฉ๋๊ฐ ๋์ ๊ฒฝ์ฐ ํ ๊ฐ์ฒด์ ๊ตฌํ์ ๋ณ๊ฒฝํ ๋ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ๋ณ๊ฒฝ์ ์ํฅ์ด ์ ํ๋ ํ๋ฅ ์ด ๋์์ง๋ค๋ ์ฌ์ค์ ๊ธฐ์ตํ์.\n์ ์ฐํ ์ค๊ณ๋ฅผ ์ฐฝ์กฐํ๊ธฐ ์ํด์๋ ์บก์ํ๋ฅผ ์ค๊ณ์ ์ฒซ ๋ฒ์งธ ๋ชฉํ๋ก ์ผ์์ผ ํ๋ค.\n๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ๋ ๊ฐ์ฒด์ ํ๋๋ณด๋ค๋ ์ํ์ ์ด์ ์ ๋ง์ถ๋ค ๋ฐ์ดํฐ ์ฃผ๋ ์ค๊ณ๋ ์ค๊ณ๋ฅผ ์์ํ๋ ์ฒ์๋ถํฐ ๋ฐ์ดํฐ์ ๊ดํด ๊ฒฐ์ ํ๋๋ก ๊ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ฌด ์ด๋ฅธ ์๊ธฐ์ ๋ด๋ถ ๊ตฌํ์ ์ด์ ์ ๋ง์ถ๊ฒ ๋๋ค.\n๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ ๋ฐฉ์์ ์ต์ํ ๊ฐ๋ฐ์๋ค์ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ๋ ์ ์ฐจ์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ๋ฐ๋ฅธ๋ค.\n์ด๊ฒ์ ์ํ์ ํ๋์ ํ๋์ ๋จ์๋ก ์บก์ํํ๋ ๊ฐ์ฒด์งํฅ ํจ๋ฌ๋ค์์ ๋ฐํ๋ ๊ฒ์ด๋ค.\n๋ฐ์ดํฐ ์ค์ฌ์ ๊ด์ ์์๋ ๊ฐ์ฒด๋ ๊ทธ์ ๋จ์ํ ๋ฐ์ดํฐ์ ์งํฉ์ฒด์ผ ๋ฟ์ด๋ค. ์ด๋ก ์ธํด ์ ๊ทผ์์ ์์ ์๋ฅผ ๊ณผ๋ํ๊ฒ ์ถ๊ฐํ๊ฒ ๋๊ณ ์ด ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์ ์ฐจ๋ฅผ ๋ถ๋ฆฌ๋ ๋ณ๋์ ๊ฐ์ฒด ์์ ๊ตฌํํ๊ฒ ๋๋ค.\n๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์์
๊ณผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ๊ฐ์ฒด ์์ ๋๋๋ผ๋ ๋ฐ์ดํฐ์ ์ด์ ์ด ๋ง์ถฐ์ ธ ์๋ค๋ฉด ๋ง์กฑ์ค๋ฌ์ด ์บก์ํ๋ฅผ ์ป๊ธฐ ์ด๋ ต๋ค.\n๋ฐ์ดํฐ๋ฅผ ๋จผ์ ๊ฒฐ์ ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ํ์ํ ์คํผ๋ ์ด์
์ ๋์ค์ ๊ฒฐ์ ํ๋ ๋ฐฉ์์ ๋ฐ์ดํฐ์ ๊ดํ ์ง์์ด ๊ฐ์ฒด์ ์ธํฐํ์ด์ค์ ๊ณ ์ค๋ํ ๋๋ฌ๋๊ฒ ๋๋ฉฐ ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฐ์ฒด์ ์ธํฐํ์ด์ค๋ ๊ตฌํ์ ์บก์ํํ๋ ๋ฐ ์คํจํ๊ณ ์ฝ๋๋ ๋ณ๊ฒฝ์ ์ทจ์ฝํด์ง๋ค.\n๋ฐ์ดํฐ ์ค์ฌ์ ์ค๊ณ๋ ๋๋ฌด ์ด๋ฅธ ์๊ธฐ์ ๋ฐ์ดํฐ์ ๋ํด ๊ณ ๋ฏผํ๊ธฐ ๋๋ฌธ์ ์บก์ํ์ ์คํจํ๊ฒ ๋๊ณ ๊ฐ์ฒด ๋ด๋ถ ๊ตฌํ์ด ๊ฐ์ฒด์ ์ธํฐํ์ด์ค๋ฅผ ์ด์ง๋ฝํ๊ณ ๊ฐ์ฒด์ ์์ง๋์ ๊ฒฐํฉ๋์ ๋์ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ์ ์ทจ์ฝํ ์ฝ๋๋ฅผ ๋ณ๊ฒ ๋๋ค.\n๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ๋ ๊ฐ์ฒด๋ฅผ ๊ณ ๋ฆฝ์ํจ ์ฑ ์คํผ๋ ์ด์
์ ์ ์ํ๋๋ก ๋ง๋ ๋ค ๊ฐ์ฒด์งํฅ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌํํ๋ค๋ ๊ฒ์ ํ๋ ฅํ๋ ๊ฐ์ฒด๋ค์ ๊ณต๋์ฒด๋ฅผ ๊ตฌ์ถํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.\nํ๋ ฅ์ด๋ผ๋ ๋ฌธ๋งฅ ์์์ ํ์ํ ์ฑ
์์ ๊ฒฐ์ ํ๊ณ ์ด๋ฅผ ์ํํ ์ ์ ํ ๊ฐ์ฒด๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํ๋ค.\n์ฌ๋ฐ๋ฅธ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ๋ฌด๊ฒ ์ค์ฌ์ ํญ์ ๊ฐ์ฒด์ ๋ด๋ถ๊ฐ ์๋๋ผ ์ธ๋ถ์ ๋ง์ถฐ์ ธ ์์ด์ผ ํ๊ณ ๊ฐ์ฒด๊ฐ ๋ด๋ถ์ ์ด๋ค ์ํ๋ฅผ ๊ฐ์ง๊ณ ๊ทธ ์ํ๋ฅผ ์ด๋ป๊ฒ ๊ด๋ฆฌํ๋๊ฐ๋ ๋ถ๊ฐ์ ์ธ ๋ฌธ์ ๋ค.\n์ค์ํ ๊ฒ์ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ํ๋ ฅํ๋ ๋ฐฉ๋ฒ์ด๋ค.\nํ์ง๋ง ๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ์์๋ ๊ฐ์ฒด์ ์ธ๋ถ๊ฐ ์๋๋ผ ๋ด๋ถ๋ก ํฅํ๊ฒ ๋๊ณ ๋ฐ์ดํฐ์ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋จผ์ ๊ฒฐ์ ํ๊ฒ ๋๋ค.\n์ด๋ ๊ฒ ๋๋ฉด ์ด๋ฏธ ๊ฒฐ์ ๋ ์ํ์ใ
๋ค๋ฅธ ๊ฐ์ฒด์์ ํ๋ ฅ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํ๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ๊ตฌํ๋ ๊ฐ์ฒด์ ์ธํฐํ์ด์ค๋ฅผ ์ต์ง๋ก ๋ผ์ ๋ง์ถ ์๋ฐ์ ์๋ค.\n","permalink":"https://www.springboot.kr/posts/object/chapter4/","summary":"Chapter 4. ์ค๊ณ ํ์ง๊ณผ ํธ๋ ์ด๋์คํ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ํต์ฌ์ ์ญํ ,์ฑ
์,ํ๋ ฅ์ด๋ค.\nํ๋ ฅ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฐ์ฒด๋ค ์ฌ์ด์ ์ํธ์์ฉ ์ด๋ค. ์ฑ
์์ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ํ๋ ฅ ํ๊ธฐ ์ํด ์ํํ๋ ํ๋์ด๊ณ ์ญํ ์ ๋์ฒด ๊ฐ๋ฅํ ์ฑ
์์ ์งํฉ์ด๋ค.\n์ฑ
์ ์ฃผ๋ ์ค๊ณ๋ผ๋ ์ด๋ฆ์ ๋์ค๋ ๊ฒ์ฒ๋ผ ์ ์
์ค ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ฑ
์์ด๋ค.\n์ฑ
์์ด ๊ฐ์ฒด์งํฅ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์ ํ์ง์ ๊ฒฐ์ ํ๋ค.\n๊ฐ์ฒด์งํฅ ์ค๊ณ๋ ์ฌ๋ฐ๋ฅธ ๊ฐ์ฒด์๊ฒ ์ฌ๋ฐ๋ฅธ ์ฑ
์์ ํ ๋นํ๋ฉด์ ๋ฎ์ ๊ฒฐํฉ๋์ ๋์ ์์ง๋๋ฅผ ๊ฐ์ง ๊ตฌ์กฐ๋ฅผ ์ฐฝ์กฐํ๋ ํ๋์ด๋ค.\n๊ฐ์ฒด์งํฅ ์ค๊ณ์ ๊ดํ ๋ ๊ฐ์ง ๊ด์ ์ด ์์ฌ ์๋ค.","title":"[์ค๋ธ์ ํธ OBJECTS] Chapter 4. ์ค๊ณ ํ์ง๊ณผ ํธ๋ ์ด๋์คํ"},{"content":"Chapter 3. ์ญํ , ์ฑ
์, ํ๋ ฅ ๊ฐ์ฒด์งํฅ ํจ๋ฌ๋ค์์ ๊ด์ ์์ ํต์ฌ์ ์ญํ , ์ฑ
์, ํ๋ ฅ์ด๋ค.\n์ ํ๋ฆฌ์ผ์ด์
์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ์ํํ๋ ์ํธ์์ฉ์ ํ๋ ฅ, ๊ฐ์ฒด ์์ฒด๊ฐ ํ๋ ฅ์ ์ฐธ์ฌํ๊ธฐ ์ํด ์ํํ๋ ๋ก์ง์ ์ฑ
์์ด๋ผ ํ๋ค.\n๊ฐ์ฒด๋ค์ด ํ๋ ฅ ์์์ ์ํํ๋ ์ฑ
์๋ค์ด ๋ชจ์ฌ ๊ฐ์ฒด๊ฐ ์ํํ๋ ์ญํ ์ ๊ตฌ์ฑํ๋ค\n๊ฐ์ฒด์งํฅ์ ๋ณธ์ง์ ํ๋ ฅํ๋ ๊ฐ์ฒด๋ค์ ๊ณต๋์ฒด๋ฅผ ์ฐฝ์กฐํ๋ ๊ฒ์ด๋ค.\nํด๋์ค์ ์์์ ๊ฐ์ฒด๋ค์ ์ฑ
์๊ณผ ํ๋ ฅ์ด ์ด๋ ์ ๋ ์๋ฆฌ๋ฅผ ์ก์ ํ์ ์ฌ์ฉํ ์ ์๋ ๊ตฌํ ๋ฉ์ปค๋์ฆ์ผ ๋ฟ์ด๋ค.\n์ญํ , ์ฑ
์ ํ๋ ฅ์ด ์ ์๋ฆฌ๋ฅผ ์ฐพ์ง ๋ชปํ ์ํ๋ผ๋ฉด ์์ง๋ ๋์ ํด๋์ค์ ์ค๋ณต ์๋ ์์ ๊ณ์ธต์ ๊ตฌํํ๋ค๊ณ ํ๋๋ผ๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ์นจ๋ชฐํ๋ ๊ฒ์ ๊ตฌ์ํ์ง๋ ๋ชปํ๋ค.\nํ๋ ฅ ๊ฐ์ฒด์งํฅ ์์คํ
์ ์์จ์ ์ธ ๊ฐ์ฒด๋ค์ ๊ณต๋์ฒด๋ค.\n๋ ๊ฐ์ฒด ์ฌ์ด์ ํ๋ ฅ์ ํ๋์ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ๋์์ ์์ฒญํ ๋ ์์๋๋ค.\n๊ฐ์ฒด๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ์์ธํ ๋ด๋ถ์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์ง ๋ฉ์์ง ์ ์ก์ ํตํด์๋ง ์์ ์ ์์ฒญ์ ์ ๋ฌํ ์ ์๋ค.\n๊ฐ์ฒด ์ฌ์ด์ ํ๋ ฅ์ ์ค๊ณํ ๋๋ ๊ฐ์ฒด๋ฅผ ์๋ก ๋ถ๋ฆฌ๋ ์ธ์คํด์ค๊ฐ ์๋ ํ๋ ฅํ๋ ํํธ๋๋ก ์ธ์ํด์ผ ํ๋ค.\n๋ฉ์์ง๋ฅผ ์์ ํ ๊ฐ์ฒด๋ ๋ฉ์๋๋ฅผ ์คํํด ์์ฒญ์ ์๋ตํ๊ณ ์ฌ๊ธฐ์ ๊ฐ์ฒด๊ฐ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ค์ค๋ก ์ ํํ๋ค๋ ์ ์ด ์ค์ํ๋ค.\n์ด๊ฒ์ ๊ฐ์ฒด๊ฐ ์์ ์ ์ผ์ ์ค์ค๋ก ์ฒ๋ฆฌํ ์ ์๋ ์์จ์ ์ธ ์กด์ฌ๋ผ๋ ๊ฒ์ ์๋ฏธํ๋ค.\n๊ฐ์ฒด๋ฅผ ์์จ์ ์ผ๋ก ๋ง๋๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ๋ด๋ถ ๊ตฌํ์ ์บก์ํํ๋ ๊ฒ์ด๋ค.\n์บก์ํ๋ฅผ ํตํด ๋ณ๊ฒฝ์ ๋ํ ํ๊ธํจ๊ณผ๋ฅผ ์ ํํ ์ ์๊ธฐ ๋๋ฌธ์ ์์จ์ ์ธ ๊ฐ์ฒด๋ ๋ณํ๊ธฐ๋ ์ฌ์์ง๋ค.\nํ๋ ฅ์ด ์ค๊ณ๋ฅผ ์ํ ๋ฌธ๋งฅ์ ๊ฒฐ์ ํ๋ค ๊ฐ์ฒด๋ ์ํ์ ํ๋์ ํจ๊ป ์บก์ํํ๋ ์คํ ๋จ์๋ค.\n์ ํ๋ฆฌ์ผ์ด์
์์ ์ด๋ค ๊ฐ์ฒด๊ฐ ํ์ํ๋ค๋ฉด ๊ทธ ์ด์ ๋ ๋จ ํ๋๋ค.\n๊ทธ ๊ฐ์ฒด๊ฐ ์ด๋ค ํ๋ ฅ์ ์ฐธ์ฌํ๊ณ ์๊ณ ํ๋ ฅ์ ํ์ํ ์ ์ ํ ํ๋ฑ์ ๋ณด์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.\n๊ฒฐ๋ก ์ ์ผ๋ก ๊ฐ์ฒด์ ํ๋์ ๊ฒฐ์ ํ๋ ๊ฒ์ ๊ฐ์ฒด๊ฐ ์ฐธ์ฌํ๊ณ ์๋ ํ๋ ฅ์ด๋ค.\nํ๋ ฅ์ด ๋ฐ๋๋ฉด ๊ฐ์ฒด๊ฐ ์ ๊ณตํด์ผ ํ๋ ํ๋ ์ญ์ ๋ฐ๋์ด์ผ ํ๋ค.\nํ๋ ฅ์ ๊ฐ์ฒด๊ฐ ํ์ํ ์ด์ ์ ๊ฐ์ฒด๊ฐ ์ํํ๋ ํ๋์ ๋๊ธฐ๋ฅผ ์ ๊ณตํ๋ค.\n์ฑ
์์ด๋ ๋ฌด์์ธ๊ฐ ๊ฐ์ฒด๊ฐ ํ๋ ฅ์ ์ฐธ์ฌํ๊ธฐ ์ํด ์ํํ๋ ํ๋์ ์ฑ
์์ด๋ผ ํ๋ค.\n์ฑ
์์ด๋ ๊ฐ์ฒด์ ์ํด ์ ์๋๋ ์์ง๋ ์๋ ํ์์ ์งํฉ์ผ๋ก ๊ฐ์ฒด๊ฐ ์ ์งํด์ผ ํ๋ ์ ๋ณด์ ์ํํ ์ ์๋ ํ๋์ ๋ํด ๊ฐ๋ต์ ์ผ๋ก ์์ ํ ๋ฌธ์ฅ์ด๋ค.\n๊ฐ์ฒด์ ์ฑ
์์ ๊ฐ์ฐจ๊ฐ \u0026lsquo;๋ฌด์์ ์๊ณ ์๋๊ฐ\u0026rsquo;์ \u0026lsquo;๋ฌด์์ ํ ์ ์๋๊ฐ\u0026rsquo;๋ก ๊ตฌ์ฑ๋๋ค\n ํ๋ ๊ฒ(doing) ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฑฐ๋ ๊ณ์ฐ์ ์ํํ๋ ๋ฑ์ ์ค์ค๋ก ํ๋ ๊ฒ ๋ค๋ฅธ ๊ฐ์ฒด์ ํ๋์ ์์์ํค๋ ๊ฒ ๋ค๋ฅธ ๊ฐ์ฒด์ ํ๋์ ์ ์ดํ๊ณ ์กฐ์ ํ๋ ๊ฒ ์๋ ๊ฒ(knowing) ์ฌ์ ์ธ ์ ๋ณด์ ๊ดํด ์๋ ๊ฒ ๊ด๋ จ๋ ๊ฐ์ฒด์ ๊ดํด ์๋ ๊ฒ ์์ ์ด ์ ๋ํ๊ฑฐ๋ ๊ณ์ฌํ ์ ์๋ ๊ฒ์ ๊ดํด ์๋ ๊ฒ ์ผ๋ฐ์ ์ผ๋ก ์ฑ
์๊ณผ ๋ฉ์์ง์ ํฌ๊ธฐ๋ ๋ค๋ฅด๋ค.\n์ฑ
์์ ๋ฉ์์ง๋ณด๋ค ์ถ์์ ์ด๊ณ ๊ฐ๋
์ ์ผ๋ก๋ ๋ ํฌ๋ค.\n์ฌ๋ฌ ๊ฐ์ ๋ฉ์์ง๋ก ๋ถํ ๋๊ธฐ๋ ํ๊ณ ํ๋์ ๊ฐ์ฒด๊ฐ ์ํํ ์ ์๋ค๊ณ ์๊ฐํ๋ ์ฑ
์์ด ๋์ค์๋ ์ฌ๋ฌ ๊ฐ์ฒด๋ค์ด ํ๋ ฅํด์ผ๋ง ํ๋ ์ปค๋ค๋ ์ฑ
์์ผ๋ก ์๋ผ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.\n์ด๋ค ์ฑ
์์ ์ํํ๊ธฐ ์ํด์๋ ๊ทธ ์ฑ
์์ ์ํํ๋๋ฐ ํ์ํ ์ ๋ณด๋ ํจ๊ป ์์์ผ ํ ์ฑ
์์ด ์๋ ๊ฒ์ด๋ค.\n์ฑ
์์ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ํต์ฌ ์ด๋ค.\n๊ฐ์ฒด์๊ฒ ์ผ๋ง๋ ์ ์ ํ ์ฑ
์์ ํ ๋นํ๋๋๊ฐ ์ค๊ณ์ ์ ์ฒด์ ์ธ ํ์ง์ ๊ฒฐ์ ํ๋ค.\n์ฑ
์ ํ ๋น INFORMATION EXPERT(์ ๋ณด ์ ๋ฌธ๊ฐ) ํจํด\n์ฑ
์ ํ ๋น์ ์ํ GRASP ํจํด\n์ผ์ ์ํ์์ ๋์์ ์ ๋ฌธ๊ฐ์๊ฒ ๋์์ ์์ฒญํ๋ ๊ฒ์ฒ๋ผ ๊ฐ์ฒด์ ์ธ๊ณ์์๋ ํ๋ ฅ์ ํ์ํ ์ง์๊ณผ ๋ฐฉ๋ฒ์ ๊ฐ์ฅ ์ ์๊ณ ์๋ ๊ฐ์ฒด์๊ฒ ๋์์ ์์ฒญํ๋ค.\n์ด ์์ฒญ์ ์๋ตํ๊ธฐ ์ํด ํ์ํ ์ด ํ๋์ด ๊ฐ์ฒด๊ฐ ์ํํ ์ฑ
์์ผ๋ก ์ด์ด์ง๋ ๊ฒ์ด๋ค.\n๊ฐ์ฒด์งํฅ ์ค๊ณ๋ ์์คํ
์ ์ฑ
์์ ์๋ฃํ๋ ๋ฐ ํ์ํ ๋ ์์ ์ฑ
์์ ์ฐพ์๋ด๊ณ ์ด๋ฅผ ๊ฐ์ฒด๋ค์๊ฒ ํ ๋นํ๋ ๋ฐ๋ณต์ ์ธ ๊ณผ์ ์ ํตํด ๋ชจ์์ ๊ฐ์ถฐ๊ฐ๋ค.\n์ ๋ณด ์ ๋ฌธ๊ฐ์๊ฒ ์ฑ
์์ ํ ๋นํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ํ์ ํ๋์ ํจ๊ป ๊ฐ์ง๋ ์์จ์ ์ธ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.\n์ฑ
์ ์ฃผ๋ ์ค๊ณ ์ฑ
์์ ์ฐพ๊ณ ์ฑ
์์ ์ํํ ์ ์ ํ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ฑ
์์ ํ ๋นํ๋ ๋ฐฉ์์ผ๋ก ํ๋ ฅ์ ์ค๊ณํ๋ ๋ฐฉ๋ฒ์ ์ฑ
์ ์ฃผ๋ ์ค๊ณ(Responsibility-Driven Design, RDD)๋ผ๊ณ ํ๋ค.\nWhat is responsibility-driven design?\n์ฑ
์ ์ฃผ๋ ์ค๊ณ ๋ฐฉ๋ฒ์ ๊ณผ์ \n ์์คํ
์ด ์ฌ์ฉ์์๊ฒ ์ ๊ณตํด์ผ ํ๋ ๊ธฐ๋ฅ์ธ ์์คํ
์ฑ
์์ ํ์
ํ๋ค. ์์คํ
์ฑ
์์ ๋ ์์ ์ฑ
์์ผ๋ก ๋ถํ ํ๋ค. ๋ถํ ๋ ์ฑ
์์ ์ํํ ์ ์๋ ์ ์ ํ ๊ฐ์ฒด ๋๋ ์ญํ ์ ์ฐพ์ ์ฑ
์์ ํ ๋นํ๋ค. ๊ฐ์ฒด๊ฐ ์ฑ
์์ ์ํํ๋ ๋์ค ๋ค๋ฅธ ๊ฐ์ฒด์ ๋์์ด ํ์ํ ๊ฒฝ์ฐ ์ด๋ฅผ ์ฑ
์์ง ์ ์ ํ ๊ฐ์ฒด ๋๋ ์ญํ ์ ์ฐพ๋๋ค. ํด๋น ๊ฐ์ฒด ๋๋ ์ญํ ์๊ฒ ์ฑ
์์ ํ ๋นํจ์ผ๋ก์จ ๋ ๊ฐ์ฒด๊ฐ ํ๋ ฅํ๊ฒ ํ๋ค. ์ฑ
์ ์ฃผ๋ ์ค๊ณ๋ ์์ฐ์ค๋ฝ๊ฒ ๊ฐ์ฒด์ ๊ตฌํ์ด ์๋ ์ฑ
์์ ์ง์คํ ์ ์๊ฒ ํ๋ค.\n๊ตฌํ์ด ์๋ ์ฑ
์์ ์ง์คํ๋ ๊ฒ์ด ์ค์ํ ์ด์ ๋ ์ ์ฐํ๊ณ ๊ฒฌ๊ณ ํ ๊ฐ์ฒด์งํฅ ์์คํ
์ ์ํด ๊ฐ์ฅ ์ค์ํ ์ฌ๋ฃ๊ฐ ๋ฐ๋ก ์ฑ
์์ด๊ธฐ ๋๋ฌธ์ด๋ค.\n๋ฉ์์ง๊ฐ ๊ฐ์ฒด๋ฅผ ๊ฒฐ์ ํ๋ค ๋ฉ์์ง๊ฐ ๊ฐ์ฒด๋ฅผ ์ ํํ๊ฒ ํด์ผ ํ๋ ๋ ๊ฐ์ง ์ค์ํ ์ด์ ๊ฐ ์๋ค.\n ๊ฐ์ฒด๊ฐ ์ต์ํ์ ์ธํฐํ์ด์ค(minimal interface)๋ฅผ ๊ฐ์ง ์ ์๊ฒ ๋๋ค. ์ฆ ๊ผญ ํ์ํ ํฌ๊ธฐ์ ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง ์ ์๋ค.\n ๊ฐ์ฒด๋ ์ถ์์ ์ธ ์ธํฐํ์ด์ค(abstract interface)๋ฅผ ๊ฐ์ง ์ ์๊ฒ ๋๋ค. ๊ฐ์ฒด๋ ๋ฌด์์ ํ๋์ง๋ ํํํด์ผ ํ์ง๋ง ์ด๋ป๊ฒ ์ํํ๋์ง๋ ๋
ธ์ถํด์๋ ์๋๋ค.\n ๊ฐ์ฒด๊ฐ ์ถฉ๋ถํ ์ถ์์ ์ด๋ฉด์ ๋ฏธ๋๋ฉ๋ฆฌ์ฆ์ ๋ฐ๋ฅด๋ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๊ฒ ํ๊ณ ์ถ๋ค๋ฉด ๋ฉ์์ง๊ฐ ๊ฐ์ฒด๋ฅผ ์ ํํ๊ฒ ํ๋ค.\nํ๋์ด ์ํ๋ฅผ ๊ฒฐ์ ํ๋ค ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ ์ด์ ๋ ํ๋ ฅ์ ์ฐธ์ฌํ๊ธฐ ์ํด์๋ค.\n๊ฐ์ฒด์ ํ๋์ ๊ฐ์ฒด๊ฐ ํ๋ ฅ์ ์ฐธ์ฌํ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด๋ค.\n์ผ๋ง๋ ์ ์ ํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์ผ๋ง๋ ์ ์ ํ ์ฑ
์์ ํ ๋นํ๊ณ ์ฑ
์์ด ์ผ๋ง๋ ์ ์ ํ์ง๋ ํ๋ ฅ์ ์ผ๋ง๋ ์ ์ ํ๊ฐ์ ๋ฌ๋ ค์๋ค.\n๊ฐ๋ณ ๊ฐ์ฒด์ ์ํ์ ํ๋์ด ์๋ ์์คํ
์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํ ํ๋ ฅ์ ์ด์ ์ ๋ง์ถฐ์ผ ์์ง๋๊ฐ ๋๊ณ ๊ฒฐํฉ๋๊ฐ ๋ฎ์ ๊ฐ์ฒด๋ค์ ๋ง๋ค์ ์๋ค.\n์ํ๋ ๋จ์ง ๊ฐ์ฒด๊ฐ ํ๋์ ์ ์์ ์ผ๋ก ์ํํ๊ธฐ ์ํ ์ฌ๋ฃ์ผ ๋ฟ์ด๋ค.\n์ญํ ๊ณผ ํ๋ ฅ ๊ฐ์ฒด๋ ํ๋ ฅ์ด๋ผ๋ ์ฃผ์ด์ง ๋ฌธ๋งฅ ์์์ ํน์ ํ ๋ชฉ์ ์ ๊ฐ๊ฒ ๋๋ค. ๊ฐ์ฒด์ ๋ชฉ์ ์ ํ๋ ฅ ์์์ ๊ฐ์ฒด๊ฐ ๋งก๊ฒ ๋๋ ์ฑ
์์ ์งํฉ์ผ๋ก ํ์๋๋ค.\n์ด๋ค ํน์ ํ ํ๋ ฅ ์์์ ์ํํ๋ ์ฑ
์์ ์งํฉ์ ์ญํ ์ด๋ผ๊ณ ํ๋ค.\n์ค์ ๋ก ํ๋ ฅ์ ๋ชจ๋ธ๋งํ ๋๋ ํน์ ํ ๊ฐ์ฒด๊ฐ ์๋๋ผ ์ญํ ์๊ฒ ์ฑ
์์ ํ ๋นํ๋ค๊ณ ์๊ฐํ๋๊ฒ ์ข๋ค.\n์ ์ฐํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋ ฅ ์ญํ ์ด ์ค์ํ ์ด์ ๋ ์ญํ ์ ํตํด ์ ์ฐํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋ ฅ์ ์ป์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.\n๋์ผํ ์ฑ
์์ ์ํํ๋ ์ญํ ์ ๊ธฐ๋ฐ์ผ๋ก ๋ ๊ฐ์ ํ๋ ฅ์ ํ๋๋ก ํตํฉํ ์ ์๋ค.\n์ญํ ์ ์ด์ฉํ๋ฉด ๋ถํ์ํ ์ค๋ณต ์ฝ๋๋ฅผ ๋ฐฉ์งํ๊ณ ์ ์ฐํ ํ๋ ฅ์ ๋ง๋ ๋ค.\n์ฑ
์๊ณผ ์ญํ ์ ์ค์ฌ์ผ๋ก ํ๋ ฅ์ ๋ฐ๋ผ๋ณด๋ ๊ฒ์ด ๋ฐ๋ก ๋ณ๊ฒฝ๊ณผ ํ์ฅ์ด ์ฉ์ดํ ์ ์ฐํ ์ค๊ณ๋ก ๋์๊ฐ๋ ๊ธธ์ด๋ค.\n์ญํ ์ ๊ตฌํ ์ญํ ์ ๊ตฌํํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.\n์ถ์ ํด๋์ค๋ ์ฑ
์์ ์ผ๋ถ๋ฅผ ๊ตฌํํด ๋์ ๊ฒ์ด๊ณ ์ธํฐํ์ด์ค๋ ์ผ์ฒด์ ๊ตฌํ ์์ด ์ฑ
์์ ์งํจ๋ง์ ๋์ดํด ๋์๋ค๋ ์ฐจ์ด๊ฐ ์์ง๋ง ํ๋ ฅ์ ๊ด์ ์์๋ ๋ ๋ชจ๋ ์ญํ ์ ์ ์ํ ์ ์๋ ๊ตฌํ ๋ฐฉ๋ฒ์ด๋ผ๋ ๊ณตํต์ ์ ๊ณต์ ํ๋ค.\n์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค๋ ๋์ผํ ์ฑ
์์ ์ํํ๋ ๋ค์ํ ์ข
๋ฅ์ ํด๋์ค๋ค์ ํ๋ ฅ์ ์ฐธ์ฌ์ํฌ ์ ์๋ ํ์ฅ ํฌ์ธํธ๋ฅผ ์ ๊ณตํ๊ณ ์ด๋ค์ ๋์ผํ ์ฑ
์์ ์ํํ ์ ์๋ ๊ฐ์ฒด๋ค์ ํ๋ ฅ ์์ ์์ฉํ ์ ์๋ ์ญํ ์ด๋ค.\n์ญํ ์ด ๋ค์ํ ์ข
๋ฅ์ ๊ฐ์ฒด๋ฅผ ์์ฉํ ์ ์๋ ์ผ์ข
์ ์ฌ๋กฏ์ด์ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด๋ค์ ํ์
์ ์บก์ํํ๋ ์ถ์ํ๋ผ๋ ๊ฒ์ด๋ค.\n๊ฐ์ฒด์๊ฒ ์ค์ํ ๊ฒ์ ํ๋์ด๋ฉฐ ์ญํ ์ ๊ฐ์ฒด๋ฅผ ์ถ์ํํด์ ๊ฐ์ฒด ์์ฒด๊ฐ ์๋ ํ๋ ฅ์ ์ด์ ์ ๋ง์ถ์ ์๊ฒ ํ๋ค.\n๊ฐ์ฒด ๋ ์ญํ ์ญํ ์ ๊ฐ์ฒด๊ฐ ์ฐธ์ฌํ ์ ์๋ ์ผ์ข
์ ์ฌ๋กฏ์ด๋ค.\nํ๋ ฅ์ ์ ํฉํ ์ฑ
์์ ์ํํ๋ ๋์์ด ํ ์ข
๋ฅ๋ผ๋ฉด ๊ฐ๋จํ๊ฒ ๊ฐ์ฒด๋ก ๊ฐ์ฃผํ๊ณ ๋ง์ฝ ์ฌ๋ฌ ์ข
๋ฅ์ ๊ฐ์ฒด๋ค์ด ์ฐธ์ฌํ ์ ์๋ค๋ฉด ์ญํ ์ด๋ผ ๋ถ๋ฅด๋ฉด ๋๋ค.\nํ๋ ฅ์ ์ญํ ๋ค์ ์ํธ์์ฉ์ผ๋ก ๊ตฌ์ฑ๋๊ณ ํ๋ ฅ์ ๊ตฌ์ฑํ๊ธฐ ์ํด ์ญํ ์ ์ ํฉํ ๊ฐ์ฒด๊ฐ ์ ํ๋๋ฉฐ ๊ฐ์ฒด๋ ํด๋์ค๋ฅผ ์ด์ฉํด ๊ตฌํ๋๊ณ ์์ฑ๋๋ค.\n๋จ์ํ๊ฒ ๊ฐ์ฒด๋ก ์์ํด ๋ฐ๋ณต์ ์ผ๋ก ์ฑ
์๊ณผ ํ๋ ฅ์ ์ ์ ํด๊ฐ๋ฉด์ ํ์ํ ์๊ฐ์ ๊ฐ์ฒด๋ก๋ถํฐ ์ญํ ์ ๋ถ๋ฆฌํด๋ด๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด๋ค.\n๋ค์ํ ๊ฐ์ฒด๋ค์ด ํ๋ ฅ์ ํจ์ฌํ๋ค๋ ๊ฒ์ด ํ์คํ๋ค๋ฉด ์ญํ ๋ก ์์ํ๊ณ ์ ํํ ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ธฐ ์ด๋ ค์ด ์ํฉ์ด๋ผ๋ฉด ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด๋ก ์์ํ์.\n๋ค์ํ ์๋๋ฆฌ์ค๋ฅผ ํ์ํ๊ณ ์ ์ฌํ ํ๋ ฅ๋ค์ ๋จ์ํํ๊ณ ํฉ์น๋ค ๋ณด๋ฉด ์์ฐ์ค๋ฝ๊ฒ ์ญํ ์ด ๊ทธ ๋ชจ์ต์ ๋ค์ด๋ผ ๊ฒ์ด๋ค.\n์ญํ ์ ๊ฐ์ฒด์ ํด๋์ค์ ๋นํด ์๋์ ์ผ๋ก ๋ ์๋ ค์ ธ ์์ผ๋ฉฐ ๊ทธ๋ค์ง ์ฃผ๋ชฉ๋ฐ์ง ๋ชปํ ๊ฐ๋
์ด๋ค.\n๋๋ถ๋ถ์ ๊ฐ์ฒด์งํฅ ์ธ์ด๋ค์ ์ญํ ์ ๊ตฌํํ ์ ์๋ ์ธ์ด์ ์ธ ํธ์ ์ฅ์น๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.\n๊ทธ๋ผ์๋ ์ ์ฐํ๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ์ผ๊ด๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ ์์คํ
์ ๊ตฌ์ถํ๋ ๋ฐ ์ญํ ์ ๋งค์ฐ ์ค์ํ๋ค.\nObject role modeling\n์ญํ ๊ณผ ์ถ์ํ ์ถ์ํ๋ฅผ ์ด์ฉํ ์ค๊ณ๊ฐ ๊ฐ์ง ์ ์๋ ๋๊ฐ์ง ์ฅ์ \n ์ถ์ํ ๊ณ์ธต๋ง์ ์ด์ฉํ๋ฉด ์ค์ํ ์ ์ฑ
์ ์์ ์์ค์์ ๋จ์ํํ ์ ์๋ค. ์ค๊ณ๊ฐ ์ข ๋ ์ ์ฐํด ์ง๋ค. ์ญํ ์ ๊ณตํต์ ์ฑ
์์ ๋ฐํ์ผ๋ก ๊ฐ์ฒด์ ์ข
๋ฅ๋ฅผ ์จ๊ธฐ๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ๊ด์ ์์ ์ญํ ์ ๊ฐ์ฒด์ ์ถ์ํ๋ก ๋ณผ์ ์๋ค.\n๋ฐ๋ผ์ ์ถ์ํ๊ฐ ๊ฐ์ง๋ ๋ ๊ฐ์ง ์ฅ์ ์ ํ๋ ฅ์ ๊ด์ ์์ ์ญํ ์๋ ๋์ผํ๊ฒ ์ ์ฉ๋ ์ ์๋ค.\n๊ฐ์ฒด์๊ฒ ์ค์ํ ๊ฒ์ ํ๋์ด๋ค. ์ญํ ์ด ์ค์ํ ์ด์ ๋ ๋์ผํ ํ๋ ฅ์ ์ํํ๋ ๊ฐ์ฒด๋ค์ ์ถ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.\nํ๋ ฅ ์์์ ๋์ผํ ์ฑ
์์ ์ํํ๋ ๊ฐ์ฒด๋ค์ ๋์ผํ ์ญํ ์ ์ํํ๊ธฐ ๋๋ฌธ์ ์๋ก ๋์ฒด ๊ฐ๋ฅํ๋ค.\n๋ฐ๋ผ์ ์ญํ ์ ๋ค์ํ ํ๊ฒฝ์์ ๋ค์ํ ๊ฐ์ฒด๋ค์ ์์ฉํ ์ ์๊ฒ ํด์ฃผ๋ฏ๋ก ํ๋ ฅ์ ์ ์ฐํ๊ฒ ๋ง๋ ๋ค.\n๋ฐฐ์ฐ์ ๋ฐฐ์ญ ์ฐ๊ทน ์์์ ๋ฐฐ์ญ์ ์ฐ๊ธฐํ๋ ๋ฐฐ์ฐ๋ผ๋ ํ๋ ฅ ์์์ ์ญํ ์ ์ํํ๋ ๊ฐ์ฒด๋ผ๋ ๊ด์ ์ด ๊ฐ์ง ์
์ฒด์ ์ธ ์ธก๋ฉด๋ค์ ํ๋ฅญํ๊ฒ ๋ด์๋ธ๋ค.\nํ๋ ฅ์ ์ฐ๊ทน๊ณผ ๋์ผํ๊ณ ์ฝ๋๋ ๊ทน๋ณธ๊ณผ ๋์ผํ๋ค.\n๋ฐฐ์ฐ๋ ์ฐ๊ทน์ด ์์๋๋ฉด ๋ฐฐ์ญ์ด๋ผ๋ ํน์ ํ ์ญํ ์ ์ฐ๊ธฐํ๋ค. ๊ฐ์ฒด๋ ํ๋ ฅ์ด๋ผ๋ ์คํ ๋ฌธ๋งฅ ์์์ ํน์ ํ ์ญํ ์ ์ํํ๋ค.\nํ์ง๋ง ์ฐ๊ทน์ด ๋๋๋ฉด ์์ ์ ๋ฐฐ์ญ์ ์๊ณ ์๋ ์๊ธฐ ์์ ์ผ๋ก ๋์์จ๋ค.\n๊ฐ์ฒด๋ ํ๋ ฅ์ด ๋๋๋ฉด ํ๋ ฅ์์์ ์ญํ ์ ์๊ณ ์๋ ์๊ธฐ ์์ ์ผ๋ก ๋์์ฌ ์ ์๋ค.\n์ผ๋ฐ์ ์ผ๋ฌ ์ญํ ์ ๊ฐ์ฒด๊ฐ ํ๋ ฅ์ ์ฐธ์ฌํ๋ ์ ์ ๋์์๋ง ์กด์ฌํ๋ ์ผ์์ ์ธ ๊ฐ๋
์ด๋ค.\n๋ฐ๋ผ์ ๋์ผํ ๊ฐ์ฒด๋ผ๊ณ ํ๋๋ผ๋ ๊ฐ์ฒด๊ฐ ์ฐธ์ฌํ๋ ํ๋ ฅ์ ๋ฐ๋ผ ๊ฐ์ฒด์ ์ผ๊ตด์ ๊ณ์ํด์ ๋ฐ๋๋ค.\n๊ฐ์ฒด๋ ๋ค์์ ์ญํ ์ ๋ณด์ ํ ์ ์์ง๋ง ๊ฐ์ฒด๊ฐ ์ฐธ์ฌํ๋ ํน์ ํ๋ ฅ์ ๊ฐ์ฒด์ ํ ๊ฐ์ง ์ญํ ๋ง ๋ฐ๋ผ๋ณผ ์ ์๋ค.\n","permalink":"https://www.springboot.kr/posts/object/chapter3/","summary":"Chapter 3. ์ญํ , ์ฑ
์, ํ๋ ฅ ๊ฐ์ฒด์งํฅ ํจ๋ฌ๋ค์์ ๊ด์ ์์ ํต์ฌ์ ์ญํ , ์ฑ
์, ํ๋ ฅ์ด๋ค.\n์ ํ๋ฆฌ์ผ์ด์
์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ์ํํ๋ ์ํธ์์ฉ์ ํ๋ ฅ, ๊ฐ์ฒด ์์ฒด๊ฐ ํ๋ ฅ์ ์ฐธ์ฌํ๊ธฐ ์ํด ์ํํ๋ ๋ก์ง์ ์ฑ
์์ด๋ผ ํ๋ค.\n๊ฐ์ฒด๋ค์ด ํ๋ ฅ ์์์ ์ํํ๋ ์ฑ
์๋ค์ด ๋ชจ์ฌ ๊ฐ์ฒด๊ฐ ์ํํ๋ ์ญํ ์ ๊ตฌ์ฑํ๋ค\n๊ฐ์ฒด์งํฅ์ ๋ณธ์ง์ ํ๋ ฅํ๋ ๊ฐ์ฒด๋ค์ ๊ณต๋์ฒด๋ฅผ ์ฐฝ์กฐํ๋ ๊ฒ์ด๋ค.\nํด๋์ค์ ์์์ ๊ฐ์ฒด๋ค์ ์ฑ
์๊ณผ ํ๋ ฅ์ด ์ด๋ ์ ๋ ์๋ฆฌ๋ฅผ ์ก์ ํ์ ์ฌ์ฉํ ์ ์๋ ๊ตฌํ ๋ฉ์ปค๋์ฆ์ผ ๋ฟ์ด๋ค.\n์ญํ , ์ฑ
์ ํ๋ ฅ์ด ์ ์๋ฆฌ๋ฅผ ์ฐพ์ง ๋ชปํ ์ํ๋ผ๋ฉด ์์ง๋ ๋์ ํด๋์ค์ ์ค๋ณต ์๋ ์์ ๊ณ์ธต์ ๊ตฌํํ๋ค๊ณ ํ๋๋ผ๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ์นจ๋ชฐํ๋ ๊ฒ์ ๊ตฌ์ํ์ง๋ ๋ชปํ๋ค.","title":"[์ค๋ธ์ ํธ OBJECTS] Chapter 3. ์ญํ , ์ฑ
์, ํ๋ ฅ"},{"content":"Chapter 2. ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ ๋ชฉ์ฒ๋ผ ์ฑํฐ 2์์๋ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋ํด ์ด์ผ๊ธฐํ๋ค\nํ๋ ฅ, ๊ฐ์ฒด, ํด๋์ค ๊ฐ์ฒด์งํฅ์ด๋ ๋ง ๊ทธ๋๋ก ๊ฐ์ฒด๋ฅผ ์งํฅํ๋ ๊ฒ์ด๋ค.\n๊ทธ๋ฆฌ๊ณ ๊ฐ์ฒด์งํฅ์ ์ต์ํ ์ฌ๋์ด๋ผ๋ฉด ํด๋์ค์ ๋ํด ๊ณ ๋ฏผํ ๊ฒ์ด๊ณ ์ด๋ค ์์ฑ๊ณผ ๋ฉ์๋๊ฐ ๋ค์ด๊ฐ ๊ฒ์ธ๊ฐ๋ฅผ ๊ณ ๋ฏผํ ๊ฒ์ด๋ค.\nํ์ง๋ง ์ด๊ฑด ๊ฐ์ฒด์งํฅ์ ๋ณธ์ง๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋ค.\n์์ ๋งํ ๊ฒ์ฒ๋ผ ๊ฐ์ฒด์งํฅ์ ๊ฐ์ฒด๋ฅผ ์งํฅํ๋ ๊ฒ์ด๋ค.\n์ง์ ํ ๊ฐ์ฒด์งํฅ ํจ๋ฌ๋ค์์ผ๋ก์ ์ ํ์ ํด๋์ค๊ฐ ์๋ ๊ฐ์ฒด์ ์ด์ ์ ๋ง์ถฐ์ผ ์ป์ ์ ์๋ค.\n๊ทธ๋ฌ๊ธฐ ์ํด์๋ ์ฐ๋ฆฌ๋ ๋ ๊ฐ์ง์ ์ง์คํด์ผ ํ๋ค.\n ์ด๋ค ํด๋์ค๊ฐ ํ์ํ์ง ๊ณ ๋ฏผํ๊ธฐ ์ ์ ์ด๋ค ๊ฐ์ฒด๋ค์ด ํ์ํ์ง ๊ณ ๋ฏผํ๊ธฐ\n ํด๋์ค๋ ๊ณตํต์ ์ธ ์ํ์ ํ๋์ ๊ณต์ ํ๋ ๊ฒ์ ์ถ์ํํ ๊ฒ. ํด๋์ค์ ์ค๊ณฝ์ ์ก๊ธฐ ์ํด์ ์ด๋ค ๊ฐ์ฒด๋ค์ด ์ด๋ค ์ํ์ ํ๋์ ๊ฐ์ง๋์ง ๊ฒฐ์ ํ ๊ฒ. ๊ฐ์ฒด๋ฅผ ๋
๋ฆฝ์ ์ธ ์กด์ฌ๊ฐ ์๋๋ผ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ํ๋ ฅํ๋ ๊ณต๋์ฒด์ ์ผ์์ผ๋ก ๋ณด๊ธฐ.\n ๊ฐ์ฒด๋ฅผ ํ๋ ฅํ๋ ๊ณต๋์ฒด์ ์ผ์์ผ๋ก ๋ฐ๋ผ๋ณด๋ ๊ฒ์ ์ค๊ณ๋ฅผ ์ ์ฐํ๊ณ ํ์ฅ ๊ฐ๋ฅํ๊ฒ ๋ง๋ ๋ค. ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์๊ฐํ๊ณ ์ถ๋ค๋ฉด ๊ฐ์ฒด๋ฅผ ๊ณ ๋ฆฝ๋ ์กด์ฌ๋ก ๋ฐ๋ผ๋ณด์ง ๋ง๊ณ ํ๋ ฅ์ ์ฐธ์ฌํ๋ ํ๋ ฅ์๋ก ๋ด์ผ ํ๋ค. ๊ฐ์ฒด๋ค์ ๋ชจ์๊ณผ ์ค๊ณฝ์ด ์กํ๋ฉด ๊ณตํต๋ ํน์ฑ๊ณผ ์ํ๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ค์ ํ์
์ผ๋ก ๋ถ๋ฅํ๊ณ ์ด ํ์
์ ๊ธฐ๋ฐ์ผ๋ก ํด๋์ค๋ฅผ ๊ตฌํํ๋ค. ์ด๋ ๊ฒ ๊ฐ์ฒด๋ฅผ ์ค์ฌ์ ๋๋ ์ ๊ทผ ๋ฐฉ๋ฒ์ ์ค๊ณ๋ฅผ ๋จ์ํ๊ณ ๊น๋ํ๊ฒ ๋ง๋ค๋ฉฐ ํ๋ฅญํ ํ๋ ฅ์ด ํ๋ฅญํ ๊ฐ์ฒด๋ฅผ ํ๋ฅญํ ๊ฐ์ฒด๊ฐ ํ๋ฅญํ ํด๋์ค๋ฅผ ๋ง๋ ๋ค.\n๋๋ฉ์ธ์ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด๋ ํ๋ก๊ทธ๋จ ๊ตฌ์กฐ ์ํํธ์จ์ด๋ ์ฌ์ฉ์๊ฐ ์ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ง๋ค์ด์ง๊ฒ ๋๋๋ฐ ์ด ์ฌ์ฉ์๊ฐ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๋ ๋ถ์ผ๋ฅผ ๋๋ฉ์ธ์ด๋ผ ํ๋ค.\n๊ฐ์ฒด์งํฅ์ ํจ๋ฌ๋ค์์ด ๊ฐ๋ ฅํ ์ด์ ๋ ์ฒ์๋ถํฐ ๋๊น์ง ๊ฐ์ฒด๋ผ๋ ๋์ผํ ์ถ์ํ ๊ธฐ๋ฒ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.\n์๊ตฌ ์ฌํญ๊ณผ ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด๋ผ๋ ๋์ผํ ๊ด์ ์์ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ฉ์ธ์ ๊ตฌ์ฑํ๋ ๊ฐ๋
๋ค์ด ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด์ ํด๋์ค๋ก ๋งค๋๋ฝ๊ฒ ์ฐ๊ฒฐ๋ ์ ์๋ค.\n์ผ๋ฐ์ ์ผ๋ก ํด๋์ค์ ์ด๋ฆ์ ๋์๋๋ ๋๋ฉ์ธ ๊ฐ๋
์ ์ด๋ฆ๊ณผ ๋์ผํ๊ฑฐ๋ ์ ์ฌํ๊ฒ ์ง์ด์ผ ํ๋ฉฐ ํด๋์ค ์ฌ์ด์ ๊ด๊ณ๋ ์ต๋ํ ๋๋ฉ์ธ ๊ฐ๋
์ฌ์ด์ ๋งบ์ด์ง ๊ด๊ณ์ ์ ์ฌํ๊ฒ ๋ง๋ค์ด ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ ์์ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด์ผ ํ๋ค.\nํด๋์ค ๊ตฌํํ๊ธฐ ํด๋์ค๋ฅผ ๊ตฌํํ๊ฑฐ๋ ๋ค๋ฅธ ๊ฐ๋ฐ์์ ์ํด ๊ฐ๋ฐ๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ํด๋์ค์ ๊ฒฝ๊ณ๋ฅผ ๊ตฌ๋ถ ์ง๋ ๊ฒ์ด๋ค.\nํด๋์ค๋ ๋ด๋ถ์ ์ธ๋ถ๋ก ๊ตฌ๋ถ๋๋ฉฐ ํ๋ฅญํ ํด๋์ค๋ ์ด ๋ด๋ถ๋๋ ์ธ๋ถ์ ๊ธฐ๋ฅ์ ๊ณต๊ฐํ๊ณ ๊ฐ์ถ ๊ฒ์ ๋ํ ๊ฒฐ์ ์ด๋ค.\n๊ทธ๋ ๋ค๋ฉด ์ ํด๋์ค์ ๋ด๋ถ์ ์ธ๋ถ๋ฅผ ๊ตฌ๋ถํด์ผ ํ ๊น? ๊ทธ ์ด์ ๋ ๋ด๋ถ์ ์ธ๋ถ์ ๊ฒฝ๊ณ์ ๋ช
ํ์ฑ์ด ๊ฐ์ฒด์ ์์จ์ฑ์ ๋ณด์ฅํ๊ณ ์ฐ๋ฆฌ์๊ฒ๋ ๊ตฌํ์ ์์ ๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ด๋ค.\n์์จ์ ์ธ ๊ฐ์ฒด ์ฐ๋ฆฌ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ ์ ๋ ๊ฐ์ง๋ฅผ ์์์ผ ํ๋ค.\n ๊ฐ์ฒด๊ฐ ์ํ์ ํ๋์ ํจ๊ป ๊ฐ์ง๋ ๋ณตํฉ์ ์ธ ์กด์ฌ๋ผ๋ ๊ฒ.\n ๊ฐ์ฒด๊ฐ ์ค์ค๋ก ํ๋จํ๊ณ ํ๋ํ๋ ์์จ์ ์ธ ์กด์ฌ๋ผ๋ ๊ฒ.\n ์ด ๋ ๊ฐ์ง๋ ์๋ก ๊น์ด ์ฐ๊ด๋ผ ์๋ค.\n๊ฐ์ฒด์งํฅ ์ด์ ์ ํจ๋ฌ๋ค์์์๋ ๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ด๋ผ๋ ๋
๋ฆฝ์ ์ธ ์กด์ฌ๋ฅผ ์๋ก ์ฎ์ด ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑํ๋ค.\nํ์ง๋ง ๊ฐ์ฒด์งํฅ์ ๊ฐ์ฒด๋ผ๋ ๋จ์ ์์ ๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ ํ ๋ฉ์ด๋ฆฌ๋ก ๋ฌถ์์ผ๋ก์จ ๋ฌธ์ ์์ญ์ ์์ด๋์ด๋ฅผ ์ ์ ํ๊ฒ ํํํ ์ ์๊ฒ ํ๋ค. (๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ ๊ฐ์ฒด ๋ด๋ถ๋ก ํจ๊ป ๋ฌถ๋ ๊ฒ์ ์บก์ํ๋ผ๊ณ ํ๋ค.)\n๊ฑฐ๊ธฐ๋ค ๊ฐ์ฒด์งํฅ์๋ ์ธ๋ถ์์์ ์ ๊ทผ์ ํต์ ํ๋ ์ ๊ทผ ์ ์ด๋ ์ ๊ณตํ๊ณ ์๋ค.\n๊ฐ์ฒด ๋ด๋ถ์ ๋ํ ์ ๊ทผ์ ํต์ ํ๋ ์ด์ ๋ ๊ฐ์ฒด๋ฅผ ์์จ์ ์ธ ์กด์ฌ๋ก ๋ง๋ค๊ธฐ ์ํจ์ด๊ณ ๊ทธ๋ ๊ฒ ๋ง๋ค์ด์ง ์์จ์ ์ธ ๊ฐ์ฒด๋ค์ ๊ณต๋์ฒด๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ด๋ค.\n์บก์ํ์ ์ ๊ทผ ์ ์ด๋ ๊ฐ์ฒด๋ฅผ ๋ ๋ถ๋ถ์ผ๋ก ๋๋๋ค.\n ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅํ ๋ถ๋ถ(ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค, public interface)\n ์ธ๋ถ์์๋ ์ ๊ทผ ๋ถ๊ฐ๋ฅํ๊ณ ์ค์ง ๋ด๋ถ์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ ๋ถ๋ถ(๊ตฌํ, implementiation)\n ์ธํฐํ์ด์ค์ ๊ตฌํ์ ๋ถ๋ฆฌ ์์น์ ํ๋ฅญํ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๊ธฐ ์ํด ๋ฐ๋ผ์ผ ํ๋ ํต์ฌ ์์น์ด๋ค.\n์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฒด์ ์ํ๋ ์จ๊ธฐ๊ณ ํ๋๋ง ์ธ๋ถ์ ๊ณต๊ฐํ๋ฉฐ ์ด๋ ํ ๋ฉ์๋๋ค์ด ์๋ธํด๋์ค๋ ๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅํด์ผ ํ๋ค๋ฉด protected๋ private์ผ๋ก ์ง์ ํด์ผ ํ๋ฉฐ ์ด๋ ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค๋ public์ผ๋ก ์ง์ ๋ ๋ฉ์๋๋ง ํฌํจ๋๋ค.\n๊ทธ ๋ฐ์ private ๋ฉ์๋๋ protected ๋ฉ์๋, ์์ฑ์ ๊ตฌํ์ ํฌํจ๋๋ค.\nํ๋ก๊ทธ๋๋จธ์ ์์ ํ๋ก๊ทธ๋๋จธ์ ์ญํ ์ ํด๋์ค ์์ฑ์์ ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋๋จธ๋ก ๊ตฌ๋ถํ๋ ๊ฒ์ด ์ ์ฉํ๋ค.\nํด๋์ค ์์ฑ์๋ ์๋ก์ด ๋ฐ์ดํฐ ํ์
์ ์ถ๊ฐํ๊ณ , ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋๋จธ๋ ํด๋์ค ์์ฑ์๊ฐ ์ถ๊ฐํ ๋ฐ์ดํฐ ํ์
์ ์ฌ์ฉํ๋ค.\nํด๋์ค ์์ฑ์๋ ํ์ํ ๋ถ๋ถ๋ง ๊ณต๊ฐํ๊ณ ๋๋จธ์ง๋ ๊ฝ๊ฝ ์จ๊ฒจ์ผ ํ๋ฉฐ ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋๋จธ๊ฐ ์จ๊ฒจ ๋์ ๋ถ๋ถ์ ๋ง์๋๋ก ์ ๊ทผํ ์ ์๋๋ก ๋ฐฉ์งํจ์ผ๋ก์จ ๊ฑฑ์ ํ์ง ์๊ณ ๋ด๋ถ ๊ตฌํ์ ๋ง์๋๋ก ๋ณ๊ฒฝํ ์ ์๋ค.\n์ด๋ฅผ ๊ตฌํ ์๋(implementation hiding)์ด๋ผ ํ๋ค.\n์ด ๊ตฌํ ์๋์ ํด๋์ค ์์ฑ์์ ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋๋จธ ๋ชจ๋์๊ฒ ์ ์ฉํ ๊ฐ๋
์ด๋ฉฐ ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋๋จธ์๊ฒ ๋ด๋ถ ๊ตฌํ์ ์ ๊ฒฝ ์ฐ์ง ์๊ณ ์ธํฐํ์ด์ค๋ง์ผ๋ก๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ด์ ์ค์ผ ์ ์๋ค.\n๋ํ ์ธํฐํ์ด์ค๋ฅผ ๋ฐ๊พธ์ง ์๋ ํ ์ธ๋ถ์ ๋ฏธ์น๋ ์ํฅ์ ๊ฑฑ์ ํ์ง ์๊ณ ๋ ๋ด๋ถ ๊ตฌํ์ ๋ง์๋๋ก ๋ณ๊ฒฝํ ์ ์๋ค.\n๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํด๋์ค๋ฅผ ๊ฐ๋ฐํ ๋๋ง๋ค ์ธํฐํ์ด์ค์ ๊ตฌํ์ ๊น๋ํ๊ฒ ๋ถ๋ฆฌํ๊ธฐ ์ํด ๋
ธ๋ ฅํด์ผ ํ๋ค.\n์ค๊ณ๊ฐ ํ์ํ ์ด์ ๋ ๋ณ๊ฒฝ์ ๊ด๋ฆฌํ๊ธฐ ์ํด์๋ผ๋ ๊ฒ์ ๊ธฐ์ตํด์ผ ํ๋ค.\nํ๋ ฅํ๋ ๊ฐ์ฒด๋ค์ ๊ณต๋์ฒด ๊ฐ์ฒด์งํฅ์ ์ฅ์ ์ ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ๋๋ฉ์ธ์ ์๋ฏธ๋ฅผ ํ๋ถํ๊ฒ ํํํ ์ ์๋ค๋ ๊ฒ์ด๋ค.\n๋ฐ๋ผ์ ์๋ฏธ๋ฅผ ์ข ๋ ๋ช
์์ ์ด๊ณ ๋ถ๋ช
ํ๊ฒ ํํํ ์ ์๋ค๋ฉด ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ํด๋น ๊ฐ๋
์ ๊ตฌํํ์ ๋น๋ก ํ๋์ ์ธ์คํด์ค ๋ณ์๋ง ํฌํจํ๋๋ผ๊ณ ๊ฐ๋
์ ๋ช
์์ ์ผ๋ก ํํํ๋ ๊ฒ์ ์ ์ฒด์ ์ธ ์ค๊ณ์ ๋ช
ํ์ฑ๊ณผ ์ ์ฐ์ฑ์ ๋์ฌ์ค๋ค.\n์์คํ
์ ์ด๋ค ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ๊ฐ์ฒด๋ค ์ฌ์ด์์ ์ด๋ค์ง๋ ์ํธ์์ฉ์ ํ๋ ฅ์ด๋ผ ํ๋ค.\n๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋จ์ ์์ฑํ ๋๋ ํ๋ ฅ์ ๊ด์ ์์ ์ด๋ค ๊ฐ์ฒด๊ฐ ํ์ํ์ง๋ฅผ ๊ฒฐ์ ํ๊ณ ๊ฐ์ฒด๋ค์ ๊ณตํต ์ํ์ ํ์๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ํด๋์ค๋ฅผ ์์ฑํ๋ค.\nํ๋ ฅ์ ๊ดํ ์งง์ ์ด์ผ๊ธฐ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ํธ์์ฉํ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋ฉ์ธ์ง๋ฅผ ์ ์กํ๋ ๊ฒ๋ฟ์ด๋ค.\n๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ์์ฒญ์ด ๋์ฐฉํ ๋ ํด๋น ๊ฐ์ฒด๊ฐ ๋ฉ์ธ์ง๋ฅผ ์์ ํ๋ค๊ณ ํ๋ค.\n๋ฉ์ธ์ง๋ฅผ ์์ ํ ๊ฐ์ฒด๋ ์ค์ค๋ก ๊ฒฐ์ ์ ๋ฐ๋ผ ์์จ์ ์ผ๋ก ๋ฉ์ธ์ง๋ฅผ ์ฒ๋ฆฌํ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋ฉฐ ์ด ๋ฉ์ธ์ง ์ฒ๋ฆฌ๋ฅผ ์ํ ์์ ๋ง์ ๋ฐฉ๋ฒ์ ๋ฉ์๋๋ผ๊ณ ํ๋ค.\n๋ฉ์ธ์ง์ ๋ฉ์๋๋ฅผ ๊ตฌ๋ถํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํ๋ฉฐ ๊ฐ์ฒด์งํฅ ํจ๋ฌ๋ค์์ด ์ ์ฐํ๊ณ , ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ, ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ค๊ณ๋ฅผ ๋ณ๋๋ค๋ ๋ช
์ฑ์ ์ป๊ฒ ๋ ๋ฐฐ๊ฒฝ์๋ ๋ฉ์์ง์ ๋ฉ์๋๋ฅผ ๋ช
ํํ๊ฒ ๊ตฌ๋ถํ ๊ฒ๋ ๋จ๋จํ ํ๋ชซํ๋ค.\n์ด ๋ ๊ฐ์ง๋ฅผ ๊ตฌ๋ถํ๋ ๊ฒ์์ ๋คํ์ฑ์ ๊ฐ๋
์ด ์ถ๋ฐํ๋ค.\nํ๋ ฅ ์์ํ๊ธฐ ๊ฐ์ฒด์งํฅ์์ ์ค์ํ๋ค๊ณ ์ฌ๊ฒจ์ง๋ ๋ ๊ฐ์ง ๊ฐ๋
์ด ์๋ค.\n ์์(inheritance) ๋คํ์ฑ ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ธฐ๋ฐ์๋ ์ถ์ํ(abstraction)๋ผ๋ ์๋ฆฌ๊ฐ ์จ๊ฒจ์ ธ ์๋ค.\n..........................\n๋์์ธ ํจํด TEMPLATE METHOD PATTERN[GOF94]\n๋์์ธํจํด - ํ
ํ๋ฆฟ ๋ฉ์๋ ํจํด\nDesign Patterns - Template Pattern\n์ค๋ฒ๋ผ์ด๋ฉ๊ณผ ์ค๋ฒ๋ก๋ฉ ์ค๋ฒ๋ผ์ด๋ฉ(overriding)\n๋ถ๋ชจ ํด๋์ค์ ์ ์๋ ๊ฐ์ ์ด๋ฆ, ๊ฐ์ ํ๋ผ๋ฏธํฐ ๋ชฉ๋ก์ ๊ฐ์ง ๋ฉ์๋๋ฅผ ์์ ํด๋์ค์์ ์ฌ์ ์ํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.\n์์ ํด๋์ค์ ๋ฉ์๋๋ ์ค๋ฒ๋ผ์ด๋ฉํ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ๊ฐ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ธ๋ถ์์๋ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๊ฐ ๋ณด์ด์ง ์๋๋ค.\n์ค๋ฒ๋ก๋ฉ(overloading)\n๋ฉ์๋์ ์ด๋ฆ์ ๊ฐ์ง๋ง ์ ๊ณต๋๋ ํ๋ผ๋ฏธํฐ ๋ชฉ๋ก์ด ๋ค๋ฅด๋ค.\n์ค๋ฒ๋ก๋ฉํ ๋ฉ์๋๋ ์๋์ ๋ฉ์๋๋ฅผ ๊ฐ๋ฆฌ์ง ์๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ์๋๋ค์ ๊ณต์กดํ ์ ์๋ค.\n์ค๋ฒ๋ผ์ด๋ฉ์ ์์ \npublic class Money { public Money plus(Money amount){ return new Money(this.amount.add(amount.amount)); } public Money plus(long amount){ return new Money(this.amount.add(BigDecimal.valueOf(amount))); } } plus ๋ฉ์๋๋ ์ด๋ฆ์ ๊ฐ์ง๋ง ํ๋ผ๋ฏธํฐ๊ฐ ๋ค๋ฅด๋ฉฐ ์ด ๊ฒฝ์ฐ ๋ ๋ฉ์๋๋ ๊ณต์กดํ๋ฉฐ ์ธ๋ถ์์๋ ๋ ๋ค ํธ์ถํ ์ ์๋ค.\n์ปดํ์ผ ์๊ฐ ์์กด์ฑ๊ณผ ์คํ ์๊ฐ ์์กด์ฑ ์ด๋ค ํด๋์ค๊ฐ ๋ค๋ฅธ ํด๋์ค์ ์ ๊ทผํ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ง๊ฑฐ๋ ํด๋น ํด๋์ค์ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฒฝ์ฐ ๋ ํด๋์ค ์ฌ์ด์ ์์กด์ฑ์ด ์กด์ฌํ๋ค๊ณ ๋งํ๋ค.\n์ฝ๋์ ์์กด์ฑ๊ณผ ์คํ ์์ ์ ์์กด์ฑ์ด ์๋ก ๋ค๋ฅผ ์ ์๋ค. ์๋ก ๋ค๋ฅผ ์ ์๋ค๋ ๊ฒ์ ํด๋์ค ์ฌ์ด์ ์์กด์ฑ๊ณผ ๊ฐ์ฒด ์ฌ์ด์ ์์กด์ฑ์ด ๋์ผํ์ง ์์ ์ ์๋ค๋ ๊ฒ์ด๋ค.\n์ฝ๋์ ์์กด์ฑ๊ณผ ์คํ ์์ ์ ์์กด์ฑ์ด ๋ค๋ฅด๋ฉด ๋ค๋ฅผ์๋ก ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ค์์ง๋ค.\nํ์ง๋ง ์ฝ๋์ ์์กด์ฑ๊ณผ ์คํ ์์ ์ ์์กด์ฑ์ด ๋ค๋ฅด๋ฉด ๋ค๋ฅผ์๋ก ์ฝ๋๋ ๋ ์ ์ฐํด์ง๊ณ ํ์ฅ ๊ฐ๋ฅํด์ง๋ค.\n์ค๊ณ๊ฐ ์ ์ฐํด์ง์๋ก ์ฝ๋๋ฅผ ์ดํดํ๊ณ ๋๋ฒ๊น
ํ๊ธฐ๋ ์ ์ ์ด๋ ค์์ง๋ค.\n์ ์ฐ์ฑ์ ์ต์ ํ๋ฉด ์ฝ๋๋ฅผ ์ดํดํ๊ณ ๋๋ฒ๊น
ํ๋ ๊ฒ์ ์ฌ์์ง ์ ์์ง๋ง ์ฌ์ฌ์ฉ ์ฑ๊ณผ ํ์ฅ ๊ฐ๋ฅ์ฑ์ ๋ฎ์์ง๋ค.\n๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ํญ์ ์ ์ฐ์ฑ๊ณผ ๊ฐ๋
์ฑ ์ฌ์ด์์ ๊ณ ๋ฏผํด์ผ ํ ํ์๊ฐ ์๋ค.\n์ฐจ์ด์ ์ํ ํ๋ก๊ทธ๋๋ฐ ์์์ ๊ฐ์ฒด์งํฅ์์ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ด๋ค.\n์์์ ๊ธฐ์กด ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด ํด๋์ค๋ฅผ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์ถ๊ฐํ ์ ์๋ ๊ฐํธํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.\n๋ํ ์์์ ์ด์ฉํ๋ฉด ๋ถ๋ชจ ํด๋์ค์ ๊ตฌํ์ ๊ณต์ ํ๋ฉด์๋ ํ๋์ด ๋ค๋ฅธ ์์ ํด๋์ค๋ฅผ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์๋ค.\n์ด๋ ๊ฒ ๋ถ๋ชจ ํด๋์ค์ ๋ค๋ฅธ ๋ถ๋ถ๋ง์ ์ถ๊ฐํด์ ์๋ก์ด ํด๋์ค๋ฅผ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ฐจ์ด์ ์ํ ํ๋ก๊ทธ๋๋ฐ(programming by difference)์ด๋ผ๊ณ ํ๋ค\n์์๊ณผ ์ธํฐํ์ด์ค ์์์ด ๊ฐ์น ์๋ ์ด์ ๋ ๋ถ๋ชจ ํด๋์ค๊ฐ ์ ๊ณตํ๋ ๋ชจ๋ ์ธํฐํ์ด์ค๋ฅผ ์์ ํด๋์ค๊ฐ ๋ฌผ๋ ค๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.\n๋๋ถ๋ถ ์ฌ๋๋ค์ ์์์ ๋ชฉ์ ์ด ๋ฉ์๋๋ ์ธ์คํด์ค ๋ณ์๋ฅผ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด๋ผ ์๊ฐํ์ง๋ง ์ธํฐํ์ด์ค๋ ๊ฐ์ฒด๊ฐ ์ดํดํ ์ ์๋ ๋ฉ์ธ์ง์ ๋ชฉ๋ก์ ์ ์ํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํด์ผํ๋ค.\n์์ ํด๋์ค๋ ์์์ ํตํด ๋ถ๋ชจ ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ๋ฌผ๋ ค๋ฐ๊ธฐ ๋๋ฌธ์ ๋ถ๋ชจ ํด๋์ค ๋์ ์ฌ์ฉ๋ ์ ์๋ค.\n์ปดํ์ผ๋ฌ๋ ์ฝ๋ ์์์ ๋ถ๋ชจ ํด๋์ค๊ฐ ๋์ค๋ ๋ชจ๋ ์ฅ์์์ ์์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํ์ฉํ๋ค.\n์ด์ฒ๋ผ ์์ ํด๋์ค๊ฐ ๋ถ๋ชจ ํด๋์ค๋ฅผ ๋์ ํ๋ ๊ฒ์ ์
์บ์คํ
(upcasting)์ด๋ผ ๋ถ๋ฅธ๋ค.\nupcasting-downcasting\n๋คํ์ฑ ๋์ผํ ๋ฉ์์ง๋ฅผ ์ ์กํด๋ ์ค์ ๋ก ์ด๋ค ๋ฉ์๋๊ฐ ์คํ๋ ๊ฒ์ธ์ง๋ ๋ฉ์์ง๋ฅผ ์์ ํ๋ ๊ฐ์ฒด์ ํด๋์ค๊ฐ ๋ฌด์์ด๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.\n์ด๋ฅผ ๋คํ์ฑ์ด๋ผ๊ณ ํ๋ค.\n๋คํ์ฑ์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋จ์ ์ปดํ์ผ ์๊ฐ ์์กด์ฑ๊ณผ ์คํ ์๊ฐ ์์กด์ฑ์ด ๋ค๋ฅผ ์ ์๋ค๋ ์ฌ์ค์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ ๋์ผํ ๋ฉ์์ง๋ฅผ ์์ ํ์ ๋ ๊ฐ์ฒด์ ํ์
์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์๋ตํ ์ ์๋ ๋ฅ๋ ฅ์ ์๋ฏธํ๋ค.\n๋ฐ๋ผ์ ๋คํ์ ์ธ ํ๋ ฅ์ ์ฐธ์ฌํ๋ ๊ฐ์ฒด๋ค์ ๋ชจ๋ ๊ฐ์ ๋ฉ์์ง๋ฅผ ์ดํดํ ์ ์์ด์ผ ํ๋ค.\n์ด ๋ง์ ์ธํฐํ์ด์ค๊ฐ ๋์ผํด์ผ ํ๋ค๋ ๊ฒ์ด๊ณ ์์ ํด๋์ค๊ฐ ๋คํ์ ์ธ ํ๋ ฅ์ ์ฐธ์ฌํ ์ ์๋ ์ด์ ๋ ์ด๋ค์ด ๋ถ๋ชจ ํด๋์ค๋ก๋ถํฐ ๋์ผํ ์ธํฐํ์ด์ค๋ฅผ ๋ฌผ๋ ค๋ฐ์๊ธฐ ๋๋ฌธ์ด๋ค.\n์ด ์์ ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ํต์ผํ๊ธฐ ์ํด ์ฌ์ฉํ ๊ตฌํ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก ์์์ด๋ค.\n๋คํ์ฑ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋งค์ฐ ๋ค์ํ์ง๋ง ๋ฉ์์ง์ ์๋ตํ๊ธฐ ์ํด ์คํ๋ ๋ฉ์๋๋ฅผ ์ปดํ์ผ ์์ ์ด ์๋ ์คํ ์์ ์ ๊ฒฐํ๋ค๋ ๊ณตํต์ ์ด ์๋ค.\n๋ฉ์์ง์ ๋ฉ์๋๋ฅผ ์คํ ์์ ์ ๋ฐ์ธ๋ฉํ๋ค๋ ๊ฒ์ด๋ค.\n์ด๋ฅผ ์ง์ฐ ๋ฐ์ธ๋ฉ(lazy binding) ๋๋ ๋์ ๋ฐ์ธ๋ฉ(dynamic binding)์ด๋ผ๊ณ ํ๋ค.\n๊ทธ์ ๋ฐํด ์ ํต์ ์ธ ํจ์ ํธ์ถ์ฒ๋ผ ์ปดํ์ผ ์์ ์ ์คํ๋ ํจ์๋ ํ๋ก์์ ๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ ์ด๊ธฐ ๋ฐ์ธ๋ฉ(early binding) ๋๋ ์ ์ ๋ฐ์ธ๋ฉ(static binding)์ด๋ผ๊ณ ํ๋ค.\n๊ฐ์ฒด์งํฅ์ด ์ปดํ์ผ ์์ ์ ์์กด์ฑ๊ณผ ์คํ ์์ ์ ์์กด์ฑ์ ๋ถ๋ฆฌํ๊ณ ํ๋์ ๋ฉ์์ง๋ฅผ ์ ํ์ ์ผ๋ก ์๋ก ๋ค๋ฅธ ๋ฉ์๋์ ์ฐ๊ฒฐํ ์ ์๋ ์ด์ ๊ฐ ๋ฐ๋ก ์ง์ฐ ๋ฐ์ธ๋ฉ์ด๋ผ๋ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.\nํ์ง๋ง ํด๋์ค๋ฅผ ์์๋ฐ๋ ๊ฒ ๋ง์ด ๋คํ์ฑ์ ๊ตฌํํ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์๋๋ค.\n์ธํฐํ์ด์ค์ ๋คํ์ฑ C#๊ณผ ์๋ฐ์์๋ ์ธํฐํ์ด์ค๋ผ๋ ํ๋ก๊ทธ๋๋ฐ ์์๋ฅผ ์ ๊ณตํ๋ค.\n์๋ฐ์ ์ธํฐํ์ด์ค๋ ๋ง ๊ทธ๋๋ก ๊ตฌํ์ ๋ํ ๊ณ ๋ ค ์์ด ๋คํ์ ์ธ ํ๋ ฅ์ ์ฐธ์ฌํ๋ ํด๋์ค๋ค์ด ๊ณต์ ๊ฐ๋ฅํ ์ธ๋ถ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ ๊ฒ์ด๋ค.\n๋์ผํ ์ธํฐํ์ด์ค๋ฅผ ๊ณต์ ํ๋ ํด๋์ค๋ค์ ๋คํ์ ์ธ ํ๋ ฅ์ ์ฐธ์ฌํ ์ ์๋ค.\n์ด ๊ฒฝ์ฐ์๋ ์
์บ์คํ
์ด ์ ์ฉ๋๋ฉฐ ํ๋ ฅ์ ๋คํ์ ์ด๋ค.\n์ถ์ํ์ ํ ์ถ์ํ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋๊ฐ์ง์ ์ฅ์ ์ ๋ณด์ฌ์ค๋ค.\n ์ถ์ํ์ ๊ณ์ธต๋ง ๋ฐ๋ก ๋ผ์ด ๋๊ณ ์ดํด๋ณด๋ฉด ์๊ตฌ์ฌํญ์ ์ ์ฑ
์ ๋์ ์์ค์์ ์์ ํ ์ ์๋ค. ์ถ์ํ๋ฅผ ์ด์ฉํ๋ฉด ์ค๊ณ๊ฐ ์ข ๋ ์ ์ฐํด์ง๋ค. ์ถ์ํ๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ๋ถ์ ์ธ ๋ด์ฉ์ ๋ฌด์ํ ์ฑ ์์ ์ ์ฑ
์ ์ฝ๊ณ ๊ฐ๋จํ๊ฒ ํํํ ์ ์๋ค.\n์ถ์ํ์ ์ด๋ฐ ํน์ง์ ์์ ๊ฐ๋
๋ง์ผ๋ก๋ ๋๋ฉ์ธ์ ์ค์ํ ๊ฐ๋
์ ์ค๋ช
ํ ์ ์๊ฒ ํ๋ค.\n์ถ์ํ๋ฅผ ์ด์ฉํ ์ค๊ณ๋ ํ์์ ๋ฐ๋ผ ํํ์ ์์ค์ ์กฐ์ ํ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค.\n์ถ์ํ๋ฅผ ์ด์ฉํด ์์ ์ ์ฑ
์ ๊ธฐ์ ํ๋ค๋ ๊ฒ์ ๊ธฐ๋ณธ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
์ ํ๋ ฅ ํ๋ฆ์ ๊ธฐ์ ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.\n์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ค๊ณ์ ๊ธฐ๋ณธ์ ์ด๋ฃจ๋ ๋์์ธ ํจํด์ด๋ ํ๋ ์์ํฌ ๋ชจ๋ ์ถ์ํ๋ฅผ ์ด์ฉํด ์์ ์ ์ฑ
์ ์ ์ํ๋ ๊ฐ์ฒด์งํฅ์ ๋ฉ์ปค๋์ฆ์ ํ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.\n์ถ์ํ๋ฅผ ์ด์ฉํด ์์ ์ ์ฑ
์ ํํํ๋ฉด ๊ธฐ์กด ๊ตฌ์กฐ๋ฅผ ์์ ํ์ง ์๊ณ ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ถ๊ฐํ๊ณ ํ์ฅํ ์ ์๋ค.(์ค๊ณ๋ฅผ ์ ์ฐํ๊ฒ ๋ง๋ค์ ์๋ค)\n์ ์ฐํ ์ค๊ณ ์ฑ
์์ ์์น๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ์กฐ๊ฑด๋ฌผ์ ์ฌ์ฉํ๋ ๊ฒ์ ํ๋ ฅ์ ์ค๊ณ ์ธก๋ฉด์์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ข์ง ์์ ์ ํ์ด๋ค.\n์์ธ ์ผ์ด์ค๋ฅผ ์ต์ํํ๊ณ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ํํด์ผ ๋๋ค.\n์ถ์ํ๋ฅผ ์ค์ฌ์ผ๋ก ์ฝ๋์ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๋ฉด ์ ์ฐํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ค๊ณ๋ฅผ ๋ง๋ค ์ ์๋ค.\n์ถ์ํ๊ฐ ์ ์ฐํ ์ค๊ณ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ด์ ๋ ์ค๊ณ๊ฐ ๊ตฌ์ฒด์ ์ธ ์ํฉ์ ๊ฒฐํฉ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ๋๋ฌธ์ด๋ค.\n์ ์ฐ์ฑ์ด ํ์ํ ๊ณณ์ ์ถ์ํ๋ฅผ ์ฌ์ฉํ์.\n์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค ํธ๋ ์ด๋์คํ ๊ตฌํ๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ๋ค์ด ํธ๋ ์ด๋์คํ์ ๋์์ด ๋ ์ ์๋ค๋ ์ฌ์ค์ด๋ค.\n์ฐ๋ฆฌ๊ฐ ์์ฑํ๋ ๋ชจ๋ ์ฝ๋์๋ ํฉ๋นํ ์ด์ ๊ฐ ์์ด์ผ ํ๋ค.\n์์ฃผ ์ฌ์ํ ๊ฒฐ์ ์ด๋๋ผ๋ ํธ๋ ์ด๋์คํ๋ฅผ ํตํด ์ป์ด์ง ๊ฒฐ๋ก ๊ณผ ๊ทธ๋ ์ง ์์ ๊ฒฐ๋ก ์ฌ์ด์ ์ฐจ์ด๋ ํฌ๋ค.\n๊ณ ๋ฏผํ๊ณ ํธ๋ ์ด๋์คํํ์.\n์ฝ๋ ์ฌ์ฌ์ฉ ์์์ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ด๋ค ํ์ง๋ง ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํด์ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ธ ๊ฒ์ ์๋๋ค.\n์์๋ณด๋ค๋ ํฉ์ฑ(composition)์ด ๋ ์ข์ ๋ฐฉ๋ฒ์ด ๋ ์ ์๋ค.\nํฉ์ฑ์ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์์ ์ ์ธ์คํด์ค ๋ณ์๋ก ํฌํจํด์ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋งํ๋ค.\n์์ ์์์ ๊ฐ์ฒด์งํฅ์์ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด ๋๋ฆฌ ์ฌ์ฉ๋๋ ๊ธฐ๋ฒ์ด๋ค.\nํ์ง๋ง ๋ ๊ฐ์ง ๊ด์ ์์ ์ค๊ณ์ ์ ์ข์ ์ํฅ์ ๋ฏธ์น๋ค.\n ์บก์ํ๋ฅผ ์๋ฐํ๋ค. ์ค๊ณ๋ฅผ ์ ์ฐํ์ง ๋ชปํ๊ฒ ๋ง๋ ๋ค. ์์์ ๊ฐ์ฅ ํฐ ๋ฌธ์ ์ ์ ์บก์ํ๋ฅผ ์๋ฐํ๋ ๊ฒ์ด๊ณ ์์์ ์ด์ฉํ๊ธฐ ์ํด์๋ ๋ถ๋ชจ ํด๋์ค์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ ์๊ณ ์์ด์ผ ํ๋ค.\n๋ถ๋ชจ ํด๋์ค์ ๊ตฌํ์ด ์์ ํด๋์ค์๊ฒ ๋
ธ์ถ๋๊ธฐ ๋๋ฌธ์ ์บก์ํ๊ฐ ์ฝํ๋๋ค.\n๊ทธ๋ ๊ฒ ๋๋ฉด ์์ ํด๋์ค๊ฐ ๋ถ๋ชจ ํด๋์ค์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋๋๋ก ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๋ถ๋ชจ ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ ๋ ์์ ํด๋์ค๋ ํจ๊ป ๋ณ๊ฒฝ๋ ํ๋ฅ ์ ๋์ธ๋ค.\n๊ฒฐ๊ณผ์ ์ผ๋ก ์์์ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ ์ฝ๋๋ ๋ณ๊ฒฝํ๊ธฐ๋ ์ด๋ ค์์ง๊ฒ ๋๋ค.\n์์์ ๋ถ๋ชจ ํด๋์ค์ ์์ ํด๋์ค ์ฌ์ด์ ๊ด๊ณ๋ฅผ ์ปดํ์ผ ์์ ์ ๊ฒฐ์ ํ๋ค. ๋ฐ๋ผ์ ์คํ ์์ ์ ๊ฐ์ฒด์ ์ข
๋ฅ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค.\n์์๋ณด๋ค ์ธ์คํด์ค ๋ณ์๋ก ๊ด๊ณ๋ฅผ ์ฐ๊ฒฐํ ์ค๊ณ๊ฐ ๋ ์ ์ฐํ๋ค.\nํฉ์ฑ ์ธํฐํ์ด์ค์ ์ ์๋ ๋ฉ์์ง๋ฅผ ํตํด์๋ง ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ํฉ์ฑ์ด๋ผ๊ณ ํ๋ค.\nํฉ์ฑ์ ์ฌ์ฉํ๋ฉด ์์์ด ๊ฐ์ง๋ ๋ ๊ฐ์ง ๋ฌธ์ ์ ์ ๋ชจ๋ ํด๊ฒฐํ ์ ์๋ค.\n์ธํฐํ์ด์ค์ ์ ์๋ ๋ฉ์์ง๋ฅผ ํตํด์๋ง ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ ํจ๊ณผ์ ์ผ๋ก ์บก์ํํ ์ ์๋ค.\n๋ํ ์์กดํ๋ ์ธ์คํด์ค๋ฅผ ๊ต์ฒดํ๋ ๊ฒ์ด ๋น๊ต์ ์ฝ๊ธฐ ๋๋ฌธ์ ์ค๊ณ๋ฅผ ์ ์ฐํ๊ฒ ๋ง๋ ๋ค.\n์์์ ํด๋์ค๋ฅผ ํตํด ๊ฐํ๊ฒ ๊ฒฐํฉ๋๋๋ฐ ๋นํด ํฉ์ฑ์ ๋ฉ์์ง๋ฅผ ํตํด ๋์จํ๊ฒ ๊ฒฐํฉ๋๋ค.\n๋ฐ๋ผ์ ์ฝ๋ ์ฌ์ฌ์ฉ์ ์ํด์๋ ์์๋ณด๋ค๋ ํฉ์ฑ์ ์ ํธํ๋ ๊ฒ์ด ๋ ์ข์ ๋ฐฉ๋ฒ์ด๋ค.\n๊ทธ๋ ๋ค๊ณ ํด์ ์์์ ์ ๋ ์ฌ์ฉํ์ง ๋ง๋ผ๋ ๊ฒ์ ์๋๊ณ ์์๊ณผ ํฉ์ฑ์ ํจ๊ป ์ฌ์ฉํด์ผ ํ๋ค.\n","permalink":"https://www.springboot.kr/posts/object/chapter2/","summary":"Chapter 2. ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ ๋ชฉ์ฒ๋ผ ์ฑํฐ 2์์๋ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋ํด ์ด์ผ๊ธฐํ๋ค\nํ๋ ฅ, ๊ฐ์ฒด, ํด๋์ค ๊ฐ์ฒด์งํฅ์ด๋ ๋ง ๊ทธ๋๋ก ๊ฐ์ฒด๋ฅผ ์งํฅํ๋ ๊ฒ์ด๋ค.\n๊ทธ๋ฆฌ๊ณ ๊ฐ์ฒด์งํฅ์ ์ต์ํ ์ฌ๋์ด๋ผ๋ฉด ํด๋์ค์ ๋ํด ๊ณ ๋ฏผํ ๊ฒ์ด๊ณ ์ด๋ค ์์ฑ๊ณผ ๋ฉ์๋๊ฐ ๋ค์ด๊ฐ ๊ฒ์ธ๊ฐ๋ฅผ ๊ณ ๋ฏผํ ๊ฒ์ด๋ค.\nํ์ง๋ง ์ด๊ฑด ๊ฐ์ฒด์งํฅ์ ๋ณธ์ง๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋ค.\n์์ ๋งํ ๊ฒ์ฒ๋ผ ๊ฐ์ฒด์งํฅ์ ๊ฐ์ฒด๋ฅผ ์งํฅํ๋ ๊ฒ์ด๋ค.\n์ง์ ํ ๊ฐ์ฒด์งํฅ ํจ๋ฌ๋ค์์ผ๋ก์ ์ ํ์ ํด๋์ค๊ฐ ์๋ ๊ฐ์ฒด์ ์ด์ ์ ๋ง์ถฐ์ผ ์ป์ ์ ์๋ค.\n๊ทธ๋ฌ๊ธฐ ์ํด์๋ ์ฐ๋ฆฌ๋ ๋ ๊ฐ์ง์ ์ง์คํด์ผ ํ๋ค.\n ์ด๋ค ํด๋์ค๊ฐ ํ์ํ์ง ๊ณ ๋ฏผํ๊ธฐ ์ ์ ์ด๋ค ๊ฐ์ฒด๋ค์ด ํ์ํ์ง ๊ณ ๋ฏผํ๊ธฐ","title":"[์ค๋ธ์ ํธ OBJECTS] Chapter 2. ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ"},{"content":"Chapter 1. ๊ฐ์ฒด, ์ค๊ณ ์ฑํฐ์ ์ด๋ฐ์ ์ํํธ์จ์ด ๋ชจ๋์ ๋ํด ์ด์ผ๊ธฐํ๋ค.\n ์คํ ์ค์ ์ ๋๋ก ๋์ํ๋ ๊ฒ ๋ณ๊ฒฝ์ ์ํด ์กด์ฌํ๋ ๊ฒ ์ฝ๋๋ฅผ ์ฝ๋ ์ฌ๋๊ณผ ์์ฌ์ํตํ๋ ๊ฒ ๊ทธ๋ฆฌ๊ณ ์์ ์๋ ์ฃผ์ ๋ฅผ ๊ฐ์ง๊ณ ์์ ๋ฅผ ๋ค์ด ์ด์ผ๊ธฐํ๋ค.\n๋ณ๊ฒฝ์ ์ทจ์ฝํ ์ฝ๋ ๊ฐ์ฒด ์ฌ์ด์ ์์กด์ฑ์ ๊ด๋ จ๋ ๋ฌธ์ , ๋ฌผ๋ก ์์กด์ฑ์ ์์ ํ ์์ ๋ ๊ฒ์ด ์๋๋ผ ์์กด์ฑ์ ๋ฎ์ถ๋ฉฐ ํ๋ ฅํ๋ ๊ฐ์ฒด๋ค์ ๊ณต๋์ฒด๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ข๋ค.\n์ด๋ ๊ฒ ๊ฐ์ฒด๋ค ๊ฐ์ ์์กด์ฑ์ด ๊ณผํ ๊ฒฝ์ฐ ๊ฒฐํฉ๋๊ฐ ๋๋ค๊ณ ํ๋ค.\n์ด ๊ฒฐํฉ๋๊ฐ ๋์ ๊ฒฝ์ฐ ์ฝ๋ ๋ณ๊ฒฝ์ ์์ด ์ด๋ ค์์ ๊ฒช์ ์๊ฐ ์๋ค.\n๊ทธ๋ฌ๋ฏ๋ก ๊ฐ์ฒด ์ฌ์ด์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ ๊ฒ์ด ์ข๋ค.\n๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ค๊ณ์ ๋ชฉํ๋ ๊ฐ์ฒด ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฐ ์ฝ๋ ์์ ์ ์์ด ์ฉ์ดํ ์ค๊ณ๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.\n์์กด์ฑ์ด ๋์ ์ฝ๋๋ ์ฝ๋๋ฅผ ์์ ํ๋ ๋ฐ ์์ด ์ด๋ ค์์ ๊ฒช์ ์ ์๋ค.\n๊ทธ๋ผ ์ด๋ป๊ฒ ํด์ผ ํ ๊น? ๊ฐ์ฒด ํ๋ํ๋๋ฅผ ๋ ์์ ๋กญ๊ฒ ํ๋ํ ์ ์๋๋ก ๋ง๋๋ ๊ฒ์ด๋ค.\n์์จ์ฑ ๊ฐ์ฒด ๋ด๋ถ์ ์บก์ํ๋ฅผ ์ฌ์ฉํด์์จ์ฑ์ ๋ถ์ฌํด ์ฃผ๋ ๊ฒ์ด๋ค. (์บก์ํ๋ฅผ ํตํด ๊ฐ์ฒด ๋ด๋ถ ์ ๊ทผ์ ์ ํํ๋ค๋ฉด ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ฉฐ ์ค๊ณ๋ฅผ ์ข ๋ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์์.)\n์ด๋ ๊ฒ ๋๋ฉด ์ข ๋ ์์ ํ๊ธฐ ์ฌ์ด ๊ฐ์ฒด๊ฐ ๋ ์ ์๋ค.\n๊ฐ์ฒด์ ์์จ์ฑ์ ๋ถ์ฌํ๊ฒ ๋๋ฉด ์์กด๋๊ฐ ๋ฎ์์ง๊ฒ ๋จ์ผ๋ก ๊ฐ์ฒด ์ค์ค๋ก๊ฐ ๋ฌธ์ ์ ์ฑ
์์ ์ง ์ ์๊ฒ ๋๋ค. (์ธ๋ถ๋ก ๋
ธ์ถ๋ ๊ธฐ๋ฅ์ด ์๋๊ธฐ์ ๋ด๋ถ์์ ํด๊ฒฐํ ์ ์์ด ์ฝ๋ ๋ณ๊ฒฝ์ ์์ด ์ ๋ฆฌํ๋ค.)\n์บก์ํ์ ์์ง๋ ๊ฐ์ฒด ๋ด๋ถ์ ์ํ๋ฅผ ์บก์ํํ๊ณ ๋ฉ์์ง๋ฅผ ํตํด ์ํธ์์ฉํ๋๋ก ๋ง๋ค๊ฒ ๋๋ฉด ๊ฐ์ฒด ๊ฐ์ ์ํ๋ ๊ฒฐ๊ณผ ๋ง์ ๋ฐํํ ๊ฒ์ ์๊ณ ์๋ค.\n์ด๋ ๊ฒ ๊ฐ์ฒด ๊ฐ์ ์ฐ๊ด๋ ์์
๋ง์ ์ํํ๊ณ ์ฐ๊ด์ด ์๋ ์์
์ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ์์ํ๋ ๊ฐ์ฒด๋ฅผ ์์ง๋๊ฐ ๋๋ค ํ๋ค.\n์์ ์ ๋ฐ์ดํฐ๋ฅผ ์ค์ค๋ก ์ฒ๋ฆฌํ๋ ์์จ์ ์ธ ๊ฐ์ฒด๋ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์์ง๋๋ฅผ ๋์ธ๋ค.\nํ์ง๋ง ์์ง๋๋ฅผ ๋์ด๊ธฐ ์ํด์๋ ์ค์ค๋ก ์์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฑ
์์ ธ์ผ ํ๊ธฐ ๋๋ฌธ์ ์์ ์ ๋ฐ์ดํฐ๋ ์๊ธฐ ์ค์ค๋ก ์ฒ๋ฆฌํ ์ค ์์์ผ ํ๋ค.\n์ด๋ ๊ฒ ์ธ๋ถ์ ๊ฐ์ญ์ ๋ฐฐ์ ํ๊ณ ๋ฉ์์ง๋ฅผ ํตํด ํ๋ ฅํ๋ ์์จ์ ์ธ ๊ฐ์ฒด๋ค์ ๊ณต๋์ฒด๋ฅผ ๋ง๋๋ ๊ฒ์ด ํ๋ฅญํ ๊ฐ์ฒด์งํฅ ์ค๊ณ๋ฅผ ์ป์ ์ ์๋ ๊ฒ์ด๋ค.\n์ ์ฐจ ์งํฅ๊ณผ ๊ฐ์ฒด์งํฅ ํ๋ก์ธ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ ๋ชจ๋์ ์์น์ํค๋ ๋ฐฉ์์ ์ ์ฐจ์ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๊ณ ํ๋ค.\n์ ์ฐจ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์๋ ๊ฐ์ฒด๋ค์ด ์๋์ ์ด ์กด์ฌ๋ค์ด๋ค.\n๋๋ฌธ์ ์ ์ฐจ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ก์ธ์ค๊ฐ ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ์ ์์กดํด์ผ ํ๋ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ์ ๋๋ฌธ์ ์ฝ๋์ ๋ณ๊ฒฝ์ ์ทจ์ฝํ ์๋ฐ์ ์๋ค.\n์ด๋ฌํ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์์ ์ ๋ฐ์ดํฐ๋ ์๊ธฐ ์ค์ค๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด ํจ์จ์ ์ผ ์ ์๋ค.\n๊ทธ๋ฌ๊ธฐ ์ํด์๋ ๋ฐ์ดํฐ์ ํ๋ก์ธ์ค๊ฐ ๋์ผํ ๋ชจ๋ ๋ด๋ถ์ ์์นํ๋๋ก ํ๊ณ ์บก์ํ๋ฅผ ์ด์ฉํ ์์กด์ฑ์ ์ ์ ํ ๊ด๋ฆฌํด ๊ฐ์ฒด ์ฌ์ด์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ ๊ฒ์ด๋ค.\n์ฑ
์์ ์ด๋ ์ ์ฐจ ์งํฅ๊ณผ ๊ฐ์ฒด์งํฅ์ ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด๋ฅผ ๋ง๋๋ ๊ฒ์ ์ฑ
์์ ์ด๋์ด๋ค. (์ฌ๊ธฐ์ ์ฑ
์์ ๊ธฐ๋ฅ์ ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด์งํฅ ์ธ๊ณ์ ์ฉ์ด๋ก ์๊ฐํ๋ผ ํ๋ค.)\n๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๋์ ๊ฐ์ฒด์ ๊ณผ๋ถํ ์ฑ
์์ ๋ถ์ฐ์์ผ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์ฝ๋ ๋ณ๊ฒฝ์ ์ฝ๊ฒ ๋์ํ ์ ์๋ค.\n๊ฐ์ฒด์งํฅ ์ค๊ณ์์๋ ํ๋์ ๊ฐ์ฒด๊ฐ ๊ณผ๋ถํ ์ฑ
์์ ๊ฐ์ง๊ณ ์์ง ์๊ณ ์ฑ
์์ ๋ถ์ฐ์์ผ ๊ฐ์ฒด ์ค์ค๋ก๊ฐ ์ฑ
์์ ์ง๋ค๋ ๊ฒ์ด๋ค.\n์ด๋ ๊ฒ ์ค๊ณํ๊ฒ ๋๋ฉด ๊ฐ์ฒด์งํฅ ์ ํ๋ฆฌ์ผ์ด์
์ ์ค์ค๋ก ์ฑ
์์ ์ํํ๋ ์์จ์ ์ธ ๊ฐ์ฒด๋ค์ ๊ณต๋์ฒด๋ฅผ ๊ตฌ์ฑํ๊ฒ ๋๋ค.\n๊ฐ์ฒด์งํฅ ์ค๊ณ์ ํต์ฌ์ ์ ์ ํ ๊ฐ์ฒด์ ์ ์ ํ ์ฑ
์์ ํ ๋น์ด๊ณ ์ด๋ค ์ฑ
์์ ํ ๋นํ ๊ฒ์ธ๊ฐ ๊ฐ ์ค์ํ๋ค.\n์ฌ๊ธฐ์ ์ค๊ณ๋ฅผ ์ด๋ ต๊ฒ ๋ง๋๋ ๊ฒ์ ์์กด์ฑ์ด๋ค.\n์ด๊ฒ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ถํ์ํ ์์กด์ฑ์ ์ ๊ฑฐํ๊ณ ๊ฐ์ฒด ์ฌ์ด์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ ๊ฒ์ด๋ค.\n๋ถํ์ํ ์ธ๋ถ์ฌํญ์ ๋ด๋ถ๋ก ์บก์ํํ์ฌ ๊ฐ์ฒด์ ์์จ์ฑ์ ๋์ด๋ฉฐ ์์ง๋ ๋์ ๊ฐ์ฒด๋ค์ ๊ณต๋์ฒด๋ฅผ ๋ง๋ค ์ ์๊ฒ ํ๋ค.\n๊ฑฐ๊ธฐ์ ์ต์ํ์ ์์กด์ฑ๋ง์ ๋จ๊ธฐ๋ ๊ฒ์ด ํ๋ฅญํ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ด๋ค.\n์ค๊ณ๊ฐ ์ ํ์ํ๊ฐ ์ค๊ณ์ ๊ตฌํ์ ๋จ์ดํธ๋ ค ์ด์ผ๊ธฐํ ์ ์์ผ๋ฉฐ ์ค๊ณ๋ ์ฝ๋ ์์ฑ์ ์ผ๋ถ์ด๋ฉฐ ์ฝ๋๋ฅผ ์์ฑํ์ง ์๊ณ ๊ฒ์ฆํ ์ ์๋ค.\n์ค๋ ์์ฑํด์ผ ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋์์ ๋ด์ผ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ ์ฝ๋๋ฅผ ์ง์ผ ํ๋ค.\n์ข์ ์ค๊ณ๋ ์ค๋ ์๊ตฌํ๋ ๊ธฐ๋ฅ์ ์จ์ ํ ์ํํ๋ฉด์ ๋ด์ผ์ ๋ณ๊ฒฝ์ ๋งค๋๋ฝ๊ฒ ์์ฉํ ์ ์๋ ์ค๊ณ์ด๋ค.\n์ค๊ณ๊ฐ ์ค์ํ ์ด์ ๋ ์๊ตฌ ์ฌํญ์ด ํญ์ ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ด๋ค.\n๊ฐ์ฒด์งํฅ ์ค๊ณ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์์กด์ฑ์ ํจ์จ์ ์ผ๋ก ํต์ ํ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ์๊ตฌ ์ฌํญ ๋ณ๊ฒฝ์ ์ข ๋ ์์ํ๊ฒ ๋์ํ ์ ์๊ฒ ํด์ค๋ค.\n๊ฐ์ฒด ์ญ์ ์์ ์ ๋ฐ์ดํฐ๋ฅผ ์ค์ค๋ก ์ฑ
์์ง๋ ์์จ์ ์ธ ์กด์ฌ์ด๋ฉฐ ์ฝ๋๋ฅผ ์ข ๋ ์ฝ๊ฒ ์ดํดํ ์ ์๊ฒ ํด์ค๋ค.\n๋จ์ํ ๋ฐ์ดํฐ์ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ฒด๋ผ๋ ๋ฉ์ด๋ฆฌ ์์ ๋ฃ์๋ค๊ณ ํด์ ๋ณ๊ฒฝํ๊ธฐ ์ฌ์ด ์ค๊ณ๊ฐ ์๋๋ค.\n๊ฐ์ฒด๋ค ๊ฐ์ ์ํธ์์ฉ์ ํตํด ๊ตฌํ๋๊ณ ์ด ์ํธ์์ฉ์ ๊ฐ์ฒด ์ฌ์ด์ ์ฃผ๊ณ ๋ฐ๋ ๋ฉ์์ง๋ก ํํ๋๋ค.\n๋ฉ์์ง๋ฅผ ์ ์กํ๊ธฐ ์ํด ์ด๋ฐ ์ง์์ด ๋ ๊ฐ์ฒด๋ฅผ ๊ฒฐํฉ์์ผ ์ด ๊ฒฐํฉ์ด ๊ฐ์ฒด ์ฌ์ด์ ์์กด์ฑ์ ๋ง๋ ๋ค.\nํ๋ฅญํ ๊ฐ์ฒด์งํฅ ์ค๊ณ๋ ํ๋ ฅํ๋ ๊ฐ์ฒด ์ฌ์ด์ ์์กด์ฑ์ ์ ์ ํ๊ฒ ๊ด๋ฆฌํ๋ ์ค๊ณ์ด๋ค.\n๊ฐ์ฒด ๊ฐ์ ์์กด์ฑ์ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ ํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋๋ ์ฃผ๋ฒ์ด๋ค.\n","permalink":"https://www.springboot.kr/posts/object/chapter1/","summary":"Chapter 1. ๊ฐ์ฒด, ์ค๊ณ ์ฑํฐ์ ์ด๋ฐ์ ์ํํธ์จ์ด ๋ชจ๋์ ๋ํด ์ด์ผ๊ธฐํ๋ค.\n ์คํ ์ค์ ์ ๋๋ก ๋์ํ๋ ๊ฒ ๋ณ๊ฒฝ์ ์ํด ์กด์ฌํ๋ ๊ฒ ์ฝ๋๋ฅผ ์ฝ๋ ์ฌ๋๊ณผ ์์ฌ์ํตํ๋ ๊ฒ ๊ทธ๋ฆฌ๊ณ ์์ ์๋ ์ฃผ์ ๋ฅผ ๊ฐ์ง๊ณ ์์ ๋ฅผ ๋ค์ด ์ด์ผ๊ธฐํ๋ค.\n๋ณ๊ฒฝ์ ์ทจ์ฝํ ์ฝ๋ ๊ฐ์ฒด ์ฌ์ด์ ์์กด์ฑ์ ๊ด๋ จ๋ ๋ฌธ์ , ๋ฌผ๋ก ์์กด์ฑ์ ์์ ํ ์์ ๋ ๊ฒ์ด ์๋๋ผ ์์กด์ฑ์ ๋ฎ์ถ๋ฉฐ ํ๋ ฅํ๋ ๊ฐ์ฒด๋ค์ ๊ณต๋์ฒด๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ข๋ค.\n์ด๋ ๊ฒ ๊ฐ์ฒด๋ค ๊ฐ์ ์์กด์ฑ์ด ๊ณผํ ๊ฒฝ์ฐ ๊ฒฐํฉ๋๊ฐ ๋๋ค๊ณ ํ๋ค.\n์ด ๊ฒฐํฉ๋๊ฐ ๋์ ๊ฒฝ์ฐ ์ฝ๋ ๋ณ๊ฒฝ์ ์์ด ์ด๋ ค์์ ๊ฒช์ ์๊ฐ ์๋ค.","title":"[์ค๋ธ์ ํธ OBJECTS] Chapter 1. ๊ฐ์ฒด, ์ค๊ณ"},{"content":"์นด์นด์คTV ์ฑ๋ด ๋ง๋ค๊ธฐ\n์ผ ๋
๋ ๋ ๋๊ฒ ๊ธ์ ์ฐ์ง ์์๋ค. ์ด์ ๊ฐ๋์ฉ ๋ค์ ์ ์ด๋ณด๋ ค๊ณ ํ๋๋ฐ ์์์ด ์นด์นด์คํฐ๋น ์ฑ๋ด์ด๋ค.\n์ด๋ฏธ ์๋
์ ๋ง๋ค์๋๋ฐ ์นด์นด์คTV๊ฐ ์ฃฝ์ด์ ์ฌ์ฉํ์ง ์๊ณ ์๋ค.\n์์ฒญ์๊ฐ 500๋ช
์ ๋๋๋ ๋ฐฉ์์ ํ
์คํธ๊น์ง ๋๋ธ ์ฑ๋ด์ธ๋ฐ\nํ
์คํธ๊ฐ ๋๋ ๋ ์ฆ์ ์ฌ๋๋ค์ด ๋๋ถ๋ถ ํธ์์น๋ก ์ด๋ํด ์ฌ์ฉํ์ง ์์๋ค.\n๊ถ๊ธํดํ๋ ์ฌ๋์ด ์์ ์๋ ์์ผ๋ ์ด๋ป๊ฒ ๋ง๋ค์๋์ง ๊ฐ๋ฐ๊ธฐ๋ฅผ ์ ์ด๋ณด๋๋ก ํด์ผ๊ฒ ๋ค.\n์ฐ์ ์นด์นด์คTV๋ ํธ์์น ์ฒ๋ผ API๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.\nํ์ง๋ง Web์ ์ ๊ณตํ๋ค ([?]ํํ๋ ์ด์ด๋ผ๋ ํ๋ ์ด์ด๋ฅผ ์ฌ์ฉํด ๋ณด๋์ฌ๋๋ค์ด ๋ง๋ค. ์น์ ํธ์์น์ฒ๋ผ ์ข์ง ์๊ณ ๊ธฐ๋ฅ์ด์ ์ด ์ฌ๋๋ค์ด ์์์ด๋ค.)\n๊ทธ๋์ ๋๋ ์ด Web์ ์ฌ์ฉํด ์ฑ๋ด์ ์ ์ํ๋ค.\n kakao tv : https://tv.kakao.com ์นด์นด์คํฐ๋น๋ API๋ฅผ ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๊ฐ ์ ์ ID๋ฅผ ์ง์ ๋ฑ๋กํด๋์ผ ์๋ํ ์ ์๋ค.\n๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์ ์๋ ๋งํฌ์ ๋ค์ด๊ฐ ๊ฒ์์ ํตํด ๋ฐฉ์กํ๋ ์ฌ๋์ ID ๊ฐ์ ๊ฐ์ ธ์์ผ ํ๋ค.\n๋ฐฉ์กํ๋ ์ฌ๋์ ID ๊ฐ์ ๊ฐ์ ธ์ค๋ ์ด์ ๋ ์ด ํ์ด์ง๋ฅผ ๊ณ์ ๊ฐ์ ธ์ ๋ฐฉ์ก์ ์ํ๋ฅผ ํ์ธ๋ค.\nํ์ธ๋๋ฉด ๋ฐฉ์ก์ด ์ผ์ง ๊ฑธ ์ ์ ์๊ณ ์ผ์ง๋ฉด ๋ฐฉ์ก์ ID ๊ฐ์ด ์๊ธด๋ค.\n๊ทธ๋ผ ๊ทธ ID๋ก ๋ค์ด๊ฐ ํ์ด์ง์์ ์ฑํ
์ฐฝ์ group id๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. (group id๋ฅผ ๊ฐ์ ธ์ค๋ ์ด์ ๋ ์ฑํ
์์ผ์ ์ ์ํด ์ฑํ
์ฐฝ์ ๋ด์ฉ์ ๊ฐ์ ธ์ฌ ์ ์๊ธฐ ๋๋ฌธ)\n๊ทธ๋ค์์ผ๋ก ๋ฐฉ์ก์ด ์ผ์ง๋ฉด ์
๋ ๋์์ ํตํด ๋ธ๋ผ์ฐ์ ๋ฅผ ํ๋ ๋์ฐ๊ณ ์คํํ๋ค (https://hub.docker.com/r/selenium/standalone-chrome ์ผ๋ฐ์ ์ธ ์
๋ ๋์ด ์๋ standalone ์ด๋ค.)\n๊ทธ๋ฆฌ๊ณ ์นด์นด์ค ์์ด๋ ๋น๋ฒ์ ์
๋ ฅ์ํค๋ ๋์์ ์คํํด ๊ทธ ๋ฐฉ์ ์
์ฅํ๋ค.\n๋จ, ์ฌ๊ธฐ์ ์์์ผ ํ ๊ฒ์ ์ ๊ณต๋ API๋ก ํ๋ ๊ฒ ์๋ ์น์ผ๋ก ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ฐฉ์กํ๋ ์ฌ๋๊ณผ์ ์๊ธฐ๋ฅผ ํตํด ์ฑ๋ด์ ์์ด๋์ AD(๋งค๋์ ) ๊ถํ์ ์ค์ผ ํ๋ค.\nAD์ ๊ถํ์ด ์๋ ๊ฒฝ์ฐ ์ฑํ
์ ๋ณด๋ด๋ ๋ฐ ์ ํ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. ๊ทธ๋ฆฌ๊ณ AD๋ฅผ ์ค์ผ ์ฑ๊ธ์ด๋ผ๋ ์ง ๊ฐํด๋ฅผ ์ํฌ ์ ์๋ค.\n๊ทธ๋ค์์ผ๋ก ์๋ฒ๋จ์์ ํด๋น๋ฐฉ์ ์ฑํ
๋ฐฉ์ ์์ผ์ ํตํด ๋ค์ด๊ฐ์ผ ํ๋ค.\ngo ์ธ์ด resty ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ์์ฒญ ์ฌํญ์ ์ด๋ ๋ค\nclient := resty.New() resp, err := client.R(). \t//SetHeader(\u0026#34;Content-Type\u0026#34;, \u0026#34;application/json\u0026#34;). \tSetHeaders(map[string]string{ \t\u0026#34;Content-Type\u0026#34;: \u0026#34;application/x-www-form-urlencoded\u0026#34;, \t\u0026#34;Origin\u0026#34;: \u0026#34;https://live-tv.kakao.com\u0026#34;, \t\u0026#34;Referer\u0026#34;: \u0026#34;https://live-tv.kakao.com/kakaotv/live/chat/user/\u0026#34; + LiveLinkId, // ์ ์ ๋ง๋ค ๋ฒํธ๊ฐ๋ค๋ฆ ์ ์ ๋ฒํธ \t\u0026#34;Sec-Fetch-Mode\u0026#34;: \u0026#34;cors\u0026#34;, \t\u0026#34;User-Agent\u0026#34;: \u0026#34;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36\u0026#34;, \t}). \tSetFormData(map[string]string{ \t\u0026#34;groupid\u0026#34;: Groupid, \t}). \tPost(\u0026#34;https://play.kakao.com/chat/service/api/room\u0026#34;) ์ด๋ ๊ฒ ์์ฒญ์ ๋ณด๋ด๊ณ ๋๋ฉด ์ฑํ
์ ์ ์ํ ์ ์๋ ip, roomid ๋ฑ์ด ๋์จ๋ค\n๊ทธ๋ฌ๋ฉด ๋ค์์ผ๋ก ๊ฑฐ๊ธฐ์ tcp ์ ์์ ์๋ํ๋ฉด ๋๋ค.\n์ ์์ ํ๊ณ ๋๋ฉด ์ด์ ์ฑํ
์ ์ฝ์ ์๊ฐ ์๋ค.\n๊ทธ๋ค์ ๋ด๊ฐ ์ํ๋ ๋ช
๋ น์ด๋ฅผ ๋ฑ๋ก ํ ์์ฒญ์ ์ค ๋ด๊ฐ ๋ฑ๋กํด๋์ ๋ช
๋ น์ด๋ฅผ ์น ๊ฒฝ์ฐ์ ๊ทธ์ ๋ง๊ฒ ์ค์ ๋ ๋ฉ์์ง๋ฅผ ์
๋ ๋์์ ๋ค์ด๊ฐ ์ฑํ
์ ์น ์ ์๋ ํจ์๋ฅผ ๋ง๋ค์ด ๋ณด๋ด๋ฉด ๋๋ค.\n๊ทธ๋ค์์ผ๋ก Fiddler๋ฅผ ์ฌ์ฉํด ์นด์นด์ค ํ๋ ์ด์ด์ ๊ธฐ๋ฅ ์คํ ์ ํด์ฅ, ์ฑํ
๊ธ์ง ๋ฑ ๋ด๊ฐ ์ํ๋ ๊ธฐ๋ฅ๋ค์ API๋ฅผ ๊ฐ์ ธ์จ๋ค.\nํ๋ ์ด์ด ๋ด๋ถ์์ ์ฌ์ฉ๋๋ API ๋ชฉ๋ก์ ์ ๋ฆฌํ ํ ๋ชฉ๋ก์ ๋ง๊ฒ ๊ธฐ๋ฅ์ ์คํํ๋ ํจ์๋ค์ ์ ์ํ๊ณ ์์ ์
๋ ๋์์์ ๊ฐ์ ธ์จ ์ธ์
๋ค์ ์ฌ์ฉํด ๋ด๊ฐ ์ํ๋ ๊ธฐ๋ฅ์ ๋ง๋ค ์ ์๋ค.\n์ด๋ ๊ฒ ํด์ ๊ธฐ๋ณธ์ ์ธ ํ๋ ์ด์ด์ ๊ธฐ๋ฅ๋ค์ ๊ตฌํํ ํ ์ด์ ํธ์์น์์ ์ฐ๋ ์น๋ ๊ฐ์ ๋ด์ ๊ธฐ๋ฅ์ ์ถ๊ฐ ๊ตฌํํด ์ฃผ๋ฉด ๋๋ค.\n์์๋ก ์
ํ์์ด๋ ๊ธ์ง๋ ๋จ์ด๋ฅผ ์ฌ์ฉ ์ ๊ฒฝ๊ณ ๋ฅผ ์ฃผ๊ณ ํด์ฅ์ ์ํจ๋ค๋ ์์ ๊ธฐ๋ฅ๋ค์ด๋ค. ๊ทธ๋ฌ๋ฉด ์ฑํ
๋ด์ ๊ธฐ๋ฅ์ ๊ตฌํ์ด ๋๋๋ค.\n๊ทธ๋ฆฌ๊ณ ๋ฐฉ์ก์ด ๊บผ์ง ๊ฒฝ์ฐ ์
๋ ๋์๋ ๊ฐ์ด ๊บผ์ค๋ค. ๋ธ๋ผ์ฐ์ 1๊ฐ๋น 100MB ์ ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋จน๋๋ค.\n๊ทธ๋ฆฌ๊ณ ์ด ์ฑ๋ด์ ๋ฐฉ์กํ๋ ์ฌ๋์ด ์ ์ฒญ์ ํด์ ์๊ธฐ๋ฐฉ์ ๋ฃ๋ ๊ฒ ์๋๋ผ ๊ฐ๋ฐ์๊ฐ ์ฑํ
์ฐฝ์ผ๋ก ๋ฐ์ด ๋ฃ์ ์ ์๋ค. (์ซ์ดํ๋ฉด ์ฑ๊ธ ๋จน๊ณ ๊ฐํด๋นํ๋ค.)\n๊ทธ๋์ ๋ฏธ๋ฆฌ ์ฌ์ ์ ์๊ธฐ๋ฅผ ๋๋ด๊ณ AD๋ฅผ ๋ฐ๊ณ ๋ฐ์ด ๋ฃ์ด์ผ ํ๋ค.\nComment) 2021-12-27 ์ถ๊ฐ\n์์ธํ ๋ด์ฉ์ ์ฑํ
๋ด์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ถํ์ ํธ์ ๋๋ ์ ๋ง๋ค๋๋ก ํ๊ฒ ์ต๋๋ค.\n","permalink":"https://www.springboot.kr/posts/kakaotv/kakaotv-chat-bot/","summary":"์นด์นด์คTV ์ฑ๋ด ๋ง๋ค๊ธฐ\n์ผ ๋
๋ ๋ ๋๊ฒ ๊ธ์ ์ฐ์ง ์์๋ค. ์ด์ ๊ฐ๋์ฉ ๋ค์ ์ ์ด๋ณด๋ ค๊ณ ํ๋๋ฐ ์์์ด ์นด์นด์คํฐ๋น ์ฑ๋ด์ด๋ค.\n์ด๋ฏธ ์๋
์ ๋ง๋ค์๋๋ฐ ์นด์นด์คTV๊ฐ ์ฃฝ์ด์ ์ฌ์ฉํ์ง ์๊ณ ์๋ค.\n์์ฒญ์๊ฐ 500๋ช
์ ๋๋๋ ๋ฐฉ์์ ํ
์คํธ๊น์ง ๋๋ธ ์ฑ๋ด์ธ๋ฐ\nํ
์คํธ๊ฐ ๋๋ ๋ ์ฆ์ ์ฌ๋๋ค์ด ๋๋ถ๋ถ ํธ์์น๋ก ์ด๋ํด ์ฌ์ฉํ์ง ์์๋ค.\n๊ถ๊ธํดํ๋ ์ฌ๋์ด ์์ ์๋ ์์ผ๋ ์ด๋ป๊ฒ ๋ง๋ค์๋์ง ๊ฐ๋ฐ๊ธฐ๋ฅผ ์ ์ด๋ณด๋๋ก ํด์ผ๊ฒ ๋ค.\n์ฐ์ ์นด์นด์คTV๋ ํธ์์น ์ฒ๋ผ API๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.\nํ์ง๋ง Web์ ์ ๊ณตํ๋ค ([?]ํํ๋ ์ด์ด๋ผ๋ ํ๋ ์ด์ด๋ฅผ ์ฌ์ฉํด ๋ณด๋์ฌ๋๋ค์ด ๋ง๋ค. ์น์ ํธ์์น์ฒ๋ผ ์ข์ง ์๊ณ ๊ธฐ๋ฅ์ด์ ์ด ์ฌ๋๋ค์ด ์์์ด๋ค.","title":"์นด์นด์ค TV ์ฑ๋ด ๋ง๋ค๊ธฐ"},{"content":"2019๋
1์์ Google+ API๊ฐ ์ข
๋ฃ ๋ฌ์ต๋๋ค.\n๊ทธ๋์ ์ฐพ์๋ณด๋๋ฐ\u0026hellip; ์ฐพ์์ต๋๋ค.\n๋ฌผ๋ก ๋๋ฌด ์งง์ ์๊ฐ๋์ ์์นํ๊ณ ์ฌ์ฉํ๊ฑฐ๋ผ ์๋ ๊ณต์ ๋์๋ ๋ด์ฉ ์ผ์๋ ์์ต๋๋ค.\n์ฌ๊ธฐ๋ก ๊ฐ๋ฉด ์ฝ๊ฒ ๋ก๊ทธ์ธ์ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋๋ฐ์.\n์ ๋ ๋ ์ฌ์ฉํ์ง ์์์ต๋๋ค.\n๊ทธ๋์ ์ฐพ์ ๋ฐฉ๋ฒ์ ์ฐ์ Golang Google OAuth ์ฌ์ฉ ํ๊ธฐ์ ๊ฒน์น๋ ๋ด์ฉ์ด ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ถ๋ถ์ ์คํตํ๊ณ ๋ฐ๋ก ์งํํ๊ฒ ์ต๋๋ค.\n๊ทธ๋ถ๋ถ ์ดํดํ์๊ณ ์ฐธ๊ณ ํ์ฌ ๋ฐ๋ผ ํ์๋ฉด ๋ฉ๋๋ค.\n๋ค๋ง ์ ํฌ์คํธ์ ๋์์๋ ๋ด์ฉ์ค code๋ฅผ ๋ฐ๊ธ๋ฐ์๋ scope๋ฅผ https://www.googleapis.com/auth/userinfo.email๋ก ์ก์ ์ฃผ์๋ฉด ๋ฉ๋๋ค.\n\u0026lt;a href=\u0026#34; https://accounts.google.com/o/oauth2/v2/auth? scope=https://www.googleapis.com/auth/userinfo.email\u0026amp; access_type=offline\u0026amp; include_granted_scopes=true\u0026amp;state=state_parameter_passthrough_value\u0026amp; redirect_uri=http://localhost:3005/googlecallback\u0026amp;response_type=code\u0026amp; client_id=YOUR_CLIENT_ID \u0026#34;\u0026gt; ๋ค์์ผ๋ก ์์ ๋งํฌ๋ ํฌ์คํธ์ ์๋ resty๋ฅผ ์ฌ์ฉํ์ฌ ์งํ ํฉ๋๋ค.\n์ฐ์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด์๋ ์์ ๋ด์ฉ์์ ์ธ์ฆ์ ํ๋ค ๋ฐ๊ธ๋ฐ์ ์ฝ๋๋ฅผ ์ฌ์ฉํด id_token์ ๋ฐ์์ผํฉ๋๋ค.\n๋ฐ๊ธ์ ๋ฐ๊ธฐ ์ํด์ ์์์ ๋งํ ์ฝ๋๋ฅผ ๋ฐ๋ ์์
์ ํด์ฃผ์๋ฉด ๋ฉ๋๋ค.\n๋ค์์ผ๋ก ์ ์ ์์ฑํ ํฌ์คํธ์ ์๋ ์ค์ฝํ์ ๋ฒ์๊ฐ ๋ฌ๋ฅด๊ธฐ ๋๋ฌธ์ ์์ ์ ์ด๋
ผ ๋ฒ์๋ก ์ก๊ณ ์์ฒญ์ ๋ณด๋ด๊ณ ๋ฐ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด id_token์ด ๋ค์ด์ต๋๋ค.\n์์ฒญ์ ๋ณด๋ด๋ฉด ์ด๋ ๊ฒ ๋์ต๋๋ค!!\n์ฝ๋๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.\nfunc (this *GoogleService) GetEmail(code string) error { // ๊ธฐ์กด token ๋ฐ๋ ์ฝ๋ \tclient := resty.New() \tresp, err := client.R(). \tSetHeader(\u0026#34;Content-Type\u0026#34;, \u0026#34;application/x-www-form-urlencoded\u0026#34;). \tSetFormData(map[string]string{ \t\u0026#34;code\u0026#34;: code, \t\u0026#34;client_id\u0026#34;: CLIENT_ID, \t\u0026#34;client_secret\u0026#34;: CLIENT_SECRET, \t\u0026#34;redirect_uri\u0026#34;: \u0026#34;http://localhost:3005/googlecallback\u0026#34;, \t\u0026#34;grant_type\u0026#34;: \u0026#34;authorization_code\u0026#34;, \t}). \tPost(\u0026#34;https://www.googleapis.com/oauth2/v4/token\u0026#34;) \tif err != nil { \tlog.Println(err.Error()) \t} \tsrc_json := resp.Body() \tvar m map[string]string \terr = json.Unmarshal(src_json, \u0026amp;m) \tif err != nil { \tlog.Println(err.Error()) \t} // ์ฌ๊ธฐ ๋ถํฐ๋ id_token์ ์ฌ์ฉํด์ google์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ์์ฒญ \tclient = resty.New() \tresp, err = client.R(). \tGet(\u0026#34;https://oauth2.googleapis.com/tokeninfo?id_token=\u0026#34; + m[\u0026#34;id_token\u0026#34;]) \tif err != nil { \tlog.Println(err.Error()) \t} \tsrc_json = resp.Body() \tvar n map[string]string \terr = json.Unmarshal(src_json, \u0026amp;n) \tif err != nil { \tlog.Println(err.Error()) \t} \tlog.Println(n[\u0026#34;email\u0026#34;]) \treturn nil } ์์ ์ฃผ์์ ํ ๋ถ๋ถ์ ์์ฒญ ์ฃผ์๋ฅผ ๋ณด์๋ฉด \u0026quot;https://oauth2.googleapis.com/tokeninfo?id_token=\u0026quot; + m[\u0026quot;id_token\u0026quot;]๋ก ๋์์ต๋๋ค.\n์์์ ๋ฐ์ id_token์ ๋ค์ ์์ฒญ ๋ถ๋ถ์์ ๋ฃ์ด์ฃผ๊ณ GET์ผ๋ก ์์ฒญํ์๋ฉด\n์ง์\n์ด๋ ๊ฒ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ๋์ค๋๋ฐ ์ฌ๊ธฐ์ ํ์ํ ๋ถ๋ถ์ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค. ์ ๋ email์ ์ฌ์ฉํ์ต๋๋ค.\n๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์~~\n","permalink":"https://www.springboot.kr/posts/google/golang-google-oauth-signin/","summary":"2019๋
1์์ Google+ API๊ฐ ์ข
๋ฃ ๋ฌ์ต๋๋ค.\n๊ทธ๋์ ์ฐพ์๋ณด๋๋ฐ\u0026hellip; ์ฐพ์์ต๋๋ค.\n๋ฌผ๋ก ๋๋ฌด ์งง์ ์๊ฐ๋์ ์์นํ๊ณ ์ฌ์ฉํ๊ฑฐ๋ผ ์๋ ๊ณต์ ๋์๋ ๋ด์ฉ ์ผ์๋ ์์ต๋๋ค.\n์ฌ๊ธฐ๋ก ๊ฐ๋ฉด ์ฝ๊ฒ ๋ก๊ทธ์ธ์ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋๋ฐ์.\n์ ๋ ๋ ์ฌ์ฉํ์ง ์์์ต๋๋ค.\n๊ทธ๋์ ์ฐพ์ ๋ฐฉ๋ฒ์ ์ฐ์ Golang Google OAuth ์ฌ์ฉ ํ๊ธฐ์ ๊ฒน์น๋ ๋ด์ฉ์ด ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ถ๋ถ์ ์คํตํ๊ณ ๋ฐ๋ก ์งํํ๊ฒ ์ต๋๋ค.\n๊ทธ๋ถ๋ถ ์ดํดํ์๊ณ ์ฐธ๊ณ ํ์ฌ ๋ฐ๋ผ ํ์๋ฉด ๋ฉ๋๋ค.\n๋ค๋ง ์ ํฌ์คํธ์ ๋์์๋ ๋ด์ฉ์ค code๋ฅผ ๋ฐ๊ธ๋ฐ์๋ scope๋ฅผ https://www.googleapis.com/auth/userinfo.email๋ก ์ก์ ์ฃผ์๋ฉด ๋ฉ๋๋ค.\n\u0026lt;a href=\u0026#34; https://accounts.google.com/o/oauth2/v2/auth? scope=https://www.","title":"Golang Google Oauth Signin ์ธ์ฆ ๋ฐฉ๋ฒ"},{"content":"serialVersionUID\n serialVersionUID์ ๋ ๋ฌด์์ธ๊ฐ?\n ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ ํ์ฌ ์ญ์ง๋ ฌํ๋ฅผ ํ ๋ ์ฌ์ฉํ๋ค. ์ง๋ ฌํ ์ธ์๋ ๋ณด์๋ฑ์ ์ฉ๋์ ์ฌ์ฉ๋ฌ๋ค. ๊ฐ์ฒด์ ๋ํ ๊ณ ์ ๋ฒํธ(?)์ผ๋ก ์๊ฐํ๋ฉด ๋๋ค. serialization๊ฐ ์ฌ์ฉ๋๋ ํด๋์ค์ ๊ฒฝ์ฐ์ ๋ช
์์ ์ผ๋ก ์ ์ธํด ์ฃผ๋๊ฒ์ ๊ถ์ ํ๋ค. ์ด๋ป๊ฒ ์ฌ์ฉํ๋๊ฐ?\n serialVersionUID๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ static, final, long ํ์
์ด์ฌ์ผ ํ๋ค. private์ ์ถ์ฒํจ. example) private static final long serialVersionUID = 11L; ์ ์ธ์ ํ์ง ์์ ๊ฒฝ์ฐ์๋?\n ์ ์ธ์ ํ์ง ์์ ๊ฒฝ์ฐ์๋ ์คํํ๋ ์์ ์์ serialization์ ๋ด๋นํ๋ ๋ชจ๋์ ํตํด ์๋์์ฑ๋์ด ๋ํดํธ๊ฐ์ด ๋ง๋ค์ด์ง๋ค. ๊ทธ ์๊ณ ๋ฆฌ์ฆ์ Java(TM) Object Serialization Specification์ ์ ์ ๋ ๊ฒ์ ๋ฐ๋ฅธ๋ค. ๋ํดํธ๋ก ์์ฑ๋ serialVersionUID๋ ๋งค์ฐ ๋ฏผ๊ฐํ๊ฒ ๋ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋ฌ์ ๋ฐ๋ผ Exception์ด ๋ฐ์ ํ ์ ์๋ค. Exception ๋ฐ์ ๋ฐฉ์ง๋ฅผ ์ํด์๋ผ๋ ๋ช
์๋ฅผ ํด์ฃผ๋ ๊ฒ์ด ์ข๋ค. ์ฐธ๊ณ \n serialVersionUID ์ ์ธ์ด์ ์ ๋ํ ํฌ์คํ
JAVA serialVersionUID ์ฌ์ฉ๋ฒ serialVersionUID๋ฅผ ์ ์ธํ๋ ์ด์ ","permalink":"https://www.springboot.kr/posts/java/about-serialversionuid/","summary":"serialVersionUID\n serialVersionUID์ ๋ ๋ฌด์์ธ๊ฐ?\n ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ ํ์ฌ ์ญ์ง๋ ฌํ๋ฅผ ํ ๋ ์ฌ์ฉํ๋ค. ์ง๋ ฌํ ์ธ์๋ ๋ณด์๋ฑ์ ์ฉ๋์ ์ฌ์ฉ๋ฌ๋ค. ๊ฐ์ฒด์ ๋ํ ๊ณ ์ ๋ฒํธ(?)์ผ๋ก ์๊ฐํ๋ฉด ๋๋ค. serialization๊ฐ ์ฌ์ฉ๋๋ ํด๋์ค์ ๊ฒฝ์ฐ์ ๋ช
์์ ์ผ๋ก ์ ์ธํด ์ฃผ๋๊ฒ์ ๊ถ์ ํ๋ค. ์ด๋ป๊ฒ ์ฌ์ฉํ๋๊ฐ?\n serialVersionUID๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ static, final, long ํ์
์ด์ฌ์ผ ํ๋ค. private์ ์ถ์ฒํจ. example) private static final long serialVersionUID = 11L; ์ ์ธ์ ํ์ง ์์ ๊ฒฝ์ฐ์๋?\n ์ ์ธ์ ํ์ง ์์ ๊ฒฝ์ฐ์๋ ์คํํ๋ ์์ ์์ serialization์ ๋ด๋นํ๋ ๋ชจ๋์ ํตํด ์๋์์ฑ๋์ด ๋ํดํธ๊ฐ์ด ๋ง๋ค์ด์ง๋ค.","title":"Java serialVersionUID์ ๋ํ์ฌ"},{"content":"Golang์์ google photo๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ์ฐพ์๋ ๋ด์ฉ์ ์ ๋ฆฌ ํ๋ ค๊ณ ํ๋ค.\n์ด๊ฑด ๋ด ๋ฐฉ๋ฒ์ด๊ณ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ ์ ์์.\nGoogle OAuth 2.0 for Web Server Applications\n์ฐ์ ์์ ์๋ ์ฌ์ดํธ๋ฅผ ์ฐธ์กฐํด ์ ๋ฆฌ ํ๋ค.\n์ ์ฌ์ดํธ์์๋ Go๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ง์ ํ๋ค๊ณ ์ ํ ์๋ค.\nํ์ง๋ง ์ฐ์ง ์์๋ค. ใ
ใ
\n๋ด๊ฐ ์ฌ์ฉํ ๋ฐฉ๋ฒ์ resty๋ผ๋ http ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.\nresty๋ spring์ผ๋ก ๋ณด๋ฉด resttemplate ๊ฐ์? ๋๋ ๊ฐ์ ์ฉ๋๋ก ์ฌ์ฉํ๋ค.\nresty์ค์น๋ฅผ ์ํด ๋ค๊ณผ ๊ฐ์ด ์
๋ ฅํด ์ค๋ค.\ngo get -u github.com/go-resty/resty/v2 ์ค์น๊ฐ ๋๋๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.\n์ฌ์ฉ๋ฒ์ README์ ์์ธํ๊ฒ ์ ํ์๋ค.\n์ด์ OAuth์ ํ์ํ ์์
์ ํ๊ธฐ ์ํด ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ง๋ค์ด ๋ณด์\nGoogle Cloud Platform์์ ํ๋ก์ ํธ ์์ฑ๊ณผ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์์ฑํด์ผ ํ๋ค.\nAPI ๋ฐ ์๋น์ค๋ฅผ ๋ค์ด๊ฐ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฉ๋ด๊ฐ ๋์ค๋๋ฐ ๊ฑฐ๊ธฐ์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋๋ฌ ์์ฑํ์\n์ ํ๋ฆฌ์ผ์ด์
์ด๋ฆ์ ์ ์ด์ฃผ๊ณ ๋๋ฉ์ธ๊ณผ ์ ํ๋ฆฌ์ผ์ด์
๋งํฌ๋ ์ ์ด์ฃผ์\n์์ฑ์ด ๋๋๋ฉด ๋ค์์ผ๋ก ๋ฉ๋ด์์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ค์ด๊ฐ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ๋ณด๊ฐ ์์ฑ๋ ์๋๋ฐ\n์ ๋ณด๋ฅผ ํด๋ฆญํ๋ฉด ์์ธ ๋ด์ฉ์ ๋ณผ ์ ์๋ค.\n์ด์ ์ฌ๊ธฐ์ ํด๋ผ์ด์ธํธ ID(client_id)์ ํด๋ผ์ด์ธํธ ๋ณด์ ๋น๋ฐ(client_sceret)์ด ์ฐ๋ฆฌ๊ฐ ํ์ํ ์ ๋ณด๋ค.\n์ด์ OAuth์ ๊ถํ์ ๋ถ์ฌ ํ ์์ด๋๋ฅผ ์ ์ฉํด ์ฃผ๋ ๋จ๊ณ๊ฐ ํ์ํ๋ค.\nStep 1: Set authorization parameters์ ๋ณด๊ฒ ๋๋ฉด ์ฌ์ฉ ํ ์ ์๋ ํ๋ผ๋ฏธํฐ๋ค์ด ์ ๋ฆฌ ๋์๋ค.\nStep 2: Redirect to Google's OAuth 2.0 server๋ฅผ ๋ณด๋ฉด ์ ์ฉ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค.\n์ธ์ฆ ์ ๋ณด๋ฅผ ์์ฑํ ๋ ๋ง๋ค์ด ๋์ ๋ฆฌ๋ค์ด๋ ํธ url๊ณผ client_id๊ฐ ํ์ํ๋ค.\nscope๋ ๋๋ ๊ตฌ๊ธ ํฌํ ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ๋ค์๊ณผ ๊ฐ์ด ๋ฒ์๋ฅผ ์ก์๋ค.\nscope=https://www.googleapis.com/auth/photoslibrary+https://www.googleapis.com/auth/photoslibrary.appendonly\n\u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html lang=\u0026#34;en\u0026#34;\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta charset=\u0026#34;UTF-8\u0026#34;\u0026gt; \u0026lt;title\u0026gt;SPRINGBOOT.KR\u0026lt;/title\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;a href=\u0026#34; https://accounts.google.com/o/oauth2/v2/auth? scope=https://www.googleapis.com/auth/photoslibrary+https://www.googleapis.com/auth/photoslibrary.appendonly\u0026amp; access_type=offline\u0026amp; include_granted_scopes=true\u0026amp;state=state_parameter_passthrough_value\u0026amp; redirect_uri=http://localhost:3005/redirect\u0026amp;response_type=code\u0026amp; client_id=Your client id \u0026#34; style=\u0026#34;font-size: 50px;\u0026#34;\u0026gt;SPRINGBOOT.KR\u0026lt;/a\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; ์ด๋ ๊ฒ ์ก์ ๋์ผ๋ฉด ๋งํฌ๋ฅผ ๋๋ ์๋ ๊ถํ์ ๋ถ์ฌํ ์ ์๋ ํ์ด์ง๋ก ์ด๋๋๋ค.\n๊ทธ๋ฆฌ๊ณ ๊ถํ์ ๋ค ์ฃผ๊ฒ ๋๋ฉด ์์์ ์ค์ ํด ๋์ redirect_uri๋ก code ๊ฐ์ด ๋ค์ด์ค๋๋ฐ\n๊ทธ ๋ถ๋ถ์ ์บ์นํด code๋ฅผ ๋ฐ๋ก ๋ค์ด์ค๋ค.\n๋๋ ehco๋ฅผ ์ฌ์ฉํ๊ณ ์์ด์ c.FormValue(\u0026quot;code\u0026quot;) ์ด๋ ๊ฒ ํ๋ฉด ์ ๋ฐ์ ์ก๋ค.\n๊ทธ๋ฆฌ๊ณ ์ด์ ์ ๋ ๊ฒ ๋ฐ์ code ๊ฐ์ ์ฌ์ฉํด OAuth๋ฅผ ์์ฒญ ํ ์ ์๋ค.\nfunc GetAccessToken(code string) { \tclient := resty.New() \tresp, err := client.R(). \tSetHeader(\u0026#34;Content-Type\u0026#34;, \u0026#34;application/x-www-form-urlencoded\u0026#34;). \tSetFormData(map[string]string{ \t\u0026#34;code\u0026#34;: YOUR_CODE, \t\u0026#34;client_id\u0026#34;: YOUR_CLIENT_ID, \t\u0026#34;client_secret\u0026#34;: YOUR_CLIENT_SECRET, \t\u0026#34;redirect_uri\u0026#34;: \u0026#34;http://localhost/redirect\u0026#34;, \t\u0026#34;grant_type\u0026#34;: \u0026#34;authorization_code\u0026#34;, \t}). \tPost(\u0026#34;https://www.googleapis.com/oauth2/v4/token\u0026#34;) \tif err != nil { \tlog.Println(err.Error()) \t} } ์์ ์ฝ๋์์ ๋ณด๋ฉด ํด๋ผ์ด์ธํธ ์์ด๋์ ์ํฌ๋ฆฟ์ด ํ์ํ๋ค.\n์๊น ๋ฐ์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด์ ๊ฐ์ ์ ๊ธฐ์ ์
๋ ฅํ๋ฉด ๋๋ค.\n๊ทธ๋ฆฌ๊ณ ์์ฒญ์ ๋ณด๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ด Response๊ฐ ์ค๋ฉด ์ฑ๊ณต\n{ \u0026#34;access_token\u0026#34;:\u0026#34;1/fFAGRNJru1FTz70BzhT3Zg\u0026#34;, \u0026#34;expires_in\u0026#34;:3600, \u0026#34;token_type\u0026#34;:\u0026#34;Bearer\u0026#34;, \u0026#34;refresh_token\u0026#34;:\u0026#34;1/xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI\u0026#34; } ๊ทธ๋ผ ์ด์ ์ ๊ธฐ์ ์๋ access token์ api๋ฅผ ์ฌ์ฉํ ๋ ์ฌ์ฉํ๋ฉด ๋๋ค!\nexpires_in์ ์๋ 3600์ ์ด๋จ์๋ก 1์๊ฐ์ด๋ค.\n๊ทธ๋ผ ๋ฆฌํ๋ ์ ํ ํฐ์.. ๋ค์ ๊ธฐํ์ ์์ฑ ํ๊ฒ ์ต๋๋ค.\n","permalink":"https://www.springboot.kr/posts/google/golang-google-oauth/","summary":"Golang์์ google photo๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ์ฐพ์๋ ๋ด์ฉ์ ์ ๋ฆฌ ํ๋ ค๊ณ ํ๋ค.\n์ด๊ฑด ๋ด ๋ฐฉ๋ฒ์ด๊ณ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ ์ ์์.\nGoogle OAuth 2.0 for Web Server Applications\n์ฐ์ ์์ ์๋ ์ฌ์ดํธ๋ฅผ ์ฐธ์กฐํด ์ ๋ฆฌ ํ๋ค.\n์ ์ฌ์ดํธ์์๋ Go๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ง์ ํ๋ค๊ณ ์ ํ ์๋ค.\nํ์ง๋ง ์ฐ์ง ์์๋ค. ใ
ใ
\n๋ด๊ฐ ์ฌ์ฉํ ๋ฐฉ๋ฒ์ resty๋ผ๋ http ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.\nresty๋ spring์ผ๋ก ๋ณด๋ฉด resttemplate ๊ฐ์? ๋๋ ๊ฐ์ ์ฉ๋๋ก ์ฌ์ฉํ๋ค.\nresty์ค์น๋ฅผ ์ํด ๋ค๊ณผ ๊ฐ์ด ์
๋ ฅํด ์ค๋ค.\ngo get -u github.com/go-resty/resty/v2 ์ค์น๊ฐ ๋๋๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.","title":"Golang Google OAuth ์ฌ์ฉ ํ๊ธฐ"},{"content":"๋งฅ๋ถ์์ kubernetes ์ค์น๋ฅผ ์ํด ์๋จ๋ฐ์ ์๋ ๋์ปค๋ฅผ ํด๋ฆญํ\nPreferences\u0026hellip; ๋ฅผ ํด๋ฆญํ kubernetes ๋ฒํผ์ ๋๋ฌ\nEnable Kubernetes๋ฅผ ์ฒดํฌ ํ apply๋ฅผ ๋๋ฌ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ํ์ฑํ ์ํจ๋ค.\nํ์ฑํ๊ฐ ๋๋ ๋์ค์๋ ์ค๋ฅธ์ชฝ ํ๋จ์ Kubernetes is starting ์ด๋ ๋ฌธ๊ตฌ๊ฐ ๋์ค๊ณ \nํ์ฑํ๊ฐ ๋๋๋ฉด ์ค๋ฅธ์ชฝ ํ๋จ์ Kubernetes is running ์ผ๋ก ๋์จ๋ค.\n๋ค์์ผ๋ก kubectl์ ์ค์นํด ์ฃผ์ kubernetes cli ํด์ด๋ค.\ncurl -LO \u0026#34;https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl\u0026#34; chmod +x ./kubectl sudo mv ./kubectl /usr/local/bin/kubectl ์ค์น๊ฐ ๋๋๋ฉด version ์ฒดํฌ๋ก ํ์ธ์ ํด์ค๋ค.\nkubectl version Kubectl ์ค์น๊ฐ ๋๋๋ฉด Minikube ์ค์น๋ฅผ ํด์ค๋ค.\ninstall-minikube ๊ณต์ ๋ฌธ์\n์ฐ์ ๋จผ์ ๊ฐ์ํ ์ง์ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ธฐ ์ํด ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด์ค๋ค\nsysctl -a | grep -E --color \u0026#39;machdep.cpu.features|VMX\u0026#39; ๋ช
๋ น์ด๋ฅผ ์คํ ํ\nVMX ์ด๋ ๋
์์ ์์ผ๋ก ๊ฐ์กฐ๋ ๋
์์ด ์์ผ๋ฉด ๊ฐ์ํ๊ฐ ํ์ฑํ ๋์๋ ๊ฒ ์ด๋ค.\n๋ค์์ผ๋ก minikube๋ฅผ ์ค์น ํด ์ฃผ์ด์ผ ํ๋๋ฐ\nhomebrew๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ฌ์ฉํด ์ค์นํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.\n1. brew (1๋ฒ ๋ฐฉ๋ฒ์ผ๋ก ์ค์น๋ฅผํ์๋ ์๋ฌ๊ฐ๋๋ฉด 1-1์ ๋ฐฉ๋ฒ์ผ๋ก ์คํํด ๋ณด์.) brew cask install minikube 1-1. brew install minikube 2. ๋ฐ์ด๋๋ฆฌ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 \\ \u0026amp;\u0026amp; chmod +x minikube ๋ค์์ผ๋ก minikube๋ฅผ ์คํ ๊ฒฝ๋ก์ ์ถ๊ฐํด ์ฃผ๋ ์์
์ด ํ์ํ๋ค.\nsudo mv minikube /usr/local/bin ์ค์น๊ฐ ์๋ฃ๊ฐ ๋ ํ ์๋ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํด ์ค๋ค.\nminikube start ์
๋ ฅ ํ ๋ค์ ๊ณผ๊ฐ์ด ์ค์น๊ฐ ์งํ๋๊ณ ์คํ์ด ๋๋ค.\n๊ทธ๋ฆฌ๊ณ ๋ค์๊ณผ ๊ฐ์ด ํ์ธ์ ํด๋ณด์\nkubectl get nodes ๋ฏธ๋์ฟ ๋ฒ ๊ฐ ์ ์ฌ๋ผ๊ฐ์๋ค.\n","permalink":"https://www.springboot.kr/posts/k8s/kubernetes-install/","summary":"๋งฅ๋ถ์์ kubernetes ์ค์น๋ฅผ ์ํด ์๋จ๋ฐ์ ์๋ ๋์ปค๋ฅผ ํด๋ฆญํ\nPreferences\u0026hellip; ๋ฅผ ํด๋ฆญํ kubernetes ๋ฒํผ์ ๋๋ฌ\nEnable Kubernetes๋ฅผ ์ฒดํฌ ํ apply๋ฅผ ๋๋ฌ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ํ์ฑํ ์ํจ๋ค.\nํ์ฑํ๊ฐ ๋๋ ๋์ค์๋ ์ค๋ฅธ์ชฝ ํ๋จ์ Kubernetes is starting ์ด๋ ๋ฌธ๊ตฌ๊ฐ ๋์ค๊ณ \nํ์ฑํ๊ฐ ๋๋๋ฉด ์ค๋ฅธ์ชฝ ํ๋จ์ Kubernetes is running ์ผ๋ก ๋์จ๋ค.\n๋ค์์ผ๋ก kubectl์ ์ค์นํด ์ฃผ์ kubernetes cli ํด์ด๋ค.\ncurl -LO \u0026#34;https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl\u0026#34; chmod +x ./kubectl sudo mv ./kubectl /usr/local/bin/kubectl ์ค์น๊ฐ ๋๋๋ฉด version ์ฒดํฌ๋ก ํ์ธ์ ํด์ค๋ค.\nkubectl version Kubectl ์ค์น๊ฐ ๋๋๋ฉด Minikube ์ค์น๋ฅผ ํด์ค๋ค.","title":"Kubernetes Minikube ์ค์น"},{"content":"Effective Java 3/E 2์ฅ ์์ฑ์๋ ์ด๊ฑฐ ํ๋น์ผ๋ก ์ฑํดํด์์ ๋ณด์ฆํ๋ผ ์ฑ๊ธํด์ ์ธ์คํด์ค๋ฅผ ํ๋๋ง ๋ง๋ค์ ์๋ ํจํด์ด๋ค.\nํ์ง๋ง ํด๋์ค๋ฅผ ์ฑ๊ธํด์ผ๋ก ๋ง๋ค๋ฉด ์ฑ๊ธํด ์ธ์คํด์ค๋ฅผ Mock ๊ตฌํ์ผ๋ก ๋์ฒด ํ ์๊ฐ ์๋ค\n๊ทธ๋ ๊ฒ ๋๋ฉด ์ด๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ฅผ ํ
์คํธํ๊ธฐ๊ฐ ์ด๋ ค์์ง๊ฒ ๋๋ค.\n์์ฃผ ๋ณต์กํ ์ง๋ ฌํ ์ํฉ์ด๋ ๋ฆฌํ๋ ์
๊ณต๊ฒฉ์์๋ ์ 2์ ์ธ์คํด์ค๊ฐ ์๊ธฐ๋ ์ผ์ ์๋ฒฝํ ๋ง์์ค๋ค.\n๋๋ถ๋ถ์ ์ํฉ์์๋ ์์๊ฐ ํ๋๋ฟ์ธ ์ด๊ฑฐ ํ์
์ด ์ฑ๊ธํด์ ๋ง๋๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด๋ค.\nํ์ง๋ง ๋ง์ฝ์ ์ฑ๊ธํด์ด Enum ์ธ์ ํด๋์ค๋ฅผ ์์ํด์ผ ํ๋ค๋ฉด ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค.\n","permalink":"https://www.springboot.kr/posts/effective-java/effective-fava-3e-02-03/","summary":"Effective Java 3/E 2์ฅ ์์ฑ์๋ ์ด๊ฑฐ ํ๋น์ผ๋ก ์ฑํดํด์์ ๋ณด์ฆํ๋ผ ์ฑ๊ธํด์ ์ธ์คํด์ค๋ฅผ ํ๋๋ง ๋ง๋ค์ ์๋ ํจํด์ด๋ค.\nํ์ง๋ง ํด๋์ค๋ฅผ ์ฑ๊ธํด์ผ๋ก ๋ง๋ค๋ฉด ์ฑ๊ธํด ์ธ์คํด์ค๋ฅผ Mock ๊ตฌํ์ผ๋ก ๋์ฒด ํ ์๊ฐ ์๋ค\n๊ทธ๋ ๊ฒ ๋๋ฉด ์ด๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ฅผ ํ
์คํธํ๊ธฐ๊ฐ ์ด๋ ค์์ง๊ฒ ๋๋ค.\n์์ฃผ ๋ณต์กํ ์ง๋ ฌํ ์ํฉ์ด๋ ๋ฆฌํ๋ ์
๊ณต๊ฒฉ์์๋ ์ 2์ ์ธ์คํด์ค๊ฐ ์๊ธฐ๋ ์ผ์ ์๋ฒฝํ ๋ง์์ค๋ค.\n๋๋ถ๋ถ์ ์ํฉ์์๋ ์์๊ฐ ํ๋๋ฟ์ธ ์ด๊ฑฐ ํ์
์ด ์ฑ๊ธํด์ ๋ง๋๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด๋ค.\nํ์ง๋ง ๋ง์ฝ์ ์ฑ๊ธํด์ด Enum ์ธ์ ํด๋์ค๋ฅผ ์์ํด์ผ ํ๋ค๋ฉด ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค.","title":"์์ฑ์๋ ์ด๊ฑฐ ํ๋น์ผ๋ก ์ฑํดํด์์ ๋ณด์ฆํ๋ผ"},{"content":"Effective Java 3/E 2์ฅ ์์ฑ์์ ๋งค๊ฐ๋ณ์๊ฐ ๋ง๋ค๋ฉด ๋น๋๋ฅผ ๊ณ ๋ คํ๋ผ ์ ์ ํฉํฐ๋ฆฌ์ ์์ฑ์์๋ ๋๊ฐ์ ์ ์ฝ์ด ํ๋ ์๋ค.\n์ ํ์ ๋งค๊ฐ๋ณ์๊ฐ ๋ง์๋ ๋์์ด ์ด๋ ต๋ค.\n์ ์ธต์ ์์ฑ์ ํจํด๋ ์ธ ์๋ ์์ง๋ง ๋งค๊ฐ๋ณ์๊ฐ ๋ง์์ง๋ฉด ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ์ฝ๊ธฐ ์ด๋ ค์ ์ง๋ค.\npublic class Hello { private String str; private String str2; private String str3; public Hello(String str) { System.out.println(\u0026#34;Hello str\u0026#34; + str); } public Hello(String str, String str2) { System.out.println(\u0026#34;Hello str1, str2\u0026#34; + str + str2); } public Hello(String str, String str2) { System.out.println(\u0026#34;Hello str, str3 \u0026#34; + str + str3); } public Hello(String str2, String str3) { System.out.println(\u0026#34;Hello str2, str3\u0026#34; + str2 + str3); } } ๋ค์์ผ๋ก ๋งค๊ฐ๋ณ์๊ฐ ๋ง์ ๋ ํ์ฉํ ์ ์๋ ์๋ฐ ๋น์ฆ ํจํด์ ๋ณด์.\npublci class Hello { private String str; private String str2; private String str3; public void setStr(String str){ this.str = str; } public void setStr(String str2){ this.str2 = str2; } public void setStr(String str3){ this.str3 = str3; } } ์๋ฐ ๋น์ฆ ํจํด์์๋ ์ ์ธต์ ์์ฑ์ ํจํด์ ๋จ์ ๋ค์ด ๋ณด์ด์ง ์๋๋ค.\n์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ธฐ ์ฝ๊ณ ๊ทธ ๊ฒฐ๊ณผ ๋ ์ฝ๊ธฐ ์ฌ์์ก๋ค.\nํ์ง๋ง ์ฌ๊ฐํ ๋จ์ ์ด ์์ผ๋ ๊ทธ๊ฑด ์๋ฐ ๋น์ฆ ํจํด์์๋ ๊ฐ์ฒด ํ๋๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ฉ์๋๋ฅผ ์ฌ๋ฌ ๊ฐ ํธ์ถํด์ผ ํ๊ณ ๊ฐ์ฒด๊ฐ ์์ ํ ์์ฑ๋๊ธฐ ์ ๊น์ง๋ ์ผ๊ด์ฑ์ด ๋ฌด๋์ง ์ํ์ ๋์ธ๋ค.\n์ผ๊ด์ฑ์ด ๋ฌด๋์ง๋ ๋ฌธ์ ๋ก ์ธํด ์๋ฐ๋น์ฆ ํจํด์ ํด๋์ค๋ฅผ ๋ถ๋ณ์ผ๋ก ๋ง๋ค ์ ์๋ค.\nํ์ง๋ง ์ด๋ฌํ ๋ฌธ์ ์ ๋ค์ ๋ํ ๋์์ผ๋ก ๋น๋ ํจํด์ด ์กด์ฌํ๋ค.\n๋น๋๋ ์์ฑํ ํด๋์ค ์์ ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ฅผ ๋ง๋ค์ด๋๋ ๊ฒ ๋ณดํต์ด๋ค.\npublic class Hello { private String str; private String str2; private String str3; public Hello() {} public static class Builder { private String str; private String str2; private String str3; public Builder() { } public setStr(String str) { this.str = str; } public setStr2(String str2) { this.str2 = str2; } public setStr3(String str3) { this.str3 = str3; } public Hello build() { return new Hello(this); } } private Hello(Builder builder) { this.str = builder.str; this.str2 = builder.str2; this.str3 = builder.str3; } } ์ฐ๊ธฐ ์ฝ๊ณ ์ฝ๊ธฐ ์ฌ์ด ๋น๋ ํจํด์ด ๋์จ๋ค.\n๋น๋ ํจํด์ ํ์ด์ฌ์ด๋ ์ค์นผ๋ผ์ ์๋ ๋ช
๋ช
๋ ์ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ํ๋ด ๋ธ ๊ฒ์ด๋ค.\n๋ง๋ค์ด์ง ๋น๋ ํจํด์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.\nHello hello = new Hello.Builder() .setStr(\u0026#34;He\u0026#34;) .setStr2(\u0026#34;ll\u0026#34;) .setStr3(\u0026#34;o\u0026#34;) .build(); ","permalink":"https://www.springboot.kr/posts/effective-java/effective-fava-3e-02-02/","summary":"Effective Java 3/E 2์ฅ ์์ฑ์์ ๋งค๊ฐ๋ณ์๊ฐ ๋ง๋ค๋ฉด ๋น๋๋ฅผ ๊ณ ๋ คํ๋ผ ์ ์ ํฉํฐ๋ฆฌ์ ์์ฑ์์๋ ๋๊ฐ์ ์ ์ฝ์ด ํ๋ ์๋ค.\n์ ํ์ ๋งค๊ฐ๋ณ์๊ฐ ๋ง์๋ ๋์์ด ์ด๋ ต๋ค.\n์ ์ธต์ ์์ฑ์ ํจํด๋ ์ธ ์๋ ์์ง๋ง ๋งค๊ฐ๋ณ์๊ฐ ๋ง์์ง๋ฉด ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ์ฝ๊ธฐ ์ด๋ ค์ ์ง๋ค.\npublic class Hello { private String str; private String str2; private String str3; public Hello(String str) { System.out.println(\u0026#34;Hello str\u0026#34; + str); } public Hello(String str, String str2) { System.","title":"์์ฑ์์ ๋งค๊ฐ๋ณ์๊ฐ ๋ง๋ค๋ฉด ๋น๋๋ฅผ ๊ณ ๋ คํ๋ผ"},{"content":"Effective Java 3/E 2์ฅ ์์ฑ์ ๋์ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ๊ณ ๋ คํ๋ผ ์ธ์คํด์ค๋ฅผ ์ป๋์ ํต์ ์๋จ์ Public ์์ฑ์์ด๋ค.\n ํด๋์ค๋ ๋ณ๋๋ก ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์ ๊ณต ํ ์ ์๋ค. (ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ๋จ์ํ ์ ์ ๋ฉ์๋)\n ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋์ ํฉํ ๋ฆฌ ํจํด์ ๊ฐ์ง ์๋ค.\n ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๊ฐ ์์ฑ์๋ณด๋ค ์ข์์ 5๊ฐ์ง\n ์ด๋ฆ์ ๊ฐ์ง ์ ์๋ค.\n ์ด๋ค๊ฒ ๋ ์๋ฏธ๋ฅผ ์ ์ค๋ช
ํ ์ ์๋ ๊ฐ? BigInteger(int, int, Random) BigInteger.ProbablePrime ํ ํด๋์ค์ ์๊ทธ๋์ฒ๊ฐ ๊ฐ์ ์์ฑ์๊ฐ ์ฌ๋ฌ๊ฐ ํ์ํ ๊ฒ ๊ฐ์ผ๋ฉด ์์ฑ์๋ฅผ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ก ๋ฐ๊พธ๊ณ ๊ฐ๊ฐ์ ์ฐจ์ด๋ฅผ ์ ๋๋ฌ๋ด๋ ์ด๋ฆ์ ์ง์ด ์ฃผ์. ํธ์ถ๋ ๋๋ง๋ค ์ธ์คํด์ค๋ฅผ ์๋ก ์์ฑํ์ง๋ ์์๋ ๋๋ค.\n ๋๋ถ์ ๋ถ๋ณ ํด๋์ค๋ ์ธ์คํด์ค๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋๊ฑฐ๋ ์๋ก ์์ฑํ ์ธ์คํด์ค๋ฅผ ์บ์ฑํ์ฌ ์ฌํ์ฉํ๋ ์์ผ๋ก ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ํผํ ์ ์๋ค.\n ๊ฐ์ ๊ฐ์ฒด๊ฐ ์์ฃผ ์์ฒญ๋๋ ์ํฉ์ด๋ผ๋ฉด ์ฑ๋ฅ์ ์๋นํ ๋์ด์ฌ๋ ค ์ค๋ค.\n ๋ฐ๋ณต๋๋ ์์ฒญ์ด ๊ฐ์ ๊ฐ์ฒด๋ฅด ๋ฐํํ๋ ์์ผ๋ก ์ ์ ํฉํฐ๋ฆฌ ๋ฐฉ์์ ํด๋์ค๋ ์ธ์ ์ด๋ ์ธ์คํด์ค๋ฅผ ์ด์ ์๊ฒ ํ ์ง๋ฅผ ์ฒ ์ ํ ํต์ ํ ์ ์๋ค. (์ด๋ฐ ํด๋์ค๋ฅผ ์ธ์คํด์ฆ ํต์ ํด๋์ค๋ผ ํ๋ค.)\n ํต์ ๋ฅผ ํ๋ฉด ์ฑ๊ธํด, ์ธ์คํด์คํ ๋ถ๊ฐ๋ก ๋ง๋ค ์ ์์ผ๋ฉฐ ์ธ์คํด์ค๊ฐ ๋จ ํ๋๋ฟ์์ ๋ณด์ฅํ ์ ์๋ค.\n ๋ฐํ ํ์
์ ํ์ ํ์
๊ฐ์ฒด๋ฅด ๋ฐํํ ์ ์๋ ๋ฅ๋ ฅ์ด ์๋ค.\n ๋ฐํํ ๊ฐ์ฒด์ ํด๋์ค๋ฅผ ์์ ๋กญ๊ฒ ์ ํํ ์ ์๊ฒ ํ๋ ์์ฒญ๋ ์ ์ฐ์ฑ์ ์ ๋ฌผํ๋ค.\n ์ธํฐํ์ด์ค๋ฅผ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋์ ๋ฐํ ํ์
์ผ๋ก ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค ๊ธฐ๋ฐ ํ๋ ์์ํฌ๋ฅด๋ฅผ ๋ง๋๋ ํต์ฌ ๊ธฐ์ ์ด๊ธฐ๋ ํ๋ค.\n ์
๋ ฅ ๋งค๊ฐ๋ณ์์ ๋ฐ๋ก ๋งค๋ฒ ๋ค๋ฅธ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์๋ค.\n ๋นคํ ํ์
์ด ํ์ ํ์
์ด๊ธฐ๋ง ํ๋ฉด ์ด๋ค ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ์๊ด ์๋ค. ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์์ฑํ๋ ์์ ์๋ ๋ฐํํ ๊ฐ์ฒด์ ํด๋์ค๊ฐ ์กด์ฌํ์ง ์์๋ ๋๋ค.\n ์ด๋ฐ ์ ์ฐํจ์ ์๋น์ค ์ ๊ณต๊ณผ ํ๋ ์์ํฌ๋ฅผ ๋ง๋๋ ๊ทผ๊ฐ์ด ๋๋ค.\n ์๋น์ค ์ ๊ณต์ ํ๋ ์์ํฌ๋ 3๊ฐ์ ํต์ฌ ์ปดํฌ๋ํธ๋ก ์ด๋ฃจ์ด์ง๋ค.\n ์๋น์ค ์ธํฐํ์ด์ค(service interface) ์ ๊ณต์ ๋ฑ๋ก API(provider registration API) ์๋น์ค ์ ๊ทผ API(service access API) ์์ 3๊ฐ์ ์ปดํฌ๋ํธ์ ์ฐ์ด๋ ์๋น์ค ์ ๊ณต์ ์ธํฐํ์ด์ค(service pro-vider- interface)๋ผ๋ ๋ค ๋ฒ์งธ ์ปดํฌ๋ํธ๊ฐ ์๋ค.\n ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋์ ๋จ์ 2๊ฐ์ง\n ์์์ ํ๋ ค๋ฉด public์ด๋ protected ์์ฑ์๊ฐ ํ์ํ๋ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ง ์ ๊ณตํ๋ฉด ํ์ฐใ
ข ํด๋์ค๋ฅผ ๋ง๋ค์ ์๋ค.\n ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ฐพ๊ธฐ ์ด๋ ต๋ค. ๊ทธ๋์ API ๋ฌธ์๋ฅผ ์ ๋ง๋ค์ด์ผ ํ๋ค.\n ","permalink":"https://www.springboot.kr/posts/effective-java/effective-fava-3e-02-01/","summary":"Effective Java 3/E 2์ฅ ์์ฑ์ ๋์ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ๊ณ ๋ คํ๋ผ ์ธ์คํด์ค๋ฅผ ์ป๋์ ํต์ ์๋จ์ Public ์์ฑ์์ด๋ค.\n ํด๋์ค๋ ๋ณ๋๋ก ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์ ๊ณต ํ ์ ์๋ค. (ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ๋จ์ํ ์ ์ ๋ฉ์๋)\n ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋์ ํฉํ ๋ฆฌ ํจํด์ ๊ฐ์ง ์๋ค.\n ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๊ฐ ์์ฑ์๋ณด๋ค ์ข์์ 5๊ฐ์ง\n ์ด๋ฆ์ ๊ฐ์ง ์ ์๋ค.\n ์ด๋ค๊ฒ ๋ ์๋ฏธ๋ฅผ ์ ์ค๋ช
ํ ์ ์๋ ๊ฐ? BigInteger(int, int, Random) BigInteger.","title":"์์ฑ์ ๋์ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ๊ณ ๋ คํ๋ผ"},{"content":"JUnit4 assert method ์์ assertXxx Method ์ฌ์ฉ ๋ชฉ์ assertArrayEquals(\u0026quot;message\u0026quot;, A, B) ๋ฐฐ์ด A์ B๊ฐ ์ผ์นํจ์ ํ์ธํ๋ค. assertEquals(\u0026quot;message\u0026quot;, A, B) ๊ฐ์ฒด A์ B๊ฐ ์ผ์นํจ์ ํ์ธํ๋ค. B๋ฅผ ํ๋ผ๋ฏธํฐ๋ก A์ equals() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค(A.equals(B)). assertSame(\u0026quot;message\u0026quot;, A, B) ๊ฐ์ฒด A์ B๊ฐ ๊ฐ์ ๊ฐ์ฒด์์ ํ์ธํ๋ค. assertEquals ๋ฉ์๋๋ ๋ ๊ฐ์ฒด์ ๊ฐ์ด ๊ฐ์๊ฐ๋ฅผ ๊ฒ์ฌํ๋๋ฐ ๋ฐํด(equals ๋ฉ์๋ ์ฌ์ฉ), assertSame ๋ฉ์๋๋ ๋๊ฐ์ฒด๊ฐ ๋์ผํ, ์ฆ ํ๋์ ๊ฐ์ฒด์ธ๊ฐ๋ฅผ ๊ฒ์ฌํ๋ค(== ์ฐ์ฐ์ ์ฌ์ฉ) assertTrue(\u0026quot;message\u0026quot;, A) ์กฐ๊ฑด A๊ฐ ์ฐธ(true)์์ ํ์ธํ๋ค. assertNotNull(\u0026quot;message\u0026quot;, A) ๊ฐ์ฒด A๊ฐ null์์ ํ์ธํ๋ค. ๋ ๋ง์ assert method๋ค ์ด ์๋ค..\nassertArrayNotEqauls, assertNotSame, assertNotTrue ๋ฑ\u0026hellip;\n๋ ์์ธํ ๋ด์ฉ์ Assert API ๋ฌธ์ ์ฐธ๊ณ ..\nAssert Document\n","permalink":"https://www.springboot.kr/posts/junit-01/","summary":"JUnit4 assert method ์์ assertXxx Method ์ฌ์ฉ ๋ชฉ์ assertArrayEquals(\u0026quot;message\u0026quot;, A, B) ๋ฐฐ์ด A์ B๊ฐ ์ผ์นํจ์ ํ์ธํ๋ค. assertEquals(\u0026quot;message\u0026quot;, A, B) ๊ฐ์ฒด A์ B๊ฐ ์ผ์นํจ์ ํ์ธํ๋ค. B๋ฅผ ํ๋ผ๋ฏธํฐ๋ก A์ equals() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค(A.equals(B)). assertSame(\u0026quot;message\u0026quot;, A, B) ๊ฐ์ฒด A์ B๊ฐ ๊ฐ์ ๊ฐ์ฒด์์ ํ์ธํ๋ค. assertEquals ๋ฉ์๋๋ ๋ ๊ฐ์ฒด์ ๊ฐ์ด ๊ฐ์๊ฐ๋ฅผ ๊ฒ์ฌํ๋๋ฐ ๋ฐํด(equals ๋ฉ์๋ ์ฌ์ฉ), assertSame ๋ฉ์๋๋ ๋๊ฐ์ฒด๊ฐ ๋์ผํ, ์ฆ ํ๋์ ๊ฐ์ฒด์ธ๊ฐ๋ฅผ ๊ฒ์ฌํ๋ค(== ์ฐ์ฐ์ ์ฌ์ฉ) assertTrue(\u0026quot;message\u0026quot;, A) ์กฐ๊ฑด A๊ฐ ์ฐธ(true)์์ ํ์ธํ๋ค.","title":"JUnit4 assert method ์์"},{"content":"golang์์ postgresql orm go-pg ์ฌ์ฉํ๊ธฐ ์ฒ์ ๊ธ์์๋ go-pg๋ฅผ ์ฌ์ฉํ connection๊ณผ close์ ๋ํด ์ ์ด๋ณธ๋ค ์์ ์ํ์ ๋ฐ๋ผํ๋ฉด ์ ๋ ๊ฒ์ด๋ค.\n๋๋ postgresql์ ์ฌ์ฉํ๊ธฐ ์ํจ์ด ์๋๋ผ cockroach db๋ฅผ go์์ ์ฌ์ฉํ๊ธฐ ์ํด go-pg๋ฅผ ์ ํํ๋ค.\ngo-pg์ ๋ํ ๋งํฌ๋ฅผ ๊ฑธ์ด ๋ก๋๋ค.\nGithub / Document\n์์ ๋งํฌ๋ฅผ ์ฒจ๋ถํด ๋์๋ค ์ฐ์ go-pg์ ์ ์ํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ์ธํ
์ ์ก๋๋ค.\n database.go func Connect() *pg.DB { db := pg.Connect(\u0026amp;pg.Options{ User: \u0026#34;user\u0026#34;, Database: \u0026#34;database\u0026#34;, Addr: \u0026#34;addr:port\u0026#34; }) if db == nil { log.Println(\u0026#34;Failed to connect to db\u0026#34;) } else { log.Println(\u0026#34;Connection to db success\u0026#34;) } return db } func Close(db *pg.DB) { closeErr := db.Close() if closeErr != nil { log.Println(\u0026#34;Error while closing the connection, Reason: %v\u0026#34;, closeErr) } log.Println(\u0026#34;Connection closed success\u0026#34;) } ์ด ์ค์ ์ผ๋ก db์ connect์ close๋ฅผ ํ ์ ์๋ค.\n๋ค์ ํธ์์๋ go-pg๋ฅผ ์ฌ์ฉํ select์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.\n","permalink":"https://www.springboot.kr/posts/golang-go-pg-1/","summary":"golang์์ postgresql orm go-pg ์ฌ์ฉํ๊ธฐ ์ฒ์ ๊ธ์์๋ go-pg๋ฅผ ์ฌ์ฉํ connection๊ณผ close์ ๋ํด ์ ์ด๋ณธ๋ค ์์ ์ํ์ ๋ฐ๋ผํ๋ฉด ์ ๋ ๊ฒ์ด๋ค.\n๋๋ postgresql์ ์ฌ์ฉํ๊ธฐ ์ํจ์ด ์๋๋ผ cockroach db๋ฅผ go์์ ์ฌ์ฉํ๊ธฐ ์ํด go-pg๋ฅผ ์ ํํ๋ค.\ngo-pg์ ๋ํ ๋งํฌ๋ฅผ ๊ฑธ์ด ๋ก๋๋ค.\nGithub / Document\n์์ ๋งํฌ๋ฅผ ์ฒจ๋ถํด ๋์๋ค ์ฐ์ go-pg์ ์ ์ํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ์ธํ
์ ์ก๋๋ค.\n database.go func Connect() *pg.DB { db := pg.Connect(\u0026amp;pg.Options{ User: \u0026#34;user\u0026#34;, Database: \u0026#34;database\u0026#34;, Addr: \u0026#34;addr:port\u0026#34; }) if db == nil { log.","title":"golang go-pg ์ฌ์ฉํ๊ธฐ"},{"content":"XML TO JSON (AND CUSTOM OBJECT) xml ๋ฐ์ดํฐ๋ฅผ json์ผ๋ก ๋ณํํ๊ธฐ ์ํ ์์
์ด ํ์ํ๋ค.\n๊ทธ๋ฌ๊ธฐ ์ํด์ spring framework์์ ๋ง์ด ์ฌ์ฉํ๋ jackson(jackson-dataformat-xml)์ ์ฌ์ฉํด ๋ณํ์ ํด๋ณด๋ ค ํ๋ค.\nํ์ง๋ง jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด xml์ json์ผ๋ก ๋ณํํ ๋ xml์ multiple child ๊ฐ๋ค์ด ๋ค ์ฌ๋ผ์ง๋ฉด์ ๋จ์ผ ๊ฐ์ด ๋จ๊ฒ ๋๋ค.\n๊ทธ๋์ ์ฐพ์๋ดค๋ค.\n๋๊ฐ์ ํ์์ ๊ฐ์ง๊ณ ์๋ ์ฌ๋์ ๋ฐ๊ฒฌํ๋ค.\n์คํ์ค๋ฒํ๋ก์ฐ\n๊ฑฐ๊ธฐ์ ์๋ ๋ต๋ณ์ ์ฐธ๊ณ ํด๋ณด์.\n org.json ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐ์ํจ๋ค.\n org.json ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ด ์ฌ์ฉํ๋ค.\n ์์ ์ํ์ด๋ค\nimport org.apache.commons.io.IOUtils; import org.json.JSONObject; import org.json.XML; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; ... try (InputStream inputStream = new FileInputStream(new File( \u0026#34;source.xml\u0026#34;))) { String xml = IOUtils.toString(inputStream); JSONObject jObject = XML.toJSONObject(xml); ObjectMapper mapper = new ObjectMapper(); mapper.enable(SerializationFeature.INDENT_OUTPUT); Object json = mapper.readValue(jObject.toString(), Object.class); String output = mapper.writeValueAsString(json); System.out.println(output); } ... ์ด๋ ๊ฒ ํ๋๊น Json ๊ฐ์ด ๋์ค๊ฒ ๋๋ฉฐ Object์ ๊ฐ๋ค์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.\n์ฌ๊ธฐ์ ์ปค์คํ
๋ ์ค๋ธ์ ํธ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด Object ์๋ฆฌ์ xml -\u0026gt; json์ผ๋ก ์ปจ๋ฒํฐ๋ custom object๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.\n๊ทธ๋ฌ๋ฉด ํ์ํ xml์ custom obeject์์ ๋ด์ ์ ์๊ฒ ๋๋ค.\n","permalink":"https://www.springboot.kr/posts/java-xml-to-json/","summary":"XML TO JSON (AND CUSTOM OBJECT) xml ๋ฐ์ดํฐ๋ฅผ json์ผ๋ก ๋ณํํ๊ธฐ ์ํ ์์
์ด ํ์ํ๋ค.\n๊ทธ๋ฌ๊ธฐ ์ํด์ spring framework์์ ๋ง์ด ์ฌ์ฉํ๋ jackson(jackson-dataformat-xml)์ ์ฌ์ฉํด ๋ณํ์ ํด๋ณด๋ ค ํ๋ค.\nํ์ง๋ง jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด xml์ json์ผ๋ก ๋ณํํ ๋ xml์ multiple child ๊ฐ๋ค์ด ๋ค ์ฌ๋ผ์ง๋ฉด์ ๋จ์ผ ๊ฐ์ด ๋จ๊ฒ ๋๋ค.\n๊ทธ๋์ ์ฐพ์๋ดค๋ค.\n๋๊ฐ์ ํ์์ ๊ฐ์ง๊ณ ์๋ ์ฌ๋์ ๋ฐ๊ฒฌํ๋ค.\n์คํ์ค๋ฒํ๋ก์ฐ\n๊ฑฐ๊ธฐ์ ์๋ ๋ต๋ณ์ ์ฐธ๊ณ ํด๋ณด์.\n org.json ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐ์ํจ๋ค.\n org.json ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ด ์ฌ์ฉํ๋ค.\n ์์ ์ํ์ด๋ค","title":"์๋ฐ XML TO JSON ๋ณํ ํ๊ธฐ"}]