๋ฐ˜์‘ํ˜•

๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋ณ€ํ™”์˜ ์ „ํŒŒ์™€ ๋ฐ์ดํ„ฐ ํ๋ฆ„๊ณผ ๊ด€๋ จ๋œ ์„ ์–ธ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„

  • ๋ณ€ํ™”์˜ ์ „ํŒŒ์™€ ๋ฐ์ดํ„ฐ ํ๋ฆ„: ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฐ๋  ๋•Œ ๋งˆ๋‹ค ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์†์ ์œผ๋กœ ์ „๋‹ฌ
  • ์„ ์–ธ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ์‹คํ–‰ํ•  ๋™์ž‘์„ ๊ตฌ์ฒด์ ์œผ๋กœ ๋ช…์‹œํ•˜๋Š” ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋‹ฌ๋ฆฌ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋‹จ์ˆœํžˆ ๋ชฉํ‘œ๋ฅผ ์„ ์–ธ.
  • ๋ฐ์ดํ„ฐ ๋ฐœํ–‰(Observable), ๊ฐ€๊ณต(Operator), ๊ตฌ๋…(Subscribe) ํ๋ฆ„์œผ๋กœ ๊ตฌ์„ฑ
  • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ํ™˜๊ฒฝ์—์„œ ๋‘˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด์Šˆ๋ฅผ ๋ฐฉ์ง€ํ•˜์—ฌ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•จ. (stream..)

 

๋ฆฌ์•กํ‹ฐ๋ธŒ์˜ ๊ฐœ๋…์ด ์ ์šฉ๋œ ์˜ˆ

  Push ๋ฐฉ์‹: ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๋•Œ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•œ ๊ณณ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ฃผ๋Š” ๋ฐฉ์‹ (๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹)

  • RTC, ์†Œ์ผ“ํ”„๋กœ๊ทธ๋ž˜๋ฐ, DB Trigger, Spring์˜ ApplicationEvent, ์•ต๊ทค๋Ÿฌ ๋ฐ”์ธ๋”ฉ, ํ‘ธ์‹œ๋ฉ”์„ธ์ง€

  Pull ๋ฐฉ์‹: ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ์š”์ฒญ์„ ๋ณด๋‚ด ์งˆ์˜ํ•˜๊ณ  ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹

  • ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ & ์„œ๋ฒ„ ์‘๋‹ต ๋ฐฉ์‹์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
  • Java์™€ ๊ฐ™์€ ์ ˆ์ฐจํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด

 

๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•ด ์•Œ์•„์•ผ ๋  ๊ฒƒ๋“ค

  • Observable: ๋ฐ์ดํ„ฐ ์†Œ์Šค
  • ๋ฆฌ์•กํ‹ฐ๋ธŒ ์—ฐ์‚ฐ์ž(Operators): ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜
  • ์Šค์ผ€์ค„๋Ÿฌ(Scheduler): ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ์ž
  • Subscriber: Observable์ด ๋ฐœํ–‰ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๊ตฌ๋…์ž
  • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ: RxJava์—์„œ ์ œ๊ณตํ•˜๋Š” ์—ฐ์‚ฐ์ž(Operator) ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ.

 

๋ฆฌ์•กํ‹ฐ๋ธŒX 

  • ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ๋‹ค์–‘ํ•œ ์–ธ์–ด ์ง€์›

.....

์ฐธ๊ณ 
https://www.youtube.com/watch?v=2McwNWO8MIw&list=PLr-ObTx8qMl9APSlvIhAah1mq3tyD1AYN

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
์„œ๋ฒ„๊ฐ„ ํ†ต์‹  ์ค‘ ์ง€์—ฐ ๋ฐœ์ƒ์‹œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

    โ€ฃ ๋„คํŠธ์›Œํฌ ํƒ€์ž„์•„์›ƒ ์„ค์ •
    โ€ฃ ๋Œ€๊ธฐ์ค‘ ์š”์ฒญ์ˆ˜ ์ œํ•œ
    โ€ฃ ์—ฌ๋Ÿฌ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๊ธฐ๋ฒ• ๊ตฌํ˜„
    โ€ฃ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ํŒจํ„ด๊ณผ ํด๋ฐฑ ๊ตฌํ˜„ ์„ค์ •

 

๋ถ€ํ•˜ ๋ถ„์‚ฐ ๋ฃฐ(rule)

์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ ๋„ทํ”Œ๋ฆญ์Šค์—์„œ๋Š” ๋‹ค์–‘ํ•œ ๋ถ€ํ•˜๋ถ„์‚ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ œ๊ณตํ•ด์ฃผ๋Š”๋ฐ,
๋„ทํ”Œ๋ฆญ์ŠคOSS ์—์„œ๋Š” ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฃฐ์ด๋ผ๊ณ  ํ•จ

์ข…๋ฅ˜

    โ€ฃ RoundrobinRule
        → ๋ผ์šด๋“œ ๋กœ๋นˆ ์‚ฌ์šฉ, ์œ ์ž…๋˜๋Š” ์š”์ฒญ์€ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ์ˆœ์ฐจ์ ์œผ๋กœ ๋ถ„์‚ฐ. ๊ธฐ๋ณธ!

    โ€ฃ AvailabilityFilteringRule
        → ์„ธ๋ฒˆ ์—ฐ๊ฒฐ ์‹คํŒจํ•˜๋ฉด ์„œํ‚ท ์ฐจ๋‹จ๋จ.
        → ์„œํ‚ท ์ฐจ๋‹จ ๋ฐ ๋™์‹œ์—ฐ๊ฒฐ์ด ๋งŽ์€๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋œ ์„œ๋ฒ„ ์ œ์™ธ.
        → RoundrobinRule ์„ ๋ฒ ์ด์Šค ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉ.


    โ€ฃ WeightedReponseTimeRule
        → ์ธ์Šคํ„ด์Šค๋กœ ์ „๋‹ฌ๋˜๋Š” ํŠธ๋ž˜ํ”ฝ์˜ ๊ทœ๋ชจ๋Š” ์ธ์Šคํ„ด์Šค์˜ ํ‰๊ท  ์‘๋‹ต์‹œ๊ฐ„์— ๋ฐ˜๋น„๋ก€.
        → ์‘๋‹ต์‹œ๊ฐ„ ๊ธธ์ˆ˜๋ก ๋” ์ž‘์€ ๊ฐ€์ค‘์น˜ ๊ฐ€์ง.
        → ๋ถ€ํ•˜๋ถ„์‚ฐํด๋ผ์ด์–ธํŠธ๋Š” ๋ชจ๋“  ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค์˜ ํŠธ๋ž˜ํ”ฝ๊ณผ ์‘๋‹ต์‹œ๊ฐ„ ๊ธฐ๋กํ•จ.


    โ€ฃ BestAvailableRule
        → ์„œํ‚ท๋ธŒ๋ ˆ์ด์ปค๊ฐ€ ์ฐจ๋‹จ๋œ ์„œ๋ฒ„๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋™์‹œ ์š”์ฒญ์„ ๊ฐ€์žฅ ์ ๊ฒŒ ๋ฐ›์€ ์„œ๋ฒ„๋ฅผ ์„ ํƒ.

 

 

ํ˜ธ๋ฒ„ํ”Œ๋ผ์ด (Hoverfly)
์„ค๋ช…

HTTP ์„œ๋น„์Šค๋ฅผ ์Šคํ…ํ•˜๊ณ  ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฐ€๋ฒผ์šด ์‹œ๊ฐํ™” ๋„๊ตฌ.
DSL ์ •์˜์—์„œ ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋ฅผ ํ˜ธ์ถœํ•ด ๋ชจ๋“  ์‹œ๋ฎฌ๋ ˆ์ด์…˜์ค‘์ธ ์„œ๋น„์Šค์˜ ๋ฉ”์„œ๋“œ์— ์ง€์—ฐ์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ.
    → maven or gradle ์— hoverfly-java import ํ•„์š”, JUnit์— @ClassRule ์ •์˜ ํ•„์š”. 

 

์‹ค์Šต

โ€ฃโ€ฃโ€ฃ ์‹ค์Šต ์ฝ”๋“œ ๋งํฌ ๐Ÿ™‚

junit test class ์ผ๋ถ€

• junit test ์‹คํ–‰์‹œ hoverflyRule ์„ ๋จผ์ € ์‹คํ–‰ํ•˜๊ณ  ๊ฐ ํ…Œ์ŠคํŠธ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. (ex. test() ์‹คํ–‰)
• test() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์— ์žˆ๋‹ค. ↓ ↓ ↓ ↓ ↓

junit test ํ˜ธ์ถœ ์ถœ๋ ฅ ๊ฒฐ๊ณผ, ๋ถ€ํ•˜๋ถ„์‚ฐ ์ฒ˜๋ฆฌ๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
application.yml ์„ค์ •์ •๋ณด. (ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ์˜ ์„ค์ •ํŒŒ์ผ์— ์ •์˜)

โ€ป https://www.baeldung.com/hoverfly ์—๋„ ์ž˜ ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค. (์‚ฌ์‹ค ํ•ด๋‹น๊ธฐ๋Šฅ์„ ๋งŽ์ด ์“ฐ๋Š”์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค;)

 

 

๋ฆฌ๋ณธ(Ribbon)
์„ค๋ช…

- Client LoadBalancer ์ด๋‹ค.
- ๊ฐœ๋ฐœ์ž๊ฐ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ๋‹ค. (L4 ์‚ฌ์šฉ์—†์ด)
- ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„๊ฐ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์„ ํ•œ๋‹ค! 
- ์œ ๋ ˆ์นด๋ž‘ ์‚ฌ์šฉ์‹œ ๊ฐ•๋ ฅํฌํ•˜๋‹ค ๐Ÿ‘
- ๋”์ด์ƒ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ํ•˜์ง€ ์•Š์Œ.

ribbon



โ€ป ๋ณดํ†ต์€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ L4 switch ์„ ์ด์šฉํ•˜์—ฌ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์ฒ˜๋ฆฌ๋ฅผ ํ• ๊ฒƒ์ด๋‹ค.
์ด๋ฅผ ์ด์šฉ์‹œ ์ถ”๊ฐ€ ์„œ๋ฒ„๋น„์šฉ ๋“ฑ์ด ๋ฐœ์ƒํ• ๊ฒƒ์ด๋‹ค.
์ด์—๋”ฐ๋ฅธ ์ ˆ์ฐจ๋„ ํ•„์š”ํ• ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. 

L4 switch

 

์‹ค์Šต 

โ€ฃโ€ฃโ€ฃ ์‹ค์Šต ์ฝ”๋“œ ๋งํฌ ๐Ÿ™‚

๐Ÿ”† ์„œ๋ฒ„๊ฐ„ ํ†ต์‹ ํ•˜์—ฌ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์ฒ˜๋ฆฌ ํ™•์ธ: Ribbon ์ ์šฉ ์„œ๋ฒ„์—์„œ Demo1 ์„œ๋ฒ„ ํ˜ธ์ถœ (ํฌํŠธ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ๋กœ ์ •์˜ํ•˜์—ฌ ์„œ๋ฒ„๋„์šฐ๊ธฐ)

• Ribbon ์ ์šฉ ์„œ๋ฒ„

# .. gradle ํŒŒ์ผ ๋‚ด ์•„๋ž˜์˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•จ 

implementation 'org.springframework.cloud:spring-cloud-starter-netflix-ribbon:2.1.4.RELEASE'

~Application.java

 

application.yml

 

controller

→ ๋นจ๊ฐ„๋ฐ•์Šค๋ฅผ ๋ณด๋ฉด, demo1 ์œผ๋กœ ๋„๋ฉ”์ธ์„ ์ •์˜ํ•ด๋†“์•˜๋‹ค.
์ด๋Š” application.yml ์˜ demo1: ribbon: listOfServers ์ •๋ณด๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ํ•œ ๊ฒƒ์ด๋‹ค. (๋‚ด๋ถ€์ ์œผ๋กœ ์ธํ„ฐ์…‰ํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค๊ณ ํ•จ)


• Ribbon ์ ์šฉ ์„œ๋ฒ„์—์„œ ํ˜ธ์ถœํ•  ์„œ๋ฒ„ ์‹คํ–‰๊ตฌ์„ฑ 

์ธํ…”๋ฆฌ์ œ์ด์˜ ์‹คํ–‰/๋””๋ฒ„๊ทธ ๊ตฌ์„ฑ์—์„œ Spring Boot ์‹คํ–‰์ •๋ณด๋ฅผ ์…‹ํŒ…ํ•œ๋‹ค. (VM ์˜ต์…˜: -Dserver.port=์ •์˜ํฌํŠธ) ๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰! x N


...๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ! (API ํ˜ธ์ถœ)

๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์ฒ˜๋ฆฌ๊ฐ€ ๋จ! ์™”๋‹ค๊ฐ”๋‹ค,, ์„œ๋ฒ„๋ณ„ API ํ˜ธ์ถœ ๊ฒฐ๊ณผ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

ํžˆ์ŠคํŠธ๋ฆญ์Šค (Hystrix)
์„ค๋ช…

- ๋ถ„์‚ฐ์‹œ์Šคํ…œ ๋‚ด์—์„œ ์„œ๋น„์Šค ๊ฐ„์˜ ์•ก์„ธ์Šค ์ง€์ ์„ ๊ฒฉ๋ฆฌํ•˜๊ณ , ์„œ๋น„์Šค ์ „๋ฐ˜์— ๊ฑธ์ณ ๊ณ„๋‹จ์‹ ์˜ค๋ฅ˜๋ฅผ ์ค‘์ง€ํ•˜๊ณ , ํด๋ฐฑ ์˜ต์…˜์„ ์ œ๊ณตํ•˜์—ฌ ์ด๋ฅผ ์ˆ˜ํ–‰
- RxJava ์— ์˜ํ•ด ๋งŒ๋“ค์–ด์ง
- Failure as a First class citizen
   → ๋ถ„์‚ฐ์‹œ์Šคํ…œ์—์„œ๋Š” ์‹คํŒจ๋ฅผ 1๊ธ‰ ์‹œ๋ฏผ์œผ๋กœ ๊ฐ„์ฃผ.
- ๋”์ด์ƒ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ํ•˜์ง€ ์•Š์Œ. 

 

์‹ค์Šต

โ€ฃโ€ฃโ€ฃ ์‹ค์Šต ์ฝ”๋“œ ๋งํฌ ๐Ÿ™‚

๐Ÿ’ฅ ์„œ๋ฒ„(PirServer → Demo1Server ํ˜ธ์ถœ)๊ฐ„ ํ†ต์‹  ์ค‘, ์—๋Ÿฌ๋ฐœ์ƒ ์œ ๋„

1๏ธโƒฃ Hystrix ๋ฏธ์ ์šฉ: ์—๋Ÿฌ ๋…ธ์ถœ ํ™•์ธ

fallback ์ ์šฉ์ด ์•ˆ๋œ ๋ชจ์Šต



2๏ธโƒฃ Hystrix ์ ์šฉ: @HystrixCommand ๋ฐ fallback ์ ์šฉ

RestTemplate ์œผ๋กœ ํ˜ธ์ถœ ๋ฐ fallback ์ ์šฉ๋œ ๋ชจ์Šต

@HystrixCommand
- ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์‹œ ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์„ฑ๊ณต/์‹คํŒจ ๊ฒฐ๊ณผ๋ฅผ ํ†ต๊ณ„๋ƒ„
- ํ†ต๊ณ„์— ๋”ฐ๋ผ ์„œํ‚ท ์˜คํ”ˆ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๊ณ  ์กฐ์น˜ํ•จ.

โ€ป ์„œํ‚ท ์˜คํ”ˆ
์ฃผ์–ด์ง„ ์‹œ๊ฐ„๋™์•ˆ ํ˜ธ์ถœ์ œํ•œ / ์—๋Ÿฌ๋ฐ˜ํ™˜ ํ•จ
์กฐ๊ธฐ์ฐจ๋‹จํ•˜์—ฌ ๋ณธ์ธ์„ ๋ณดํ˜ธํ•จ

- ์ •์˜ํ•ด๋†“์€ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ๋Š” ์ •ํ•ด์ง„ ์‘๋‹ต์‹œ๊ฐ„ ๋‚ด์— ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•จ. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Exception ๋ฐœ์ƒ & fallback ์ •์˜ ์ˆ˜ํ–‰

 

โญ๏ธ Hystrix ๋ณด๋‹จ Resilience4j ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์ข‹์Œ.
- Resilience4j ๊ฐ€ Java8 ์ง€์› ๋ฐ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•ด์ค€๋‹ค๊ณ  ํ•จ.

 

 

 


์ฐธ๊ณ 

์ฑ…: ๋งˆ์Šคํ„ฐ๋ง ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ
๋งํฌ: https://www.youtube.com/watch?v=K4laj5cDYLg&list=PL9mhQYIlKEhdtYdxxZ6hZeb0va2Gm17A5&index=5 

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ (Service Discovery)
์„ค๋ช…

์„œ๋น„์Šค ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœ์‹œ, ์„œ๋น„์Šค์˜ ์œ„์น˜(IP, port) ๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ
๊ด€๋ จ ์˜คํ”ˆ์†Œ์Šค๋กœ ๋„ทํ”Œ๋ฆญ์Šค OSS์˜ ์œ ๋ ˆ์นด(Eureka)๊ฐ€ ์กด์žฌ!

 

์œ ๋ ˆ์นด (Eureka)
์„ค๋ช…

์„œ๋ฒ„๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์‹œ์ž‘๋˜๋ฉด ๊ทธ๊ฒƒ์„ ๊ฐ์ง€ํ•˜์—ฌ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋˜๊ณ , ์„œ๋ฒ„๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋ชฉ๋ก์—์„œ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• ?!
์œ ๋ ˆ์นด์™€์˜ ํ†ตํ•ฉ์„ ์œ„ํ•œ ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๋‘๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค!

    โ€ฃ ์„œ๋ฒ„
      ๋“ฑ๋ก๋œ ์„œ๋น„์Šค์˜ ๋ชฉ๋ก์„ ์ˆ˜์ง‘ํ•˜๊ธฐ ์œ„ํ•œ API & ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ๋„คํŠธ์›Œํฌ ์œ„์น˜ ์ฃผ์†Œ์™€ ํ•จ๊ป˜ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ API ์œผ๋กœ ๊ตฌ์„ฑ
      ๊ฐ ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ๋ณต์ œํ•ด ์„ค์ •ํ•˜๊ณ  ๋ฐฐํฌํ•จ์œผ๋กœ์จ ๊ฐ€์šฉ์„ฑ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค!
      ์„œ๋น„์Šค์˜ ๊ฐ ์ธ์Šคํ„ด์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์กด์‹ ํ˜ธ(heartbeat) ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๋Š”๋‹ค. ์„ค์ •๋œ ๊ธฐ๊ฐ„๋™์•ˆ ์ƒ์กด์‹ ํ˜ธ๋ฅผ ๋ฐ›์ง€ ๋ชปํ•˜๋ฉด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์„œ๋น„์Šค๊ฐ€ ์‚ญ์ œ๋œ๋‹ค.

    โ€ฃ ํด๋ผ์ด์–ธํŠธ 
      ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ํ›„ ๋“ฑ๋ก & ์ข…๋ฃŒ ์ „ ๋“ฑ๋ก ํ•ด์ œ๋ฅผ ๋‹ด๋‹นํ•˜๊ณ  ์œ ๋ ˆ์ปค ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ตœ์‹  ์„œ๋น„์Šค ๋ชฉ๋ก์„ ๋ฐ›์•„์˜ด!

 

์‹ค์Šต

• eureka server 1๊ฐœ (eureka server) , client server 2๊ฐœ (demo1, demo2)

์œ ๋ ˆ์นด ์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ๋“ค์˜ application.yml ๋“ค

    โ€ฃ eureka.client.service-url.defaultZone ์—๋Š” ์œ ๋ ˆ์นด ์„œ๋ฒ„ ์—ฌ๋Ÿฌ๊ฐœ ์„ค์ •๋„ ๊ฐ€๋Šฅํ•˜๋‹ค

์œ ๋ ˆ์นด ์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ ๋“ค์˜ ์–ด๋…ธํ…Œ์ด์…˜ ์„ค์ •๋“ค

    โ€ฃ @EnableDiscoveryClient: spring-cloud-commons์— ์กด์žฌ
    โ€ฃ @EnableEurekaClient: spring-cloud-netflix์— ์กด์žฌํ•˜๋ฉฐ, ์œ ๋ ˆ์นด๋งŒ์„ ์œ„ํ•ด ์ž‘๋™

 

์œ ๋ ˆ์นด ์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ๋“ค์˜ build.gradle ์„ค์ •๋“ค


    โ€ฃ spring-cloud-starter-eureka-server vs spring-cloud-starter-netflix-eureka-server : ์ฐจ์ด์—†์Œ. ๊ทผ๋ฐ netflix ๋ถ™์€๊ฒƒ์„ ๊ถŒ์žฅํ•˜๋Š”๋“ฏ

 

 


์ฐธ๊ณ 

๋งํฌ: https://bcho.tistory.com/1252

 

MSA์—์„œ Service discovery ํŒจํ„ด

