๊ด€๋ฆฌ ๋ฉ”๋‰ด

Unfazedโ—๏ธ๐ŸŽฏ

SOLID ์›์น™(์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„)๊ณผ Spring์˜ ํ•„์š”์„ฑ ๋ณธ๋ฌธ

Web (back-end)/Spring

SOLID ์›์น™(์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„)๊ณผ Spring์˜ ํ•„์š”์„ฑ

9taetae9 2025. 1. 6. 16:11
728x90

SOLID๋Š” ํด๋ฆฐ ์ฝ”๋“œ๋กœ ์œ ๋ช…ํ•œ ๋กœ๋ฒ„ํŠธ ๋งˆํ‹ด์ด ์ œ์•ˆํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐ ์„ค๊ณ„์˜ ๋‹ค์„ฏ ๊ฐ€์ง€ ํ•ต์‹ฌ ์›์น™์ด๋‹ค.

1. ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (Single Responsibility Principle, SRP)

"ํ•œ ํด๋ž˜์Šค๋Š” ์˜ค์ง ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค"๋Š” ๊ฒƒ์ด SRP์˜ ํ•ต์‹ฌ์ด๋‹ค. ์—ฌ๊ธฐ์„œ '์ฑ…์ž„'์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

์ฃผ๋ฌธ ์‹œ์Šคํ…œ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

// SRP๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ์˜ˆ์‹œ
class Order {
    public void calculateTotalPrice() { ... }
    public void printOrder() { ... }
    public void saveToDatabase() { ... }
}

// SRP๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ์˜ˆ์‹œ
class Order {
    public void calculateTotalPrice() { ... }
}

class OrderPrinter {
    public void printOrder(Order order) { ... }
}

class OrderRepository {
    public void saveOrder(Order order) { ... }
}

 

์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ๋Š” ์ฃผ๋ฌธ ๊ณ„์‚ฐ, ์ถœ๋ ฅ, ์ €์žฅ์ด๋ผ๋Š” ์„ธ ๊ฐ€์ง€ ์ฑ…์ž„์„ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ์–ด SRP๋ฅผ ์œ„๋ฐ˜ํ•œ๋‹ค.

๋ฐ˜๋ฉด, ๋‘ ๋ฒˆ์งธ ์˜ˆ์‹œ๋Š” ๊ฐ ํด๋ž˜์Šค๊ฐ€ ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ง€๋„๋ก ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์ ์šฉ ์ด์œ  : ์ฝ”๋“œ์˜ ์ดํ•ด์™€ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ํ•˜๊ณ , ํŠน์ • ์ฑ…์ž„ ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ์ฑ…์ž„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ.

์‹ค์ œ ์‚ฌ์šฉ : 

  • MVC ํŒจํ„ด์—์„œ Controller๋Š” ์š”์ฒญ ์ฒ˜๋ฆฌ, Service๋Š” ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง, Repository๋Š” ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์œผ๋กœ ์—ญํ•  ๋ถ„๋ฆฌ
  • ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌ

2. ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ (Open/Closed Principle, OCP)

"์†Œํ”„ํŠธ์›จ์–ด ์š”์†Œ๋Š” ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์œผ๋‚˜, ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค"๋Š” ์›์น™์œผ๋กœ ์ถ”์ƒํ™”์™€ ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

// OCP๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ์˜ˆ์‹œ
class PaymentProcessor {
    public void processPayment(String type) {
        if (type.equals("CREDIT")) {
            processCreditPayment();
        } else if (type.equals("DEBIT")) {
            processDebitPayment();
        }
        // ์ƒˆ๋กœ์šด ๊ฒฐ์ œ ๋ฐฉ์‹์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ ์ˆ˜์ • ํ•„์š”
    }
}

// OCP๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ์˜ˆ์‹œ
interface PaymentMethod {
    void processPayment();
}

class CreditPayment implements PaymentMethod {
    public void processPayment() { ... }
}

class DebitPayment implements PaymentMethod {
    public void processPayment() { ... }
}

// ์ƒˆ๋กœ์šด ๊ฒฐ์ œ ๋ฐฉ์‹ ์ถ”๊ฐ€๊ฐ€ ์šฉ์ดํ•จ
class CryptoPayment implements PaymentMethod {
    public void processPayment() { ... }
}

 

