๐Ÿ“– Java&Spring

Spring Framework๋ฅผ ์•Œ์•„๋ณด์ž

bell22 2022. 4. 22. 16:19

์–ด์ฉŒ๋‹ค๋ณด๋‹ˆ Spring ๊ฐœ๋ฐœ๋„ ํ•˜๊ฒŒ ๋œ ๋‚˜
์˜คํžˆ๋ ค ์ข‹์•„ (?)
Notion์— ์ •๋ฆฌํ•ด๋’€๋˜๊ฑฐ๋ฅผ ๊ฐ€์ ธ์™”๋”๋‹ˆ ํ˜•์‹์ด ๋งŽ์ด ๊นจ์ง€๋„ด

 

๋‚ด๊ฐ€ ์ฐ์Œ

 

์ฐธ๊ณ ๋กœ Spring Framework์˜ ์Šคํ”„๋ง์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํŽธํ•˜๊ฒŒ ์œ ์šฉํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•˜๊ธธ ๋ฐ”๋ผ๋ฉฐ

๋ด„๋‚ ์ด ์˜ค๊ธธ ๋ฐ”๋ž€๋‹ค๋Š” ๋œป์ด๋ผ๊ณ  ํ•œ๋‹ค ใ…‹

 


Spring Framework

์ •์˜

์ž๋ฐ” ๊ธฐ๋ฐ˜์˜ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ

ํŠน์ง•

  • ๊ฐ์ฒด ์ง€ํ–ฅ ๊ฐœ๋ฐœ
  • Application ๊ฐœ๋ฐœ์— ์šฉ์ดํ•˜๋„๋ก (๋น ๋ฅด๊ณ  ํšจ์œจ์ ) ๊ธฐ๋ณธ ํ‹€๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ, API ๋“ฑ์„ ์ œ๊ณตํ•จ
  • ๋™์ ์ธ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณต

๐Ÿคฎ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ vs ํ”„๋ ˆ์ž„์›Œํฌ

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์„ ๋•Œ ์ง์ ‘ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ•ด๋‘” ๊ฒƒ.
    • String์€ java.lang.String์— ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ ๊ธฐ๋Šฅ
  • ํ”„๋ ˆ์ž„์›Œํฌ: ์ •ํ•ด์ง„ ํ๋ฆ„์— ๋งž๊ฒŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฏธ๋ฆฌ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ๊ฒƒ.
    • ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” MVC๋ผ๋Š” ๊ตฌ์กฐ์—์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐœ๋ฐœํ•จ

๐Ÿ˜ช MVC ํŒจํ„ด

  • Model, View, Controller
  • ์–ด๋–ป๊ฒŒ ๊ธฐ๋Šฅ์„ ์ž˜ ๋‚˜๋ˆ ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ์„๊นŒ?
  • ๋””์ž์ธ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ทœ์•ฝ์„ ์ •ํ•ด์„œ ์‰ฝ๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋งŒ๋“  ๊ฒƒ.
    • ์˜ˆ๋Šฅ ํ”„๋กœ ๋งŒ๋“ค ๋•Œ) ์ƒˆ๋กœ์šด ์•„์ด๋””์–ด → ๋ณด์ˆ˜ → ์œ ์ง€ ... ๊ฐ™์€ ๊ทœ์•ฝ
  • ์‚ฌ์šฉ์ž๊ฐ€ Controller๋ฅผ ์กฐ์ž‘ → Controller๋Š” Model์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ด → View์—์„œ ์ด๊ฑธ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œํ˜„ํ•ด์„œ ์ „๋‹ฌํ•ด์คŒ

 


Spring 3๊ฐ€์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ

1. Spring Container

