[์ฐจ๊ทผ์ฐจ๊ทผ ๊ธฐ์ด ๋ค์ง๊ธฐ] 01. BackEnd: Server - Spring
ํ๊ต์์ Comento์ ๊ฐ์ข๋ฅผ ์ง์ํด์ค์, Spring + React๋ฅผ ํตํด ๊ฐ๋จ ๊ฒ์ํ ์น์ฌ์ดํธ๋ฅผ ๋ง๋๋ ์์ ์ ์ฐธ์ฌํ์๋ค.
์ต๋ช ์ ๋ฉํ ๋๊ณผ ์ด์ฉ๋ค๋ณด๋ 1๋1๋ก ์์ ์ ์งํํ๊ฒ ๋์๋๋ฐ, ์ฃผ์ ์ ๋ํด์ `ํต์ฌ์ด`๋ค์ ์ฝ์ฝ ์ง์ด์ฃผ์ ์ ํผ์์ ๊ณต๋ถํ ๋๋ณด๋ค ํจ์ฌ ๊ณต๋ถํ๊ธฐ ์์ํ๋ ๊ฒ ๊ฐ๋ค. ๋์์ ์ด์ฌํ ๊ณต๋ถํ๋ค๊ณ ์นญ์ฐฌ๋ ๋ง์ด ๋ฐ์๋ค. ํฌ์คํ ์ ์์๊ณ ์ ๋ง๋ ๊ฒ์ ์๋์ง๋ง, ๋ฉํ ๋์ด ๋ค๋ฅธ ๋ฉํฐ๋ค์๊ฒ ์๋ํ์ จ๋ค๊ณ ํด์ ๋๋ฌด ๋ฟ๋ฏํ๋ค. ใ ใ
5๊ฐ์ ํฌ์คํ ์ ๊ฑธ์ฒ ๋ฐฐ์ด ๋ด์ฉ์ ์ ๋ฆฌํ์๋๋ฐ, ์๋ ๋ฒจ๋ก๊ทธ์ ์๋ ํฌ์คํธ๋ฅผ ์ด๊ณณ์ผ๋ก ํ๋์ฉ ์ด๋ํ๋ ค๊ณ ํ๋ค.
์์!
๐ฑSpring
์คํ๋ง(Spring)์ JVM ๊ธฐ๋ฐ์ ์ธ์ด์ธ JAVA, Kotlin, Groovy๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ ํ๋ ์์ํฌ์ด๋ค.
์์กด์ฑ ์ฃผ์
(DI, Dependency Injection) ์ปจํ
์ด๋
์ ์ ์ด์ ์ญ์ (IOC, Inversion Of Control)
์ ํน์ง์ผ๋ก ํ๋ฉฐ, ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ์ด ๋ ๋์ ๊ฐ์ฒด์งํฅ์ ๋ชฉํ๋ก ํ๋ค.
๋์์ ์คํ๋ง ์ปจํ ์ด๋๋ ํ๋ก์ ํธ๋ฅผ ๋ณ๋์ ์ฑ๊ธํค์ผ๋ก ๊ตฌํํ์ง ์์๋ ์์ฒด์ ์ผ๋ก Singleton์ ๊ตฌํํ๋ค.
Spring์ Spring ์ํ๊ณ, Spring Framework, DI Container ์์ฒด ๋ฑ ๋์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ฉฐ, ์ํฉ๊ณผ ๋ฌธ๋งฅ์ ๋ง๊ฒ ์ดํดํ๋ฉด ๋๋ค.
IOC์ DI
์ผ๋ฐ์ ์ผ๋ก ์์กด์ฑ์ ๊ฐ๋ฐ์๊ฐ ์ ์ดํ๋ค. ์์กด์ฑ์ ์ด๋ค ๊ฐ์ฒด๊ฐ ์ฌ์ฉํด์ผํ ๊ฐ์ฒด๋ผ๊ณ ํ ์ ์์ผ๋ฉฐ, ๊ฐ์ฒด ์์์ new๋ฅผ ํตํด ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ฉด ๋๋ค. ํ์ง๋ง ์คํ๋ง์์๋ ์ง์ ์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ์ด ์๋๊ณ ์ธ๋ถ์์ ์์กด์ฑ์ ๊ฐ์ ธ์จ๋ค.
์ด๋ ์ธ๋ถ์์ ์์กด์ฑ์ ์ฃผ์ ํ๋ ๊ฒ์ DI๋ผ๊ณ ํ๋ค. ๋ํ ์ด๋ฌํ ์ํฉ์์ IOC๋ ์์กด์ฑ ์ ์ด์ ์ฃผ์ฒด๊ฐ ๊ฐ๋ฐ์์์ ํ๋ ์์ํฌ๋ก ์ญ์ ๋์์์ ์๋ฏธํ๋ค.
์คํ๋ง IOC ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด๋ค์ Bean์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
//๊ฐ์ฒด ์์์ ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์๋ค.
//๋ง์ฝ ์ฌ์ฉํ๋ ค๋ ๊ฐ์ฒด๊ฐ ๋ฐ๋๋ฉด ํด๋น ๊ฐ์ฒด๊ฐ ์ฐ์ด๋ ๋ชจ๋ ๊ณณ์ ๋ฐฉ๋ฌธํ์ฌ ์์ ํด์ผํ๋ค.
public OwnerController(){
this.owners = new OwnerRepo();
this.visits = new VisitRepo();
}
//๊ฐ์ฒด๋ฅผ ์ธ๋ถ์์ ์ธ์๋ก ๋ฐ์์ค๊ณ ์๋ค.
public OwnerController(OwnerRepo ownerService, VisitRepo visits){
this.owners = ownerService;
this.visits = visits;
}
๊ฒฐํฉ๋์ ์์ง๋
๋ชจ๋์ ๋ ๋ฆฝ์ฑ์ ๋ํ๋ด๋ ์งํ
- ๊ฒฐํฉ๋๋ ๋ชจ๋๊ฐ์ ์ํธ ์์กด ์ ๋
- ์์ง๋๋ ๋ชจ๋ ๋ด๋ถ์ ๊ธฐ๋ฅ์ ์ธ ์ง์ค ์ ๋
๊ฒฐํฉ๋๋ ๋ฎ๊ณ , ์์ง๋๋ ๋์์ผ ์ด์์ ์ด๋ค.
Spring Boot
์คํ๋ง ๋ถํธ(Spring Boot)๋ Spring์ ๊ฐํธํ๊ฒ ์ฌ์ฉํ๋๋ฐ ๋์์ ์ฃผ๋ ์คํ๋ง ํ๋ ์์ํฌ์ ์๋ธ ํ๋ก์ ํธ์ด๋ค.
Singleton Pattern
์ฑ๊ธํค(Singleton Pattern)์ด๋ ์ธ์คํด์ค๋ฅผ 1๊ฐ๋ก ์ ํํ๋ฉฐ, ์ด๋์๋ ์ ๊ทผ ํ ์ ์๋๋ก ํ๋ ๋์์ธํจํด์ด๋ค.
๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ์ค์ด๊ณ , ์ ์ญ์ด๋ฏ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๊ณต์ ํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ง๋ง, ์ผ๋ฐ์ ์ธ ๊ฐ๋ฐ์์ ๋จ์ ์ด ๋ ๋ง๋ค. ํ์ง๋ง ์๋ง์ ํธ๋ํฝ์ด ์กด์ฌํ๋ ์๋ฒ ํ๊ฒฝ์์ ์ฑ๊ธํค์ ํจ์จ์ ์ด๋ฏ๋ก, ์คํ๋ง ํ๋ ์์ํฌ๋ ์์ฒด์ ์ผ๋ก ๋จ์ ์ ๋ณด์ํด์ ์ด๋ฅผ ์ฌ์ฉํ๋ค.
๐ฟSpring ์์ํ๊ธฐ
๊ทธ๋ผ Spring Initializr๋ฅผ ์ฌ์ฉํ์ฌ Spring ํ๋ก์ ํธ๋ฅผ ์์ํด๋ณด์.
๋ถ๋ช ํ Gradle์ ์ ํํ๋๋ฐ, Maven ํ์ผ์ด ์์ด์ ๋นํฉํ๋ค. ๋คํํ๋ ๋น๋ํ๋, ํ์ผ์ด Gradle๋ก ๋ฐ๋์๋ค. ํด
Maven๊ณผ Gradle
๋น๋ ๊ด๋ฆฌ ๋๊ตฌ๋ก, ํ๋ก์ ํธ์ ํ์ผ๋ค์ JVM์ด๋ WAS๊ฐ ์ธ์ํ ์ ์๋๋ก ํจํค์งํด์ฃผ๋ ์ญํ ์ ํ๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์๋ ๊ด๋ฆฌํ์ฌ ํ๋ก์ ํธ ์์ฑ, ํ ์คํธ ๋น๋, ๋ฐฐํฌ ๋ฑ์ ์์ ์ ์ํํ๋ค.
๊ณผ๊ฑฐ์๋ Maven์ ํ์ฌ๋ ์ฃผ๋ก Gradle์ ์ฌ์ฉํ๋ค. Maven๋ณด๋ค Gradle์ด ์ฑ๋ฅ, ๊ฐํธ์ฑ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์์กด์ฑ ๊ด๋ฆฌ ๋ฉด์์ ๋ฐ์ด๋๋ค.
๐พDB ์ฐ๊ฒฐํ๊ธฐ
์ด์ mySql๋ฅผ ์ฐ๊ฒฐํด๋ณด์. ์ฐ์ธก์ ๋ณด๋ฉด Gradle๊ณผ Database์ ๋ํ ๋ฒํผ์ด ์๋ค. Database๋ฅผ ํตํด MySql์ ์ฐ๊ฒฐํด์ค๋ค.
JDBC API์ DB ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํด JDBC Driver๊ฐ ํ์ํ๋ค. ์ฐ๋ฆฌ๋ MySql์ ์ฌ์ฉํ๋ฏ๋ก mysql์ J Connector๋ฅผ Project Structure์ Library์ ๊ฒฝ๋ก๋ฅผ ํฌํจํด์ค๋ค. ํด๋น jar์ ๋ค์ด ๋ฐ์ ์ฐ๊ฒฐํ ์ ์์ง๋ง, ์๋ ์ฌ์ดํธ์์ ๋ฐ์จ ์์กด์ฑ์ gradle์ ์ถ๊ฐํด ์ฃผ์ด๋ ๋๋ค.
Spring Initializer์์ ์์ฑํ ํ๋ก์ ํธ๋ฅผ ๋ฐ๋ก ์คํํ๋ฉด, datasource์ url์ ๋ํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
ํ์ง๋ง application.yml(application.properties)๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด์ฃผ๋ฉด ์ค๋ฅ์์ด ๊ธฐ๋ณธ์ ์ธ ์๋ฒ๊ฐ ์คํ๋๋ค.
JDBC, ORM, JPA, Hibernate
JDBC(Java Database Connectivity)๋ Java์์ DB์ ์ ์ํ ์ ์๋๋ก ํ๋ Java API์ด๋ค. JDBC API๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ฌํ ์์ ์ ๋ฐ๋ณตํ๊ณ , ๊ฐ์ฒด๋ฅผ ์ ๋ณด ์ ๋ฌ์๋ง ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์งํฅ์ ์ด์ง ๋ชปํ ๋จ์ ์ด ์๋ค.
๋ฐ๋ผ์ ๊ฐ์ฒด์ DB์ ํ ์ด๋ธ์ด ๋งคํ์ ์ด๋ฃจ๋ ORM(Object Relational Mapping)๋ฅผ ์ฌ์ฉํ๊ฒ ๋์๋ค. ์ด๋ฅผ ํตํด ๊ฐ์ฒด์ ํ ์ด๋ธ์ ๊ฐ์ ๊ฐ๋ ์ผ๋ก ์๋ฏธํ๊ณ , ์ฟผ๋ฆฌ๊ฐ ์๋๋ผ ์ฝ๋๋ฅผ ํตํด์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ ์ ์๊ฒ ๋์๋ค.์ฟผ๋ฆฌ ๋ณต์ก์ฑ์ ๋ํ ํ๊ณ์ ์ฑ๋ฅ์ query๋ณด๋ค ๋๋ฆฌ์ง๋ง, ์์ฐ์ฑ์ด ๋งค์ฐ ๋๋ค๋ ์ฅ์ ์ด ์๋ค.
JPA(Java Persistant API)์ Java ORM ๊ธฐ์ ์ ๋ํ API ํ์ค ๋ช ์ธ๋ฅผ ์๋ฏธํ๋ค. ORM์ ์ฌ์ฉํ๊ธฐ ์ํ ์ธํฐํ์ด์ค์ ์งํฉ์ด๋ฉฐ, JPA๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ Hiberate์ ๊ฐ์ JPA๋ฅผ ๊ตฌํํ ORM ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ค.
Hiberate๋ ๋ฐ๋ณต์ ์ธ SQL์ ์ฌ์ฉํ์ง ์์ ์์ฐ์ฑ์ด ์ข๊ณ , JPA๊ฐ ์ ์ง๋ณด์๋ฅผ ๋์ ํด์ฃผ๋ฉฐ, ํน์ DB์ ์ข ์์ ์ด์ง ์์ผ๋ฏ๋ก DB ์ ํ์ด ์์ ๋กญ๋ค.
์ฌ์ค Hiberate๊ฐ ์ง์ํ๋ ๋ฉ์๋ ๋ด๋ถ์๋ JDBC API๊ฐ ๋์ํ๋ค. ๊ทธ๋์ ์ค์ ํด๋น ๋ฉ์๋๊ฐ ๋ด ์๋์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋์ง ๋ชจ๋ํฐ๋ง ํ ์ ์์ด์ผ ํ๋ฏ๋ก SQL์ ์์์ผ ํ๋ค. ๋ํ ๋ณต์กํ SQL์ ์ํํ๊ธฐ ์ด๋ ค์ฐ๋ฏ๋ก, ์ํฉ์ ๋ฐ๋ผ SQL์ ์ง์ ์ฌ์ฉํ ์ง JPA๋ฅผ ์ฌ์ฉํ ์ง ์ ์ ํ๊ฒ ์ ํํ๋ค.
์ง๋ ฌํ์ YAML
์ง๋ ฌํ(Serialization)๋ ๊ฐ์ฒด๋ฅผ ํน์ ํฌ๋ฉง์ผ๋ก ๋ณํํ์ฌ ์ ์ก ๊ฐ๋ฅํ ํํ๋ก ๋ง๋๋ ๊ฒ์ ์๋ฏธํ๋ค. csv, json, txt ๋ฑ์ผ๋ก ๋ณํ์ด ๊ฐ๋ฅํ๋ค.
๋ฐ๋๋ก ์ญ์ง๋ ฌํ(Deserialization)์ ์ง๋ ฌํ๋ ํ์ผ์ ๋ค์ ๊ฐ์ฒด์ ํํ๋ก ๋ง๋๋ ๊ฒ์ ์๋ฏธํ๋ค.
yaml/yml์ ์ฌ๋์ด ์ฝ๊ฒ ์ฝ์ ์ ์๋ ์ง๋ ฌํ ์ธ์ด์ด๋ค.(json์ yaml์ ์ผ์ข ) ์์์ properties ํ์ฅ์๋ฅผ yml๋ก ๋ณํ์ํจ ํฐ ์ด์ ๋ ๊ฐ๋ ์ฑ ๋๋ฌธ์ด์ง๋ง, ๋ฆฌ์คํธ ํํ์ด ์ฉ์ดํ๊ณ , ์ฃผ์ ์ฒ๋ฆฌ, ๊ตฌ๋ถ์๋ฅผ ํตํด ํ ํ์ผ ๋ด์์ ์ฌ๋ฌ ํ์ผ๋ก ๋ถ๋ฆฌํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
๐ผSpring MVC
์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์กฐ์ ์ผ๋ก ์ค๊ณ ๋ฐ ์ ์ํ๋ ์ํคํ ์ณ ์ค ํ๋๋ก, ์ผ๋ฐ์ ์ธ Model, View, Controller ๊ตฌ์กฐ๋ฅผ ์ด๋ฃฌ๋ค. Spring์์๋ Model์ Data Access Object(DAO), Data Transfer Obcect(DTO), Service๋ก ์ธ๋ถํํ์๋ค.
๋จผ์ View๋ ์ฌ์ฉ์์ ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋ง๋ฟ๋ ๋ถ๋ถ์ด๋ค. Controller๋ ํด๋ผ์ด์ธํธ์์ ๋น์ฆ๋์ค ๋ก์ง์ ์ ์ดํ๊ณ , Service๊ฐ ์ค์ ๋ก ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ค. ์ด๋ Service๋ DAO๋ก DB์ ์ ๊ทผํ๊ณ , DTO๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ๋๋ค.
ํฌ๊ฒ View์ Controller๋ Presentation Layer, Service์ DTO๋ Business Layer, DAO๋ Persistance layer์ ํฌํจ๋์ด ์๋ค.(๋ค์ํ ์๊ฒฌ๋ค์ด ๋ง๋ค.)
DAO๋ @Repository๋ก ์ ์ํ๋ฉฐ, ๋๋ JPARepository๋ฅผ implementํ Interface๋ก ์ ์ธํ๋ค. class๊ฐ ์๋ interface๋ก ์ ์ธํ๋ฉด ์ ์ฐ์ฑ๊ณผ ํ์ฅ์ฑ์ด ์๊ธด๋ค.
DTO๋ ๊ณ์ธต๊ฐ ๋ฐ์ดํฐ ๊ตํ์ ๋ชฉ์ ์ผ๋ก DB์ Entity๋ฅผ ์๋ฏธํ๋ฏ๋ก, data์ data์ ๋ํ getter์ setter๋ง์ ๊ฐ์ง๋ค.
๋น์ฆ๋์ค ๋ก์ง (Business Logic) : ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์ ์ผ์ปซ๋๋ค.
Java Annotation
@๋ฅผ ์ด์ฉํ ์ฃผ์์ผ๋ก, Java Code์ ํน๋ณํ ์๋ฏธ์ ๊ธฐ๋ฅ์ ์ํํ๋๋ก ํ๋ค. ํ๋ก๊ทธ๋จ์ ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ meta data์ด๋ค. ํด๋์ค, ๋ฉ์๋, ๋ณ์ ๋ฑ์ ์ ์ธ์ด ๊ฐ๋ฅํ๋ค.
- ์ปดํ์ผ๋ฌ์๊ฒ ์ฝ๋ ์์ฑ ๋ฌธ๋ฒ ์๋ฌ๋ฅผ ์ฒดํฌํ๋๋ก ์ ๋ณด ์ ๊ณต
- ์ํํธ์จ์ด ๊ฐ๋ฐ ํด์ด ๋น๋๋ ๋ฐฐ์นํ ๋, ์๋์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋๋ก ์ ๋ณด๋ฅผ ์ ๊ณต
- ์คํ ๋๋ ๋ฐํ์ ์ ํน์ ๊ธฐ๋ฅ์ ์คํํ๋๋ก ์ ๋ณด๋ฅผ ์ ๊ณต
๋์์ ์ฝ๋ ์คํ ์ค Reflection์ ์ด์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ๊ตฌ์กฐ์ ๋์์ ๊ฒ์ฌ, ์กฐ์ฌ, ์์ ํ ์ ์๋ค. ์ฆ, ํ๋ ์์ํฌ์ ์ ์ฐ์ฑ์๋ ๋์์ ์ํด ์ฌ์ฉ๋๋ค.
๋ํ์ ์ธ ๋ช๊ฐ์ annotation์ ์์๋ณด์.
- @Autowired
Type์ ๋ฐ๋ผ์ ์์์ Bean์ ์ฃผ์ ํ๋ค. - @Component
๊ฐ๋ฐ์๊ฐ ์ง์ ์์ฑํ Class๋ฅผ Bean์ผ๋ก ๋ฑ๋กํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. @Controller, @Service, @Repository ๋ฑ ๋ก ๊ตฌ์ฒดํ ๋๋ Bean ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค. ๊ตฌ๋ถ์ ํตํด ๊ฐ๋ ์ฑ์ ๋ฌผ๋ก ์์ธ์ฒ๋ฆฌ๋ ๊ฐ๋ฅํ๋ค. - @RestController (= @Controller + @ResponseBody)
@Controller๋ API์ View๋ฅผ ๋์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
@ResponseBody๋ data(Json๊ณผ xml) ํํ๋ก ์์ฒญ์ ์๋ตํ ์ ์๊ฒ ํด์ค๋ค.
์ฆ, RestController๋ View ์์ด API๋ง ์ง์ํ๋ ์๋น์ค์์ ์ฌ์ฉํ๋ Controller๋ฅผ ์๋ฏธํ๋ฉฐ, data(Json๊ณผ xml) ํํ๋ก ๋ฐํํ์ฌ ์๋ตํ๋ค. - @RequestMapping
๊ธฐ๋ณธ์ ์ผ๋ก @ResponseBody์๋ฏธ๋ฅผ ๊ฐ์ ํ๋ค.
Class Level Mapping์ด๋ฉด, ์ธ์ ๊ฐ์ ํตํด ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํด๋น ํด๋์ค์์ ์งํํ๋ค.
๋ฉ์๋ ๋จ์๋ก ์งํํ๋ฉด, ์์ฒญ url์ ๋ํด ์ธ๋ถ์ ์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค. - Parameter๋ฅผ ๋ฐ๋ ๋ฒ
@PathVariable : ํด๋น url์์ ํน์ ๊ฐ์ ๋ณ์๋ก ๋ฐ์์ด
@RequestParam : url ๋ค์ ๋ถ๋ ๋ณ์์ ๊ฐ์ ๊ฐ์ ธ์ด
Java Optional
์๋ฐ ์ต์ ๋(JavaOptional)์ ์ฃผ์ด์ง ๊ฐ์ฒด๊ฐ Null์ผ ๋์ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋จํ ํ๊ธฐ ์ํด Java8์ ๋์ ๋์๋ค.
์ต์ ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋, ์ค๊ฐ ์ฒ๋ฆฌ, ์ข ๋จ ์ฒ๋ฆฌ์์์ ๋ฉ์๋๊ฐ ์กด์ฌํ๋ค. ์ค๊ฐ ์ฒ๋ฆฌ ๋ฉ์๋๋ ๊ฐ์ฒด ์์ฑ ํ, ๋ฉ์๋์ ๋ฐ๋ผ ๋ณํ๋ ์ต์ ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ์ข ๋จ ์ฒ๋ฆฌ ๋ฉ์๋๋ ๋ณํ์ ์ข ๋ฃํ๊ณ , ๊ทธ ์์ ์ ๊ฐ์ฒด์ ์ํ์ ๋ฐ๋ผ ์คํ๋๋ค.
๐จ๐Postman
ํฌ์คํธ๋งจ(Postman)์ API๋ฅผ ์ค๊ณ, ๊ฐ๋ฐ, ํ ์คํธํ ์ ์๋ ํ๋ซํผ์ด๋ค. ์ผ๋ฐ์ ์ธ ๋ธ๋ผ์ฐ์ ๋ Get ๋ฐฉ์์ ์์ฒญ๋ง์ ํ์ธํ ์ ์๋ ํ๊ณ๊ฐ ์๋ค. ๋ฐ๋ผ์ ํฌ์คํธ๋งจ์ ํตํ์ฌ Get์ ํฌํจํ ๋ค์ํ ์์ฒญ๋ค์ด ์ ์ฒ๋ฆฌ๋๋์ง ํ์ธํ ์ ์๋ค.
์์ฃผ ์ ๋๋๊ฑฐ ๊ฐ์์ ํ๋ณตํ๋ค. ํํ
Reference
https://raisonde.tistory.com/entry/๊ฒฐํฉ๋Coupling๊ณผ-์์ง๋Cohension
https://chanhuiseok.github.io/posts/spring-4/
https://hellojinhwi.tistory.com/11
https://victorydntmd.tistory.com/195
https://codevang.tistory.com/164
https://goddaehee.tistory.com/213
https://m.blog.naver.com/jysaa5/221751719334
https://honeyinfo7.tistory.com/56
https://jdm.kr/blog/234
https://velog.io/@gillog/Spring-Annotation-%EC%A0%95%EB%A6%AC
https://gmlwjd9405.github.io/2018/12/02/spring-annotation-types.html