์ ์šฉ ๋ฐฉ๋ฒ• : 

  • ์ถ”์ƒํ™”์™€ ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉ
  • ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ์„ค๊ณ„๋กœ ๊ธฐ๋Šฅ ํ™•์žฅ์ด ํ•„์š”ํ•  ๋•Œ ๊ตฌํ˜„์ฒด๋งŒ ์ถ”๊ฐ€

์Šคํ”„๋ง ์ ์šฉ ์‚ฌ๋ก€ :

  • DI๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ตฌํ˜„์ฒด๋ฅผ ์ฃผ์ž…ํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋Š” ์ˆ˜์ •ํ•˜์ง€ ์•Š์Œ

3. ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ (Liskov Substitution Principle, LSP)

ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๊ทœ์•ฝ์„ ์ง€์ผœ์•ผ ํ•œ๋‹ค๋Š” ์›์น™์œผ๋กœ, ์ƒ์œ„ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ํ•˜์œ„ ํƒ€์ž…์˜ ๊ฐ์ฒด๋กœ ์น˜ํ™˜ํ•ด๋„ ํ”„๋กœ๊ทธ๋žจ์˜ ์ •ํ™•์„ฑ์ด ๋ณด์žฅ๋˜์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.

// LSP๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ์˜ˆ์‹œ
class Bird {
    void fly() { ... }
}

class Penguin extends Bird {
    void fly() {
        throw new UnsupportedOperationException(); // ํŽญ๊ท„์€ ๋‚  ์ˆ˜ ์—†์Œ!
    }
}

// LSP๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ์˜ˆ์‹œ
interface FlyingBird {
    void fly();
}

interface WalkingBird {
    void walk();
}

class Sparrow implements FlyingBird {
    public void fly() { ... }
}

class Penguin implements WalkingBird {
    public void walk() { ... }
}

 

์ ์šฉ ์ด์œ  : ์ƒ์† ๊ด€๊ณ„์—์„œ์˜ ์ผ๊ด€์„ฑ ์œ ์ง€

์ ์šฉ ๋ฐฉ๋ฒ• :

  • ์ž˜๋ชป๋œ ์ƒ์† ๊ตฌ์กฐ๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์žฌ์„ค๊ณ„
  • ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ๊ณต์œ ํ•˜๋Š” ๊ฐ์ฒด๋Š” ์ƒ์†๋ณด๋‹ค ์ปดํฌ์ง€์…˜์„ ๊ณ ๋ ค

4. ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™ (Interface Segregation Principle, ISP)

ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์‹ ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ์›์น™์ด๋‹ค.

// ISP๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ์˜ˆ์‹œ
interface Worker {
    void work();
    void eat();
    void sleep();
}

// ISP๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ์˜ˆ์‹œ
interface Workable {
    void work();
}

interface Eatable {
    void eat();
}

interface Sleepable {
    void sleep();
}

class Human implements Workable, Eatable, Sleepable {
    public void work() { ... }
    public void eat() { ... }
    public void sleep() { ... }
}

class Robot implements Workable {
    public void work() { ... }
}



์ ์šฉ ๋ฐฉ๋ฒ• :

  • ์ž‘์€ ๋‹จ์œ„์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌ
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ์ œ๊ณต

์ ์šฉ ์˜ˆ์‹œ :

  • ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋ก ์‹œ ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

5. ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™ (Dependency Inversion Principle, DIP)

"์ƒ์œ„ ๋ชจ๋“ˆ์€ ํ•˜์œ„ ๋ชจ๋“ˆ์˜ ๊ตฌํ˜„์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ๋‘˜ ๋‹ค ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•˜๊ณ ,

์ถ”์ƒํ™”๊ฐ€ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์„ธ๋ถ€์‚ฌํ•ญ์ด ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค"

์ฆ‰, ์ƒ์œ„์™€ ํ•˜์œ„ ๊ฐ์ฒด ๋ชจ๋‘๊ฐ€ ๋™์ผํ•œ ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.

// DIP๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ์˜ˆ์‹œ
class OrderService {
    private MySQLOrderRepository repository = new MySQLOrderRepository();
}

// DIP๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ์˜ˆ์‹œ
interface OrderRepository {
    void save(Order order);
}

class OrderService {
    private final OrderRepository repository;

    public OrderService(OrderRepository repository) {
        this.repository = repository;
    }
}

 

์ ์šฉ ์ด์œ  :

  • ๋ชจ๋“ˆ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์œ ์—ฐ์„ฑ์„ ๋†’์ž„
  • ์ƒ์œ„ ๋ชจ๋“ˆ ๋กœ์ง ๋ณ€๊ฒฝ ์—†์ด ํ•˜์œ„ ์ˆ˜์ค€์˜ ๊ตฌํ˜„ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

์ ์šฉ ์˜ˆ์‹œ :

  • DI ์ปจํ…Œ์ด๋„ˆ๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…
  • ์„ค์ • ํŒŒ์ผ, ์• ๋„ˆํ…Œ์ด์…˜์„ ํ†ตํ•ด ์œ ์—ฐํ•œ ๊ตฌ์กฐ ์ œ๊ณต

SOLID ์›์น™์˜ ์‹ค์ œ ์ ์šฉ

SOLID ์›์น™๋“ค์€ ๊ฐœ๋ณ„์ ์œผ๋กœ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ, ์„œ๋กœ ๊ธด๋ฐ€ํ•˜๊ฒŒ ์—ฐ๊ด€๋˜์–ด ์žˆ๋‹ค. ์›์น™๋“ค์„ ์ ์ ˆํžˆ ์ ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

  • ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ
  • ํ™•์žฅ์„ฑ ์žˆ๋Š” ์„ค๊ณ„ ๊ฐ€๋Šฅ
  • ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ
  • ํ…Œ์ŠคํŠธ๊ฐ€ ์šฉ์ดํ•œ ์ฝ”๋“œ ์ž‘์„ฑ

ํ•˜์ง€๋งŒ, ์ด๋Ÿฌํ•œ ์›์น™๋“ค์„ ๊ณผ๋„ํ•˜๊ฒŒ ์ ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ ์ ˆํžˆ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

ํŠนํžˆ, ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ๋Š” ๋‹จ์ˆœํ•œ ์„ค๊ณ„๋กœ ์‹œ์ž‘ํ•˜๊ณ , ํ•„์š”์— ๋”ฐ๋ผ ์ ์ง„์ ์œผ๋กœ ์›์น™๋“ค์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋”ฐ๋ผ์„œ, ์ด๋Ÿฌํ•œ ์›์น™๋“ค์€ ๋‹จ์ˆœํžˆ ๊ทœ์น™์œผ๋กœ ์™ธ์šฐ๊ธฐ๋ณด๋‹ค๋Š”, ์™œ ํ•„์š”ํ•œ์ง€, ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์ ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. 

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ ๋งŒ๋‚จ

์Šคํ”„๋ง์ด ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ–ˆ๋˜ ๋ฌธ์ œ

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ ์›์น™์ธ OCP(๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™)์™€ DIP(์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™)๋ฅผ ์‹ค์ œ ์ฝ”๋“œ์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์€ ์ž‘์—…์„ ํ•„์š”๋กœ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํƒ„์ƒํ–ˆ๋‹ค.

์Šคํ”„๋ง์ด ์—†์„ ๋•Œ์˜ ๋ฌธ์ œ์ 

// ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์ฒด
interface PaymentService {
    void processPayment();
}

class KakaoPayService implements PaymentService {
    public void processPayment() {
        System.out.println("์นด์นด์˜คํŽ˜์ด ๊ฒฐ์ œ ์ฒ˜๋ฆฌ");
    }
}

class NaverPayService implements PaymentService {
    public void processPayment() {
        System.out.println("๋„ค์ด๋ฒ„ํŽ˜์ด ๊ฒฐ์ œ ์ฒ˜๋ฆฌ");
    }
}

// ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ
class OrderService {
    private PaymentService paymentService = new KakaoPayService();  // DIP ์œ„๋ฐ˜!

    public void order() {
        paymentService.processPayment();
    }
}

 

์œ„ ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ 

  • ๋‹ค๋ฅธ ๊ฒฐ์ œ ์„œ๋น„์Šค๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด OrderService ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•จ (OCP ์œ„๋ฐ˜)
  • OrderService๊ฐ€ ๊ตฌ์ฒด์ ์ธ ๊ฒฐ์ œ ์„œ๋น„์Šค์ธ KakaoPayService๋ฅผ ์ง์ ‘ ์ƒ์„ฑ(์ƒ์œ„ ๋ชจ๋“ˆ์ด ํ•˜์œ„ ๋ชจ๋“ˆ์— ์˜์กด)ํ•˜๊ณ  ์žˆ์Œ (DIP ์œ„๋ฐ˜)

์Šคํ”„๋ง์˜ ํ•ด๊ฒฐ์ฑ…: DI(Dependency Injection)

// ์Šคํ”„๋ง ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ
@Service
class OrderService {
    private final PaymentService paymentService;

    @Autowired
    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }

    public void order() {
        paymentService.processPayment();
    }
}

@Service
class KakaoPayService implements PaymentService {
    public void processPayment() {
        System.out.println("์นด์นด์˜คํŽ˜์ด ๊ฒฐ์ œ ์ฒ˜๋ฆฌ");
    }
}

 

OrderService๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ํ†ตํ•ด PaymentService์˜ ์ถ”์ƒํ™”์— ์˜์กดํ•˜๋ฏ€๋กœ, ์ƒˆ๋กœ์šด ๊ฒฐ์ œ ์ˆ˜๋‹จ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. (OCP ์ค€์ˆ˜)

OrderService๊ฐ€ PaymentService๋ผ๋Š” ์ถ”์ƒํ™”์— ์˜์กดํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๊ตฌํ˜„์ฒด๋Š” ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋œ๋‹ค. (DIP ์ค€์ˆ˜)

 

์žฅ์ 

  • DI ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์„ ๋‹ด๋‹น
  • ์„ค์ • ๋ณ€๊ฒฝ๋งŒ์œผ๋กœ ๊ตฌํ˜„์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ (๋ชจํ‚น(mocking)์ด๋‚˜ ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋กœ์˜ ๊ต์ฒด๊ฐ€ ์šฉ์ด)
  • ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์—†์ด ๊ธฐ๋Šฅ ํ™•์žฅ ๊ฐ€๋Šฅ

์—ญํ• ๊ณผ ๊ตฌํ˜„์˜ ๋ถ„๋ฆฌ

์Šคํ”„๋ง์€ ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ํ•ต์‹ฌ ์›์น™์ธ "์—ญํ• ๊ณผ ๊ตฌํ˜„์˜ ๋ถ„๋ฆฌ"๋ฅผ ๋งค์šฐ ์ž˜ ์ง€์›ํ•œ๋‹ค.

// ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)
public interface MemberRepository {
    void save(Member member);
    Member findById(Long id);
}

// ๊ตฌํ˜„
@Repository
public class JpaMemberRepository implements MemberRepository {
    @Override
    public void save(Member member) {
        // JPA๋ฅผ ์‚ฌ์šฉํ•œ ๊ตฌํ˜„
    }

    @Override
    public Member findById(Long id) {
        // JPA๋ฅผ ์‚ฌ์šฉํ•œ ๊ตฌํ˜„
    }
}

@Repository
public class MongoMemberRepository implements MemberRepository {
    // MongoDB๋ฅผ ์‚ฌ์šฉํ•œ ๊ตฌํ˜„
}

 

์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•œ ์„ค๊ณ„์˜ ์žฅ์ 

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Œ
  • ํ…Œ์ŠคํŠธ๊ฐ€ ์šฉ์ดํ•จ (Mock ๊ฐ์ฒด ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
  • ๊ธฐ๋Šฅ ํ™•์žฅ์ด ์‰ฌ์›€

 

๊ฒฐ๋ก 

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ํ•ต์‹ฌ ์›์น™๋“ค์„ ์‹ค์ฒœํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค. DI ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•ด ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ์ œ๊ณตํ•ด์ฃผ์–ด, ๊ฐœ๋ฐœ์ž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

 

 

์ฐธ๊ณ  ์ž๋ฃŒ :

์Šคํ”„๋ง ๊ธฐ๋ณธ ๊ฐ•์˜ (๊น€์˜ํ•œ ๊ฐ•์‚ฌ)

https://ko.wikipedia.org/wiki/SOLID_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%EC%84%A4%EA%B3%84)

 

SOLID (๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„) - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „. ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ SOLID๋ž€ ๋กœ๋ฒ„ํŠธ C. ๋งˆํ‹ด[1][2]์ด 2000๋…„๋Œ€ ์ดˆ๋ฐ˜[3]์— ๋ช…๋ช…ํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐ ์„ค๊ณ„์˜ ๋‹ค์„ฏ ๊ฐ€์ง€ ๊ธฐ๋ณธ ์›์น™์„ ๋งˆ์ดํด ํŽ˜๋”์Šค๊ฐ€ ๋‘๋ฌธ์ž

ko.wikipedia.org

 

728x90