(๋˜๋Š” Application Context๋ผ๊ณ  ๋ถˆ๋ฆผ)

  • ์Šคํ”„๋ง์€ ๋Ÿฐํƒ€์ž„ ์—”์ง„์„ ์ œ๊ณตํ•จ
  • ์„ค์ • ์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ App์„ ๊ตฌ์„ฑํ•˜๋Š” Object๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•จ → ์ด Object๊ฐ€ Bean(๋นˆ)์ž„
    • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” Object
  • ์˜์กด์„ฑ ๊ฐ–๋Š” ๊ฐ์ฒด์— DI(์˜์กด์„ฑ ์ฃผ์ž…, Dependency Injection)๋ฅผ ํ†ตํ•ด Object๊ฐ„ ๊ฒฐํ•ฉ๋„๋ก ๋‚ฎ์ถฐ์คŒ
๐Ÿ’ก ๐Ÿคข Bean : Spring์—์„œ Applicatiopn์„ ๊ตฌ์„ฑํ•˜๋Š” Object

 

2. ๊ณตํ†ต ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ

  • ์Šคํ”„๋ง์€ Bean์ด ์ƒ์„ฑ๋˜๊ณ  ๋™์ž‘ํ•˜๋Š” ํ‹€์„ ์ œ๊ณตํ•ด์ฃผ๊ณ , ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ธฐ์ค€๋„ ์ œ๊ณตํ•จ → ์ด๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์ด๋ผ๊ณ  ํ•จ
  • ์Šคํ”„๋ง์€ ํฌ๊ฒŒ 3๊ฐ€์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์„ ์ง€์›ํ•จ (๊ถŒ์žฅ)

 

1) IoC / DI ๐Ÿ‘

์˜ค๋ธŒ์ ํŠธ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ์™€ ์˜์กด ๊ด€๊ณ„์— ๋Œ€ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ.

  • ์œ ์—ฐํ•จ
  • ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚œ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ
  • ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™
  • ๋””์ž์ธ ํŒจํ„ด์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ๋‹ด๊ณ  ์žˆ์Œ
  • ์ฃผ๋กœ ํ™˜๊ฒฝ์„ค์ •์„ ๋‹ด๋‹นํ•˜๋Š” XML ํŒŒ์ผ์— ์˜ํ•ด ์„ค์ •๋˜๊ณ  ์ˆ˜ํ–‰๋จ

 

IoC (Inversion of Control)

  • ๋ง ๋œป๋Œ€๋กœ ์ œ์–ด์˜ ์—ญ์ „
  • ์‚ฌ์šฉ์ž๊ฐ€ Object๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์Šคํ”„๋ง์ด ์ง„ํ–‰ ํ•ด์คŒ → ๊ฒฝ๋Ÿ‰ ์ปจํ…Œ์ด๋„ˆ
  • Service, DAO ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ƒ์„ฑ (new)๋ฅผ ํ•˜์ง€ ์•Š์Œ
  • @Autowired๋ฅผ ํ†ตํ•ด ๋ฐ›์•„ ์‚ฌ์šฉํ•จ

 

public class order {
	private customer customer;
  	
  	public order() {
  		this.customer = new customer();
  	}
  }
  // Spring ํ”„๋กœ์ ํŠธ
  public class order {

  	@Autowired
	private customer customer;

  }

 

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ (IoC Container)๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” Object๋ฅผ Bean์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์Œ
    • @Autowired๋ฅผ ํ†ตํ•ด Object๋ฅผ ์ฃผ์ž…ํ•ด์คŒ
    • ๊ธฐ์กด Java ์—์„œ๋Š” new๋กœ ์ƒ์„ฑํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋‹ค๋ฅธ object๋กœ ๋ณด๋‚ด๊ฑฐ๋‚˜ ์†Œ๋ฉธํ•จ → new & delete ๋“ฑ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์–ด๋ฅผ ์ง์ ‘ ์ง„ํ–‰ํ•จ

 

๐Ÿ’ก Spring์—์„œ๋Š” ์ œ์–ด๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹ˆ๋ผ, Spring Framework๊ฐ€ ์ง„ํ–‰ ํ•ด์ค€๋‹ค

