๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Back-end ๋ฐ๋ธŒ์ฝ”์Šค/week 03 - 05 TIL (Spring)

[TIL] 221031 - SpringBoot Part1

by young-ji 2022. 11. 2.

SpringBoot Part1 (1)

 

Spring ๊ธฐ์ดˆ์˜ ๋ชฉํ‘œ

  • Spring Framework ํ•ต์‹ฌ ๊ฐœ๋…๋“ค์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.
  • Spring Framework Core ๋ชจ๋“ˆ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.
  • Spring Framework JDBC ๋ชจ๋“ˆ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.
  • Spring Framework ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.
  • Spring Boot๋กœ ์Šคํ”„๋ง ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•œ๋‹ค.

 

  1. ์Šคํ”„๋ง(๋ถ€ํŠธ) ์‹œ์ž‘ํ•˜๊ธฐ
    • Spring Boot ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ
    • Spring Framework์ดํ•ดํ•˜๊ธฐ
    • ์Šคํ”„๋ง ๋ถ€ํŠธ ์ดํ•ดํ•˜๊ธฐ
  2. ๋ฐ์ดํ„ฐ๋กœ ์ž‘์—…ํ•˜๊ธฐ
    • ๋ฐ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
    • JDBC ์ด์šฉ
    • Spring Framework์˜ JdbcTemplate ์‚ฌ์šฉ
    • AOP ์ดํ•ดํ•˜๊ธฐ
  3. ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœํ•˜๊ธฐ
    • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดํ•ดํ•˜๊ธฐ
    • ๊ฐ„๋‹จํ•œ ์„œ๋ธ”๋ฆฟ ๋ง›๋ณด๊ธฐ
    • ์Šคํ”„๋ง MVC ๋™์ž‘์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ
    • CORS์— ๋Œ€ํ•œ ์ดํ•ด์™€ ์ ์šฉํ•˜๊ธฐ
    • Spring MVC Test ์ ์šฉํ•˜๊ธฐ

 


 

Build Tool

  • Maven - build ๋™์ž‘์„ ๊ธฐ์ˆ ํ•œ Build Script๋ฅผ XML์— ๊ธฐ์ˆ  (pom.xml)
  • Gradle - groovy, kotiln

 

Build?

: ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด ๋ฐ›๊ณ  classpath์ถ”๊ฐ€

: ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผ

: ํ…Œ์ŠคํŠธ ์‹คํ–‰

: ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋ฅผ packing ํ•ฉ๋‹ˆ๋‹ค. → jar / war / zip etc

: packing๋œ ํŒŒ์ผ์„ ์ฃผ๋กœ artifacts ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์„œ๋ฒ„๋‚˜ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

 

Maven

XML๊ธฐ๋ฐ˜์œผ๋กœ ์„ค์ • ๋ชจ๋ธ์„ ์ œ๊ณตํ•˜๊ณ  pom.xmlํŒŒ์ผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (Project Object Model)

: achetypes๋ผ๋Š” ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ์„ ์ œ๊ณตํ•ด์ค€๋‹ค. (์ผ์ผํžˆ ์„ค์ •์„ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์•„๋„๋œ๋‹ค.)

: ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ dependency๋ฅผ ๊ด€๋ฆฌํ•ด์ค€๋‹ค.

: ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•œ๋‹ค. → ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์™ธ๋ถ€ dependency ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์„ž์ด์ง€์•Š๊ฒŒ

: dependency๋ฅผ ๋‹ค์šด ๋ฐ›๋Š” repo๊ฐ€ ๋กœ์ปฌ์ด ๋ ์ˆ˜๋„ ์žˆ๊ณ  Maven Cental์™€ ๊ฐ™์€ ๊ณต๊ฐœ repo์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

 

Maven Project ์ƒ์„ฑ

  • pom.xml
<groupId>org.prgms</groupId>
<artifactId>dev-kdt-maven</artifactId>
<version>1.0.1</version>

ํ”„๋กœ์ ํŠธ๋ฅผ ์‹๋ณ„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

groupId → ๋ณดํ†ต ํšŒ์‚ฌ๋‚˜ ๋‹จ์ฒด ์ž‘์„ฑ

artifactId → ๊ฐœ๋ณ„ ๋ชจ๋“ˆ : ํ”„๋กœ์ ํŠธ ๋ช…

  • Build Life Cycle์ด ์กด์žฌ
  • Transitive Depedencies

 

Gradle

xml๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค

  • build.gradle

 


1. Spring Intiializr

Manual Setup

maven/Gradle๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  pom.xml์ด๋‚˜ build.gradl์„ ์ง์ ‘ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

 