MSA์—์„œ Service discovery ํŒจํ„ด์˜ ์ดํ•ด ์กฐ๋Œ€ํ˜‘ (http://bcho.tistory.com) MSA์™€ ๊ฐ™์€ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์€ ์„œ๋น„์Šค ๊ฐ„์˜ ์›๊ฒฉ ํ˜ธ์ถœ๋กœ ๊ตฌ์„ฑ์ด ๋œ๋‹ค. ์›๊ฒฉ ์„œ๋น„์Šค ํ˜ธ์ถœ์€ IP ์ฃผ์†Œ์™€ ํฌํŠธ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ๋˜๋Š”๋‹ค. ํด๋ผ

bcho.tistory.com

๋งํฌ: https://stackoverflow.com/questions/49885718/difference-between-spring-cloud-starter-eureka-server-and-spring-cloud-starte

 

 

difference between `spring-cloud-starter-eureka-server` and `spring-cloud-starter-netflix-eureka-server`

I am new to the Spring Cloud, what is the exact difference between spring-cloud-starter-eureka-server and spring-cloud-starter-netflix-eureka-server ? When we should go for spring-cloud-starter-e...

stackoverflow.com

์ฑ…: ๋งˆ์Šคํ„ฐ๋ง ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ (Spring Cloud)

โ€ฃ ๋ถ„์‚ฐ/๋ฒ„์ „๊ด€๋ฆฌ, ์„œ๋น„์Šค ๋“ฑ๋ก ๋ฐ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ, ๋ผ์šฐํŒ…, ์„œ๋น„์Šค๊ฐ„ ํ˜ธ์ถœ, ๋ถ€ํ•˜๋ถ„์‚ฐ, ํšŒ๋กœ์ฐจ๋‹จ๊ธฐ, ๋ถ„์‚ฐ๋ฉ”์„ธ์ง€ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์ด๋‹ค.
โ€ฃ 
https://spring.io/projects/spring-cloud

 

Spring Cloud

Spring Cloud is an umbrella project consisting of independent projects with, in principle, different release cadences. To manage the portfolio a BOM (Bill of Materials) is published with a curated set of dependencies on the individual project. Go here to r

spring.io

โ€ฃ ์Šคํ”„๋ง๋ถ€ํŠธ ๋ฒ„์ „, ์Šคํ”„๋งํด๋ผ์šฐ๋“œ ๋ฒ„์ „ ์œ ์˜ํ•ด์„œ ์‚ฌ์šฉ ํ•„์š”!


12-ํŒฉํ„ฐ ์•ฑ(The Twelve-Factor App)

โ€ฃ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์‰ฝ๊ฒŒ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Œ.
โ€ฃ ์ง€์† ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋˜๋Š” Software as a Service(SaaS)๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก .
โ€ฃ ์Šคํ”„๋ง ๋ถ€ํŠธ & ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ๋Š” 12-ํŒฉํ„ฐ๋ฃฐ์— ๋ถ€ํ•ฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งŒ๋“œ๋Š” ๊ธฐ๋Šฅ & ์š”์†Œ ์ œ๊ณต
โ€ฃ https://12factor.net/ko/

 

The Twelve-Factor App (ํ•œ๊ตญ์–ด)

๋ฐฐ๊ฒฝ ์ด ๋ฌธ์„œ์— ๊ธฐ์—ฌํ•œ ์‚ฌ๋žŒ๋“ค์€ ์ˆ˜๋ฐฑ๊ฐœ ์•ฑ์˜ ๊ฐœ๋ฐœ๊ณผ ๋ฐฐํฌ์— ์ง์ ‘ ์ฐธ์—ฌํ–ˆ์œผ๋ฉฐ, Heroku ํ”Œ๋žซํผ์„ ํ†ตํ•ด์„œ ๋ฐฉ๋Œ€ํ•œ ์•ฑ์˜ ๊ฐœ๋ฐœ, ์šด์˜, ํ™•์žฅ์„ ๊ฐ„์ ‘์ ์œผ๋กœ ๊ด€์ฐฐํ–ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ์‹ค์ œ๋กœ ์“ฐ์ด๋Š” ๋‹ค์–‘ํ•œ SaaS

12factor.net

โ€ป Software as a Service(SaaS)
์„œ๋น„์Šค ์‚ฌ์—…์ž๊ฐ€ ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ธํ„ฐ๋„ท์ƒ์—์„œ ์ด์— ์›๊ฒฉ ์ ‘์†ํ•ด ํ•ด๋‹น ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ํ™œ์šฉํ•˜๋Š” ์„œ๋น„์Šค ๋ชจ๋ธ.
ERP..CRM..SLACK..

โ€ฃ https://medium.com/dtevangelist/12-factors-%EB%9E%80-b39c7ef1ed30

 

๋„ทํ”Œ๋ฆญ์Šค(Netflix) OSS

โ€ฃ ๋ชจ๋†€๋ฆฌ์‹ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ฐ˜ ์ „ํ†ต์  ๊ฐœ๋ฐœ ๋ชจ๋ธ → ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜ํ•œ ์„ ๊ตฌ์ž
โ€ฃ ๋งŽ์€ ์˜คํ”ˆ์†Œ์Šค๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ์œ ๋ ˆ์นด(Eureka), ํžˆ์ŠคํŠธ๋ฆญ์Šค(Hystrix), ๋ฆฌ๋ณธ(Ribbon), ์ค„(Zuul) ๋“ฑ๊ณผ ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ์™€ ํ†ตํ•ฉ๋จ.

 

์œ ๋ ˆ์นด(Eureka)

โ€ฃ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ (์ „ํ™”๋ฒˆํ˜ธ๋ถ€ ์ฑ…)
    → ์™ธ๋ถ€์˜ ์„œ๋น„์Šค๋“ค์ด ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…
    → ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ or API Gateway์„ ์ „๋‹ฌํ•˜๊ฒŒ๋˜๋ฉด serviceDiscovery ์— ์ „๋‹ฌ๋˜์–ด ํ•„์š” ์ •๋ณด๋ฅผ ์ฐพ์Œ

โ€ฃ ์„œ๋น„์Šค ์ •๋ณด ๋ฐ ์œ„์น˜์ •๋ณด ํ™•์ธ ๋“ฑ (Naming server)
โ€ฃ ์„œ๋ฒ„๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์‹œ์ž‘๋˜๋ฉด ๊ทธ๊ฒƒ์„ ๊ฐ์ง€ํ•˜์—ฌ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋˜๊ณ , ์„œ๋ฒ„๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋ชฉ๋ก์—์„œ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•.

โ€ฃ ํด๋ผ์ด์–ธํŠธ & ์„œ๋ฒ„๋กœ ๊ตฌ๋ถ„
    • ํด๋ผ์ด์–ธํŠธ (discovery client)
          → ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ผ๋ถ€๋กœ ์›๊ฒฉ ๋””์Šค์ปค๋ฒ„๋ฆฌ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋Š” ์ผ์„ ๋‹ด๋‹น
          → ์—ฐ๊ฒฐ๋˜๋ฉด ์„œ๋น„์Šค ์ด๋ฆ„ & ๋„คํŠธ์›Œํฌ ์œ„์น˜๋ฅผ ๋‹ด์€ ๋“ฑ๋ก ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋ƒ„
          → ํ˜„์žฌ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๊ฐ€ ๋‹ค๋ฅธ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ์ข…๋‹จ์ ์„ ํ˜ธ์ถœํ•ด์•ผ ํ•  ๊ฒฝ์šฐ, ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋“ฑ๋ก๋œ ์„œ๋น„์Šค ๋ชฉ๋ก์„ ๋‹ด์€ ์ตœ์‹ ์˜ ์ปจํ”ผ๊ทœ๋ ˆ์ด์…˜(์„ค์ •์ •๋ณด)๋ฅผ ๊ฐ€์ ธ์˜ด.
          → ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์บ์‹ฑํ•˜๊ณ  ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ฒดํฌํ•œ๋‹ค.
           ์œ ๋ ˆ์นด ์„œ๋ฒ„๊ฐ€ ๋ฉˆ์ถ”๋”๋ผ๋„ ์„œ๋น„์Šค๋“ค๋ผ๋ฆฌ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค! ์„œ๋น„์Šค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ๋กœ์ปฌ์— ์บ์‹ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ
          → spring-cloud-starter-netflix-eureka-client ์‚ฌ์šฉ

    • ์„œ๋ฒ„ (Service registry)
          → ๊ฐ ์„œ๋น„์Šค๋“ค๋กœ๋ถ€ํ„ฐ ์ƒ์กด์‹ ํ˜ธ? ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›๊ณ , ๋ฉ”์„ธ์ง€๋ฅผ ๋ชป๋ฐ›์œผ๋ฉด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์„œ๋น„์Šค ์‚ญ์ œ๋œ๋‹ค.
           ๋…๋ฆฝ์ ์ธ ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์„ค์ •๋˜๊ณ  ์‹คํ–‰๋จ. ๊ฐ ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ๋‹ค๋ฅธ ์„œ๋ฒ„์— ๋ณต์ œํ•ด ๊ฐ€์šฉ์„ฑ(=์„œ๋น„์Šค ์ •์ƒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ์ •๋„)์ด ๋†’์Œ.
           pring-cloud-starter-netflix-eureka-server ์‚ฌ์šฉ

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4/lecture/68382?tab=curriculum&volume=1.00&speed=1

 

ํžˆ์ŠคํŠธ๋ฆญ์Šค(Hystrix)

โ€ฃ ์„œํ‚ท๋ธŒ๋ ˆ์ด์ปคํŒจํ„ด ๊ตฌํ˜„ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 
โ€ฃ ํด๋ฐฑ(fallback) ๋กœ์ง ์‰ฝ๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
โ€ฃ spring-cloud-starter-hystricx ์Šคํƒ€ํ„ฐ ์‚ฌ์šฉ

โ€ป ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ํŒจํ„ด (circuit breaker pattern)
์„ฑ๊ณต ๋ฐ ์‹คํŒจ ์š”์ฒญ ํšŸ์ˆ˜๋ฅผ ์„ผ ๋‹ค์Œ, ์—๋Ÿฌ ๋น„์œจ์ด ๊ฐ€์ •๋œ ์ž„๊ณ„์น˜๋ฅผ ๋„˜์œผ๋ฉด ์ฐจ๋‹จ ๋ฐœ์ƒ ๋ฐ ์ดํ›„ ์‹คํŒจ์ฒ˜๋ฆฌํ•œ๋‹ค.
→ ๋ฌธ์ œ๋˜๋Š” ๋ถ€๋ถ„(๋Š๋ฆฐ๋ถ€๋ถ„)์„ ํŠน์ • ํ˜ธ์ถœ์„ ๊ฐ์ง€ํ•˜์—ฌ ์Šค๋ ˆ๋“œ๋ฅผ ์†Œ์ง„ํ•˜์ง€ ์•Š๊ณ  ๋น ๋ฅด๊ฒŒ ์‹คํŒจ์‹œ์ผœ ๋ฒ„๋ฆผ(์›๊ฒฉ ์ž์› ์‚ฌ์šฉ ๋ถ€๋ถ„ ์ œ๊ฑฐ)
→ ๋‹ค๋ฅธ์„œ๋น„์Šค์— ์˜ํ–ฅ ์•ˆ๊ฐ€๋„๋ก!
์ง€์ •๋œ ์‹œ๊ฐ„์ด ์ง€๋‚˜๊ณ  ๋‚˜๋ฉด, ์žฌ์š”์ฒญ ํ›„ ์„œํ‚ท์€ ๋‹ซํ˜€ ์ •์ƒ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๋„๋ก ํ•œ๋‹ค. 

 

๋ฆฌ๋ณธ(Ribbon)

โ€ฃ ํด๋ผ์ด์–ธํŠธ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์—ญํ• ,, ๊ทผ๋ฐ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ž˜ ๋˜์ง€ ์•Š์Œ,, ์ž˜ ์‚ฌ์šฉ ์•ˆํ•˜๊ฒŒ๋จ
โ€ฃ IP..port..ํ˜ธ์ถœ์ด ์•„๋‹Œ ์ด๋ฆ„๋งŒ ๊ฐ€์ง€๊ณ  ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅ... 
โ€ฃ ํด๋ผ์ด์–ธํŠธ ์ธก ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ
โ€ฃ HTTP, UDP, TCP ๋“ฑ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ํ”„๋กœํ† ์ฝœ ์ง€์›
โ€ฃ ๋™๊ธฐ๋ฐฉ์‹์˜ RESTํ˜ธ์ถœ, ๋น„๋™๊ธฐ, ๋ฆฌ์•กํ‹ฐ๋ธŒ ๋ชจ๋ธ๋„ ์ง€์›
โ€ฃ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ, ์บ์‹ฑ, ์ผ๊ด„์ฒ˜๋ฆฌ, ์žฅ์•  ๋‚ด์„ฑ๊ณผ ํ†ตํ•ฉ ๊ฐ€๋Šฅ.
โ€ฃ spring-cloud-starter-ribbon ์Šคํƒ€ํ„ฐ ์‚ฌ์šฉ
โ€ฃ springboot 2.4 ์ดํ›„ Maintenance ์ƒํƒœ 

 

์ค„(Zuul)

โ€ฃ API ๊ฒŒ์ดํŠธ์›จ์ด or API Service, Edge Service
โ€ฃ JVM ๊ธฐ๋ฐ˜ ๋ผ์šฐํ„ฐ, ์„œ๋ฒ„ ์ธก ๋ถ€ํ•˜ ๋ถ„์‚ฐ or ์ผ๋ถ€ ํ•„ํ„ฐ๋ง ์ˆ˜ํ–‰
โ€ฃ ์ธ์ฆ, ๋ถ€ํ•˜ ํ‰๊ท  ๋ถ„๋ฐฐ, ์ •์  ์‘๋‹ต ์ฒ˜๋ฆฌ, ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ๋“ฑ์— ์‚ฌ์šฉ.
โ€ฃ ์„ค์ • ๊ฐ€๋Šฅ ๋ฐ ๋…๋ฆฝ์  ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์‹คํ–‰๋จ.
โ€ฃ spring-cloud-starter-zuul ์Šคํƒ€ํ„ฐ ์‚ฌ์šฉ
โ€ฃ springboot 2.4 ์ดํ›„ Maintenance ์ƒํƒœ 

 

โœป ์ตœ๊ทผ์—๋Š” Ribbon,, Zuul ๋ณด๋‹จ, Spring Cloud Gateway ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•จ.
https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now#spring-cloud-netflix-projects-entering-maintenance-mode

https://happycloud-lee.tistory.com/218โ€‹

 

[SC12] Spring Cloud Gateway ๋ž€ ?

1. Spring Cloud Gateway(SCG) ์ดํ•ด 1) WHY ? SCG๋Š” API Gateway์˜ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ API Gateway๊ฐ€ ์™œ ํ•„์š”ํ•œ์ง€ ๋จผ์ € ์ดํ•ดํ•˜๋Š”๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Zuul serverํŽธ์—์„œ ์„ค๋ช…ํ•œ๋ฐ”์™€ ๊ฐ™์ด API Gateway๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ..

happycloud-lee.tistory.com

 

 

ํŽ˜์ธ(Feign)

โ€ฃ REST Client
โ€ฃ Interface ์„ ์–ธ์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ HttpClient ์„ ์ƒ์„ฑ 
โ€ฃ ์›น ์„œ๋น„์Šค ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•˜๋„๋ก ๋„์™€์คŒ.
โ€ฃ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ (๋ฆฌํ„ด๊ฐ’๋งŒ ๊ด€์‹ฌ,, ์–ด๋–ค URL ์ธ์ง€ ์–ด๋–ป๊ฒŒ ์‘๋‹ต๊ฐ’์„ ํŒŒ์‹ฑํ• ์ง€๋Š” ๊ด€์‹ฌ์—†์Œ)

