ํฐ์คํ ๋ฆฌ ๋ทฐ
Spring ์คํฐ๋๋ฅผ 5์ฃผ๊ฐ ์งํํ์๋ค. ์ฝ๋ฆฐ์ด์ธ ๋๋ ๋์ด๋๊ฐ ๋ชน์ ์ด๋ ต๊ณ ๋ฐ๋ผ๊ฐ๊ธฐ ๋ฒ ์ฐผ๋ ์คํฐ๋์๋ค. ๊ทธ๋๋ ์๊ฒ๋๊ฒ๋ ๋ง์ด ์๊ณ ๋ด๊ฐ ์๋๊ฒ๊ณผ๋ ๋ค๋ฅธ ๋ด์ฉ๋ ์์ด์ ํ๊ธธ ์ํ๋ค๋ ์๊ฐ์ด๋ ๋ค. ๊ด๋ จ ์ฐธ๊ณ ์๋ฃ๋ฅผ ์ฐ์ ๋ค ์ ์ฅํด๋๊ณ ํ๋ ํ๋ ๋ค์ ๋ณด๋๋ก ํ ๊ฒ์ด๋ค.
Restful API
-
DEVOPEDIA ์๋ฌธ์ผ๋ก ๋์ด์๋ ์ค๋ช [Richardson Maturity Model](https://devopedia.org/richardson-maturity-model#summary)
-
๋ฆฌ์ฐจ๋ ์ฑ์๋ ๋ชจ๋ธ ํ๊ธ ์ค๋ช [Richardson Maturity Model](https://brunch.co.kr/@pubjinson/12)
-
NAVER DEVIEW 2017 [๊ทธ๋ฐ REST API๋ก ๊ด์ฐฎ์๊ฐ by ์ด์์ค](https://tv.naver.com/v/2292653)
DDD building blocks
[DDD, Part 2: DDD Building Blocks](https://dzone.com/articles/ddd-part-ii-ddd-building-blocks)
[DDD(Domain Driven Design) - ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ๋?](https://huisam.tistory.com/entry/DDD)
**DDD ๊ตฌ์ฑ์์**
-
Entities
์ํฐํฐ๋ id๊ฐ ์๊ณ ์ ์ฌ์ ์ผ๋ก ๋ณ๊ฒฝ๊ฐ๋ฅํ ์ผ๋ฐ ๊ฐ์ฒด์ด๋ค. ๊ฐ ์ํฐํฐ๋ ์์ฑ์ด ์๋ ID๋ก ๊ณ ์ ํ๊ฒ ์๋ณ๋๋ค. ๋ฐ๋ผ์ ๋ ์ํฐํฐ๊ฐ ์์ฑ์ด ๋ค๋ฅด๋๋ผ๋ ๋์ผํ ID๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด ๋ ์ํฐํฐ๊ฐ ๋์ผํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ ๋ ์ ์๋ค.(์๋ณ์ ๋์ผ์ฑ) ์ฆ, ์ํฐํฐ์ ์ํ๋ ์ธ์ ๋ ์ง ๋ณ๊ฒฝ๋ ์ ์์ง๋ง ๋ ์ํฐํฐ๊ฐ ๋์ผํ ID๋ฅผ ๊ฐ๋ ๋ ์ํฐํฐ๋ ์ด๋ค ์์ฑ์ ๊ฐ์ง๊ณ ์๋์ง์ ๊ด๊ณ์์ด ๋์ผํ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ค.
-
Value Objects
VO๋ ๋ถ๋ณํ๋ค. VO๋ ์ํฐํฐ์์ ๋ณผ์์๋ ID๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค. ๋ ๊ฐ์ VO๊ฐ ๋์ผํ ํ์ ๊ณผ ๊ฐ์ ์์ฑ(๋ชจ๋ ์์ฑ์ ์ ์ฉ๋จ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๋์ผํ ๊ฐ์ฒด๋ก ๊ฐ์ฃผ๋ ์ ์๋ค.
์ข ์ข ๋ฉ์์ง ์ ๋ฌ๊ณผ ๊ฐ์ ์ฉ๋๋ก ์ฌ์ฉ๋๋ฉฐ ์ค์ ๋ก ์ด๋ ๋ถ๋ณ์ ์ธก๋ฉด์ ๋ฐ๋์ ๋ ธ์ถํ์ง ์๊ณ ๋๋ฉ์ธ ๊ฐ๋ ์ ๋ ธ์ถํ๋ ์ํ ์ํคํ ์ฒ ๋ด์ API๊ณ์ธต์์ ํนํ ์ ์ฉํ๋ค.
[์ํ์ํคํ ์ฒ๊ฐ ๋ญ์ง ๋ชฐ๋ผ์ ๊ฒ์](https://dev.to/barrymcauley/onion-architecture-3fgl)
VO์ ์ด์ :
-
VO์ ๋ณตํฉ์ ๋ง์ ๊ณ์ฐ ๋ณต์ก์ฑ์ ์ผํฌ ์ ์๋ค.
-
์ํฐํฐ๋ ๋ ผ๋ฆฌ ๋ณต์ก์ฑ์์ ํด์ ๋ ์ ์๋ค.
-
ํนํ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ ์ด์ค ๊ฐ๋ฅ์ฑ ๋ฐ ๋์์ฑ ๋ฌธ์ ์ ๋ํ ํ์ฅ์ฑ์ ๊ฐ์ ํ๋ค.
-
-
Aggregate Roots
Aggregate Roots๋ ๋ค๋ฅธ ์ํฐํฐ์ ํจ๊ป ๊ฒฐํฉํ๋ ์ํฐํฐ์ด๋ค. ๋ํ Aggregate Roots๋ ์ค์ ๋ก ์ง๊ณ์ ์ผ๋ถ์ด๋ค.(๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์ํด ๋จ์ผ ๋จ์๋ก ์ฒ๋ฆฌ๋๋ ๊ด๋ จ ๊ฐ์ฒด์ ์ปฌ๋ ์ /ํด๋ฌ์คํฐ) ๋ฐ๋ผ์ ๊ฐ ์ง๊ณ๋ ์ค์ ๋ก ์ง๊ณ๋ฃจํธ์ ๊ฒฝ๊ณ๋ก ๊ตฌ์ฑ๋๋ค. ์๋ฅผ ๋ค์ด, SalesOrderDomain ๋ด์ Order์ OrderLineItem ๊ฐ์ ๊ด๊ณ๋ Order๊ฐ ์ง๊ณ ๋ฃจํธ ์ญํ ์ ํ๋ ์ง๊ณ๋ก ๊ฐ์ฃผ๋ ์ ์์ผ๋ฉฐ OrderLineItem์ SalesOrder ๊ฒฝ๊ณ ๋ด์์ Order์ ํ์ ํญ๋ชฉ์ด๋ค.
์ง๊ณ ๋ฃจํธ์ ์ฃผ์ ๊ธฐ๋ฅ ์ค ํ๋๋ ์ธ๋ถ ๊ฐ์ฒด๊ฐ ์ง๊ณ ๋ฃจํธ ์์ ์ํฐํฐ์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ง๊ณ ๋ฃจํธ ํ์ ํญ๋ชฉ (aka ์ง๊ณ) ์ค ํ๋์ ์ก์ธ์คํด์ผํ๋ ๊ฒฝ์ฐ ์ง๊ณ ๋ฃจํธ๋ฅผ ๊ฑฐ์ณ์ผํ๋ค.(์ฆ, ํ์ ํญ๋ชฉ์ ์ง์ ์ก์ธ์ค ํ ์ ์์)
๋ค๋ฅธ ํ๊ฐ์ง๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋๋ฉ์ธ ๋ด์ ๋ชจ๋ ์์ ์ด ์ง๊ณ ๋ฃจํธ๋ฅผ ๊ฑฐ์ณ์ผํ๋ค๋ ๊ฒ์ด๋ค. Factory, Repository, Service๋ ์ด์ ๋ํ ๋ช๊ฐ์ง ์์ธ์ด์ง๋ง ๊ฐ๋ฅํ ๋๋ง๋ค ์์ ์ด ์ง๊ณ ๋ฃจํธ๋ฅผ ํต๊ณผํ๋๋ก ๋ง๋ค๊ฑฐ๋ ์๊ตฌํ ์ ์๋ค๋ฉด ๋ ์ข์ ๊ฒ์ด๋ค.
-
Repositories
๋ ํฌ์งํ ๋ฆฌ๋ ์ฃผ๋ก ์ ์ฅ์๋ฅผ ๋ค๋ฃจ๋๋ฐ ์ฌ์ฉ๋๋ค. ์ค์ ๋ก DDD์์ ๊ฐ์ฅ ์ค์ํ ๊ฐ๋ ์ค ํ๋์ด๋ค. ๋ง์ ์ ์ฅ์ ๋ฌธ์ (์ : ์คํ ๋ฆฌ์ง ์ผ๋ถ ํ์/๋ฉ์ปค๋์ฆ)๋ฅผ ์ถ์ํ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ ํฌ์งํ ๋ฆฌ ๊ตฌํ์ ํ์ผ ๊ธฐ๋ฐ ์ ์ฅ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค(SQL / NoSQL๊ธฐ๋ฐ) ๋๋ ์บ์ฑ๊ณผ ๊ฐ์ ์ ์ฅ์ ๋ฉ์ปค๋์ฆ๊ณผ ๊ด๋ จ๋ ๊ธฐํ ํญ๋ชฉ์ผ ์ ์๋ค. ์ด๋ค์ ๋ชจ๋ ์กฐํฉ๋ ๊ฐ๋ฅํ๋ค.
๋ ํฌ์งํ ๋ฆฌ๋ ๋ฐ์ดํฐ์ ์ฅ์์ ํผ๋ํด์๋ ์๋๋ค. ๋ ํฌ์งํ ๋ฆฌ๊ฐ ํ๋ ์ผ์ agrregate roots๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด๋ค. ๊ทธ ์๋์์ ๋ ํฌ์งํ ๋ฆฌ ๊ตฌํ์ ์ง๊ณ๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด ์ค์ ๋ก ์ฌ๋ฌ ๋ค๋ฅธ ์ ์ฅ์ ์์น์ ํต์ ํด์ผํ ์ ์๋ค. ๋ฐ๋ผ์ ๋จ์ผ ์ง๊ณ ๋ฃจํธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ ํ์ผ๋ฟ ์๋๋ผ REST API์์ ๊ฐ์ ธ์ฌ ์ ์๋ค. ์ด๋ฅผ ๋ฐ์ดํฐ ์ ์ฅ์๋ผ๊ณ ํ๋ ๊ฒ์ ๋ํํ ์ ์์ง๋ง ๋ ํฌ์งํ ๋ฆฌ๋ ๋ชจ๋ ๊ฐ๋ณ ๋ฐ์ดํฐ ์ ์ฅ์ ์์ ์ถ๊ฐ ๋ ์ถ์ํ ๊ณ์ธต์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ ํฌ์งํ ๋ฆฌ๋ ์ํ ์ํคํ ์ฒ ๋ด ๋๋ฉ์ธ/๋๋ฉ์ธ ์๋น์ค ๊ณ์ธต ๋ด์ ์ธํฐํ์ด์ค๋ก ๊ตฌํํ ๋ค์ ๋ ํฌ์งํ ๋ฆฌ ์ธํฐํ์ด์ค์ ๊ตฌํ ๋ ผ๋ฆฌ๋ฅผ ์ธํ๋ผ ๊ณ์ธต์์ ์ ์ํ๋ค.
-
Factories
ํฉํ ๋ฆฌ๋ ๊ฐ์ฒด ๊ตฌ์ฑ์ ์ถ์ํ๋ฅผ ์ ๊ณตํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ([GOF์ ํฉํ ๋ฆฌ ๋์์ธ ํจํด](Aggregate Roots))
ํฉํ ๋ฆฌ๋ ์ ์ฌ์ ์ผ๋ก ์ง๊ณ ๋ฃจํธ๋ ์ํฐํฐ ๋๋ VO๋ฅผ ๋ฐํํ ์๋ ์๋ค. ์ข ์ข ์ง๊ณ ๋ฃจ์ธ ์ ๋ํ ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ ์ฅ์๋ก ๋กค๋ง๋๋ค. ๋ฐ๋ผ์ ์ ์ฅ์์๋ ํ์ธ๋ ์์ฑ ๋ฉ์๋๊ฐ ์์ ์ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก ๊ตฌํ ๋ ผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฉ์ธ/๋๋ฉ์ธ ์๋น์ค ๊ณ์ธต ๋ด์์ ์ธํฐํ์ด์ค๋ก ๊ตฌํ ๋ ๊ณต์ฅ๋ ์ธํ๋ผ ๊ณ์ธต์์ ์ ์๋๋ค.
-
Services
์๋น์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง๊ณ ๋ฃจํธ์ ๋ง์ง ์๋ ์์ ์ ์ํ ํ์ ์ ๊ณตํ๊ธฐ ์ํด ์กด์ฌํ๋ค. ์๋ฅผ ๋ค์ด ์์ ์ด ์๊ณ ์ด๋ค ์ง๊ณ ๋ฃจํธ๋ก ๋ค์ด๊ฐ๋์ง ๋ชจ๋ฅผ ๋ ์ฌ๋ฌ ์ง๊ณ ๋ฃจํธ์์ ์๋ํ๊ณ ๋ ๊ธฐ์กด ์ง๊ณ ๋ฃจํธ์ ์ํ์ง ์์ ์ ์๋ค. ๊ทธ๋ฐ ๋ค์ ๋ ผ๋ฆฌ๋ฅผ ์๋น์ค์ ๋ฃ์ ์ ์๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ๊ฒ์ ์๋น์ค์์ ํ๋ ค๊ณ ํ๋ฉด ์๋๋ค. ๋ฌด์๋ณด๋ค๋ ์์ ์ด ๊ธฐ์กด ์ง๊ณ ๋ฃจํธ ์ค ํ๋์ ์ ํฉํ์ง ์ ์คํ๊ฒ ๋ถ์ํ๋ ๊ฒ์ด ์ข๋ค. ์ง๊ณ ๋ฃจํธ๋ฅผ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ์๋ ์ง๊ณ ๋ฃจํธ ํ๋๋ฅผ ๋์ณค๋์ง ์ค์ค๋ก์๊ฒ ๋ฌผ์ด๋ณด๋๊ฒ์ด ์ข๋ค. ์๋๋ฉด ์์ ์ ๋๋ฉ์ธ์ ๊ฐ์ ธ์ค๊ธฐ ์ ์ ๋๋ฉ์ธ์ผ๋ก ๊ฐ์ ธ์์ผํ๋ค๊ณ ์๊ฐํ์ง ์๋ ๋๋ฉ์ธ ๊ฐ๋ ์ด ์์ ์ ์๋ค.
**๊ธฐํ ์ค์ํ ์ฌํญ**
![img](https://cdn-images-1.medium.com/max/1600/1*-PJWpAFq29uDEqJt0zMrDQ.png)
VO ๋ฐ DTO๋ POJO / POCO์ ํ์ ์งํฉ์ด๋ค. ์ํฐํฐ๋ ๋ํ POJO / POCO์ ํ์ ์งํฉ์ด๋ค. ์์ ๋ฌ์ฌ์์ POJO์ POCO๋ ์๋ก ๋ฐ๊ฟ์ ์ฌ์ฉํ ์ ์๋ค. ๋ ๋ค ๋น์ทํ ๊ฒ์ ์ธ๊ธํ๊ณ ์๋ค. ๋ ๋ค ๋น์ฆ๋์ค ์์ฉ ํ๋ก๊ทธ๋จ ๋ด์์ ์ฃผ๋ก ๋๋ฉ์ธ / ๋น์ฆ๋์ค ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ ๋๋ฉ์ธ ๊ฐ์ฒด์ด๋ค.
POJO (plain old Java object)๋ผ๋ ์ฉ์ด๋ Martin Fowler๊ฐ ๋ง๋ ๊ฒ์ผ๋ก Java ์ปค๋ฎค๋ํฐ์์ ๋งค์ฐ ์ธ๊ธฐ๊ฐ์๋ ๋ฐ๋ฉด POCO (plain old CLR object / plain old class object)๋ dotNet์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ค.
์์ ์ธ๊ธํ๋ฏ์ด DTO, VO ๋ฐ ์ํฐํฐ๋ POJO / POCO์ ํ์ ์งํฉ ์ผ๋ฟ์ด์ง๋ง ์๋์ ์ค๋ช ๋๋๋ก ์ค์ ๋ก๋ ๋ค๋ฅด๋ค.
![img](https://cdn-images-1.medium.com/max/1600/1*gLLWywd76Tg_poJ0aiWalg.png)
DTO๋ ๋ฉ์ฒญํ ๋ฐ์ดํฐ ์ปจํ ์ด๋์ด๋ค(๋ก์ง์์ด ์ค์ง ๋ฐ์ดํฐ๋ง ๋ค๊ณ ์์). ๋ฐ๋ผ์ ์ผ๋ฐ์ ์ผ๋ก ๋นํ์ด๋ค(์์ฑ ๋ฐ getter/setter๋ง ํฌํจ). DTO๋ ์ ๋์ ์ผ๋ก ๋ถ๋ณ์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก DTO๋ฅผ ์ฌ์ฉํ์ฌ ํ๋์ ๋จ์ผ ์์ฉ ํ๋ก๊ทธ๋จ์์ ๊ณ์ธต๊ณผ ๊ณ์ธต๊ฐ์ ๋๋ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์์ฉ ํ๋ก๊ทธ๋จ์ผ๋ก ๋๋ JVM์์ JVM(๋ค์ค ๋คํธ์ํฌ ํธ์ถ์ ์ค์ด๊ธฐ ์ํด ๋คํธ์ํฌ๊ฐ์ ๊ฐ์ฅ ์ ์ฉํจ)๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ ์กํ๋ค.
VO ๋ํ ๋ถ๋ณ์ด์ง๋ง DTO์ ๋ค๋ฅธ์ ์ VO์๋ ๋ ผ๋ฆฌ๊ฐ ํฌํจ๋์ด์๋ค๋ ๊ฒ์ด๋ค.
DTO(Data Transfer Object) & VO (Value Object)
[์์ด๋ก ๋ ์ค๋ช DTO](https://martinfowler.com/eaaCatalog/dataTransferObject.html)
[์์ด๋ก ๋ ์ค๋ช VO](https://martinfowler.com/eaaCatalog/dataTransferObject.html)
[DTO vs VO](https://multifrontgarden.tistory.com/182)
[final ํค์๋ ๋ถ๋ณ ์ ์](https://www.schibsted.pl/blog/immutability-entities-and-value-objects/)
[๊น๋ํ๊ฒ DTO ๊ด๋ฆฌํ๊ธฐ](https://velog.io/@p4rksh/Spring-Boot%EC%97%90%EC%84%9C-%EA%B9%94%EB%81%94%ED%95%98%EA%B2%8C-DTO-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0)
-
DTO๋ฅผ ์์ฑํ๊ณ ๋ฐํํ๋ ๋ด์ฉ์ ๋ชจ๋ **์ปจํธ๋กค๋ฌ**์ ์์ด์ผ ํ๋ค.
-
์๋น์ค๋ ๋ค๋ฅธ ์๋น์ค์์๋ ํธ์ถ ๋ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ฉ์ธ ๊ฐ์ฒด๋ค์ด ์ฌ์ฉ๋์ด์ผํ๋ค. ์๋น์ค์์๋ DTO๋ฅผ ์ฌ์ฉํ๊ธฐ ๋ณด๋ค๋ ๋๋ฉ์ธ ๊ฐ์ฒด๋ค์ธ Entity, VO๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
-
DTOํด๋์ค์ SETTER๋ฅผ ๋์ด๋ ์๊ด์ด ์์ง๋ง ๋ถ๋ณ์ด ๊ฐ๋ฅํ๋ฉด ๋ถ๋ณ์ผ๋ก ํด์ค๋ค.
-
๋ฐ์ดํฐ ์ ๋ฌ์ ์ํด DTO๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ Map์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ๊ฐ๊ฐ ์ฅ๋จ์ ์ด ์์
-
DTO๋ ๋์ฑ ๋ช ์์ ์ธ ์ฅ์ ์ ์์ง๋ง, class๋ฅผ ์๋ก ๋ง๋ค์ด์ผ ํ๋ ๋จ์
-
Map์ ์ถ๊ฐ์ ์ธ class๊ฐ ํ์์์ง๋ง, ์ฃผ์ ๋ฑ์ ํตํด ํ์ ์ด ์ฝ๋๋ก ์ ๋ช ์ธ๋ฅผ ํด๋์์ผ ํจ
-
-
Response DTO
-
์ด๋ ํ ํ์ ๋ ๋ด์ ์ ์๋๋ก ์ ๋ค๋ฆญ ์ฒ๋ฆฌํ์
-
์ด ํด๋์ค์ ์ญํ ์ด ๋ฌด์์ธ์ง, ๋ฌด์จ ์ ๋ณด๋ฅผ ๋ด์์ผํ ์ง ์๊ฐํ๊ธฐ ๋ชจ๋ api์ ์๋ต์ ํํํ ์ ์๋ ํํ๋ง๊ณ -> ์ด๊ฒ ๋ฌด์จ ๋ง์ธ์ง ๋ชจ๋ฅด๊ฒ ๋ค,,
-
ResponseDTO๋ ๋ณดํต code(์ํ ์ฝ๋), message(๋ฉ์ธ์ง), data(์ ๋ฌ ๋ฐ์ดํฐ)๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
-
์์ฑ์์ ResponseDto๋ฅผ ๋ฆฌํดํด์ฃผ๋ ๋ฉ์๋, Getter๋ฅผ ๋ง๋ค์ด ์ค๋ค. Setter๋ ๋ง๋ค์ง ์์(๋ถ๋ณ์ด๊ธฐ ๋๋ฌธ์)
-
DAO์ Repository
[DAO์ Repository์ ์ฐจ์ด์ ](https://stackoverflow.com/questions/8550124/what-is-the-difference-between-dao-and-repository-patterns)
๋น๋ ํจํด
[๋น๋ ๋์์ธ ํจํด์ผ๋ก ๋ถ๋ณ์ฑ ๋ฌ์ฑ](https://dzone.com/articles/immutability-with-builder-design-pattern)
[๋กฌ๋ณต - @Builder ์ด๋ ธํ ์ด์ ](https://www.baeldung.com/lombok-builder)
Lambda ํํ์
[Java 8 Lambda ํํ์ ์์ ](https://www.byteslounge.com/tutorials/java-8-lambda-expressions-example)
Spring JDBC
`Spring JDBC`๋ ์คํ๋ง ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ ๋ฐ์ดํฐ ์ ๊ทผ ๋ชจ๋์ด๋ค. ๋จ์ํ๊ฒ DB CRUD์ธ์๋ ํธ๋์ญ์ ๊ด๋ฆฌ, ์ ๊ทผ ์ ์์ธ ์ฒ๋ฆฌ ๋ฑ์ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
`๋ฐ์ดํฐ ์์ค`๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด DB์ ์ ๊ทผํ๊ธฐ ์ํ ์ถ์ํ๋ ์ฐ๊ฒฐ ๋ฐฉ์, ์ฆ ์ปค๋ฅ์ (java.sql.connection)์ ์ ๊ณตํ๋ ์ญํ ์ ํ๋ ๋ ์์ ์ง์นญํ๋ค. ๋ฐ์ดํฐ ์์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ์ธ๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค.
-
**์ ํ๋ฆฌ์ผ์ด์ ๋ชจ๋์ด ์ ๊ณตํ๋ ๋ฐ์ดํฐ ์์ค**
Commons DBCP, Tomcat JDBC Connection Pool๊ณผ ๊ฐ์ด ์๋ํํฐ๊ฐ ์ ๊ณตํ๋ ๋ฐ์ดํฐ ์์ค ํน์ DriverManagerDataSource ๊ฐ์ด ์คํ๋ง ํ๋ ์์ํฌ๊ฐ ํ ์คํธ ์ฉ๋๋ก ์ ๊ณตํ๋ ๋ฐ์ดํฐ ์์ค๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
-
**์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๊ฐ ์ ๊ณตํ๋ ๋ฐ์ดํฐ ์์ค** ์๋ฒ๊ฐ ์ ์ํ ๋ฐ์ดํฐ ์์ค๋ฅผ JNDI(Java Namming and Directory Interface)๋ฅผ ํตํด ๊ฐ์ ธ์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
-
**๋ด์ฅํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ์์ค**
H2 ๊ฐ์ ๋ด์ฅํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๋ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
์คํ๋ง ๋ถํธ์์ ์คํ๋ง JDBC์ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ฐ๊ฒฐํ๋ ์์ ์ application.properties ์ ์์ฑํ๋ฉด๋๋ค.
Spring JDBC๋ฅผ ์ฌ์ฉํ๋ฉด ๊ณตํต์ ์ด๊ณ ๋ฐ๋ณต๋๋ ์์ ์ ๋์ ํด์ค๋ค๋ ์ด์ ์ด ์๋ค.
-
์ปค๋ฅ์ ์ ์ฐ๊ฒฐ๊ณผ ์ข ๋ฃ
-
SQL ๋ฌธ์ ์คํ
-
SQL ๋ฌธ์ ์คํ ๊ฒฐ๊ณผ ํ์ ๋ํ ๋ฐ๋ณต ์ฒ๋ฆฌ
-
์์ธ ์ฒ๋ฆฌ
๋ฐ๋ผ์ ๊ฐ๋ฐ์๋ SQL๋ฌธ์ ์ ์, ํ๋ผ๋ฏธํฐ ์ค์ , SQL์์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์จ ํ ๋ ์ฝ๋ ๋ณ๋ก ํ์ํ ์ฒ๋ฆฌ๋ง ํ๋ฉด๋๋ค.
Spring JDBC๋ Jdbc Template๋ผ๋ ํด๋์ค๋ก ๋ฐ์ดํฐ CRUD ์์ ์ ์ฒ๋ฆฌํ๋ค.
**Jdbc Template CRUD ์์ ์ ์ฃผ์ ๋ฉ์๋**
๋ฉ์๋๋ช ์ค๋ช
queryForObject | ํ๋์ ๊ฒฐ๊ณผ ๋ ์ฝ๋ ์ค ํ๋์ ์นผ๋ผ ๊ฐ์ ๊ฐ์ ธ์ฌ ๋ ์ฌ์ฉ, RowMapper ๋ฑ๊ณผ ๋งคํ์ ๋์์ฃผ๋ ํด๋์ค์ ํจ๊ป ์ฌ์ฉํ๋ฉฐ ๊ฐ์ฒด์ ๋งคํ, ๊ฒ์๊ฒฐ๊ณผ๊ฐ ์๊ฑฐ๋ ๋๊ฐ ์ด์์ด๋ฉด ์์ธ (IncorrectResultSizeDataAccessException)์ ๋ฐ์์ํด, ์๋ฐ ๊ฐ์ฒด๋ก ๋งคํํ RowMapper ๊ฐ์ฒด๋ฅผ ๋ฐ๋์ ์ง์ ํด์ผํจ |
queryForMap | ํ๋์ ๊ฒฐ๊ณผ ๋ ์ฝ๋ ์ ๋ณด๋ฅผ Map ํํ๋ก ๋งคํ |
queryForList | ์ฌ๋ฌ ๊ฐ์ ๊ฒฐ๊ณผ ๋ ์ฝ๋๋ฅผ List๋ก Map<String, Object> ํํ๋ก ๋ง๋ค์ด์ ๋ฐํ |
query | ResultSetExtractor, RowCallbackHander์ ๊ฐ์ด ์ฌ์ฉ, ์คํ๊ฒฐ๊ณผ๊ฐ List<T>์ผ ๋ ์ฌ์ฉ |
update | ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ SQL INSERT, DELETE, UPDATE๋ฅผ ์คํํ ๋ ์ฌ์ฉ |
https://m.blog.naver.com/adamdoha/222078797274
https://velog.io/@sa833591/Repository-Jdbc-%EC%B2%98%EB%A6%AC-%EC%BD%94%EB%93%9C-%EA%B5%AC%ED%98%84
[baeldung Spring JDBC](https://www.baeldung.com/spring-jdbc-jdbctemplate)
JDBC Template
-
[(Spring JDBC) Spring JDBC๋ฅผ ์ด์ฉํ ๋ฐ์ดํฐ ์ ๊ทผ ๋ฐฉ์](https://gmlwjd9405.github.io/2018/05/15/setting-for-db-programming.html)
-
[(Spring JDBC) JDBC Template์ ๊ธฐ๋ณธ ์ฌ์ฉ ๋ฐฉ๋ฒ](https://gmlwjd9405.github.io/2018/12/19/jdbctemplate-usage.html)
-
[JDBC Template querey ~ ๋ค์ํ ํ์ ์์ ](https://blog.outsider.ne.kr/882)
-
Spring ๊ธฐ์ค์ด๋ผ ์ด์ง ๋ manualํ๋ฐ, SpringBootdptjsms application.properties์ ์ค์ ํด๋ datasource ์ค์ ์ ๋ฐํ์ผ๋ก Jdbc Template์ ์ด๋ฏธ ๋ง๋ค์ด ๋๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฅ JDBC Template์ ๋ฐ๋ก DI ๋ฐ์์ ์ฌ์ฉํ๋ฉด ๋๋ค.
JDBC datasource ์ค์
-
application.properties์ db ๊ด๋ จ ์ค์ ์ ์ํด์ฃผ๋ฉด Failed to configure a DataSource ์ด์ฉ๊ณ ํ๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฏ๋ก ์ค์ ์ ํด์ค ๊ฒ
KeyHolder & PerparedStatement
jdbcTemplate.update()๋ก ๋ ์ฝ๋๋ฅผ ์ฝ์ ํ๋ ๋์์ ํด๋น ๋ ์ฝ๋์ key๊ฐ์ ๋ฐํํ๊ธฐ
Spring MVC
[baeldung](https://www.baeldung.com/spring-mvc-tutorial)
[Spring Docs](https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html)
Spring Message Source
[baeldung message source](https://www.baeldung.com/spring-custom-validation-message-source)
Validation
[์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ ์ ํจ์ฑ ๊ฒ์ฌ์ ๋ํ ์ ์ฒด ๊ฐ์ด๋](https://reflectoring.io/bean-validation-with-spring-boot/)
[baeldung Validation](https://www.baeldung.com/spring-boot-bean-validation)
Spring unit Testing
[์คํ๋ง docs test](https://docs.spring.io/spring-framework/docs/current/reference/html/testing.html#testing-introduction)
Spring MVC Test
[์น๋ ์ด์ด ํ ์คํธ - JUnit](https://spring.io/guides/gs/testing-web/)
[์คํ๋ง MVC ๋จ์ ํ ์คํธ Junit](https://thswave.github.io/java/2015/03/02/spring-mvc-test.html)
ํ ์คํธ ์์ฑ์ ๋ง์ด ํด๋ณด๋ ์ฐ์ต์ ํ๋ผ
mock
ํ ์คํธ๋ฅผ ํ๋ค๊ฐ ์คํจ๋ฅผ ํ๋ ๊ฒฝ์ฐ ๋๋ฒ๊น ์ ํด์ผ์ง
์ํ๋ ๊ฒฐ๊ณผ๊ฐ์ด ๋์ค์ง ์์์ ๋ ๊ทธ ์คํจํ ๋ฉ์๋์ ๋ธ๋ ์ดํนํฌ์ธํธ๋ฅผ ๊ฑธ์ด์ฃผ๊ณ
๊ทธ ๋ฉ์๋๋ฅผ ๋๋ฒ๊ทธ๋ก ์คํ์ ํด์ค๋ค. ์ด๋ ๊ฒ ํด์ฃผ๋ฉด ์ด๋๋ถ๋ถ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ์ ์์์๋ค. ํ ์์ฃผ ๋ชจ๋ฅด๋ ์๋ฆฌ๋ผ ๋ง๋งํ๋ค
ํ ์คํธ ๋ถ๋ถ์์ log ์์ฑ์ ํด์ค๋ใ ๋๋ค
๋ง์ฝ ํ ์คํธ๋ฅผ ํ๋ค๊ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์์ธ๋ฅผ ๋ง๋ฌ์ ๋ ์๋ฌ๋ฉ์์ง๋ฅผ ๋ณด๊ณ ๋ฌด์์ํ๋๋? ์ฝ๊ณ ๊ตฌ๊ธ๋ง์ ํฉ๋๋ค. ์ต์ ์ ์ ๋ํ ๊ฒ์ ์ฝ์ด๋ณธ๋ค.
Mock
[baeldung mock](https://www.baeldung.com/java-spring-mockito-mock-mockbean)
[MovkMvc๋ฅผ ์ฌ์ฉํด GET, POST ํ ์คํธํ๊ธฐ](https://shinsunyoung.tistory.com/52)
๋ผ์ด๋ธ๋ฌ๋ฆฌ
-
[PasswordEncoder](https://velog.io/@corgi/Spring-Security-PasswordEncoder%EB%9E%80-4kkyw8gi)
-
apache์์ ์ ๊ณตํ๋ ์๋ฐ ์ ํธ๋ฆฌํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
-
[json ์ ํธ๋ฆฌํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ](https://github.com/FasterXML/jackson)
-
[jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฑ๋ฅ ํฅ์์ ์ํ ํ์ฅ ํ๋ฌ๊ทธ์ธ](https://github.com/FasterXML/jackson-modules-base/tree/master/afterburner)
-
[jdbc connection pool ๋ผ์ด๋ธ๋ฌ๋ฆฌ](https://github.com/brettwooldridge/HikariCP)
-
[jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ LocalDateTime ์ฒ๋ฆฌ ํ๋ฌ๊ทธ์ธ](https://github.com/FasterXML/jackson-datatype-jsr310)
Spring Security
[Spring Security ์ฒ๋ฆฌํ๋ฆ์ ๋ํ ์ ๋ฐ์ ์ธ ์ค๋ช ](https://springsource.tistory.com/80)
Spring Security๋ฅผ ์ต๋ํ ์ฝ๊ฒ(?) ์ค๋ช ํ ๊ธ ๋ชจ์ [1](https://hyunsangwon93.tistory.com/24) [2](https://hyunsangwon93.tistory.com/26) [3](https://hyunsangwon93.tistory.com/27)
[Spring Security ์ธ๊ฐ ์ฒ๋ฆฌ ์ค๋ช ](https://zgundam.tistory.com/57?category=430446)
HTTP ์ธ์
HTTP ์ธ์ ๊ฐ์
-
[https://mohwaproject.tistory.com/entry/HTTP-Session-%EC%9D%B4%EB%9E%80](https://mohwaproject.tistory.com/entry/HTTP-Session-์ด๋)
Redis๋ฅผ ํ์ฉํ Spring Boot ์ธ์ ํด๋ฌ์คํฐ ์์
JWT
JWT ์๊ฐ
Java-Jwt ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Spring-Boot, Security๋ก ๊ตฌํํ๋ Jwt
Jwt ์ฝ์ (Jwt ๋์ฝ๋ ๋ฐ ๊ฒ์ฆ)
Spring Validation
-
[https://kapentaz.github.io/spring/Spring-Boo-Bean-Validation-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90/](https://kapentaz.github.io/spring/Spring-Boo-Bean-Validation-์ ๋๋ก-์๊ณ -์ฐ์/)
-
[https://medium.com/@gaemi/java-%EC%99%80-spring-%EC%9D%98-validation-b5191a113f5c](https://medium.com/@gaemi/java-์-spring-์-validation-b5191a113f5c)
Java Optional
์๋ฐ์์ NULL์ ์์ ํ๊ฒ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ
Lambdas & Stream API
์๋ฐ๋ 8๋ฒ์ ์ด์ ๊ณผ ๊ทธ ์ดํ๋ก ๋๋์ด ์ง๋๋ค. ๊ทธ ์ค์ฌ์๋ Stream API์ ๋๋ค ํํ์์ด ์์ต๋๋ค.
์ค๋ผํด ์น์ฌ์ดํธ์ [Java8 Lambdas, Part1](https://www.oracle.com/technical-resources/articles/java/architect-lambdas-part1.html) ๋ฒ์ญ๊ธ์ ๋๋ค.
Stream API์ ๋ํ ์ค๋ช ์ ๋๋ค.
'(๊ตฌ)Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SpringBoot] Spring Security (0) | 2021.01.20 |
---|---|
[Spring] ํ๋ก์ ํธ ๊ณผ์ ํ์ด (0) | 2020.06.14 |
[Spring] ํ๋ก์ ํธ ์ดํด๋ณด๊ธฐ (0) | 2020.06.13 |
[Spring] ํ๋ก์ ํธ ์ค์ (0) | 2020.06.13 |
[Springboot&AWS] ์คํ๋ง๋ถํธ์ AWS๋ก ํผ์ ๊ตฌํํ๋ ์น ์๋น์ค (0) | 2020.05.26 |
- Total
- Today
- Yesterday
- ์ดํด๋ฆฝ์ค ํ๊ธ ์ธ์ฝ๋ฉ
- ์ ์ฒด๊ฒ์๋ฌผ ์กฐํ
- typeAliases
- java ํ๊ฒฝ๋ณ์
- mysql์ค์น
- ๊ฒ์ํ๋ง๋ค๊ธฐ
- ๊ฒ์ํ ์กฐํ
- ๊ฐ๋ฐํ๊ฒฝ๊ตฌ์ถ
- Algorithm
- tomcat์ค์น
- java jdk ์ค์น
- Java
- ์๋ฐ
- ๋ถํธ ์๋์์ฑ
- ๊ฒ์ํ ์ญ์
- ๊ฐ๋ฐ
- ์ดํด๋ฆฝ์ค ์ค์น
- ๊ฒ์๋ฌผ์กฐํ
- ์จ๋ฆฌ์์ค
- ์คํ๋ง๋ถํธ ์๋์์ฑ
- ๊ฒ์๋ฌผ ์ญ์
- ์๊ณ ๋ฆฌ์ฆ
- ์๋ฃ๊ตฌ์กฐ
- ๋ณ๋ช ์ฒ๋ฆฌ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |