Spring & OOP

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

  • IoC(Inversion of Control) / DI(Dependency Injection)

  • AOP(Aspect Oriented Programming)

  • PSA(Portable Service Abstraction)

  • ์ด๋ฒคํŠธ(Event)

์œ„์™€ ๊ฐ™์€ ๊ธฐ์ˆ ๋กœ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์— ์ง‘์ค‘ํ•˜๊ณ , ๊ธฐ์ˆ  ยท ๋ถ€๊ฐ€๊ธฐ๋Šฅ์€ ํ”„๋ ˆ์ž„์›Œํฌ์— ์œ„์ž„ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ ๋‹ค.

IoC/DI - ์ถ”์ƒํ™”์™€ ์˜์กด์„ฑ ์ฃผ์ž…

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

  • ๊ฐ์ฒด๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๊ณ  ๊ตฌํ˜„ ์ฃผ์ž…์€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ด๋‹น

  • ํ”„๋กœํŒŒ์ผ/์„ค์ •๋งŒ ๋ฐ”๊ฟ” ๊ตฌํ˜„์„ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์–ด ํ…Œ์ŠคํŠธ ยท ๋ฐฐํฌ ํ™˜๊ฒฝ ๋ถ„๋ฆฌ ์šฉ์ด

public interface PaymentGateway {

    void authorize(String orderId, long amount);
}

@Service
class TossPaymentsGateway implements PaymentGateway {

    public void authorize(String orderId, long amount) { /* ... */ }
}

@Primary
@Service
class KakaoPayGateway implements PaymentGateway {

    public void authorize(String orderId, long amount) { /* ... */ }
}

@Service
class PaymentService {

    private final PaymentGateway gateway;

    public PaymentService(@Qualifier("tossPaymentsGateway") PaymentGateway gateway) {
        this.gateway = gateway;
    }
}

AOP - ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ

๋กœ๊น…, ๋ณด์•ˆ ๊ฐ™์€ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์Šคํ”„๋ง ํŠธ๋žœ์žญ์…˜์˜ @Transactional ์–ด๋…ธํ…Œ์ด์…˜๋„ AOP ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

  • ๋กœ๊น… ยท ๋ณด์•ˆ ยท ํŠธ๋žœ์žญ์…˜ ๊ฐ™์€ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ์• ์ŠคํŽ™ํŠธ๋กœ ๋ถ„๋ฆฌ

  • ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฉ”์„œ๋“œ ๊ฒฝ๊ณ„์—์„œ ์ •์ฑ…์„ ์ผ๊ด„ ์ ์šฉํ•˜๋˜, ๋‚จ์šฉ ์‹œ ํ๋ฆ„ ์ถ”์ ์ด ์–ด๋ ค์›Œ์ง€๋ฏ€๋กœ ๋ฒ”์œ„๋ฅผ ๋ช…ํ™•ํžˆ ๊ด€๋ฆฌ

PSA(Portable Service Abstraction) - ์ผ๊ด€๋œ ์„œ๋น„์Šค ์ถ”์ƒํ™”

์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ์ผ๊ด€๋œ ์„œ๋น„์Šค ์ถ”์ƒํ™”๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋Š” ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค(๋˜๋Š” ์• ๋…ธํ…Œ์ด์…˜)์— ์˜์กดํ•˜๊ณ  ์‹ค์ œ ๊ตฌํ˜„(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/๋ฒค๋”)์€ ๋นˆ ๊ตฌ์„ฑ์œผ๋กœ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

  • ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค/์• ๋…ธํ…Œ์ด์…˜์— ์˜์กดํ•˜๊ณ  ์‹ค์ œ ๊ตฌํ˜„์€ ๋นˆ ๊ตฌ์„ฑ์œผ๋กœ ๊ต์ฒด

  • ์บ์‹œ ยท ํŠธ๋žœ์žญ์…˜ยท๋ฉ”์‹œ์ง• ๋“ฑ ์ธํ”„๋ผ๋ฅผ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ๋ฐ”๊ฟ”๋„ ๋น„์ฆˆ๋‹ˆ์Šค ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋จ

์ด๋ฒคํŠธ - ๋ชจ๋“ˆ ๊ฐ„ ๊ฒฐํ•ฉ๋„ ๊ฐ์†Œ

์ด๋ฒคํŠธ๋Š” ํ•œ ๋ชจ๋“ˆ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ , ๋‹ค๋ฅธ ๋ชจ๋“ˆ์ด ํ›„์ฒ˜๋ฆฌ๋ฅผ ๊ตฌ๋…ํ•˜๊ฒŒ ํ•ด ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.

  • ์ด๋ฒคํŠธ ๋ฐœํ–‰ํ•˜๊ณ  ๊ด€์‹ฌ ๋ชจ๋“ˆ์ด ๊ตฌ๋…ํ•˜๋„๋ก ์„ค๊ณ„ํ•ด ๋Ÿฐํƒ€์ž„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถค

  • AFTER_COMMIT๊ณผ ๋น„๋™๊ธฐ ๋ฆฌ์Šค๋„ˆ๋กœ ํ›„์ฒ˜๋ฆฌ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๊ณ , Outbox ยท ๋ฉฑ๋“ฑ ์ฒ˜๋ฆฌ๋กœ ์œ ์‹ค๊ณผ ์ค‘๋ณต์„ ๋ฐฉ์ง€ ๊ฐ€๋Šฅ

Last updated

Was this helpful?