๐Ÿ˜ท Spring Bean vs JAVA Bean

  • Spring Bean
    • Spring Container๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด
    • ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑํ•ด ์ƒ๋ช… ์ฃผ๊ธฐ ๊ด€๋ฆฌ๋ฅผ ํ•ด์คŒ.
    • ํ•„์š”ํ•œ ๊ณณ์— ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ด์ฃผ๋Š” ๊ฐ์ฒด๋“ค์„ ์˜๋ฏธ
  • JAVA Bean
    • ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด
    • ์Šคํ”„๋ง์˜ DTO(VO)์™€ ์œ ์‚ฌํ•œ ๊ฐœ๋…
    • private ๋ณ€์ˆ˜์™€ Getter/Setter๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์ง๋ ฌํ™”๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด

 

DI (Dependency Ingection)

  • ๋ง ๊ทธ๋Œ€๋กœ ์˜์กด์„ฑ ์ฃผ์ž…
  • ์Šคํ”„๋ง์—์„œ IoC ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹
  • IoC๋Š” ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์Šคํ”„๋ง ์ฐจ๋ณ„์ ์ด ๋ถ€์กฑํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ๊ฐœ๋….

๐Ÿ˜ฌ DI ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  • ๊ฐ์ฒด๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•จ
  • ๋ฐ–์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ๋„ฃ์–ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์‚ฌ์šฉ์„ฑ ↑, ์ˆ˜์ • ์šฉ์ด

 

// ๊ธฐ์กด ์ž๋ฐ” ํ”„๋กœ์ ํŠธ
class concept_api implements Post(){}
class concept_Spring implements Post(){}

class Blog_log() {
private Post post; // ๋ธ”๋กœ๊ทธ ๊ธ€ ํด๋ž˜์Šค

  public Blog_log() {
  	this.post = new concept_api();
		this.post = new concept_Spring();
  }
}


๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋Š” CRUD ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•จ;;;

private Post post;

    public Blog_log(Post post) {
    	this.post = new Post();
    }


์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ด DI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Blog_log ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค

2) PSA

Portable Service Abstraction, ํฌํ„ฐ๋ธ” ์„œ๋น„์Šค ์ถ”์ƒํ™”

  • ํŠน์ • ํ™˜๊ฒฝ์ด๋‚˜ ์„œ๋ฒ„, ๊ธฐ์ˆ ์— ์ข…์†๋˜์ง€ ์•Š์Œ → ์œ ์—ฐํ•˜๊ฒŒ App ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ
  • ์Šคํ”„๋ง์€ ์ถ”์ƒํ™” ๊ณ„์ธต์œผ๋กœ ๊ตฌ์ฒด์ ์ธ ๊ธฐ์ˆ /ํ™˜๊ฒฝ์— ์ข…์†๋˜์ง€ ์•Š๋„๋ก ํ•ด์คŒ
    • MyBatis, JPA ๋“ฑ ์„ธ๋ถ€ ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ์—๋Ÿฌ๋„ ์ถ”์ƒํ™”ํ•ด์„œ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•ด์คŒ
    • ์ถ”์ƒํ™”๋ฅผ ์œ„ํ•ด Proxy ํŒจํ„ด๊ณผ ๊ฐ™์€ ๋””์ž์ธ ํŒจํ„ด์ด ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ํ•จ

 

3) AOP

