๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
CS

Spring Boot์—์„œ ์ด๋ฒคํŠธ ์‚ฌ์šฉํ•˜๊ธฐ

by yukuda 2024. 3. 14.
728x90

๐Ÿ“š ๊ฐœ๋… ์ •๋ฆฌ & ์‚ฌ์ „์ค€๋น„

1. ์ด๋ฒคํŠธ

Spring Boot์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—, ์ด๋ฒคํŠธ๋ฅผ ์™œ ์จ์•ผํ•˜๋Š”์ง€, ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ์ƒํ™ฉ์— ๋Œ€ํ•ด ๋จผ์ € ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํšŒ์›๊ฐ€์ž…์„ ํ•˜๊ณ  ๋‚˜๋ฉด ๊ฐ€์ž… ์ถ•ํ•˜ ๋ฉ”์„ธ์ง€๋ฅผ ์ „์†กํ•˜๋Š” ๋™์‹œ์— ์ฟ ํฐ์„ ์ „์†กํ•˜๋Š” ์„œ๋น„์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@Service
public class RegisterService {

  @Autowired
  ApplicationEventPublisher publisher;

  public void register(String name) {
    // ํšŒ์›๊ฐ€์ž… ์ฒ˜๋ฆฌ ๋กœ์ง
    System.out.println("ํšŒ์› ์ถ”๊ฐ€ ์™„๋ฃŒ");
    
    // ๊ฐ€์ž… ์ถ•ํ•˜ ๋ฉ”์„ธ์ง€ ์ „์†ก
    System.out.println(name + "๋‹˜์—๊ฒŒ ๊ฐ€์ž… ์ถ•ํ•˜ ๋ฉ”์„ธ์ง€๋ฅผ ์ „์†กํ–ˆ์Šต๋‹ˆ๋‹ค.");
    
    // ๊ฐ€์ž… ์ถ•ํ•˜ ์ฟ ํฐ ๋ฐœ๊ธ‰
    System.out.println(name + "๋‹˜์—๊ฒŒ ์ฟ ํฐ์„ ์ „์†กํ–ˆ์Šต๋‹ˆ๋‹ค.");
  }
}

์œ„์™€ ๊ฐ™์ด ํšŒ์› ๊ฐ€์ž… - ๋ฉ”์„ธ์ง€ ์ „์†ก - ์ฟ ํฐ ๋ฐœ๊ธ‰์˜ ๋กœ์ง์„ ํƒ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์œ„ ์ฝ”๋“œ์—๋Š” ๋ฌธ์ œ์ ์ด ๋ช‡๊ฐ€์ง€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

1) ๊ฐ•ํ•œ ๊ฒฐํ•ฉ

ํ˜„์žฌ ํšŒ์›๊ฐ€์ž… ์„œ๋น„์Šค์— ํšŒ์› ๊ฐ€์ž… ๋กœ์ง๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐ€์ž… ์ถ•ํ•˜ ๋ฉ”์„ธ์ง€๋ฅผ ์ „์†กํ•˜๋Š” ๋กœ์ง, ๊ฐ€์ž… ์ถ•ํ•˜ ์ฟ ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๋Š” ๋กœ์ง์ด ๋ชจ๋‘ ์„ž์—ฌ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์„œ๋กœ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์œผ๋กœ ๋ฌถ์—ฌ์žˆ์œผ๋ฉด ํ›„์— ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์šธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

2) ํŠธ๋žœ์žญ์…˜

๋งŒ์•ฝ ๊ฐ€์ž… ์ถ•ํ•˜ ๋ฉ”์„ธ์ง€๋ฅผ ์ „์†กํ•˜๋‹ค๊ฐ€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํšŒ์›๊ฐ€์ž…์„ ํ•œ ์ด๋ ฅ๊นŒ์ง€ ๋ชจ๋‘ ๋กค๋ฐฑ์„ ํ•˜๋Š” ๊ฒƒ์€ ์ ˆ๋Œ€ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ฐจ๋ผ๋ฆฌ ํšŒ์› ๊ฐ€์ž… ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ณ , ์ถ•ํ•˜ ๋ฉ”์„ธ์ง€์™€ ์ฟ ํฐ ๋ฐœ๊ธ‰์€ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•˜๋Š”๊ฒŒ ์˜ณ์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

3) ์„ฑ๋Šฅ

