[Spring] 1.๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง
* ์ธํ๋ฐ '๊น์ํ'๋์ ์คํ๋ง ๊ฐ์ข ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ ๋ฆฌํ ๋ด์ฉ์์ ๋ฐํ
1. ์ด์ผ๊ธฐ - ์๋ฐ ์ง์์ ์ถ์ด ๊ฒจ์ธ๊ณผ ์คํ๋ง์ ํ์
EJB (Enterprise Java Beans)
-> ์คํ๋ง / ํ์ด๋ฒ๋ค์ดํธ(->JPA) ๋ง๋ฆ
2. ์คํ๋ง์ด๋?
์คํ๋ง ์ํ๊ณ
[ํ์]
* ์คํ๋ง ํ๋ ์์ํฌ
- ํต์ฌ ๊ธฐ์ : ์คํ๋ง DI ์ปจํ ์ด๋, AOP, ์ด๋ฒคํธ, ๊ธฐํ
- ์น ๊ธฐ์ : ์คํ๋ง MVC, ์คํ๋ง WebFlux
- ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ : ํธ๋์ญ์ , JDBC, ORM ์ง์, XML ์ง์
- ๊ธฐ์ ํตํฉ : ์บ์, ์ด๋ฉ์ผ, ์๊ฒฉ์ ๊ทผ, ์ค์ผ์ค๋ง
- ํ ์คํธ : ์คํ๋ง ๊ธฐ๋ฐ ํ ์คํธ ์ง์
- ์ธ์ด : ์ฝํ๋ฆฐ, ๊ทธ๋ฃจ๋น
- ์ต๊ทผ์๋ ์คํ๋ง ๋ถํธ๋ฅผ ํตํด์ ์คํ๋ง ํ๋ ์์ํฌ์ ๊ธฐ์ ๋ค์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉ
* ์คํ๋ง ๋ถํธ
- ์คํ๋ง์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ (๊ธฐ๋ณธ)
- ๋จ๋ ์ผ๋ก ์คํํ ์ ์๋ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๊ฒ ์์ฑ
- Tomcat ๊ฐ์ ์น์๋ฒ๋ฅผ ๋ด์ฅํด์ ๋ณ๋์ ์น์๋ฒ๋ฅผ ์ค์นํ์ง ์์๋ ๋จ
- ์์ฌ์ด ๋น๋ ๊ตฌ์ฑ์ ์ํ starter ์ข ์์ฑ ์ ๊ณต
- ์คํ๋ง๊ณผ 3rd path(์ธ๋ถ)๋ผ์ด๋ธ๋ฌ๋ฆฌ ์๋ ๊ตฌ์ฑ
- ๋ฉํธ๋ฆญ, ์ํ ํ์ธ, ์ธ๋ถ ๊ตฌ์ฑ ๊ฐ์ ํ๋ก๋์ ์ค๋น ๊ธฐ๋ฅ ์ ๊ณต (๋ชจ๋ํฐ๋ง ๊ธฐ๋ฅ)
- ๊ด๋ก์ ์ํ ๊ฐ๊ฒฐํ ์ค์ (๋ํดํธ ์ค์ , ๋ฉ๋ด์ผ) -> ํ์ํ ๋ถ๋ถ๋ง customizing
[์ ํ]
- ์คํ๋ง ๋ฐ์ดํฐ : DB CRUD ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฒ
- ์คํ๋ง ์ธ์ : ์ธ์ ๊ธฐ๋ฅ ํธ๋ฆฌ
- ์คํ๋ง ์ํ๋ฆฌํฐ : ๋ณด์
- ์คํ๋ง Rest Docs : API ๋ฌธ์ ํธ๋ฆฌํ๊ฒํด์ฃผ๋๊ฒ
- ์คํ๋ง ๋ฐฐ์น : ์ฌ๋ฌ ๋ฐ์ดํฐ ํ๋ฒ์ ์ฒ๋ฆฌํ์ง ์๊ณ ๋ฐฐ์น ์์ (์ฌ๋ฌ ๋ฐ์ดํฐ ์ค ๋ช๊ฑด ํผ์ฌ๋ ค์ ์ ์ฅ ๋ฐ๋ณต)
- ์คํ๋ง ํด๋ผ์ฐ๋ : ํด๋ผ์ฐ๋ ํนํ๋ ๊ธฐ์
* ์คํ๋ง ํต์ฌ ๊ฐ๋
- ์ข์ ๊ฐ์ฒด์งํฅ ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐํ ์ ์๋๋ก ๋์์ฃผ๋ ํ๋ ์์ํฌ
3. ์ข์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ?
๊ฐ์ฒด์งํฅ์ ํน์ง : https://www.codestates.com/blog/content/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8A%B9%EC%A7%95
1) ์ถ์ํ
2) ์บก์ํ
3) ์์
4) ๋คํ์ฑ
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
- ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ ๋ช ๋ น์ด์ ๋ชฉ๋ก์ผ๋ก ๋ณด๋ ์๊ฐ์์ ๋ฒ์ด๋ ์ฌ๋ฌ๊ฐ์ ๋ ๋ฆฝ๋ ๋จ์ = ๊ฐ์ฒด๋ค์ ๋ชจ์์ผ๋ก ํ์ ํ๊ณ ์ํ๋ ๊ฒ
- ๊ฐ๊ฐ์ ๊ฐ์ฒด๋ ๋ฉ์ธ์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค. (ํ๋ ฅ)
- ์ ์ฐํ๊ณ ๋ณ๊ฒฝ์ด ์ฉ์ดํ๊ธฐ ๋๋ฌธ์ ๋๊ท๋ชจ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ฌ์ฉ๋๋ค.
์ ์ฐํ๊ณ ๋ณ๊ฒฝ ์ฉ์ด?
-> ๋ ๊ณ ๋ธ๋ญ ์กฐ๋ฆฝํ๋ฏ์ด
-> ํค๋ณด๋ ๋ง์ฐ์ค ๊ฐ์ ๋ผ์ฐ๋ฏ์ด
-> ์ปดํจํฐ ๋ถํ ๊ฐ์ ๋ผ์ฐ๋ฏ์ด
-> ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ณ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ๋ฉด์ ๊ฐ๋ฐํ ์ ์๋ ๋ฐฉ๋ฒ
๋คํ์ฑ
๋คํ์ฑ์ ์ค์ธ๊ณ ๋น์
- ์ญํ ๊ณผ ๊ตฌํ์ผ๋ก ์ธ์์ ๊ตฌ๋ถ
ex1)
ex2)
- ์๋์ฐจ์ ์ญํ / ์๋์ฐจ ๊ตฌํ ๊ตฌ๋ถ
- ์๋ก์ด ์๋์ฐจ๊ฐ ๋์๋ ํด๋ผ์ด์ธํธ๋ฅผ ๋ฐ๊ฟ ํ์๊ฐ ์์
[์ฅ์ ]
> ํด๋ผ์ด์ธํธ๋ ๋์์ ์ญํ (์ธํฐํ์ด์ค)๋ง ์๋ฉด ๋๋ค.
> ํด๋ผ์ด์ธํธ๋ ๊ตฌํ ๋์์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋ ๋๋ค.
> ํด๋ผ์ด์ธํธ๋ ๊ตฌํ ๋์์ ๋ด๋ถ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋์ด๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
> ํด๋ผ์ด์ธํธ๋ ๊ตฌํ ๋์ ์์ฒด๋ฅผ ๋ณ๊ฒฝํด๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
์๋ฐ์์๋ ์ด๋ป๊ฒ?
- ์๋ฐ ์ธ์ด์ ๋คํ์ฑ์ ํ์ฉ
์ญํ = ์ธํฐํ์ด์ค
๊ตฌํ = ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค (๊ตฌํ ๊ฐ์ฒด)
- ๊ฐ์ฒด ์ค๊ณ์ ์ญํ (์ธํฐํ์ด์ค)์ ๋จผ์ ๋ถ์ฌํ๊ณ , ๊ทธ ์ญํ ์ ์ํํ๋ ๊ตฌํ ๊ฐ์ฒด ๋ง๋ค๊ธฐ
= ์ธํฐํ์ด์ค(์ญํ )๊ฐ ์ค์!
'๊ฐ์ฒด์ ํ๋ ฅ' ๊ด๊ณ๋ฅผ ๋จผ์ ์๊ฐ
- ํด๋ผ์ด์ธํธ = ์์ฒญ / ์๋ฒ = ์๋ต
- ์ ๋ง์ ๊ฐ์ฒดํด๋ผ์ด์ธํธ์ ๊ฐ์ฒด ์๋ฒ๋ ์๋ก ํ๋ ฅํ๋ ๊ด๊ณ
์๋ฐ ์ธ์ด๊ฐ ๋คํ์ฑ์ ์ด๋ป๊ฒ ๊ตฌํํ๋๊ฐ?
์ค๋ฒ๋ก๋ฉ(Overloading) : ๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋ ์ฌ๋ฌ๊ฐ๋ฅผ ๊ฐ์ง๋ฉด์ ๋งค๊ฐ๋ณ์์ ์ ํ๊ณผ ๊ฐ์๊ฐ ๋ค๋ฅด๋๋ก ํ๋ ๊ธฐ์
์ค๋ฒ๋ผ์ด๋ฉ(Overriding) : ์์ ํด๋์ค๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฉ์๋๋ฅผ ํ์ ํด๋์ค๊ฐ ์ฌ์ ์ํด์ ์ฌ์ฉ
ex) ์ค๋ฒ๋ผ์ด๋ฉ : ๋ฉค๋ฒ์๋น์ค์์ ํน์ ํจ์๋ฅผ ํธ์ถํ์๋ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ๊ฐ์ฒด๊ฐ ๋ญ์ง์๋ฐ๋ผ ๊ฐ ํจ์์ ํฌํจ๋ ํน์ ํจ์(ex.save)๊ฐ ํธ์ถ๋๋๋ก ํ๋ ๋ฐฉ์
ํด๋ผ์ด์ธํธ(๋ฉค๋ฒ์๋น์ค)๊ฐ ์๋ฒ(๋ฆฌํฌ์งํฐ๋ฆฌ)๋ฅผ ์์กดํ ๋ ๋ฆฌํฌ์งํฐ๋ฆฌ์ ๋ฐ๋ผ ๋ค๋ฅธ ์๋ฒ ํธ์ถ๊ฐ๋ฅ
ํด๋ผ์ด์ธํธ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์๋ฒ์ ๊ตฌํ ๊ธฐ๋ฅ์ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝ๊ฐ๋ฅ
์คํ๋ง๊ณผ ๊ฐ์ฒด ์งํฅ
- ๋คํ์ฑ์ด ๊ฐ์ฅ ์ค์
- ์คํ๋ง์ ๋คํ์ฑ์ ๊ทน๋ํํด์ ์ด์ฉํ ์ ์๊ฒ ๋์์ค
- ์คํ๋ง์์ ์ ์ด์ ์ญ์ (Ioc), ์์กด๊ด๊ณ์ฃผ์ (DI)์ ๋คํ์ฑ์ ํ์ฉํด์ ์ญํ ๊ณผ ๊ตฌํ์ ํธ๋ฆฌํ๊ฒ ํ ์ ์๋๋ก ์ง์
4. ์ข์ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น
SOLID
1) SRP : ๋จ์ผ ์ฑ
์ ์์น (Single Responsibility Principle)
2) OCP : ๊ฐ๋ฐฉ-ํ์ ์์น (Open/closed Principle)
3) LSP : ๋ฆฌ์ค์ฝํ ์นํ ์์น (Liskov Substitution Principle)
4) ISP : ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น (Interface Segregation Principle)
5) DIP : ์์กด๊ด๊ณ ์ญ์ ์์น (Dependency Inversion Principle)
1) SRP : ๋จ์ผ ์ฑ ์ ์์น (Single Responsibility Principle)
- ํ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผํ๋ค.
- ํ๋์ ์ฑ ์ = ๋ชจํธํ๊ธดํจ (ํด์๋ ์์์๋, ๋ฌธ๋งฅ๊ณผ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฆ)
- ์ค์ํ ๊ธฐ์ค์ ๋ณ๊ฒฝ -> ๋ณ๊ฒฝ์ด ์์ ๋ ํ๊ธํจ๊ณผ๊ฐ ์ ์ผ๋ฉด ๋จ์ผ ์ฑ ์ ์์น์ ์ ๋ฐ๋ฅธ ๊ฒ (UI ๋ณ๊ฒฝ, ๊ฐ์ฒด ์์ฑ๊ณผ ์ฌ์ฉ ๋ถ๋ฆฌ)
2) OCP : ๊ฐ๋ฐฉ-ํ์ ์์น (Open/closed Principle) **
- ํ์ฅ์๋ ์ด๋ ค์์ผ๋ ๋ณ๊ฒฝ์๋ ๋ซํ์์ด์ผํ๋ค.
- ์ฝ๋์ ๋ณ๊ฒฝ์์ด ํ์ฅ์ด ๊ฐ๋ฅํด์ผํ๋ค -> ๋คํ์ฑ
- ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผํ๋ค! (๋ฉค๋ฒ ์๋น์ค)
- ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋ ๋ณ๋์ ์กฐ๋ฆฝ, ์ค์ ์๊ฐ ํ์ํ๋ค (= ์คํ๋ง์ ์ญํ )
3) LSP : ๋ฆฌ์ค์ฝํ ์นํ ์์น (Liskov Substitution Principle)
- ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์์ผ๋ฉด์ ํ์ ํ์ ์ ์ธ์คํด์ค๋ก ๋ฐ๊ฟ ์ ์์ด์ผํ๋ค.
- ๋คํ์ฑ์์ ํ์ ํด๋์ค๋ ์ธํฐํ์ด์ค ๊ท์ฝ์ ๋ค ์ง์ผ์ผํ๋ค๋ ๊ฒ, ๋คํ์ฑ์ ์ง์ํ๊ธฐ ์ํ ์์น, ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๋ ๋ฏฟ๊ณ ์ฌ์ฉํ๋ ค๋ฉด ์ด ์์น์ด ํ์ํ๋ค.
- ๋จ์ํ ์ปดํ์ผ์ ์ฑ๊ณตํ๋ ๊ฒ์ ๋์ด์๋ ์ด์ผ๊ธฐ
- ex) ์๋์ฐจ ์ธํฐํ์ด์ค์ ์ ์ ์ ์์ผ๋ก ๊ฐ๋ผ๋ ๊ธฐ๋ฅ / ๋ค๋ก ๊ฐ๊ฒ ๊ตฌํํ๋ฉด LSP์๋ฐ, ๋๋ฆฌ๋๋ผ๋ ์์ผ๋ก ๊ฐ์ผํจ.
4) ISP : ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น (Interface Segregation Principle)
- ํน์ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ธํฐํ์ด์ค ์ฌ๋ฌ ๊ฐ๊ฐ ๋ฒ์ฉ ์ธํฐํ์ด์ค ํ๋๋ณด๋ค ๋ซ๋ค
- ex) ์๋์ฐจ ์ธํฐํ์ด์ค - ์ด์ ์ธํฐํ์ด์ค / ์ ๋น ์ธํฐํ์ด์ค ๋ถ๋ฆฌ
์ฌ์ฉ์ ํด๋ผ์ด์ธํธ - ์ด์ ์ ํด๋ผ์ด์ธํธ / ์ ๋น์ฌ ํด๋ผ์ด์ธํธ ๋ถ๋ฆฌ
-> ๋ถ๋ฆฌํ๋ฉด ์ ๋น ์ธํฐํ์ด์ค ์์ฒด๊ฐ ๋ณํด๋ ์ด์ ์ ํด๋ผ์ด์ธํธ์ ์ํฅ์ ์ฃผ์ง ์์
- ์ธํฐํ์ด์ค๊ฐ ๋ช ํํด์ง๊ณ ๋์ฒด ๊ฐ๋ฅ์ฑ์ด ๋์์ง
5) DIP : ์์กด๊ด๊ณ ์ญ์ ์์น (Dependency Inversion Principle)**
- ์์กด์ฑ ์ฃผ์ -> ์ถ์ํ์ ์์กด O ๊ตฌ์ฒดํ์ ์์กด X (์์น)
- ๊ตฌํ ํด๋์ค์ ์์กดํ์ง ๋ง๊ณ ์ธํฐํ์ด์ค์ ์์กดํ๋ผ๋ ๋ป!
- ์ญํ ์ ์์กดํ๊ฒ ํด์ผํ๋ค๋ ๋ป! (๊ตฌํ์ด ์๋๋ผ)
- ๊ฐ์ฒด ์ธ์๋ ํด๋ผ์ด์ธํธ๊ฐ ์ธํฐํ์ด์ค์ ์์กดํด์ผ ์ ์ฐํ๊ฒ ๊ตฌํ์ฒด๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
๊ตฌํ์ฒด์ ์์กดํ๋ฉด ๋ณ๊ฒฝ์ด ์ด๋ ค์์ง๋ค.
- ๊ทธ๋ฐ๋ฐ OCP์์ ์ค๋ช ํ ๋ฉค๋ฒ์๋น์ค๋ ์ธํฐํ์ด์ค์ ์์กดํ์ง๋ง, ๊ตฌํ ํด๋์ค๋ ๋์์ ์์กดํ๋ค.
- ๋ฉค๋ฒ์๋น์ค ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌํ ํด๋์ค๋ฅผ ์ง์ ์ ํ
MemberRepository m = new MemoryMemberRepository();
-> ๋ฉค๋ฒ ์๋น์ค๋ ๋ฉ๋ชจ๋ฆฌrepo ๋ฟ๋ง ์๋๋ผ ๋ฉ๋ชจ๋ฆฌ๋ฉค๋ฒrepo ๊น์ง ์๊ณ ์๋ ๊ฒ
= ๋ฉค๋ฒ ์๋น์ค๋ ์ธํฐํ์ด์ค์ ์์กดํ์ง๋ง ๊ตฌํ ํด๋์ค๋ ๋์์ ์์กดํ๋ค
= ๋ฉค๋ฒ ์๋น์ค ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌํ ํด๋์ค๋ฅผ ์ง์ ์ ํํ๊ณ ์๋ ๊ฒ (๋ฉค๋ฒ์๋น์ค ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌํ ํด๋์ค(๋ฉ๋ชจ๋ฆฌ๋ฉค๋ฒ๋ ํฌ) ์ ํ/์์กด)
-> DIP ์๋ฐ (์ถ์ํ์๋ง ์์กดํด์ผํ๋๋ฐ ๊ตฌ์ฒดํ๊น์ง ์์กด)
-> ๊ทธ๋ผ ์ด๋ป๊ฒ ํ๋ผ๋ ๊ฑฐ์ผ?!
-> ๋ฐฉ๋ฒ์ด ์์
[์ ๋ฆฌ]
- ๊ฐ์ฒด ์งํฅ์ ํต์ฌ = ๋คํ์ฑ
BUT
- ๋คํ์ฑ ๋ง์ผ๋ก๋ ์ฝ๊ฒ ๋ถํ์ ๊ฐ์ ๋ผ์ฐ๋ฏ ๊ฐ๋ฐํ ์ ์๋ค.
- ๋คํ์ฑ ๋ง์ผ๋ก๋ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ ๋ ํด๋ผ์ด์ธํธ ์ฝ๋๋ ํจ๊ป ๋ณ๊ฒฝ๋๋ค.
- ๋คํ์ฑ๋ง์ผ๋ก๋ OCP / DIP ๋ฅผ ์งํฌ ์ ์๋ค.
= WE NEED MORE!
5. ๊ฐ์ฒด์งํฅ์ค๊ณ์ ์คํ๋ง
๋ค์ ์คํ๋ง์ผ๋ก
- ์คํ๋ง์
> DI (dependency injection, ์์กด๊ด๊ณ, ์์กด์ฑ ์ฃผ์ )
> DI ์ปจํ ์ด๋ ์ ๊ณต
์ผ๋ก OCP, DIP๋ฅผ ๊ฐ๋ฅํ๊ฒ ์ง์
- ํด๋ผ์ด์ธํธ ์ฝ๋์ ๋ณ๊ฒฝ ์์ด ๊ธฐ๋ฅ ํ์ฅ
- ์ฝ๊ฒ ๋ถํ์ ๊ต์ฒดํ๋ฏ์ด ๊ฐ๋ฐ
- ์ธํฐํ์ด์ค๋ฅผ ๋จผ์ ์ค๊ณํ๊ณ ๊ตฌํ์ ๋์ค์ ์ ํ๋ฉด, ๊ตฌํ ๊ธฐ์ ์ด ๋ฐ๋๋๋ผ๋ ๋๋จธ์ง ๋ณ๊ฒฝํ ํ์ ์์ด์ ๋ณ๊ฒฝ์ ๋ฒ์ ์๊ณ ์ ์ฐํด์ง
์ค๋ฌด๊ณ ๋ฏผ?
๋ฌด๋ถ๋ณ ๋จ๋ฐ -> ์ถ์ํ๋ผ๋ ๋น์ฉ์ด ๋ฐ์ (๋ค์ด๊ฐ์ ํ์ธํด์ผํจ)
-> ๊ธฐ๋ฅ ํ์ฅ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฉด ๊ตฌ์ฒด ํด๋์ค ์ง์ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ด์ฐฎ์! (๋์ค์ ๋ฆฌํฉํฐ๋งํด์ ์ธํฐํ์ด์ค ๋์ )
'๐จโ๐ป Web Development > Spring - ๊ธฐ๋ณธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] 6.์ปดํฌ๋ํธ ์ค์บ (0) | 2023.02.24 |
---|---|
[Spring] 5.์ฑ๊ธํค ์ปจํ ์ด๋ (0) | 2023.02.22 |
[Spring] 4.์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น (0) | 2023.02.20 |
[Spring] 3.์คํ๋ง ํต์ฌ ์๋ฆฌ ์ดํด2 - ๊ฐ์ฒด ์งํฅ ์๋ฆฌ ์ ์ฉ (0) | 2023.02.18 |
[Spring] 2.์คํ๋ง ํต์ฌ ์๋ฆฌ ์ดํด1 - ์์ ๋ง๋ค๊ธฐ (0) | 2023.02.17 |
์ต๊ทผ๋๊ธ