๐ŸณDev/์ฐจ๊ทผ์ฐจ๊ทผ ๊ธฐ์ดˆ ๋‹ค์ง€๊ธฐ

[์ฐจ๊ทผ์ฐจ๊ทผ ๊ธฐ์ดˆ ๋‹ค์ง€๊ธฐ] 01. BackEnd: Server - Spring

fortune.00 2021. 11. 27. 17:52

ํ•™๊ต์—์„œ 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์„ ์•Œ์•„๋ณด์ž.

  1. @Autowired
    Type์— ๋”ฐ๋ผ์„œ ์•Œ์•„์„œ Bean์„ ์ฃผ์ž…ํ•œ๋‹ค.
  2. @Component
    ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ž‘์„ฑํ•œ Class๋ฅผ Bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. @Controller, @Service, @Repository ๋“ฑ ๋กœ ๊ตฌ์ฒดํ™” ๋˜๋Š” Bean ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ตฌ๋ถ„์„ ํ†ตํ•ด ๊ฐ€๋…์„ฑ์€ ๋ฌผ๋ก  ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
  3. @RestController (= @Controller + @ResponseBody)
    @Controller๋Š” API์™€ View๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.
    @ResponseBody๋Š” data(Json๊ณผ xml) ํ˜•ํƒœ๋กœ ์š”์ฒญ์— ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
    ์ฆ‰, RestController๋Š” View ์—†์ด API๋งŒ ์ง€์›ํ•˜๋Š” ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” Controller๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, data(Json๊ณผ xml) ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์‘๋‹ตํ•œ๋‹ค.
  4. @RequestMapping
    ๊ธฐ๋ณธ์ ์œผ๋กœ @ResponseBody์˜๋ฏธ๋ฅผ ๊ฐ€์ •ํ•œ๋‹ค.
    Class Level Mapping์ด๋ฉด, ์ธ์ž ๊ฐ’์„ ํ†ตํ•ด ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋‹น ํด๋ž˜์Šค์—์„œ ์ง„ํ–‰ํ•œ๋‹ค.
    ๋ฉ”์†Œ๋“œ ๋‹จ์œ„๋กœ ์ง„ํ–‰ํ•˜๋ฉด, ์š”์ฒญ url์— ๋Œ€ํ•ด ์„ธ๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  5. 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