๊ฐ€์ž… ์ถ•ํ•˜ ๋ฉ”์„ธ์ง€๋ฅผ ์ „์†กํ•˜๋Š”๋ฐ 3๋ถ„, ์ฟ ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๋Š”๋ฐ 3๋ถ„์ด ๊ฑธ๋ฆฐ๋‹ค๊ณ  ํ•˜๋ฉด ์ด ํšŒ์›๊ฐ€์ž…์€ 6๋ถ„์ด ๊ฑธ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ ์ด๋ฒคํŠธ์ธ ํšŒ์›๊ฐ€์ž… ์ฒ˜๋ฆฌ ๋กœ์ง์„ ๋๋‚ด๋ฉด ์„œ๋ธŒ ์ด๋ฒคํŠธ์ธ ๊ฐ€์ž… ์ถ•ํ•˜ ๋ฉ”์„ธ์ง€ ์ „์†ก์ด๋‚˜ ๊ฐ€์ž… ์ถ•ํ•˜ ์ฟ ํฐ์€ ์ „์†ก์™„๋ฃŒ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ฆ‰, ํšŒ์›๊ฐ€์ž… ์ฒ˜๋ฆฌ → ๊ฐ€์ž… ์ถ•ํ•˜ ๋ฉ”์„ธ์ง€ ์ „์†ก → ์ฟ ํฐ ๋ฐœ๊ธ‰ → ํšŒ์›๊ฐ€์ž… ์ฒ˜๋ฆฌ ์™„๋ฃŒ๊ฐ€ ์•„๋‹Œ, ํšŒ์›๊ฐ€์ž… ์ฒ˜๋ฆฌ → ํšŒ์›๊ฐ€์ž… ์ฒ˜๋ฆฌ ์™„๋ฃŒ (๊ฐ€์ž…์ถ•ํ•˜ ๋ฉ”์„ธ์ง€, ์ฟ ํฐ ๋ฐœ๊ธ‰์€ ๊ฐ€์ž… ์ฒ˜๋ฆฌ ๋˜๋ฉด ๋”ฐ๋กœ ์‹คํ–‰ ์‹œ์ž‘)์˜ ์ˆœ์„œ๋กœ ์‹คํ–‰์„ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘์— ์ด๋ฒคํŠธ๋ฅผ ์ ์šฉํ•ด์„œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๋Š” ์ƒ์„ฑ ์ฃผ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•ด์„œ ํ›„์ฒ˜๋ฆฌ๋ฅผ ๋„์™€์ค๋‹ˆ๋‹ค.

 

2. ์ด๋ฒคํŠธ์˜ ์‹คํ–‰ ๋‹จ๊ณ„

  1. ์ƒ์„ฑ ์ฃผ์ฒด(์ฃผ๋กœ ๋„๋ฉ”์ธ ๊ฐ์ฒด)์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฒคํŠธ ๋””์ŠคํŒจ์ฒ˜์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.
  2. ์ด๋ฒคํŠธ ๋””์ŠคํŒจ์ฒ˜๊ฐ€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.
  3. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ์ด๋ฒคํŠธ์— ๋‹ด๊ธด ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•œ๋‹ค.

 

3. ์‚ฌ์ „ ์ค€๋น„

  • ์˜์กด์„ฑ ์ถ”๊ฐ€
    • spring-boot-starter-web

๐Ÿ’ป ๊ตฌํ˜„ - ๊ฐ•ํ•œ๊ฒฐํ•ฉ ํ•ด๊ฒฐ

1. ์ด๋ฒคํŠธ ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ

event/RegisteredEvent.java

public class RegisteredEvent {

  private String name;

  public RegisteredEvent(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }
}

์ด๋ฒคํŠธ๋Š” ์ƒํƒœ๊ฐ€ ๋ฐ”๋€ ํ›„์— ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒคํŠธ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์€ ๊ณผ๊ฑฐ์‹œ์ œ๋กœ ์ง€์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ด๋ฒคํŠธ ํด๋ž˜์Šค๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

 

2. ์„œ๋น„์Šค ๋งŒ๋“ค๊ธฐ

service/RegisterService.java

@Service
public class RegisterService {

  @Autowired
  ApplicationEventPublisher publisher; // 1

  public void hello(String name) {
    // ํšŒ์›๊ฐ€์ž… ์ฒ˜๋ฆฌ ๋กœ์ง
    System.out.println("ํšŒ์› ์ถ”๊ฐ€ ์™„๋ฃŒ");
    publisher.publishEvent(new RegisteredEvent(name)); // 2
  }
}

