์Šคํ”„๋ง

[ Spring Boot ] API

KIMHYEYUN 2022. 8. 30. 15:52
๋ฐ˜์‘ํ˜•

API๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ด 3๊ฐœ์˜ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”

  • Request ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ DTO
  • API ์š”์ฒญ์„ ๋ฐ›์„ Controller
  • ํŠธ๋žœ์žญ์…˜, ๋„๋ฉ”์ธ ๊ธฐ๋Šฅ ๊ฐ„์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๋Š” Service

โœ… ์—ฌ๊ธฐ์„œ ๋งŽ์€ ์˜คํ•ด โ†’ Service์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ
But, ์ „ํ˜€ ๊ทธ๋ ‡์ง€ ์•Š์Œ
โœ… Service๋Š” ํŠธ๋žœ์žญ์…˜, ๋„๋ฉ”์ธ ๊ฐ„ ์ˆœ์„œ ๋ณด์žฅ์˜ ์—ญํ• ๋งŒ ํ•จ

  • Web Layer
    • ํ”ํžˆ ์‚ฌ์šฉํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ(@Controller)์™€ JSP/Freemarker ๋“ฑ์˜ ๋ทฐ ํ…œํ”Œ๋ฆฟ ์˜์—ญ
    • ์ด์™ธ์—๋„ ํ•„ํ„ฐ(@Filter), ์ธํ„ฐ์…‰ํ„ฐ, ์ปจํŠธ๋กค๋Ÿฌ ์–ด๋“œ๋ฐ”์ด์Šค(@ControllerAdvice)๋“ฑ ์™ธ๋ถ€ ์š”์ฒญ๊ณผ ์‘๋‹ต์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ์˜์—ญ
  • Service Layer
    • @Service์— ์‚ฌ์šฉ๋˜๋Š” ์„œ๋น„์Šค ์˜์—ญ
    • ์ผ๋ฐ˜์ ์œผ๋กœ Controller์™€ Dao ์ค‘๊ฐ„ ์˜์—ญ์—์„œ ์‚ฌ์šฉ๋จ
    • @Transactionaldl ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” ์˜์—ญ์ด๊ธฐ๋„ ํ•จ
  • Repository Layer
    • Database์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์— ์ ‘๊ทผํ•˜๋Š” ์˜์—ญ
    • DAO(Data Access Object) ์˜์—ญ
  • Dtos
    • Dto(Data Transfer Object)๋Š” ๊ณ„์ธต ๊ฐ„์— ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ์œ„ํ•œ ๊ฐ์ฒด๋ฅผ ์ด์•ผ๊ธฐํ•˜๋ฉด Dtos๋Š” ์ด๋“ค์˜ ์˜์—ญ
    • ์—๋ฅผ ๋“ค์–ด, ๋ทฐ ํ…œํ”Œ๋ฆฟ ์—”์ง„์—์„œ ์‚ฌ์šฉ๋  ๊ฐ์ฒด๋‚˜ Repository Layer์—์„œ ๊ฒฐ๊ณผ๋กœ ๋„˜๊ฒจ์ค€ ๊ฐ์ฒด ๋“ฑ์ด ์ด๋“ค์„ ์ด์•ผ๊ธฐํ•จ
  • Domain Model
    • ๋„๋ฉ”์ธ์ด๋ผ ๋ถˆ๋ฆฌ๋Š” ๊ฐœ๋ฐœ ๋Œ€์ƒ์„ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋™์ผํ•œ ๊ด€์ ์—์„œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹จ์ˆœํ™”์‹œํ‚จ ๊ฒƒ์„ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด๋ผ๊ณ  ํ•จ
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ํƒ์‹œ ์•ฑ์ด๋ผ๊ณ  ํ•˜๋ฉด ๋ฐฐ์ฐจ, ํƒ‘์Šน, ์š”๊ธˆ๋“ฑ์ด ๋ชจ๋‘ ๋„๋ฉ”์ธ์ด ๋  ์ˆ˜ ์žˆ์Œ
    • @Entity๊ฐ€ ์‚ฌ์šฉ๋œ ์˜์—ญ ์—ญ์‹œ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋จ
    • ๋‹ค๋งŒ, ๋ฌด์กฐ๊ฑด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๊ณผ ๊ด€๊ณ„๊ฐ€ ์žˆ์–ด์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹˜
    • VO์ฒ˜๋Ÿผ ๊ฐ’ ๊ฐ์ฒด๋“ค๋„ ์ด ์˜์—ญ์— ํ•ด๋‹น