Aspect Oriented Programming, ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (OOP ๋ณด๋‹ค ์ข€ ๋” ๋ฐœ์ „๋œ ๊ฐœ๋…)

  • App์— ๊ณตํ†ต์ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ๋…์ง‘์ ์œผ๋กœ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ
    • ๋กœ๊น…, ๋ณด์•ˆ, ํŠธ๋žœ์žญ์…˜ ๋“ฑ
  • ์Šคํ”„๋ง์€ AOP๋ฅผ ์ง€์›ํ•ด์„œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์„œ๋น„์Šค๋ฅผ ์ ์šฉํ•˜๊ณ ๋„ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊นฐ๋”ํ•˜๊ฒŒ ํ•จ. ๊ฐ์ฒด์ง€ํ–ฅ ์Šค๋Ÿฝ๊ฒŒ ๊ฐœ๋ฐœํ•˜๋„๋ก ํ•ด์คŒ.
  • ์Šคํ”„๋ง์€ @Transactional ์ด๋ผ๋Š” ์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์„œ AOP๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ

๐Ÿข Enterprise Service (์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์„œ๋น„์Šค)

  • ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์กฐํšŒ ๋ฐ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ํŒŒ์ดํ”„๋ผ์ธ.
  • Sync/Async ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ.
  • Web ์„œ๋น„์Šค, HTTP ๊ฐ™์€ ๋‹ค์ค‘ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

 

4) POJO (Plain Old Java Object)

์ž๋ฐ”๊ฐ€ ๋„ˆ๋ฌด ๋ฌด๊ฑฐ์›Œ์„œ, ์Šคํ”„๋ง์—์„œ ์ž๋ฐ” ๊ฐœ๋…๋งŒ ๊ธฐ๋ณธ์ ์ธ๊ฑฐ๋งŒ ๊ฐ€์ ธ์™€์„œ ํ•˜์ž! ํ•œ๊ฑฐ

 

3. API

  • Application Programming Interface, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค
  • ์šด์˜์ฒด์ œ๋‚˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“  ์ธํ„ฐํŽ˜์ด์Šค
  • ์Šคํ”„๋ง์€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์•ฑ์„ ๊ฐœ๋ฐœํ•  ๋•Œ, ๋‹ค์–‘ํ•œ ์˜์—ญ์—์„œ ๋ฐ”๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” API๋ฅผ ์ œ๊ณตํ•จ
  • ๐Ÿ‘€ Layerd Architecture(๊ณ„์ธตํ™” ์•„ํ‚คํ…์ณ)์—์„œ ํ•„์š”ํ•œ ์ฃผ์š” ๊ธฐ์ˆ ์„ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ
    • function, class, ์˜คํ”ˆ ์†Œ์Šค ๊ธฐ์ˆ  ๋“ฑ๋“ฑ ์ง€์›ํ•ด์คŒ
    • ex) ํด๋ผ์ด์–ธํŠธ์˜ Get request๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” @GetMapping ๊ฐ™์€ API๋ฅผ ์ œ๊ณตํ•จ
  • ์ง€๋‹ˆ์•ผ~ ๊ฐ™์€๊ฑธ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค!?๋ฉด TTS ๊ฐ™์€ UI๋Š” ๊ตฌ๊ธ€์ด๋‚˜ ๋„ค์ด๋ฒ„๊บผ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค

 


Spring MVC ๊ตฌ์กฐ

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋Š” MVC ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ง

๐Ÿ’ก View - Controller - Service - Serviceimpl - DAO - DAOimpl - DTO

 

1) View

  • ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด๋Š” ํ™”๋ฉด
  • ์Šคํ”„๋ง์€ JSP๋ฅผ ํ†ตํ•ด ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•จ
  • Controller๋ฅผ ํ†ตํ•ด Backend ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐํ•จ

 

2) Controlloer

  • View์™€ Service ์‚ฌ์ด๋ฅผ ์—ฐ๊ฒฐํ•ด์คŒ.
  • ํด๋ผ์ด์–ธํŠธ์—์„œ ์ž…๋ ฅํ•œ URL์— ๋งž๊ฒŒ View๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ Service๋กœ ์ „๋‹ฌํ•ด์คŒ
@RequestMapping(value = "/") 
public String home()
{
	service.method();
  return "index"; 
} // localhost:port/๋กœ ์ ‘์†ํ•œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ index.jsp๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