โ€ฃ spring-cloud-starter-feign ์Šคํƒ€ํ„ฐ ์‚ฌ์šฉ
โ€ฃ ๋ฆฌ๋ณธ ํด๋ผ์ด์–ธํŠธ์™€ ํ†ตํ•ฉ๋ผ ๋””์Šค์ปค๋ฒ„๋ฆฌ ์„œ๋น„์Šค์™€ ํ†ต์‹ , ๋ถ€ํ•˜๋ถ„์‚ฐ ๊ฐ™์€ ๊ธฐ๋Šฅ ์ œ๊ณต.

 

https://erea.tistory.com/14

 

 

๋ถ„์‚ฐ ์ปจํ”ผ๊ทœ๋ ˆ์ด์…˜ ๊ด€๋ฆฌ

โ€ฃ ์„ค์ •์ •๋ณด ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€๊ฐ€ ์•„๋‹Œ, ์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๋Š”๊ฒƒ (์ค‘์•™ํ™” ๋œ ์ €์žฅ์†Œ์—์„œ ๊ตฌ์„ฑ ์š”์†Œ ๊ด€๋ฆฌ)
โ€ฃ ๊ฐ ์„œ๋น„์Šค๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜์ง€์•Š๊ณ  ๋ฐ”๋กœ ์ ์šฉ! (์ค‘์•™์— ์žˆ์œผ๋ฏ€๋กœ)
โ€ฃ ์„œ๋ฒ„๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ค‘์•™ ์žฅ์†Œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๋ชจ๋“  ์™ธ๋ถ€ ์†์„ฑ์ด ๋ชจ๋“  ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ์„œ๋ฒ„์—์„œ ๊ด€๋ฆฌ๋จ. (key, value.. yml file..)
โ€ฃ ์„ค์ • ํŒŒ์ผ์€ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋˜๋Š” ์„œ๋ฒ„ ํด๋ž˜์Šค ๊ฒฝ๋กœ์— ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. (vault..)

โ€ป Vault 
ํ† ํฐ ๋ฐ ํŒจ์Šค์›Œ๋“œ ์ž๊ฒฉ์ฆ๋ช…์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ ์†Œ์Šค ๋„๊ตฌ
ํ•ด์‹œ์ฝ”ํ”„(HashCorp)์—์„œ ๋งŒ๋“ฌ
์ž๊ฒฉ ์ •๋ณด ๋“ฑ์„ ์•ˆ์ „ํ•œ ์žฅ์†Œ์— ์ €์žฅ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ๋ณด์•ˆ์ด์Šˆ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
API ์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ (API๋Š” ๊ธฐ๋ณธ ์ธ์ฆ์œผ๋กœ ๋ณดํ˜ธ๋จ)
ํ‚ค/๊ณต๊ฐœ ํ‚ค ์ธ์ฆ์„ ์‚ฌ์šฉํ•œ SSL ์—ฐ๊ฒฐ ์„ค์ •๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

โ€ฃ spring-cloud-config-server ์˜์กด์„ฑ ์ถ”๊ฐ€ํ•˜์—ฌ ํ™œ์„ฑํ™”

 

์ปจ์„ค(Consul)

โ€ฃ ๋„ทํ”Œ๋ฆญ์Šค ๋ฆฌ๋ณธ๊ณผ ๋™์  ๋ผ์šฐํ„ฐ, ๋„ทํ”Œ๋ฆญ์Šค Zuul์˜ filter๋ฅผ ์ง€์›
โ€ฃ spring-cloud-starter-consul-discovery ์˜์กด์„ฑ ์‚ฌ์šฉ

 

์•„ํŒŒ์น˜ ์ฃผํ‚คํผ(Apache Zookeeper)

โ€ฃ ์ปจํ”ผ๊ทœ๋ ˆ์ด์…˜๊ณผ ์ด๋ฆ„์„ ์œ ์ง€ํ•˜๋Š” ์ค‘์•™ ์„œ๋น„์Šค๋กœ ๋ถ„์‚ฐ ๋™๊ธฐํ™”, ๊ทธ๋ฃน ์„œ๋น„์Šค๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ. 
โ€ฃ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ๋œ ๋ฉ”์„ธ์ง€ ํ ์ •๋ณด๋“ค ๊ด€๋ฆฌ, kafka ์„œ๋ฒ„ ๊ฐ€๋™ํ•˜๋ ค๋ฉด zookeeper๊ฐ€ ๊ตฌ๋™๋˜์–ด ์žˆ์–ด์•ผ ํ•จ.
โ€ฃ ํด๋ผ์ด์–ธํŠธ ์ธก์— ์ฃผํ‚คํผ๋ฅผ ์‚ฌ์šฉํ•œ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด spring-cloud-startet-zookeeper-discovery, ์•„ํŒŒ์น˜ ํ๋ ˆ์ดํ„ฐ๋ฅผ ์˜์กด์„ฑ์— ํฌํ•จ.
โ€ฃ ๋ถ„์‚ฐ ์ปจํ”ผ๊ทœ๋ ˆ์ด์…˜ ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ™œ์„ฑํ™” ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” spring-cloud-starter-zookeeper-config ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•„์š”.

 

 

๋ถ„์‚ฐ์ถ”์ 

์Šฌ๋ฃจ์Šค(Sleuth)

โ€ฃ ํ•˜๋‚˜์˜ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ ์ฒ˜๋ฆฌํ• ๋•Œ ์ด์–ด์ง€๋Š” ์š”์ฒญ์„ ์—ฐ๊ด€์ง€์Œ
โ€ฃ Slf4j, MDC๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค.
โ€ฃ spring-cloud-starter-sleuth ์˜์กด์„ฑ ์ถ”๊ฐ€ํ•˜์—ฌ ํ™œ์„ฑํ™”

โ€ป Slf4j
๋กœ๊ทธ๋ฐฑ log4j, logging ๋“ฑ๊ณผ ๊ฐ™์€ ํŠน์ • ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ถ”์ƒํ™” ํผ์‚ฌ๋“œ(Facade=์ปค๋‹ค๋ž€ ์ฝ”๋“œ๋ถ€๋ถ„์— ๋Œ€ํ•ด ๊ฐ„๋žตํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณต)๋ฅผํ•จ

โ€ป MDC (mapped diagnostic context)
๋‹ค์–‘ํ•œ ์†Œ์Šค์˜ ๋กœ๊ทธ ์ถœ๋ ฅ์„ ๊ตฌ๋ถ„ํ•˜๊ณ  ์‹ค์ œ ๋ฒ”์œ„์— ์—†๋˜ ๋ถ€๊ฐ€ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์†”๋ฃจ์…˜ 

 

 

๋ฉ”์„ธ์ง•

 

๋ฒ„์Šค(bus)

โ€ฃ ๋ถ„์‚ฐ์‹œ์Šคํ…œ์˜ ๋…ธ๋“œ(๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค)๋ฅผ ๊ฒฝ๋Ÿ‰ ๋ฉ”์„ธ์ง€ ๋ธŒ๋กœ์ปค(RabbitMQ)์™€ ์—ฐ๊ฒฐ
โ€ฃ ์ƒํƒœ ๋ฐ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์—๊ฒŒ ์ „๋‹ฌ (๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค์—๊ฒŒ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์•Œ๋ ค์คŒ)
โ€ฃ ์ปจํ”ผ๊ทœ๋ ˆ์ด์…˜ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ์˜ ์ „๋‹ฌ ๋“ฑ ๊ณตํ†ต ์˜คํผ๋ ˆ์ด์…˜์„ ์œ„ํ•œ ๋ถ„์‚ฐ ๋ฉ”์„ธ์ง• ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ŠคํŠธ๋ฆผ(Stream)

โ€ฃ ๋ฉ”์„ธ์ง€ ์ค‘์‹ฌ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋กœ ๊ตฌ์„ฑ๋œ ์‹œ์„ธํ‹ˆ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ์˜ฌ๋ฐ”๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ
โ€ฃ ๋‘๊ฐœ์˜ ๋ฐ”์ธ๋”๊ฐ€ ์กด์žฌ (AMQP, Apache Kafka)
โ€ฃ ์Šคํ”„๋ง ์ธํ…Œ๊ทธ๋ ˆ์ด์…˜์— ๊ธฐ๋ฐ˜. ์ข…๋‹จ์ , ์ฑ„๋„, ์• ๊ทธ๋ฆฌ๊ฒŒ์ดํ„ฐ, ํŠธ๋žœ์Šคํฌ๋จธ์™€ ๊ฐ™์€ ๋Œ€๋ถ€๋ถ„์˜ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ†ตํ•ฉ ํŒจํ„ด์„ ์ง€์›ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์„ ์ œ๊ณต
โ€ฃ ๋งˆ์ดํฌ๋กœ์‹œ์Šคํ…œ ๋‚ด์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ ์ŠคํŠธ๋ฆผ ์ž…๋ ฅ & ์ถœ๋ ฅ ์ฑ„๋„์„ ํ†ตํ•ด ํ†ต์‹ ํ•จ. 
โ€ฃ ๊ตฌ๋…/๊ฒŒ์‹œ ๋“ฑ ๋ฉ”์„ธ์ง€ ๊ณต์œ  ํ† ํ”ฝ์„ ํ†ตํ•ด ์ „ํŒŒ. (์›น์†Œ์ผ“ ํ†ต์‹ ๋ฐฉ์‹ ๊ฐ™์€๊ฑด๊ฐ€,,)

โ€ป AMQP (Advanced Message Queue Protocol)
๋ฉ”์„ธ์ง• ํ”„๋กœํ† ์ฝœ (MQ(๋ฉ”์„ธ์ง€ํ) ๊ธฐ๋ฐ˜)
HTTP ํ”„๋กœํ† ์ฝœ๊ณผ ๋‹ฌ๋ฆฌ ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ์˜ ์ •์˜ ๋ฟ ์•„๋‹ˆ๋ผ ์„œ๋ฒ„ ์ธก ์„œ๋น„์Šค์™€ ๋™์ž‘ ๋ฐฉ์‹๋„ ์ •์˜ํ•œ๋‹ค.
๊ด€๋ จ ๋ฏธ๋“ค์›จ์–ด : RabbitMQ, Erlang
๋ฉ”์„ธ์ง€๋ธŒ๋กœ์ปค
์˜คํ”ˆ์†Œ์Šค ๋ฉ”์„ธ์ง€ ์†Œํ”„ํŠธ์›จ์–ด
https://www.youtube.com/watch?v=80y2C54KPxg
๋ฐ›๋Š” ์†Œ๋น„์ž ์ค‘์‹ฌ
โ€ป Apache Kafka
Scala์–ธ์–ด๋กœ ๊ฐœ๋ฐœ๋œ ์˜คํ”ˆ์†Œ์Šค ๋ฉ”์„ธ์ง€ ๋ธŒ๋กœ์ปค ํ”„๋กœ์ ํŠธ
์ด๋ฒคํŠธ๋ธŒ๋กœ์ปค (๋ฉ”์„ธ์ง€ ๋ธŒ๋กœ์ปค ๊ธฐ๋Šฅ ํฌํ•จ)
๋ถ„์‚ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์„ค๊ณ„๋œ ์˜คํ”ˆ์†Œ์Šค ๋ฉ”์„ธ์ง• ํ”Œ๋žซํผ
๋ฉ”์„ธ์ง€ ๋ฐœํ–‰/๊ตฌ๋… ์‹œ์Šคํ…œ (Pub/Sub)
๋ณด๋‚ด๋Š” ์ƒ์‚ฐ์ž ์ค‘์‹ฌ

 

 

ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ ์ง€์›

โ€ฃ ํ”ผ๋ณดํƒˆ..SQS,,SNS,,ElasticCache,,RDS,,๋“ฑ์ด ์žˆ๋‹ค.
โ€ฃ ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ ํŽ‘์…˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋‹ค. FaaS(Function-as-a-Service),,AWS Lambda
โ€ฃ SMTP..rabbitMQ,,Redis,,

 

 

๋ณด์•ˆ๊ด€๋ฆฌ ํ™œ์„ฑํ™”

โ€ฃ spring-cloud-starter-security ์˜์กด์„ฑ ์ถ”๊ฐ€

 

 

๋ฆด๋ฆฌ์ฆˆ ํŠธ๋ ˆ์ธ

โ€ฃ ํ•˜์œ„ ํ”„๋กœ์ ํŠธ์˜ ํ˜ผ๋ž€์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ฆด๋ฆฌ์ฆˆ๋ฅผ ๋ฒ„์ „์ด ์•„๋‹Œ ์ด๋ฆ„์œผ๋กœ ๊ตฌ๋ถ„
โ€ฃ BOM(Bill of materials)์— ๊ธฐ๋ฐ˜ → ์•„ํ‹ฐํŒฉํŠธ ๋ฒ„์ „์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ํ‘œ์ค€ ๋ฉ”์ด๋ธ ๊ฐœ๋….
โ€ฃ https://spring.io/projects/spring-cloud-stream

 

 