(1) ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋‚ด๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ApplicationEventPublisher๋ฅผ ์ฃผ์ž…ํ•ด์ค๋‹ˆ๋‹ค.

(2) ํšŒ์›๊ฐ€์ž… ์ฒ˜๋ฆฌ๋ฅผ ์™„๋ฃŒํ•˜๊ณ  ๋‚˜๋ฉด, publishEvent()๋ฅผ ์‚ฌ์šฉํ•ด ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•ด์ค๋‹ˆ๋‹ค.

์ด์ œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ธ๋“ค๋ง์„ ํ•  ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

3. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋งŒ๋“ค๊ธฐ

event/handler/SmsEventHandler.java

@Component
public class SmsEventHandler {

  @EventListener // 1
  public void sendSms(RegisteredEvent event) {
    System.out.println(event.getName() + "๋‹˜์—๊ฒŒ ๊ฐ€์ž… ์ถ•ํ•˜ ๋ฉ”์„ธ์ง€๋ฅผ ์ „์†กํ–ˆ์Šต๋‹ˆ๋‹ค.");
  }

  @EventListener
  public void makeCoupon(RegisteredEvent event) {
    System.out.println(event.getName() + "๋‹˜์—๊ฒŒ ์ฟ ํฐ์„ ์ „์†กํ–ˆ์Šต๋‹ˆ๋‹ค.");
  }
}

(1) @EventListener๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋กœ ๋“ฑ๋ก์ด ๋˜๊ณ , ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ด๋ฒคํŠธ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋ฉด ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ˆ˜์‹ ํ•ด์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

4. ์ปจํŠธ๋กค๋Ÿฌ ๋งŒ๋“ค๊ธฐ

controller/TestController.java

@RestController
public class TestController {

  @Autowired
  RegisterService service;

  @GetMapping("/register/{name}")
  public void register(@PathVariable String name) {
    service.hello(name);
    System.out.println("ํšŒ์›๊ฐ€์ž…์„ ์™„๋ฃŒํ–ˆ์–ด์š”");
  }

}

ํ…Œ์ŠคํŠธ์šฉ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. ์ด๋ฆ„์„ ๊ฐ€์ ธ์™€์„œ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€์—ฐ ์„ค๋ช…์€ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.

 

5. ํ…Œ์ŠคํŠธ

์ด์ œ ๊ตฌํ˜„์ด ๋๋‚ฌ์œผ๋‹ˆ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

http://localhost:8080/register/์นฉ์•ค๋ฐ์ผ๋กœ ์ ‘์†ํ•œ ํ›„์— ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด

์ œ๋Œ€๋กœ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ์„œ๋น„์Šค ์ฝ”๋“œ๋„ ๋กœ์ง์ด ์„ž์ด์ง€ ์•Š๊ณ  ๊ฒฐํ•ฉ๋„๋„ ์•ฝํ•ด์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ์ถ•ํ•˜ ๋ฉ”์„ธ์ง€์™€ ์ฟ ํฐ์„ ์ „์†กํ•˜๋Š” ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์„œ๋น„์Šค ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

event/handler/SmsEventHandler.java

@Component
public class SmsEventHandler {

  @EventListener
  public void sendSms(RegisteredEvent event) throws InterruptedException {
    Thread.sleep(2000); // 2์ดˆ
    System.out.println(event.getName() + "๋‹˜์—๊ฒŒ ๊ฐ€์ž… ์ถ•ํ•˜ ๋ฉ”์„ธ์ง€๋ฅผ ์ „์†กํ–ˆ์Šต๋‹ˆ๋‹ค.");
  }

  @EventListener
  public void makeCoupon(RegisteredEvent event) throws InterruptedException {
    Thread.sleep(1000); // 1์ดˆ
    System.out.println(event.getName() + "๋‹˜์—๊ฒŒ ์ฟ ํฐ์„ ์ „์†กํ–ˆ์Šต๋‹ˆ๋‹ค.");
  }
}