Web(Controller), Service, Repository, Dto, Domain ์ด 5๊ฐ€์ง€ ๋ ˆ์ด์–ด์—์„œ ๋น„์ง€๋‹ˆ์Šค ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•ด์•ผ ํ•  ๊ณณ์€ ???
โ†’ ๋ฐ”๋กœ Domain

๊ธฐ์กด์— ์„œ๋น„์Šค๋กœ ์ฒ˜๋ฆฌํ•˜๋˜ ๋ฐฉ์‹์„ ํŠธ๋žœ์žญ์…˜ ์Šคํฌ๋ฆฝํŠธ๋ผ๊ณ  ํ•จ
์˜ˆ) ์ฃผ๋ฌธ ์ทจ์†Œ ๋กœ์ง

@Transactional
public Order cancelOrder(int orderId){
    1) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ ์ฃผ๋ฌธ์ •๋ณด(Orders), ๊ฒฐ์ œ์ •๋ณด(Billing), ๋ฐฐ์†ก์ •๋ณด(Delivery) ์กฐํšŒ
    2) ๋ฐฐ์†ก ์ทจ์†Œ๋ฅผ ํ•ด์•ผ ํ•˜๋Š”์ง€ ํ™•์ธ
    3) if(๋ฐฐ์†ก ์ค‘์ด๋ผ๋ฉด){
        ๋ฐฐ์†ก ์ทจ์†Œ๋กœ ๋ณ€๊ฒฝ
       }
    4) ๊ฐ ํ…Œ์ด๋ธ”์— ์ทจ์†Œ ์ƒํƒœ Update
}

๋ชจ๋“  ๋กœ์ง์ด ์„œ๋น„์Šค ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์ฒ˜๋ฆฌ๋จ. ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ์„œ๋น„์Šค ๊ณ„์ธต์ด ๋ฌด์˜๋ฏธํ•˜๋ฉฐ, ๊ฐ์ฒด๋ž€ ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ ๋ฉ์–ด๋ฆฌ ์—ญํ• ๋งŒ ํ•˜๊ฒŒ ๋จ
๋ฐ˜๋ฉด ๋„๋ฉ”์ธ ๋ชจ๋ธ์—์„œ ์ฒ˜๋ฆฌํ•  ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ

@Transactional
public Order cancelOrder(int orderId){
    //1)
    Orders order = ordersRepository.findById(orderId);
    Billing billing = billingRepository.findByOrderId(orderId);
    Delivery delivery = deliveryRepository.findByOrderId(orderId);

    //2-3)
    delivery.cancel();

    //4)
    order.cancel();
    billing.cancel();

    return order;
}

order, billing, delivery๊ฐ€ ๊ฐ์ž ๋ณธ์ธ์˜ ์ทจ์†Œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉฐ, ์„œ๋น„์Šค ๋ฉ”์„œ๋“œ๋Š” ํŠธ๋žœ์žญ์…˜๊ณผ ๋„๋งค์ธ ๊ฐ„์˜ ์ˆœ์„œ๋งŒ ๋ณด์žฅ

์Šคํ”„๋ง์—์„  Bean์„ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ์‹๋“ค

  • @Autowired
  • setter
  • ์ƒ์„ฑ์ž

์ด ์ค‘ ๊ฐ€์žฅ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ์‹์ด ์ƒ์„ฑ์ž๋กœ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ์‹(@Autowired๋Š” ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ)
์ฆ‰, ์ƒ์„ฑ์ž๋กœ Bean ๊ฐ์ฒด๋ฅผ ๋ฐ›๋„๋ก ํ•˜๋ฉด @Autowired์™€ ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ
๊ทธ๋Ÿฌ๋ฉด ์•ž์—์„œ ์ƒ์„ฑ์ž๋Š” ์–ด๋”” ???????
โ†’ ๋ฐ”๋กœ @RequiredArgsConstructor์—์„œ ํ•ด๊ฒฐ ๐Ÿ‘‰ final์ด ์„ ์–ธ๋œ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์ธ์ž๊ฐ’์œผ๋กœ ํ•˜๋Š” ์ƒ์„ฑ์ž๋ฅผ ๋Œ€์‹  ์ƒ์„ฑ

728x90
๋ฐ˜์‘ํ˜•