์ฐธ๊ณ 

๋งํฌ: https://m.blog.naver.com/quart21c/173614581

 

ํด๋ผ์šฐ๋“œ์ปดํ“จํŒ…์˜ SaaS, PaaS, laaS์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณผ๊นŒ์š”.

ํด๋ผ์šฐ๋“œ์ปดํ“จํŒ… ๋•Œ ์ž์ฃผ ๋“ฃ๋Š” SaaS, PaaS, LaaS์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณผ๊นŒ์š”. ํด๋ผ์šฐ๋“œ์ปดํ“จํŒ…, ํด๋ผ...

blog.naver.com

๋งํฌ: https://coe.gitbook.io/guide/gateway/zuul

 

Zuul - guide

๋™์  ๋ผ์šฐํŒ…, ๋ชจ๋‹ˆํ„ฐ๋ง, ํšŒ๋ณต ํƒ„๋ ฅ์„ฑ, ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ์ง€์› (Filters๋ฅผ ํ†ตํ•œ ๊ตฌํ˜„)

coe.gitbook.io

๋งํฌ: https://sup2is.github.io/2020/04/12/spring-cloud-hystrix-circuit-breaker-with-fallback.html

 

Sup2's blog-Spring Cloud์—์„œ Hystrix๋ฅผ ์‚ฌ์šฉํ•œ Circuit Breaker ๊ตฌํ˜„ํ•˜๊ธฐ Feat.Fallback

 

sup2is.github.io

์ฑ…: http://www.yes24.com/Product/Goods/66581779

 

๋งˆ์Šคํ„ฐ๋ง ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ - YES24

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ๋ณด์•ˆ ๊ฐ•ํ™”, ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ์ž!ํด๋ผ์šฐ๋“œ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฐฐํฌํ•˜๊ณ  ์šด์˜ํ•˜๋Š” ๊ฒƒ์€ ๋กœ์ปฌ ์• ํ”Œ๋ฆฌ

www.yes24.com

๋งํฌ: http://blog.skby.net/amqp-advanced-message-queue-protocol/

 

AMQP (Advanced Message Queue Protocol) > ๋„๋ฆฌ์˜ ๋””์ง€ํ„ธ๋ผ์ดํ”„

I. ์‘์šฉ ๊ณ„์ธต ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ํ‘œ์ค€, AMQP ๊ฐ€. AMQP(Advanced Message Queue Protocol)์˜ ๊ฐœ๋… ํด๋ผ์ด์–ธํŠธ ๋ฏธ๋“ค์›จ์–ด ๋ธŒ๋กœ์ปค ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ์œ„ํ•œ MQ๊ธฐ๋ฐ˜ ๋ฉ”์‹œ์ง€ ๊ตํ™˜ ํ”„๋กœํ† ์ฝœ ๋‚˜. AMQP ํŠน์ง• ์ด๊ธฐ์ข… ๊ฐ„ ๋ฉ”์‹œ์ง€ ๊ตํ™˜

blog.skby.net

๊ฐ•์˜: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4/lecture/68407?tab=curriculum&volume=1.00&speed=1

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
WebSocket
์„ค๋ช…

TCP ์ ‘์†์— ์ „์ด์ค‘ ํ†ต์‹  ์ฑ„๋„์„ ์ œ๊ณตํ•˜๋Š” ์ปดํ“จํ„ฐ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ
HTTP ํด๋ง๊ณผ ๊ฐ™์€ ๋ฐ˜์ด์ค‘ ๋ฐฉ์‹์— ๋น„ํ•ด ๋” ๋‚ฎ์€ ๋ถ€ํ•˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ๋ธŒ๋ผ์šฐ์ €์™€ ์›น ์„œ๋ฒ„๊ฐ„์˜ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ. 
์„œ๋ฒ„๊ฐ€ ๋‚ด์šฉ์„ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋‚ด๋Š” ํ‘œ์ค€ํ™”๋œ ๋ฐฉ์‹์„ ์ œ๊ณต
์—ฐ๊ฒฐ์ด ์œ ์ง€๋œ ์ƒํƒœ์—์„œ ๋ฉ”์„ธ์ง€๋“ค์„ ์˜ค๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉํ•จ. (์–‘๋ฐฉํ–ฅ)

โ€ป ์ „์ด์ค‘ ํ†ต์‹  (Full Duplex)
๋‘ ์ง€์ (์‹œ์ž‘๊ณผ ๋) ์‚ฌ์ด์—์„œ ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ์ „์ž ํ†ต์‹  ์‹œ์Šคํ…œ
โ€ป TCP (Transmission Control Protocol), ์ „์†ก์ œ์–ดํ”„๋กœํ† ์ฝœ
์„œ๋ฒ„๋ผ๋ฆฌ ํ†ต์‹ ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๊ทœ์•ฝ(ํ”„๋กœํ† ์ฝœ)
์›น๋ธŒ๋ผ์šฐ์ €๋“ค์ด WWW์— ์„œ๋ฒ„ ์—ฐ๊ฒฐํ• ๋•Œ ์‚ฌ์šฉ
์ด๋ฉ”์ผ ์ „์†ก ๋ฐ ํŒŒ์ผ ์ „์†ก์‹œ ์‚ฌ์šฉ

โœฑ ์ตœ์ดˆ ์—ฐ๊ฒฐ์‹œ  
    1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์›น์†Œ์ผ“ ํ•ธ๋“œ์…ฐ์ดํฌ ์š”์ฒญ์„ ๋ณด๋ƒ„
    2. ์„œ๋ฒ„๋Š” ์›น์†Œ์ผ“ ํ•ธ๋“œ์…ฐ์ดํฌ ์‘๋‹ต์„ ๋ณด๋ƒ„
    3. ์ดํ›„๋กœ ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์š”์ฒญ์„ ๋ณด๋‚ผ์ˆ˜ ์žˆ์Œ. (!= HTTP)


 

Websocket in Spring
๊ด€๋ จ ์˜ˆ์ œ 

https://spring.io/guides/gs/messaging-stomp-websocket/ ์„ ์ฐธ๊ณ ํ•˜์—ฌ ์‹ค์Šต์„ ํ•ด ๋ณด์•˜๋‹ค. 
ํ•ด๋‹น ๋งํฌ๋Š” STOMP(Simple Text Messaging protocol)์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

โ€ป STOMP(Simple Text Messaging protocol)
ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋ฉ”์„ธ์ง• ํ”„๋กœํ† ์ฝœ
์ด๋ฅผ ์ด์šฉํ•˜์—ฌ Binary, Text๊ฐ€ ์•„๋‹Œ ๊ทœ๊ฒฉ์„ ๋งž์ถ˜ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. 
๋ฐœํ–‰(pub), ๊ตฌ๋…(sub), ๋ฉ”์„ธ์ง€๋ธŒ๋กœ์ปค(=๋ฐœ์‹ ์ž๊ฐ€ ๋ฉ”์„ธ์ง€ ๋ฐ›์•„์™€ ์ˆ˜์‹ ์ž์—๊ฒŒ ์ „๋‹ฌ) ๋“ฑ์˜ ๊ฐœ๋…์ด ์žˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์„œ๋ฒ„ ๊ตฌ๋™์‹œ, ์›น์†Œ์ผ“ ๋ฉ”์„ธ์ง• ๋ธŒ๋กœ์ปค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š”๋“ฏ ํ•˜๋‹ค. (SimpleBrokerMessageHandler)

+ Fallback Options์œผ๋กœ SockJS์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค. 

 

ํ…Œ์ŠคํŠธ ํ™”๋ฉด

์ตœ์ดˆ์—ฐ๊ฒฐ์‹œ (๋ธŒ๋ผ์šฐ์ €1(์ƒ๋‹จ), ๋ธŒ๋ผ์šฐ์ €2(ํ•˜๋‹จ))

 

๋ธŒ๋ผ์šฐ์ €1์ด TARGET1์„ ์ž…๋ ฅ ํ•˜์˜€์„๋•Œ

๋ธŒ๋ผ์šฐ์ €์—์„œ Send ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ, /app/hello ์„ ํ˜ธ์ถœํ•˜๊ณ 
๋ฉ”์„ธ์ง€ ๋ธŒ๋กœ์ปค ํ•ธ๋“ค๋Ÿฌ ๋‚ด์—์„œ ์ฒ˜๋ฆฌ ํ›„ /topic/greetings ์œผ๋กœ ๊ฒฐ๊ณผ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•จ!

 

๋ธŒ๋ผ์šฐ์ €2๊ฐ€ TARGET2์„ ์ž…๋ ฅ ํ•˜์˜€์„๋•Œ

 

 

 


์ฐธ๊ณ 

๋งํฌ: https://ko.wikipedia.org/wiki/%EC%9D%B4%EC%A4%91%ED%86%B5%EC%8B%A0

 

์ด์ค‘ํ†ต์‹  - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์ด์ค‘ํ†ต์‹ (duplex) ๋˜๋Š” ์Œ๋ฐฉํ–ฅ ํ†ต์‹ ์€ ๋‘ ์ง€์  ์‚ฌ์ด์—์„œ ์ •๋ณด๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ์ „์ž ํ†ต์‹  ์‹œ์Šคํ…œ์„ ๋งํ•œ๋‹ค. ์ด์ค‘ ํ†ต์‹ ์„ ํ•  ๋•Œ ์ „์†ก ๋ฐฉํ–ฅ๋งˆ๋‹ค ๋‘ ๊ฐœ์˜ ํ†ต์‹  ์„ ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹จ์ˆœํ•˜์ง€๋งŒ ์ „์†ก๋กœ๋ฅผ ์•„๋ผ

ko.wikipedia.org

๋งํฌ: https://ko.wikipedia.org/wiki/%EC%9B%B9%EC%86%8C%EC%BC%93

 

์›น์†Œ์ผ“ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์›น์†Œ์ผ“(WebSocket)์€ ํ•˜๋‚˜์˜ TCP ์ ‘์†์— ์ „์ด์ค‘ ํ†ต์‹  ์ฑ„๋„์„ ์ œ๊ณตํ•˜๋Š” ์ปดํ“จํ„ฐ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ์›น์†Œ์ผ“ ํ”„๋กœํ† ์ฝœ์€ 2011๋…„ IETF์— ์˜ํ•ด RFC 6455๋กœ ํ‘œ์ค€ํ™”๋˜์—ˆ์œผ๋ฉฐ ์›น IDL์˜ ์›น์†Œ์ผ“ API๋Š” W3C์— ์˜ํ•ด ํ‘œ์ค€

ko.wikipedia.org

๋งํฌ :https://ko.wikipedia.org/wiki/%EC%A0%84%EC%86%A1_%EC%A0%9C%EC%96%B4_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C

 

์ „์†ก ์ œ์–ด ํ”„๋กœํ† ์ฝœ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์ „์†ก ์ œ์–ด ํ”„๋กœํ† ์ฝœ(Transmission Control Protocol, TCP, ๋ฌธํ™”์–ด: ์ „์†ก์กฐ์ข…๊ทœ์•ฝ)์€ ์ธํ„ฐ๋„ท ํ”„๋กœํ† ์ฝœ ์Šค์œ„ํŠธ(IP)์˜ ํ•ต์‹ฌ ํ”„๋กœํ† ์ฝœ ์ค‘ ํ•˜๋‚˜๋กœ, IP์™€ ํ•จ๊ป˜ TCP/IP๋ผ๋Š” ๋ช…์นญ์œผ๋กœ๋„ ๋„๋ฆฌ ๋ถˆ๋ฆฐ๋‹ค. TCP๋Š” ๊ทผ๊ฑฐ๋ฆฌ ํ†ต์‹ 

ko.wikipedia.org

๋งํฌ: https://namu.wiki/w/TCP

๋งํฌ: https://tecoble.techcourse.co.kr/post/2021-09-05-web-socket-practice/

 

์›น ์†Œ์ผ“์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž! - ์‹ค์ „ ํŽธ

์›น ์†Œ์ผ“์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž! - ์‹ค์ „ ํŽธ ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ €๋ฒˆ์— ์ž‘์„ฑํ–ˆ๋˜ ์›น ์†Œ์ผ“ ์ด๋ก  ํŽธ์— ์ด์–ด์„œ, ์Šคํ”„๋ง ํ™˜๊ฒฝ์—์„œ ์›น ์†Œ์ผ“์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๋ ค๊ณ  ํ•œ๋‹ค. STOMP ๊ตฌํ˜„ํ•˜๊ธฐ์— ์•ž์„œ, ์šฐ๋ฆฌ๋Š” ์ƒˆ