3) Service

  • ์‹ค์ œ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• . ๋ชจ๋“  ๊ธฐ๋Šฅ์€ Service์—์„œ ๋งŒ๋“ค์–ด์ง.
  • Controller๋ฅผ ํ†ตํ•ด View์— ์—ฐ๊ฒฐ๋˜๊ณ , DAO๋ฅผ ํ†ตํ•ด DB์™€ ์—ฐ๊ฒฐ๋จ

 

4) DAO

  • Data Access Object
  • ํ”„๋กœ์ ํŠธ์™€ DB๋ฅผ ์—ฐ๊ฒฐํ•ด์คŒ
  • Mapper์— SQL์„ ๋ช…์‹œํ•˜๊ณ  Mapper์™€ ํ•จ๊ป˜ DB ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์Œ
  • JDBC, iBATIS(MyBatis), ํ•˜์ด๋ฒ„๋„ค์ดํŠธ ๋“ฑ ์ง€์› ๊ธฐ๋Šฅ ์ œ๊ณต. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‰ฝ๊ฒŒ ๊ฐ€๋Šฅ

๐Ÿ˜ฌ Service์˜ Serviceimpl ์™€ DAO์˜ DAOimpl

  • interface๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌ์กฐ

 

5) DTO

  • Data Transfer Object, VO(Value Object)๋ผ๊ณ ๋„ ๋ถˆ๋ฆผ
  • MVC ๊ตฌ์กฐ ์‚ฌ์ด์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ์œ„ํ•œ ์˜ค๋ธŒ์ ํŠธ.
  • getter/setter ํ•จ์ˆ˜๊ฐ€ ์ด์— ํ•ด๋‹น๋จ
  • ์ฃผ๋กœ DB ํ…Œ์ด๋ธ”๊ณผ ๋งค์นญ๋จ

 

public class temp {

    private String id;
    private String pwd;

    public String getId() {return id;}
    public void setId(int id) {this.id = id;}

    public String getPwd() {return pwd;}
    public void setPwd(String pwd) {this.pwd = pwd;}
}

Layerd Architecture

(๊ณ„์ธตํ™” ์•„ํ‚คํ…์ฒ˜)
Domain Model์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋‹จ์–ด? โ“

  • ๊ฐ ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ถ„๋ฆฌ๋œ ๊ฐ ๊ธฐ๋Šฅ(์š”์†Œ)๋Š” ์‘์ง‘๋„๊ฐ€ ๋†’์•„์ง€๊ณ , ๊ธฐ๋Šฅ๋ณ„ ๊ฒฐํ•ฉ๋„๋Š” ๋‚ฎ์•„์ง
  • ์„œ๋กœ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ๋ถ„๋ฆฌํ•ด์„œ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ์˜ํ–ฅ์ด ์•ˆ๊ฐ€๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•
  • ์Šคํ”„๋ง์€ 3๊ฐ€์ง€๋กœ ๋‚˜๋‰˜์–ด ์ฒ˜๋ฆฌํ•จ
  • ๊ฐ ๊ณ„์ธต์€ ์ž์‹ ์˜ ๊ณ„์ธต๋งŒ ์ž˜ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ถฉ์‹ค, ์ฑ…์ž„์„ ์ง
    • presentation ๊ณ„์ธต์— ์ข…์†๋œ ๊ฐ์ฒด๋ฅผ Service ๊ณ„์ธต์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋“ฑ์˜ ์‹ค์ˆ˜๊ฐ€ ๋งŽ์Œ
    • ๊ฒฐํ•ฉ๋„ ๋†’๊ฒŒ ํ•˜์ง€๋ง ๊ฒƒ. ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ๊ฒƒ.

 