Spring Boot

  • Spring Boot CLI ์ด์šฉ
    • https://start.spring.io/
    • ์ƒ์„ฑํ• ๋•Œ ์™ธ๋ถ€ dependencies ์ถ”๊ฐ€ ๊ฐ€๋Šฅ (JDBC API, Spring Web ๋“ฑ)
Spring init --build maven -j 17 -g org.prgrms -a kdt-spring-demo -n kdt-spring-demo -x kdt-spring-demo

 

  • Spring Initializ ์ด์šฉ
    • InterlliJ ์ด์šฉ

 

2. ์Šคํ”„๋ง์—ญ์‚ฌ

  • Spring Famework
    • ์—ฌ๋Ÿฌ Spring ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์›ํ•˜๋Š” ํฐ ์˜๋ฏธ์˜ Framework ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์„ ์ง€์›ํ•œ๋‹ค.
  • Spring Boot
    • ์ปดํ“จํ„ฐ๋ฅผ ๋ถ€ํŒ…ํ•œ๋‹ค๋Š” ๋ง์ฒ˜๋Ÿผ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์˜๋ฏธ
    • Spring Boot๊ฐ€ ์—†์„๋• Setup์„ ํ•˜๋Š”๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค.
    • ์†์‰ฌ์šด ์‹คํ–‰, ์ž๋™ ์„ค์ •, ์‰ฌ์šด ์™ธ๋ถ€ํ™˜๊ฒฝ ์„ค์ •, developer tools ๋“ฑ

 

3. ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ํ•ต์‹ฌ ๊ธฐ๋Šฅ

Core Technologies

  • Spring IoC ์ปจํ…Œ์ด๋„ˆ ๊ทธ๋ฆฌ๊ณ  Beans
  • ๋ฆฌ์†Œ์Šค ํ•ธ๋“ค๋ง
  • ๋ฒจ๋ฆฌ๋ฐ์ด์…˜๊ณผ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ๊ทธ๋ฆฌ๊ณ  ํƒ€์ž… ๋ณ€ํ™˜
  • ์Šคํ”„๋ง expression ์–ธ์–ด
  • AOP
  • Null-Safety
  • ๋ฐ์ดํ„ฐ ๋ฒ„ํผ์™€ ์ฝ”๋ฑ
  • ๋กœ๊น…

 


์˜์กด์„ฑ โ—๏ธ

โœ… Domain Driven Design์„ ์œ„ํ•œ ์šฉ์–ด

Domain

: ์œ ์‚ฌํ•œ ์—…๋ฌด์˜ ์ง‘ํ•ฉ

 

Entity

: ์—”ํ„ฐํ‹ฐ๋Š” ๋‹ค๋ฅธ ์—”ํ„ฐํ‹ฐ์™€ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์‹œ๊ฐ„์— ํ๋ฆ„์— ๋”ฐ๋ผ ์ง€์†์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

: ๋„๋ฉ”์ธ์—์„œ ๊ฐœ๋ณ„์„ฑ์ด ์žˆ๋Š” ๊ฐœ๋…. ์ฃผ๋ฌธ๊ด€๋ฆฌ ๋„๋ฉ”์ธ์—์„œ ‘์ฃผ๋ฌธ’์ด๋ผ๋Š” entity๊ฐ€ ์žˆ๊ณ  ์ฃผ๋ฌธ์€ ๊ฐ๊ฐ ์œ ๋‹ˆํฌํ•˜๋‹ค.

: UUID(๋ฒ”์šฉ ๊ณ ์œ  ์‹๋ณ„์ž) type์œผ๋กœ ๋งŽ์ด ์ƒ์„ฑํ•œ๋‹ค.

: Entity Class์— ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์ด ๋“ค์–ด๊ฐ„๋‹ค.

 

Value Object (๊ฐ’ ๊ฐ์ฒด)

: ๊ฐ’ ๊ฐ์ฒด๋Š” ๊ฐ ์†์„ฑ์ด ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜์ง€ ์•Š๊ณ  ๊ฐ’ ๊ทธ ์ž์ฒด๋กœ ๊ณ ์œ ํ•œ ๋ถˆ๋ณ€ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

: ๋Œ€์ฒด๋กœ ์—”ํ„ฐํ‹ฐ๊ฐ€ value object๋ฅผ ์†์„ฑ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

: ํ•œ๋ฒˆ ์ฃผ๋ฌธ์ด ๋งŒ๋“ค์–ด์ง€๋ฉด ์ฃผ๋ฌธ์ž,๋ฐฐ์†ก์ง€,์ฃผ๋ฌธ ์•„์ดํ…œ์€ ๋ณ€ํ•˜์ง€์•Š๋Š”๋‹ค.

 