tecoble.techcourse.co.kr

๋งํฌ: https://tech.kakao.com/2020/06/22/websocket-part3/

 

์‹ค์‹œ๊ฐ„ ๋Œ“๊ธ€ ๊ฐœ๋ฐœ๊ธฐ(part.3) - Spring์˜ ๋™์‹œ์„ฑ ์ ‘๊ทผ ์ œ์–ด์— ๋ฐœ๋ชฉ ์žกํžŒ ์ด์•ผ๊ธฐ

์ „ํŽธ(์‹ค์‹œ๊ฐ„ ๋Œ“๊ธ€ ๊ฐœ๋ฐœ๊ธฐ(part.2) – ํ—˜๋‚œํ–ˆ์ง€๋งŒ ์œ ์ตํ–ˆ๋˜ ์›น์†Œ์ผ“ ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ ๋ฐ ์•ˆ์ •ํ™” ์ž‘์—…)์—์„œ ๊ณต์œ  ๋“œ๋ฆฐ ๋ฐ”์™€ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋””๋ฒ„๊น… ํˆด์˜ ์‹ค์ œ ํ™œ์šฉ ์‚ฌ๋ก€์ธ Spring SimpleBroker ํŠœ

tech.kakao.com

๋งํฌ: https://www.youtube.com/watch?v=rvss-_t6gzg

 

๋ฐ˜์‘ํ˜•

'๊ฐœ๋ฐœ > spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[AOP] AOP ์ ์šฉ ๊ด€๋ จ ์ด์Šˆ  (0) 2024.05.14
ํŠธ๋žœ์žญ์…˜  (0) 2021.11.25
Spring - ์Šคํ”„๋ง MVC ๊ฐ„๋‹จ ์ •๋ฆฌ  (0) 2021.06.05
Spring - DI (Dependency Injection)  (0) 2021.06.01
Spring - AOP(Aspect-Oriented Programming)  (0) 2021.05.25
๋ฐ˜์‘ํ˜•
์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ
์„ค๋ช…

ํด๋ผ์šฐ๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ
์•„๋ž˜์™€ ๊ฐ™์€ ๋‚ด์šฉ๋“ค์„ ์ œ๊ณตํ•ด์ค€๋‹ค.


    โ–ถ๏ธŽ ๋ถ„์‚ฐ / ๋ฒ„์ „ ์ปจํ”ผ๊ทœ๋ ˆ์ด์…˜
        • ๋ถ„์‚ฐ ์ปจํ”ผ๊ทœ๋ ˆ์ด์…˜์€ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ํ™˜๊ฒฝ์—์„œ ์ธ๊ธฐ์žˆ๋Š” ํ‘œ์ค€์ด๋‹ค. 
        • ์Šคํ”„๋ง ์ปจํ”ผ๊ทธ๋Š” ๋ถ„์‚ฐ์‹œ์Šคํ…œ์—์„œ ์™ธ๋ถ€ ์ปจํ”ผ๊ทœ๋ ˆ์ด์…˜์„ ์œ„ํ•ด ์„œ๋ฒ„ ์ธก๊ณผ ํด๋ผ์ด์–ธํŠธ ์ธก์„ ์ง€์›ํ•œ๋‹ค.
            → ์ค‘์•™ ๋‹จ์ผ ์ €์žฅ์†Œ ์ƒ์„ฑ๋จ. ... vault..
        • ์ฃผํ‚คํผ(Zookeeper) ๋“ฑ์ด์žˆ๋‹ค..


    โ–ถ๏ธŽ ์„œ๋น„์Šค ๋“ฑ๋ก & ๋””์Šค์ปค๋ฒ„๋ฆฌ
        • ๋””์Šค์ปค๋ฒ„๋ฆฌ๋Š” ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ์ƒ์˜ ๋””๋ฐ”์ด์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋””๋ฐ”์ด์Šค&์„œ๋น„์Šค๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๋Š” ์„œ๋น„์Šค์ด๋‹ค.
            → ๊ฐ ์„œ๋น„์Šค๋“ค ์‹คํ–‰์‹œ ์ค‘์•™ ์„œ๋ฒ„์— ์ž์‹ (์„œ๋น„์Šค)์„ ๋“ฑ๋กํ•˜๋Š”๊ฒƒ. (IP, Port ๋“ฑ)
            → ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ฐ ์„œ๋ฒ„์ธ์Šคํ„ด์Šค๋“ค์ด ์˜คํ† ์Šค์ผ€์ผ๋ง ๋˜๊ฑฐ๋‚˜, ์ƒ์„ฑ ํ™•์žฅ๋“ฑ์ด ๋ ๋•Œ IP or Port ๋“ฑ์ด ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์ •๋ณด๋“ค์„ ์บ์น˜ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์‚ฌ์šฉํ•จ.
        • ๋„ทํ”Œ๋ฆญ์Šค OSS(Open Source Software) ์˜ ๋””์Šค์ปค๋ฒ„๋ฆฌ ํŒจํ‚ค์ง€ ์œ ๋ ˆ์นด(Eureka)๊ฐ€ ์žˆ๋‹ค.
        • ์œ ๋ ˆ์นด๋Š” ํด๋ผ์ด์–ธํŠธ & ์„œ๋ฒ„๋กœ ๊ตฌ์„ฑ์ด ๋˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๋Š” ์›๊ฒฉ ๋””์Šค์ปค๋Ÿฌ๋น„์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋Š” ์ผ์„ ๋‹ด๋‹นํ•˜๊ณ 
์„œ๋ฒ„๋Š” ๋…๋ฆฝ์ ์ธ ์Šคํ”„๋ง๋ถ€ํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ด๋‹นํ•œ๋‹ค.


    โ–ถ๏ธŽ ๋ผ์šฐํŒ…
        • ๋„ทํ”Œ๋ฆญ์Šค OSS(Open Source Software) ์˜ ์ค„(Zuul)์ด ์žˆ๋‹ค.
        • ์ค„์€ ๋ถ€ํ•˜๋ถ„์‚ฐ ๋ฐ ํ•„ํ„ฐ๋ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ฒŒ์ดํŠธ์›จ์ด๋กœ์จ์˜ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.


    โ–ถ๏ธŽ ์„œ๋น„์Šค๊ฐ„ ํ˜ธ์ถœ

        • API ๊ฒŒ์ดํŠธ์›จ์ด์—์„œ ๊ฐ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ๋„๋ฉ”์ธ์œผ๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  IP๋“ฑ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ๋ณ€๊ฒฝ๋œ IP์— ๋Œ€ํ•ด์„œ๋Š” ๊ด€๋ จ ๋‚ด์šฉ์„ ์—…๋ฐ์ดํŠธ ํ•ด์ค˜์•ผ ํ•จ
        • ๋””์Šค์ปค๋ฒ„๋ฆฌ ์„œ๋น„์Šค๋Š” ์ธ์Šคํ„ด์Šค์˜ ID๋‚˜ ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ถœํ•˜๊ธฐ์—, ๋ณ€๊ฒฝ๋œ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์Œ. 
        • API ํ†ต์‹ ํ• ๋•Œ ์‚ฌ์šฉํ•˜๋Š” RestClient ์ข…๋ฅ˜๋กœ ๋„ทํ”Œ๋ฆญ์Šค OSS(Open Source Software) ์˜ํŽ˜์ธ(Feign) ์ด ์žˆ๋‹ค.


    โ–ถ๏ธŽ ๋ถ€ํ•˜๋ถ„์‚ฐ
        • ๋ผ์šด๋“œ ๋กœ๋นˆ ๊ทœ์น™์„ ๊ฐ€์ง€๊ณ  ๋””์Šค์ปค๋ฒ„๋ฆฌ์— ๋“ฑ๋ก๋œ ์ธ์Šคํ„ด์Šค ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. (๋ถ€ํ•˜๋ถ„์‚ฐ๊ธฐ)
        • ๋„ทํ”Œ๋ฆญ์Šค OSS(Open Source Software) ์˜ ๋ฆฌ๋ณธ(Ribbon) ์ด
์žˆ๋‹ค.


    โ–ถ๏ธŽ ์„œํ‚ท๋ธŒ๋ ˆ์ด์ปค
        • ๋„คํŠธ์›Œํฌ ํƒ€์ž„์•„์›ƒ ๋ฌธ์ œ ํ•ด๊ฒฐ 
        • ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค: ์„ฑ๊ณต & ์‹คํŒจ ํ™•๋ฅ ์„ ์ €์žฅ
        • ์ž„๊ณ„์น˜๊ฐ€ ๋„˜์œผ๋ฉด ์ฐจ๋‹จ! 
        • ํด๋ฐฑ(fallback) ๋กœ์ง ์ˆ˜ํ–‰!


    โ–ถ๏ธŽ ๋ถ„์‚ฐ ๋ฉ”์„ธ์ง• 
        • AMQP, Apache kafka ๋“ฑ์ด ์žˆ๋‹ค.

 

 

ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜
์„ค๋ช…

ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์„ ์œ„ํ•ด ์ž˜ ์„ค๊ณ„๋œ ํ”„๋กœ๊ทธ๋žจ
https://docs.spring.io/spring-cloud-commons/docs/3.1.1/reference/html/

 

 

 


์ฐธ๊ณ 

์ฑ…: http://www.yes24.com/Product/Goods/66581779
๋งํฌ: https://mangchhe.github.io/springcloud/2021/04/07/ServiceDiscoveryConcept/

 

[Spring Cloud] Service Discovery๋ž€?

Service Discovery๊ฐ€ ์™œ ํ•„์š”ํ•œ์ง€, Service Discovery์˜ ์ข…๋ฅ˜์™€ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ๋ฐฐ์›Œ๋ณด์ž

mangchhe.github.io

๋งํฌ: https://www.baeldung.com/spring-cloud-bootstrapping

 

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•

ํ•˜๋‚˜์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ฌ๋Ÿฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ชผ๊ฐ ๊ฒƒ (๋Š์Šจํ•œ ์—ฐ๊ฒฐ)
    → ํ”„๋กœ์ ํŠธ ์ฐธ์—ฌ์ž๊ฐ€ ์„œ๋น„์Šค ํŒŒ์•…์— ์šฉ์ด (์ชผ๊ฐœ์ ธ ์žˆ์œผ๋ฏ€๋กœ!)
    → ๋ถ„๋ฆฌ๋œ ์„œ๋น„์Šค๋ฅผ ๊ฐ ๋‹ด๋‹น์ž๋“ค์ด ๋‚˜๋ˆ  ๊ด€๋ฆฌํ•จ.
    → ์ชผ๊ฐœ์ ธ์žˆ์–ด ์„œ๋น„์Šค๊ฐ„ ๋ฐฐํฌ์— ์˜ํ–ฅ๋„ X
    → ํ™•์žฅ์„ฑ, ๋…๋ฆฝ์„ฑ, ์œ ์—ฐ์„ฑ

์ž‘๊ณ  ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„์ด๊ณ  ์ค‘์•™์—์„œ ๊ด€๋ฆฌ๊ฐ€ ๋จ.
    → ๋„คํŠธ์›Œํฌ ์œ„์น˜, ์ปจํ”ผ๊ทœ๋ ˆ์ด์…˜(configuration), ๋กœ๊น…ํŒŒ์ผ, ๋ฉ”ํŠธ๋ฆญ๋“ฑ์€ ์ค‘์•™์—์„œ ๊ด€๋ฆฌ๋จ.

โ€ป ๋ฉ”ํŠธ๋ฆญ
์†Œํ”„ํŠธ์›จ์–ด์˜ ์†์„ฑ์ด๋‚˜ ๊ทœ๊ฒฉ์„ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ง€ํ‘œ.
ํ”„๋กœ๊ทธ๋žจ์˜ ๋ณต์žก์„ฑ, ์ฝ”๋“œ๋ณ„ ๋ฒ„๊ทธ์˜ ์ˆ˜, ์ˆ˜์š”์ž ์š”๊ตฌ ์‚ฌํ•ญ์˜ ์ˆ˜ ๋”ฐ์œ„๋ฅผ ์ธก์ •ํ•œ๋‹ค.

 

 


์ฐธ๊ณ 

์ฑ…: http://www.yes24.com/Product/Goods/66581779

 