1) Presentation Layer

  • ์›น ๊ธฐ๋ฐ˜์œผ๋กœ HTTP Request, Response ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณ„์ธต
  • ์–ด๋– ํ•œ ์š”์ฒญ๊ณผ ์‘๋‹ต ์ƒํƒœ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ฑ…์ž„.
  • ์ž‘์„ฑํ•œ Class๋ฅผ Presentaion ๊ณ„์ธต์œผ๋กœ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” @Controller ๋˜๋Š” @RestController ๋กœ Annotation์„ ์‚ฌ์šฉํ•ด์ค˜์•ผํ•จ
  • ์Šคํ”„๋ง์€ HTTP ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๊ธฐ ์œ„ํ•ด Restful API์— ๋งž๋Š” Mapping Annotation์„ ์ œ๊ณตํ•จ
    • @GetMapping
    • @PostMapping
    • @PutMapping
    • @DeleteMapping ๋“ฑ๋“ฑ๋“ฑ

 

2) Business(Service) Layer

๋น„์ฆˆ๋‹ˆ์Šค ์„œ๋น„์Šค ๋กœ์ง์„ ๋‹ด๊ณ  ์žˆ๋Š” ๊ณ„์ธต

  • ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๊ฒŒ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ž‘์„ฑํ•˜๋Š” ๊ณ„์ธต → ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋น„์Šค์˜ ํ•ต์‹ฌ ๋กœ์ง๋“ค์ด ์ฃผ๋กœ ๋‹ด๊ฒจ ์žˆ์Œ
  • ์„œ๋น„์Šค ๊ณ„์ธต ๋ช…์‹œํ•  ๋•Œ๋Š” @Service ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
  • ํŠธ๋žœ์žญ์…˜์— ๋Œ€ํ•œ ๊ด€๋ฆฌ๋„ ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒŒ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด

 

3) Data Access Layer

DB์™€ ์—ฐ๋™๋˜์–ด ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ณ„์ธต

  • ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด DB์— ์ ‘๊ทผํ•˜๋Š” ๊ณ„์ธต
  • @Repository ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉํ•จ
  • ์Šคํ”„๋ง์€ @Repository ๊ฐ€ ๋ถ™์€ ์–ด๋…ธํ…Œ์ด์…˜์„ Bean์œผ๋กœ ๋“ฑ๋กํ•ด์คŒ.
  • ์—๋Ÿฌ ์ถ”์ƒํ™” ๊ฐ™์€ ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•ด์คŒ

 


์ฐธ๊ณ  ๋งํฌ

https://mangkyu.tistory.com/156

 

[Spring] Spring์— ๋Œ€ํ•œ ์ดํ•ด์™€ ์ž…๋ฌธ, Spring์˜ 3๊ฐ€์ง€ ํ•ต์‹ฌ ํŠน์ง•(IoC/DI, PSA, AOP)์™€ 3๊ฐ€์ง€ ๊ณ„์ธต ๊ตฌ์กฐ(Controlle

Spring์„ ์ œ๋Œ€๋กœ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Spring์ด ๊ฐ–๋Š” ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ์ฒ ํ•™์„ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ฒˆ์—๋Š” Spring์— ์ž…๋ฌธํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด Spring์— ๋Œ€ํ•ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ์„ ์ž‘์„ฑํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. 1. Spring์—

mangkyu.tistory.com

https://velog.io/@duckchanahn/Spring-%EC%9D%B4%EB%A1%A0%EC%A0%95%EB%A6%AC

 

Spring ๊ฐœ๋…์ •๋ฆฌ

Spring ์ด๋ก  ์ •๋ฆฌ

velog.io

'๐Ÿ“– Java&Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Spring Cron Expression  (0) 2023.01.25
StringUtils  (0) 2023.01.18
Looking For Annotation~  (0) 2023.01.16
Intellij) Junit Test Code ์ž‘์„ฑ ์‹œ "Execution failed for task" ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•  (0) 2023.01.09
Web Server vs WAS  (0) 2022.04.25