โœ… ์˜์กด์„ฑ ๊ด€๋ฆฌ

์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ํ˜๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํ•„์š”๋กœ ํ•  ๋•Œ ๋‘ ๊ฐ์ฒด ์‚ฌ์ด์˜ ์˜์กด์„ฑ์ด ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค. ์˜์กด์„ฑ์€ ์‹คํ–‰ ์‹œ์ ๊ณผ ๊ตฌํ˜„ ์‹œ์ ์— ์„œ๋กœ ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.

  • ์ปดํŒŒ์ผํƒ€์ž„ ์˜์กด์„ฑ : ์ฝ”ํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‹œ์ ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜์กด์„ฑ ํด๋ž˜์Šค ์‚ฌ์ด์˜ ์˜์กด์„ฑ
  • ๋Ÿฐํƒ€์ž„ ์˜์กด์„ฑ : ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๋Š” ์‹œ์ ์˜ ์˜์กด์„ฑ. ๊ฐ์ฒด ์‚ฌ์ด์˜ ์˜์กด์„ฑ

์˜์กด์„ฑ

Order๊ฐ€ FixedAmountVourcher์„ ์ง์ ‘ ์˜์กดํ•˜๋Š” ๊ฒƒ์€ ํ•˜๋“œ ์ฝ”๋”ฉ (๋ฐ”์šฐ์ฒ˜ ๋ฐฉ์‹์— ๋”ฐ๋ผ Order class ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝ ํ•ด์ค˜์•ผํ•œ๋‹ค.) ๊ฐ•ํ•œ ๊ฒฝํ•ฉ๋„.

 

๊ฒฐํ•ฉ๋„

ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚ ๋•Œ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ๋ณ€ํ™”๋ฅผ ์š”๊ทœํ•˜๋Š” ์ •๋„

๋‘ ์š”์„œ ์‚ฌ์ด์— ์กด์žฌํ•˜๋Š” ์˜์กด์„ฑ์ด ๋ฐ”๋žŒ์งํ• ๋•Œ ๋Š์Šจํ•œ ๊ฒฐํ•ฉ๋„ ๋˜๋Š” ์•ฝํ•œ ๊ฒฐํ•ฉ๋„๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ ํ•˜๊ณ  ๋ฐ˜๋Œ€๋กœ ๊ทธ๋ ‡์ง€ ๋ชปํ• ๋•Œ ๋‹จ๋‹จํ•œ ๊ฒฐํ•ฉ๋„ ๋˜๋Š” ๊ฐ•ํ•œ ๊ฒฐํ•ฉ๋„๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ๋งํ•œ๋‹ค.

→ ๋Š์Šจํ•œ ๊ฒฐํ•ฉ๋„๋ฅผ ์œ„ํ•ด ๋Ÿฐํƒ€์ž„ ์˜์กด์„ฑ์„ ๊ฐ–๋„๋ก ํ•œ๋‹ค. (์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด)

// Order ์ƒ์„ฑ์ž - ์ปดํŒŒ์ผ ์˜์กด์„ฑ
public Order(UUID orderId, UUID customerId, List<OrderItem> orderItems, long discount) {
    this.orderId = orderId;
    this.customerId = customerId;
    this.orderItems = orderItems;
    this.fixedAmountVoucher = new FixedAmountVoucher(voucherId, discountAmount);
}

 

 

// Order ์ƒ์„ฑ์ž - ๋Ÿฐํƒ€์ž„ ์˜์กด์„ฑ voucher ์ฃผ์ž…๋ฐ›๊ธฐ
public Order(UUID orderId, UUID customerId, List<OrderItem> orderItems, Voucher voucher) {
    this.orderId = orderId;
    this.customerId = customerId;
    this.orderItems = orderItems;
    this.voucher = voucher;
}

 


Daliy Mission

  • Maven๊ณผ Gradle๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹ค๋ฐ๋กœ ๊ตฌ์„ฑํ•ด๋ด…๋‹ˆ๋‹ค.
  • Spring Boot CLI ์„ค์น˜ํ•ด์„œ ๋ช…๋ น์–ด๋“ค ์‚ฌ์šฉํ•ด๋ณด๊ธฐ
    • ์ปค๋ฉ˜๋“œ ๋ผ์ธ ๋ช…๋ น์–ด๋กœ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•ด๋ณด๊ธฐ
  • IntelliJ๋ฅผ ํ†ตํ•ด Spring Boot ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ณ  ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ณด์ž. (Web)

 

 

 

์ถœ์ฒ˜ - ํ•ด๋ฆฌ : SpringBoot Part1

๋Œ“๊ธ€