๋งˆ์Šคํ„ฐ๋ง ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ - YES24

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ๋ณด์•ˆ ๊ฐ•ํ™”, ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ์ž!ํด๋ผ์šฐ๋“œ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฐฐํฌํ•˜๊ณ  ์šด์˜ํ•˜๋Š” ๊ฒƒ์€ ๋กœ์ปฌ ์• ํ”Œ๋ฆฌ

www.yes24.com

๋งํฌ: https://badadict.com/ko/1623891โ€‹

 

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
JPQL (Java Persistence Query Language)
์„ค๋ช…

ํ…Œ์ด๋ธ” ๋Œ€์ƒ์œผ๋กœ ํ•œ ์–ธ์–ด๊ฐ€ ์•„๋‹Œ, ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌํ•œ ๊ฒƒ.
SQL์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค SQL์— ์˜์กดํ•˜์ง€ ์•Š์Œ.
JPQL → SQL ์œผ๋กœ ๋ณ€ํ™˜ํ•จ
๊ฐ์ฒด์ง€ํ–ฅSQL

 

ํŠน์ง•
-- ์ผ๋ฐ˜ SQL ๋ฌธ
select * from Member as m where m.username = 'coffee' -- ๋ณ„์นญ(m)์€ ํ•„์ˆ˜๋‹ค.

-- JPQL ๋ฌธ
/**
@Entity(name="memeber")
class Memeber {
  ...
  private String username;
}
*/
select m from memeber as m where m.username = 'coffee'
-- → ์—”ํ‹ฐํ‹ฐ๋ช…(member)์œผ๋กœ ์กฐํšŒํ•ด์•ผํ•œ๋‹ค.
-- → ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํด๋ž˜์Šค๋ช…(Member)์„ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. (ํด๋ž˜์Šค๋ช… ์ถ”์ฒœ)
-- → ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.

select m.username from member as m 
-- → username ์„ ์กฐํšŒ ํ•œ๋‹ค๋ฉด, ๋ณ„์นญ(m)์€ ํ•„์ˆ˜๋กœ ์‚ฌ์šฉํ•ด์•ผํ•จ.

 

๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ›์„ ๋•Œ (createQuery ์‚ฌ์šฉ ์‹œ)

TypeQuery: ๋ฐ˜ํ™˜ํƒ€์ž…(๋ฉ”์†Œ๋“œ ๋ฆฌํ„ดํƒ€์ž…)์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ.
• Query: ๋ฐ˜ํ™˜ํƒ€์ž…(๋ฉ”์†Œ๋“œ ๋ฆฌํ„ดํƒ€์ž…)์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ.

 

๊ฒฐ๊ณผ ์กฐํšŒ API

query.getResultList(): ๊ฒฐ๊ณผ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์ผ๋•Œ ๋ฆฌ์ŠคํŠธ ๋ฐ˜ํ™˜
• query.getSingleResult(): ๊ฒฐ๊ณผ๊ฐ€ ์ •ํ™•ํžˆ ํ•˜๋‚˜, ๋‹จ์ผ ๊ฐ์ฒด ๋ฐ˜ํ™˜.

 

JPQL ์กฐ์ธ


 ๋‚ด๋ถ€ ์กฐ์ธ๊ณผ ์™ธ๋ถ€์กฐ์ธ

-- ๋‚ด๋ถ€ ์กฐ์ธ (INNER JOIN, INNER ์ƒ๋žต ๊ฐ€๋Šฅ)
select m from Member m inner join m.team t where t.name = :teamName


-- ์™ธ๋ถ€ ์กฐ์ธ (LEFT OUTER JOIN, OUTER ์ƒ๋žต ๊ฐ€๋Šฅ)
select m from Member m left join m.team t


-- ์„ธํƒ€์กฐ์ธ (์—ฐ๊ด€๊ด€๊ณ„ ์—†๋Š”๋ฐ ์กฐ์ธํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ!!)
select count(m) from Member m, Team t where m.username = t.name


์ปฌ๋ ‰์…˜ ์กฐ์ธ
  → ์ผ๋Œ€๋‹ค or ๋‹ค๋Œ€์ผ ๊ด€๊ณ„ ์ฒ˜๋Ÿผ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์— ์กฐ์ธํ•˜๋Š” ๊ฒƒ. 
  → ์ผ๋Œ€๋‹ค(=๋‹ค์˜ ์—ฐ๊ด€ํ•„๋“œ ์‚ฌ์šฉ) or ๋‹ค๋Œ€์ผ(=์ผ์˜ ์—ฐ๊ด€ํ•„๋“œ ์‚ฌ์šฉ)
 
์„ธํƒ€ ์กฐ์ธ
  → where ์ ˆ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ์ธ (select count(m) from Memeber m, Team t where m.username = t.name)

• JOIN ON ์ ˆ (JPA 2.1 ๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
  → ์™ธ๋ถ€์กฐ์ธ์—์„œ๋งŒ ์‚ฌ์šฉ.

 ํŽ˜์น˜ ์กฐ์ธ (FETCH JOIN)
  → JPQL์—์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ. ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋‚˜ ์ปฌ๋ ‰์…˜์„ ํ•œ๋ฒˆ์— ๊ฐ™์ด ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ. join fetch ์œผ๋กœ ์‚ฌ์šฉ.
  → ํŽ˜์น˜์กฐ์ธ ์‚ฌ์šฉ์‹œ, SQL ํ•œ๋ฒˆ์œผ๋กœ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋“ค์„ ํ•จ๊ป˜ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์–ด, SQL ์กฐํšŒ ํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  → ์ง€์—ฐ๋กœ๋”ฉ ์‚ฌ์šฉ ๋ฐ  fetch join ์ ์šฉํ•˜๋Š”๊ฒƒ์ด ํšจ์œจ์ .
  ํŽ˜์น˜์กฐ์ธ์€ alias ์‚ฌ์šฉ์„ ๋ชปํ•˜๋ฉฐ, ๋‘˜ ์ด์ƒ์˜ ์ปฌ๋ ‰์…˜์„ ํŽ˜์น˜ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŽ˜์ด์ง• API์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค...ํ—‰ 
  → ํŽ˜์น˜์กฐ์ธ์€ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ์œ ์ง€ํ• ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ํšจ๊ณผ์ !
  → ํŠน์ • ๋ฐ์ดํ„ฐ๋งŒ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๊ตฌ์ง€ ํŽ˜์น˜ ์กฐ์ธ์„ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†๋‹ค.

-- fetch join ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, m ๋ฐ m.team ๋ชจ๋‘ ์กฐํšŒ๋จ.
-- >> JPQL ์‹
select m from Member m join fetch m.team where m.name = 'AA'

-- >> SQL ์‹ 
select
  m.*, t.*
from Member m join Team t on m.team_id = t.id
where m.name = 'AA'




-- fetch join ์ด ์•„๋‹Œ ์ผ๋ฐ˜ join ์„ ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” SQL ์—์„œ ์ด๋ ‡๊ฒŒ ๋‚˜์˜ด
-- >> JPQL ์‹
select m from Member m join m.team

-- >> SQL ์‹ 
select
  m.*
from Member m join Team t on m.team_id = t.id

๋ฌต์‹œ์  ์กฐ์ธ
  → join ํ‚ค์›Œ๋“œ ์ง์ ‘ ์‚ฌ์šฉ (select ~~ from Member m join m.team t)
  → ์กฐ์ธ์ด ์ผ์–ด๋‚˜๋Š” ์ƒํ™ฉ,,์„ ํ•œ๋ˆˆ์— ์•Œ์•„๋ณด๊ธฐ ์–ด๋ ต๋‹ค,,?

๋ช…์‹œ์  ์กฐ์ธ (์ถ”์ฒœโญ๏ธ)
  → ๊ฒฝ๋กœ ํ‘œํ˜„์‹์— ์˜ํ•ด ๋ฌต์‹œ์ ์œผ๋กœ SQL ์กฐ์ธ ๋ฐœ์ƒ (๋‚ด๋ถ€ ์กฐ์ธ๋งŒ ๊ฐ€๋Šฅ) (select m.team from Member m)

 

 

์„œ๋ธŒ์ฟผ๋ฆฌ

where, having ์ ˆ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, select, from ์ ˆ์—์„œ๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ! (ใ… ใ… )
• EXISTS(๊ฒฐ๊ณผ ์กด์žฌ์‹œ ์ฐธ) → select ~~ where exsist (select t from ~~)
 ALL(๋ชจ๋‘ ๋งŒ์กฑ ์ฐธ) select ~~ where o.number > ALL (select b from ~~)
 ANY(์กฐ๊ฑด์ด ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑ์‹œ ์ฐธ=SOME)  select ~~ where a.tesm = ANY(select c from ~~) 
 IN(์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๊ฐ™์€ ๊ฐ’์ด ์žˆ์œผ๋ฉด ์ฐธ) select ~~ where a.count in (select d from ~~)

 

CASE ์‹

COALESCE: ํ•˜๋‚˜์”ฉ ์กฐํšŒํ•ด์„œ null ์ด ์•„๋‹ˆ๋ฉด ๋ฐ˜ํ™˜
NULLIF: ๋‘ ๊ฐ’์ด ๊ฐ™์œผ๋ฉด null ๋ฐ˜ํ™˜, ๋‹ค๋ฅด๋ฉด ์ฒซ๋ฒˆ์งธ ๊ฐ’ ๋ฐ˜ํ™˜


์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜

select function('group_concat', name) from ~~
์‚ฌ์šฉ ์ „ group_concat์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ •์˜๋ฅผ ํ•ด์•ผ ํ•จ. (DB๋ฐฉ์–ธ ์ƒ์† ๋ฐ›๊ณ , ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ๋“ฑ๋ก ํ•„์š”)

 

 


์ฐธ๊ณ 

- ์ฑ…: https://www.coupang.com/vp/products/20488571?itemId=80660090&vendorItemId=3314421212&src=1042503&spec=10304982&addtag=400&ctag=20488571&lptag=10304982I80660090&itime=20220302010946&pageType=PRODUCT&pageValue=20488571&wPcid=16461509863931582782572&wRef=&wTime=20220302010946&redirect=landing&gclid=CjwKCAiApfeQBhAUEiwA7K_UHxuELLbyb9IhdrRf5inlJZLtN8-t8cUswFHeV6fFp-Yd4RThtzZvHxoCPFsQAvD_BwE&campaignid=12207438463&adgroupid=115720946583&isAddedCart= 

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘

ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋ฉด, ์™ธ๋ž˜ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ”๋ผ๋ฆฌ ์—ฐ๊ด€์„ ๋งบ๋Š”๊ฒƒ or ๊ฐ์ฒด๋ผ๋ฉด ์ฐธ์กฐ(์ฃผ์†Œ)์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ด€์„ ๋งบ๋Š”๊ฒƒ.

 

์—ฐ๊ด€๊ด€๊ณ„ ๋ฐฉํ–ฅ (Direction)

โ€ฃ ๋‹จ๋ฐ˜ํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„
    → ํ•œ์ชฝ๋งŒ ์ฐธ์กฐํ•˜๋Š”๊ฒƒ
    → ๊ฐ์ฒด ๊ด€๊ณ„

โ€ฃ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„ 
    → ์„œ๋กœ ์ฐธ์กฐํ•˜๋Š”๊ฒƒ
    → mappedBy ์†์„ฑ ์‚ฌ์šฉ
    → ํ…Œ์ด๋ธ” ๋ผ๋ฆฌ ์—ฐ๊ด€๊ด€๊ณ„ ๋งบ๊ธฐ (์™ธ๋ž˜ํ‚ค ์ด์šฉ) = ์„œ๋กœ ๋‹ค๋ฅธ ๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„ 2๊ฐœ

 

 

๋‹ค์ค‘์„ฑ (Multiplicity)

โ€ฃ ๋‹ค๋Œ€์ผ (N:1)
    → ๋‹จ๋ฐฉํ–ฅ, ์–‘๋ฐฉํ–ฅ
    → @ManyToOne ์œผ๋กœ ํ‘œํ˜„
    → N ์— ์™ธ๋ž˜ํ‚ค ์กด์žฌ = ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ
    → @ManyToOne ๊ธฐ๋ณธ ํŽ˜์น˜์ „๋žต: ์ฆ‰์‹œ๋กœ๋”ฉ (EAGER)


โ€ฃ ์ผ๋Œ€๋‹ค (1:N)
    → ๋‹จ๋ฐฉํ–ฅ(@JoinColumn ๋ช…์‹œ ํ•„์š”), ์–‘๋ฐฉํ–ฅ(=์กด์žฌํ•˜์ง€ ์•Š์Œ. ๋‹ค๋Œ€์ผ ์–‘๋ฐฉํ–ฅ ๋งคํ•‘์„ ์‚ฌ์šฉํ•ด์•ผํ•จ)
    → @OneToMay ์œผ๋กœ ํ‘œํ˜„
    → N ์— ์™ธ๋ž˜ํ‚ค ์กด์žฌ = ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ
    → @OneToMany ๊ธฐ๋ณธ ํŽ˜์น˜์ „๋žต: ์ง€์—ฐ๋กœ๋”ฉ (LAZY)
    → ์ผ๋Œ€๋‹ค ๋‹จ๋ฐฉํ–ฅ ๋งคํ•‘๋ณด๋‹จ, ๋‹ค๋Œ€์ผ ์–‘๋ฐฉํ–ฅ ๋งคํ•‘์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž! (์™ธ๋ž˜ํ‚ค ๊ด€๋ฆฌํ•˜๊ธฐ ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)


โ€ฃ ์ผ๋Œ€์ผ (1:1)
    → ์ฃผํ…Œ์ด๋ธ” or ๋Œ€์ƒํ…Œ์ด๋ธ” ์—์„œ ์™ธ๋ž˜ํ‚ค ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ.
    → @OneToOne ์œผ๋กœ ํ‘œํ˜„
    → @OneToOne ๊ธฐ๋ณธ ํŽ˜์น˜์ „๋žต: ์ฆ‰์‹œ๋กœ๋”ฉ (EAGER)


โ€ฃ ๋‹ค๋Œ€๋‹ค (N:N)
    → ๋‹จ๋ฐฉํ–ฅ, ์–‘๋ฐฉํ–ฅ (๋‹ค๋Œ€๋‹ค ์–‘๋ฐฉํ–ฅ์€ ์ผ๋Œ€๋‹ค ์–‘๋ฐฉํ–ฅ๊ณผ ๊ฐ™์Œ)
    → @ManyToMany ์œผ๋กœ ํ‘œํ˜„
    → N:N ์‚ฌ์ด ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ.
    → ์‹๋ณ„๊ด€๊ณ„์™€ ๋น„์‹๋ณ„๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค.
    → @ManyToMany ๊ธฐ๋ณธ ํŽ˜์น˜์ „๋žต: ์ง€์—ฐ๋กœ๋”ฉ (LAZY)

 

์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘ ๊ด€๋ จ ์–ด๋…ธํ…Œ์ด์…˜
@ManyToOne(optional="false ๋ฆฌ๋ฉด ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ํ•ญ์ƒ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’: true", 
           fetch="๊ธ€๋กœ๋ฒŒ ํŽ˜์น˜ ์ „๋žต(EAGER, LAZY)", 
           cascade="์˜์†์„ฑ ์ „์ด ๊ธฐ๋Šฅ ์‚ฌ์šฉ", targetEntity="์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ์˜ ํƒ€์ž… ์ •๋ณด ์„ค์ •(๊ฑฐ์˜์‚ฌ์šฉ์•ˆํ•จ).")
           
           
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)

