yeon's blog

[Spring] Spring? Spring Boot? ๋ณธ๋ฌธ

Spring/Spring ๊ฐœ๋…

[Spring] Spring? Spring Boot?

yeonii 2023. 11. 30. 19:39

๐ŸŒฑ Spring ๐ŸŒฑ

  1. Java ๊ธฐ๋ฐ˜์˜ ํ”„๋ ˆ์ž„ ์›Œํฌ
  2. Java ์–ธ์–ด์˜ ํฐ ํŠน์ง•์ธ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด๋ฅผ ์‚ด๋ฆผ
  3. ์ฆ‰, ์Šคํ”„๋ง์€ ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

๐ŸŒฑ Spring Framework ํŠน์ง• ๐ŸŒฑ

1. ์ œ์–ด์˜ ์—ญ์ „(IoC, Invertion of Control)

์ œ์–ด์˜ ์—ญ์ „: ๊ฐ์ฒด์˜ ์ œ์–ด๊ถŒ์„ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ปจํ…Œ์ด๋„ˆ์—๊ฒŒ ๋„˜๊ธฐ๋Š” ๊ฒƒ
์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— Bean(๊ฐ์ฒด) ๋“ฑ๋ก์‹œ, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ฐ์ฒด์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด(์ƒ์„ฑ, ์†Œ๋ฉธ)์„ ์ปจํŠธ๋กค ํ•ด์ค€๋‹ค.
์ฆ‰, ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ์ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋กœ ์—ญ์ „๋˜๋Š” ๊ฒƒ!

2. ์˜์กด์„ฑ ์ฃผ์ž…(DI, Dependency Injection)

์˜์กด์„ฑ ์ฃผ์ž…: ํด๋ž˜์Šค๊ฐ„ ์˜์กด์„ฑ์„ ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ
Spring์—๋Š” DI ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์กด์žฌํ•˜์—ฌ, ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•ด์ค€๋‹ค.
DI ์ด์šฉํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์ฃผ๊ณ , ๋ชจ๋“ˆ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.

3. ๊ด€์ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(AOP, Aspect-Oriented-Programming)

AOP: ํ”„๋กœ๊ทธ๋žจ์˜ ํ•ต์‹ฌ ๋กœ์ง ์™ธ์˜ ๋ถ€๊ฐ€์ ์ธ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๊ฒƒ
-> ์ด๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๊ฐ์ฒด์— ๊ณตํ†ต์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌ๋ถ„ํ•จ์œผ๋กœ์จ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค.


๐ŸŒฑ Spring Boot ๐ŸŒฑ

  1. Spring์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ
  2. ๋‹จ๋…์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํ”„๋ง ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ์ƒ์„ฑ
  3. Tomcat / Jetty ๊ฐ™์€ servlet container๋ฅผ ์ž์ฒด์ ์œผ๋กœ ๋‚ด์žฅ
  4. ์†์‰ฌ์šด ๋นŒ๋“œ ๊ตฌ์„ฑ์„ ์œ„ํ•œ starter ์ข…์†์„ฑ ์ œ๊ณต
  5. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „ ์ž๋™๊ด€๋ฆฌ
  6. ๊ด€๋ก€์— ์˜ํ•œ ๊ฐ„๊ฒฐํ•œ ์„ค์ •

๐ŸŒฑ Spring ์›น ๊ณ„์ธต ๊ตฌ์กฐ ๐ŸŒฑ

1. Web Layer

์™ธ๋ถ€ ์š”์ฒญ๊ณผ ์‘๋‹ต์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ์˜์—ญ์œผ๋กœ, ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋Š” ํ•˜์ง€ ์•Š๊ณ  ์„œ๋น„์Šค์—๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.

๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ์ฒด๋งŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

  • ํ”ํžˆ ์‚ฌ์šฉํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ (@Controller)์™€ JSP/Freemarker ๋“ฑ์˜ ๋ทฐ ํ…œํ”Œ๋ฆฟ ์˜์—ญ
  • ์ด์™ธ์— ํ•„ํ„ฐ(@Filter), ์ธํ„ฐ์…‰ํ„ฐ, ์ปจํŠธ๋กค๋Ÿฌ ์–ด๋“œ๋ฐ”์ด์Šค(@Controller Advice)๋“ฑ ํฌํ•จ

2. Service Layer

ํŠธ๋žœ์žญ์…˜(Transaction)์— ๋Œ€ํ•œ ๊ฒฝ๊ณ„ ์—ญํ• ๋กœ, ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ์ฒด๋ฅผ ๋ฉ”์†Œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ์ฒด๋งŒ Web Layer๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • @Service์— ์‚ฌ์šฉ๋˜๋Š” ์„œ๋น„์Šค ์˜์—ญ
  • Controller์™€ Dao ์ค‘๊ฐ„ ์˜์—ญ์—์„œ ์‚ฌ์šฉ
  • @Transactional์ด ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” ์˜์—ญ์ด๊ธฐ๋„ ํ•จ

3. Repository Layer

๋ฐ์ดํ„ฐ ์Šคํ† ๋ฆฌ์ง€ ๊ณ„์ธต๊ณผ ํ†ต์‹ ํ•˜๋Š” ์—ญํ• ๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ(repository)์— ์ ‘๊ทผํ•˜๋Š” ์—ญํ• ์ด๋‹ค.

์—”ํ‹ฐํ‹ฐ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ณ , ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

  • Database์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์— ์ ‘๊ทผํ•˜๋Š” ์˜์—ญ
  • Entity์˜ ์˜์†์„ฑ์„ ๊ด€์žฅํ•˜๋Š” ์—ญํ• 
  • Dao(Data Access Object) ์˜์—ญ๊ณผ ๊ฐ™์€ ์˜๋ฏธ

4. DTOs

๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์ด๋‹ค. ์ฆ‰, Data Transfer Object๋กœ, ๋‹ค๋ฅธ ๊ณ„์ธต ๊ฐ„ ๊ตํ™˜์„ ์œ„ํ•œ ๊ฐ์ฒด์ด๋‹ค.

  • ๋ทฐ ํ…œํ”Œ๋ฆฟ ์—”์ง„์—์„œ ์‚ฌ์šฉ๋  ๊ฐ์ฒด, Repository Layer์—์„œ ๊ฒฐ๊ณผ๋กœ ๋„˜๊ฒจ ์ค€ ๊ฐ์ฒด ๋“ฑ

5. Domain Model

Domain์„ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋™์ผํ•œ ๊ด€์ ์—์„œ ์ดํ•ด, ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹จ์ˆœํ™” ์‹œํ‚จ ๊ฒƒ์ด๋‹ค.

 

Domain: ์ „์ฒด ๋ผ์ดํ”Œ ์‚ฌ์ดํด ๋™์•ˆ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด

-> Value Object(VO: DTO์™€ ๋™์ผํ•œ ๊ฐœ๋…์ด๋‚˜ readonly ์†์„ฑ์„ ๊ฐ€์ง)๋กœ, ์†์„ฑ์ด๋‚˜ ์‚ฌ๋ฌผ์„ ์„ค๋ช…ํ•œ๋‹ค.

 


References

https://velog.io/@smallcherry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-%EA%B3%84%EC%B8%B5-Spring-Web-Layer