์•„๊นŒ์™€ ๊ฐ™์ด ์ˆœ์„œ๋Œ€๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ธด ํ•˜์ง€๋งŒ, ํšŒ์› ์ถ”๊ฐ€ ์™„๋ฃŒ —2์ดˆ ํ›„→ ๊ฐ€์ž… ์ถ•ํ•˜ ๋ฉ”์„ธ์ง€ ์ „์†ก —1์ดˆ ํ›„→ ์ฟ ํฐ ์ „์†ก → ํšŒ์›๊ฐ€์ž… ์™„๋ฃŒ์˜ ์ˆœ์„œ๋Œ€๋กœ ์ž‘์—…์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํšŒ์› ์ถ”๊ฐ€๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ด๋ฒคํŠธ๋“ค์€ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ถ”๊ฐ€ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ’ป ๊ตฌํ˜„ - ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ(์„ฑ๋Šฅ ํ•ด๊ฒฐ)

1. @EnableAsync ์ถ”๊ฐ€

SpringEventApplication.java

@EnableAsync // ์ถ”๊ฐ€
@SpringBootApplication
public class SpringEventApplication {

  public static void main(String[] args) {
    SpringApplication.run(SpringEventApplication.class, args);
  }

}

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด Application์— @EnableAsync๋ฅผ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค. (Application์ด ์•„๋‹Œ config ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ด๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.)

 

2. @Async ์ถ”๊ฐ€

event/handler/SmsEventHandler.java

@Component
public class SmsEventHandler {

  @Async // ์ถ”๊ฐ€
  @EventListener
  public void sendSms(RegisteredEvent event) throws InterruptedException {
    Thread.sleep(2000);
    System.out.println(event.getName() + "๋‹˜์—๊ฒŒ ๊ฐ€์ž… ์ถ•ํ•˜ ๋ฉ”์„ธ์ง€๋ฅผ ์ „์†กํ–ˆ์Šต๋‹ˆ๋‹ค.");
  }

  @Async // ์ถ”๊ฐ€
  @EventListener
  public void makeCoupon(RegisteredEvent event) throws InterruptedException {
    Thread.sleep(1000);
    System.out.println(event.getName() + "๋‹˜์—๊ฒŒ ์ฟ ํฐ์„ ์ „์†กํ–ˆ์Šต๋‹ˆ๋‹ค.");
  }
}

๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•  ๋ฉ”์†Œ๋“œ์— @Async๋ฅผ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

 

3. ํ…Œ์ŠคํŠธ

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


๐Ÿ“• ๊ตฌํ˜„ - ํŠธ๋žœ์žญ์…˜ ํ•ด๊ฒฐ

๊ทธ๋ ‡๋‹ค๋ฉด ์ฟ ํฐ์„ ์ „์†กํ•˜๋‹ค ์‹คํŒจํ•˜๋ฉด ํ‰์ƒ ๋ฐœ๊ธ‰ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ์œ„ ์˜ˆ์ œ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ @Async์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ ์ด์™ธ์— ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•˜์ง€๋งŒ, ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋กœ์ปฌ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰ํ•˜๊ธฐ
  • ๋ฉ”์„ธ์ง€ ํ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ(RabbitMQ, Kafka ...)
  • ์ด๋ฒคํŠธ ์ €์žฅ์†Œ์™€ ์ด๋ฒคํŠธ ํฌ์›Œ๋” ์‚ฌ์šฉํ•˜๊ธฐ
  • ์ด๋ฒคํŠธ ์ €์žฅ์†Œ์™€ ์ด๋ฒคํŠธ ์ œ๊ณต API ์‚ฌ์šฉํ•˜๊ธฐ

์œ„ ๋„ค๊ฐ€์ง€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์ด๋‚˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์€ DDD START!๋ผ๋Š” ์ฑ…์— ์„ค๋ช…์ด ๋˜์–ด์žˆ์œผ๋‹ˆ ๊ด€์‹ฌ์ด ์žˆ์œผ์‹  ๋ถ„๋“ค์€ ํ•œ ๋ฒˆ์”ฉ ์ฝ์œผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค :)

https://shinsunyoung.tistory.com/88

 

Spring Boot์—์„œ ์ด๋ฒคํŠธ ์‚ฌ์šฉํ•˜๊ธฐ

์•ˆ๋…•ํ•˜์„ธ์š”! ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Spring Boot์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์ฝ”๋“œ๋Š” Github์—์„œ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. โœ๏ธ ๐Ÿ“š ๊ฐœ๋… ์ •๋ฆฌ & ์‚ฌ์ „์ค€๋น„ 1. ์ด๋ฒคํŠธ Spring Boot์—์„œ

shinsunyoung.tistory.com