@ManyToOne(fetch = FetchType.LAZY)

@ManyToMany(mappedBy = "items")
@JoinColumn(name="๋งคํ•‘ํ•  ์™ธ๋ž˜ ํ‚ค ์ด๋ฆ„", 
            referencedColumnName="์™ธ๋ž˜ํ‚ค๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋Œ€์ƒ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๋ช…", 
            foreignKey="์™ธ๋ž˜ํ‚ค์ œ์•ฝ์กฐ๊ฑด์„ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์†์„ฑ์€ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.")
/**
- ๊ทธ์™ธ์†์„ฑ
unique, nullable, insertable, updatable, columnDefinition, table..
*/
@JoinTable(name = "category_item",
        joinColumns = @JoinColumn(name = "category_id"),
        inverseJoinColumns = @JoinColumn(name="item_id")
)
// ๋ถ€๋ชจ ๊ฐ์ฒด์— ์„ค์ •
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // ํ•œํ…Œ์ด๋ธ”์— ์ปฌ๋Ÿผ ๋‹ค ๋•Œ๋ ค๋ฐ•์Œ
@DiscriminatorColumn(name = "dtype") // ํ•˜์œ„ ์ž์‹ํ…Œ์ด๋ธ”๋“ค ํƒ€์ž…..

// ์ž์‹๊ฐ์ฒด์—๋‹ค๊ฐ€ ์„ค์ •
@DiscriminatorValue("A")
@Enumerated(EnumType.STRING)

@Embedded
@Id @GeneratedValue
@Column(name = "order_id")
private Long id;

 

 

 

์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ (Owner) vs ์ฃผ์ธ์ด ์•„๋‹Œ์ชฝ

๊ฐ์ฒด๋ฅผ ์–‘๋ฐฉํ–ฅ(N:N)์—ฐ๊ด€๊ด€๊ณ„๋กœ ๋งŒ๋“ค ๊ฒฝ์šฐ, ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์„ ์ •ํ•ด์•ผ ํ•œ๋‹ค. (=์ฐธ์กฐ๋Š” ๋‘˜, ์™ธ๋ž˜ํ‚ค๋Š” ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ)


โ€ฃ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ
    → ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์—ฐ๊ด€๊ด€๊ณ„์™€ ๋งคํ•‘๋˜๊ณ  ์™ธ๋ž˜ํ‚ค๋ฅผ ๊ด€๋ฆฌ(๋“ฑ๋ก,์ˆ˜์ •,์‚ญ์ œ)๋ฅผ ํ• ์ˆ˜์žˆ๋‹ค.
    → mappedBy ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
    → ์™ธ๋ž˜ํ‚ค ๊ด€๋ฆฌ์ž๋ฅผ ์„ ํƒ ํ•˜๋Š”๊ฒƒ์ด๋‹ค.
    → ์™ธ๋ž˜ํ‚ค์˜ ์œ„์น˜์™€ ๊ด€๋ จํ•ด์„œ ์ •ํ•ด์•ผํ•˜๊ณ , ๋น„์ง€๋‹ˆ์Šค ์ค‘์š”๋„๋กœ ์ ‘๊ทผํ•˜๋ฉด ์•ˆ๋จ
โ€ฃ ์ฃผ์ธ์ด ์•„๋‹Œ ์ชฝ
    → ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
    → mappedBy ์†์„ฑ์„ ์‚ฌ์šฉ ํ•˜์—ฌ ์†์„ฑ์˜ ๊ฐ’์œผ๋กœ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

ํ”„๋ก์‹œ

์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์ ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Œ

ํ”„๋ก์‹œ ๊ฐ์ฒด

โ€ฃ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ๋ฅผ ์ง€์—ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์งœ ๊ฐ์ฒด(์ง€์—ฐ๋กœ๋”ฉ์—์„œ ์‚ฌ์šฉ). ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ๋งŒ๋“ค์–ด์ ธ์žˆ์Œ.
โ€ฃ ์ง„์งœ๊ฐ์ฒด์ธ์ง€, ํ”„๋ก์‹œ ๊ฐ์ฒด์ธ์ง€ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅ
โ€ฃ EntityManager.getReference(): ์กฐํšŒ๋ฅผ ๋ฏธ๋ฃจ๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉ. ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
โ€ฃ ์ฒ˜์Œ ์‚ฌ์šฉํ• ๋•Œ ํ•œ๋ฒˆ๋งŒ ์ดˆ๊ธฐํ™” → ์ดˆ๊ธฐํ™”๋˜๋ฉด ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ.
โ€ฃ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ฐพ๋Š” ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ด๋ฏธ ์žˆ์œผ๋ฉด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐํšŒํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ
em.getReference()์„ ํ˜ธ์ถœํ•ด๋„ ํ”„๋ก์‹œ๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•จ.

-



 

์ฆ‰์‹œ๋กœ๋”ฉ(FetchType.EAGER) ๊ณผ ์ง€์—ฐ๋กœ๋”ฉ(FetchType.LAZY) 

โ€ฃ ์ฆ‰์‹œ๋กœ๋”ฉ(FetchType.EAGER)
    → ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋„ ํ•จ๊ป˜ ์กฐํšŒ
    → ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด SQL ์กฐ์ธ์„ ์‚ฌ์šฉํ•ด์„œ ํ•œ ๋ฒˆ์— ์กฐํšŒ
    → ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ํ•˜๋‚˜๋ฉด ์ฆ‰์‹œ๋กœ๋”ฉ ์‚ฌ์šฉ


โ€ฃ ์ง€์—ฐ๋กœ๋”ฉ(FetchType.LAZY)
    → ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‹ค์ œ ์‚ฌ์šฉํ•  ๋•Œ ์กฐํšŒ
    → ํ”„๋ก์‹œ๋ฅผ ์‹ค์ œ ์‚ฌ์šฉํ•  ๋•Œ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐํšŒ
    → ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ปฌ๋ ‰์…˜์ด๋ฉด ์ง€์—ฐ๋กœ๋”ฉ ์‚ฌ์šฉ

โœฐ ์ง€์—ฐ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž. (N+1๋ฌธ์ œ ๋ฐฉ์ง€)
โœฐ ์ปฌ๋ ‰์…˜์€ ํ•„๋“œ์—์„œ ๋ฐ”๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๋„๋ก ํ•˜์ž. (ex. Apple apple = new Apple();)
โœฐ ๋งŒ์•ฝ ์—”ํ‹ฐํ‹ฐ์กฐํšŒ์‹œ, ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•ด์•ผํ•œ๋‹ค๋ฉด fetch join์„ ์‚ฌ์šฉํ•˜์ž. 

 


์ฐธ๊ณ 

- ์ฑ…: http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788960777330 

 

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ต๋ณด๋ฌธ๊ณ 

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ ์˜ˆ์ œ ํ”„๋กœ์ ํŠธ๋กœ ๋ฐฐ์šฐ๋Š” ์ „์ž์ •๋ถ€ ํ‘œ์ค€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ”„๋ ˆ์ž„ | โ˜… ์ด ์ฑ…์—์„œ ๋‹ค๋ฃจ๋Š” ๋‚ด์šฉ โ˜…โ–  JPA ๊ธฐ์ดˆ ์ด๋ก ๊ณผ ํ•ต์‹ฌ ์›๋ฆฌโ–  JPA๋กœ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์„ค๊ณ„ํ•˜๋Š” ๊ณผ์ •์„ ์˜ˆ์ œ ์ค‘์‹ฌ์œผ๋กœ

www.kyobobook.co.kr


- ๋งํฌ: https://velog.io/@lsj8367/JPA-%ED%94%84%EB%A1%9D%EC%8B%9C

 

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
๋ณ€๊ฒฝ๊ฐ์ง€ (Dirty Checking)

โ€ฃ ๋ณ€๊ฒฝ๋œ ์—”ํ‹ฐํ‹ฐ ๋‚ด์šฉ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ž๋™์œผ๋กœ ๋ฐ˜์˜ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ.

 

em.save() ์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ์ด ๋˜์—ˆ๋‹ค.

1. ๋ฐ์ดํ„ฐ ์ €์žฅ (๊ณผ๊ฑฐ๋‹‰๋„ค์ž„)

 

2. ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘, User entity ์„ ์กฐํšŒํ•˜๋‹ˆ username ์—๋Š” ๊ณผ๊ฑฐ๋‹‰๋„ค์ž„

 

3. setUsername๊ฑด์œผ๋กœ ๋ณ€๊ฒฝ  

 

4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜

โ€ฃ ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ํ›„, flush (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋™๊ธฐํ™”) ํ•˜๋ฉด์„œ username ๋ณ€๊ฒฝ๋จ → ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ˜์˜ 

 


์ฐธ๊ณ 

- ๋งํฌ: https://cornarong.tistory.com/m/63

 

[JPA] ๋ณ€๊ฒฝ ๊ฐ์ง€(Dirty Checking) ์™€ ๋ณ‘ํ•ฉ(merge)

๋ณ€๊ฒฝ ๊ฐ์ง€(Dirty Checking) ์™€ ๋ณ‘ํ•ฉ( merge ) * ์ค€์˜์† ์ƒํƒœ? - ์˜์† ์ƒํƒœ์˜€๋‹ค๊ฐ€ ๋”๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ - ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌ๋œ ์ƒํƒœ * ์ค€์˜์† ์ƒํƒœ๋ฅผ ๋งŒ๋“œ๋Š” 3๊ฐ€์ง€ ๋ฐฉ

cornarong.tistory.com

 

๋ฐ˜์‘ํ˜•

+ Recent posts