SOLID ์›์น™ — ์ข‹์€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ ๋‹ค์„ฏ ๊ฐ€์ง€ ๊ธฐ์ค€

SOLID ์›์น™. ์ข‹์€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ ๋‹ค์„ฏ ๊ฐ€์ง€ ๊ธฐ์ค€. SRP·OCP·LSP·ISP·DIP๋ฅผ ์•ˆํ‹ฐํŒจํ„ด ์ฝ”๋“œ์™€ ๊ฐœ์„  ์˜ˆ์ œ๋กœ ์ •๋ฆฌํ•˜๊ณ , ๋””์ž์ธ ํŒจํ„ด·์Šคํ”„๋ง๊ณผ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”์ง€๊นŒ์ง€ ์งš๋Š”๋‹ค.


๋“ค์–ด๊ฐ€๋ฉฐ

์ง€๋‚œ ๊ธ€์—์„œ ์‹ค๋ฌด์—์„œ ์ž์ฃผ ์“ฐ๋Š” ๋””์ž์ธ ํŒจํ„ด์„ ์ •๋ฆฌํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋””์ž์ธ ํŒจํ„ด์€ ํ•˜๋Š˜์—์„œ ๋–จ์–ด์ง„ ๊ฒŒ ์•„๋‹ˆ๋‹ค.
๊ทธ ๋ฐ‘์—๋Š” SOLID ๋ผ๋Š” ๋‹ค์„ฏ ๊ฐ€์ง€ ์„ค๊ณ„ ์›์น™์ด ๊น”๋ ค ์žˆ๋‹ค.
์ „๋žต ํŒจํ„ด์ด ์™œ ์ข‹์€์ง€, ์Šคํ”„๋ง์ด ์™œ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์“ฐ๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ทผ๊ฑฐ๊ฐ€ ๋ฐ”๋กœ SOLID๋‹ค.

SOLID๋Š” ๋กœ๋ฒ„ํŠธ ๋งˆํ‹ด(Robert C. Martin)์ด ์ •๋ฆฌํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ ๋‹ค์„ฏ ์›์น™์˜ ๋จธ๋ฆฌ๊ธ€์ž๋‹ค.

์•ฝ์ž ์›์น™ ํ•œ ์ค„ ์š”์•ฝ
S ๋‹จ์ผ ์ฑ…์ž„ (SRP) ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ด์œ ๋กœ๋งŒ ๋ณ€๊ฒฝ๋ผ์•ผ ํ•œ๋‹ค
O ๊ฐœ๋ฐฉ-ํ์‡„ (OCP) ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ๊ณ , ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค
L ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ (LSP) ์ž์‹์€ ๋ถ€๋ชจ๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค
I ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ (ISP) ์•ˆ ์“ฐ๋Š” ๋ฉ”์„œ๋“œ์— ์˜์กดํ•˜๊ฒŒ ํ•˜์ง€ ๋งˆ๋ผ
D ์˜์กด์„ฑ ์—ญ์ „ (DIP) ๊ตฌ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์ถ”์ƒ์— ์˜์กดํ•˜๋ผ

SOLID๋Š” ๊ทœ์น™์ด ์•„๋‹ˆ๋ผ ๋ฐฉํ–ฅ์ด๋‹ค. ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ์— ์–ผ๋งˆ๋‚˜ ์œ ์—ฐํ•œ์ง€๋ฅผ ๋ณด๋Š” ๋‹ค์„ฏ ๊ฐ€์ง€ ๋ Œ์ฆˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” ๊ฐ ์›์น™์„ ์•ˆํ‹ฐํŒจํ„ด ์ฝ”๋“œ์™€ ๊ฐœ์„  ์ฝ”๋“œ๋กœ ๋น„๊ตํ•˜๋ฉฐ ์ •๋ฆฌํ•œ๋‹ค. ์˜ˆ์‹œ๋Š” Java/Spring ๊ธฐ์ค€์ด๋‹ค.


S — ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (Single Responsibility)

ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ๋‹ค๋ฅด๊ฒŒ ๋งํ•˜๋ฉด, ํด๋ž˜์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ์ด์œ ๋Š” ๋‹จ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค.

์•„๋ž˜ UserService๋Š” ์‚ฌ์šฉ์ž ๋“ฑ๋ก, ์ด๋ฉ”์ผ ๋ฐœ์†ก, ๋กœ๊ทธ ๊ธฐ๋ก๊นŒ์ง€ ๋‹ค ํ•œ๋‹ค.

// ์•ˆํ‹ฐํŒจํ„ด: ํ•œ ํด๋ž˜์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์ฑ…์ž„์„ ์งŠ์–ด์ง
public class UserService {
    public void register(User user) {
        // 1. ์‚ฌ์šฉ์ž ์ €์žฅ (DB ์ฑ…์ž„)
        userRepository.save(user);

        // 2. ํ™˜์˜ ์ด๋ฉ”์ผ ๋ฐœ์†ก (๋ฉ”์ผ ์ฑ…์ž„)
        String html = "<h1>ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค " + user.getName() + "</h1>";
        emailClient.send(user.getEmail(), html);

        // 3. ๊ฐ์‚ฌ ๋กœ๊ทธ ๊ธฐ๋ก (๋กœ๊น… ์ฑ…์ž„)
        Files.writeString(Path.of("audit.log"), "registered: " + user.getId());
    }
}

์ด ํด๋ž˜์Šค๋Š” ์„ธ ๊ฐ€์ง€ ์ด์œ ๋กœ ๋ฐ”๋€๋‹ค. ์ด๋ฉ”์ผ ์–‘์‹์ด ๋ฐ”๋€Œ์–ด๋„, ๋กœ๊ทธ ํ˜•์‹์ด ๋ฐ”๋€Œ์–ด๋„, DB๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์—ฌ๊ธฐ๋ฅผ ๊ฑด๋“œ๋ฆฐ๋‹ค.
์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ๋œ๋‹ค.

// ๊ฐœ์„ : ์ฑ…์ž„๋งˆ๋‹ค ํด๋ž˜์Šค๋ฅผ ๋‚˜๋ˆˆ๋‹ค
public class UserService {

    private final UserRepository userRepository;
    private final WelcomeEmailSender emailSender;
    private final AuditLogger auditLogger;

    public void register(User user) {
        userRepository.save(user);       // ์ €์žฅ๋งŒ
        emailSender.send(user);          // ์ด๋ฉ”์ผ์€ ์œ„์ž„
        auditLogger.log("registered", user.getId());  // ๋กœ๊น…๋„ ์œ„์ž„
    }
}

์ด์ œ ์ด๋ฉ”์ผ ์–‘์‹์ด ๋ฐ”๋€Œ๋ฉด WelcomeEmailSender๋งŒ ๊ณ ์น˜๋ฉด ๋œ๋‹ค. ๊ฐ ํด๋ž˜์Šค๊ฐ€ ์ž๊ธฐ ์ฑ…์ž„์—๋งŒ ์ง‘์ค‘ํ•œ๋‹ค.


O — ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ (Open-Closed)

ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ๊ณ , ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ƒˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊ณ ์น˜์ง€ ์•Š๊ณ , ์ƒˆ ์ฝ”๋“œ๋ฅผ ๋”ํ•˜๋Š” ๋ฐฉ์‹์ด์–ด์•ผ ํ•œ๋‹ค.

๋“ฑ๊ธ‰๋ณ„ ํ• ์ธ์„ ๊ณ„์‚ฐํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

// ์•ˆํ‹ฐํŒจํ„ด: ๋“ฑ๊ธ‰์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜์ •
public int discount(Grade grade, int price) {
    if (grade == Grade.SILVER) return price * 5 / 100;
    else if (grade == Grade.GOLD) return price * 10 / 100;
    else if (grade == Grade.VIP) return price * 20 / 100;
    // ์ƒˆ ๋“ฑ๊ธ‰ ์ถ”๊ฐ€ = ์ด ์ฝ”๋“œ ์ˆ˜์ • (๋ณ€๊ฒฝ์— ์—ด๋ ค ์žˆ์Œ → ์œ„๋ฐ˜)
    return 0;
}

์ƒˆ ๋“ฑ๊ธ‰์ด ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ „๋žต ํŒจํ„ด์œผ๋กœ ์ถ”์ƒํ™”ํ•˜๋ฉด ๋ณ€๊ฒฝ ์—†์ด ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

// ๊ฐœ์„ : ์ •์ฑ…์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ƒํ™”
public interface DiscountPolicy {
    boolean supports(Grade grade);
    int calculate(int price);
}

@Component
public class VipDiscountPolicy implements DiscountPolicy {
    public boolean supports(Grade grade) { return grade == Grade.VIP; }
    public int calculate(int price) { return price * 20 / 100; }
}

์ƒˆ ๋“ฑ๊ธ‰์€ DiscountPolicy ๊ตฌํ˜„์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ๊ธฐ์กด ์ฝ”๋“œ๋Š” ๋‹ซํ˜€ ์žˆ๋‹ค.
์ง€๋‚œ ๊ธ€์˜ ์ „๋žต ํŒจํ„ด์ด ๋ฐ”๋กœ OCP๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋„๊ตฌ๋‹ค.


L — ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ (Liskov Substitution)

์ž์‹ ํƒ€์ž…์€ ์–ธ์ œ๋‚˜ ๋ถ€๋ชจ ํƒ€์ž…์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋ถ€๋ชจ๋ฅผ ์“ฐ๋˜ ์ž๋ฆฌ์— ์ž์‹์„ ๋„ฃ์—ˆ์„ ๋•Œ ๋™์ž‘์ด ๊นจ์ง€๋ฉด ์•ˆ ๋œ๋‹ค.

์œ ๋ช…ํ•œ ๋ฐ˜๋ก€๊ฐ€ "์ง์‚ฌ๊ฐํ˜•-์ •์‚ฌ๊ฐํ˜•" ๋ฌธ์ œ๋‹ค.

// ์•ˆํ‹ฐํŒจํ„ด: Square๊ฐ€ Rectangle์„ ์ƒ์†
public class Rectangle {
    protected int width, height;
    public void setWidth(int w)  { this.width = w; }
    public void setHeight(int h) { this.height = h; }
    public int area() { return width * height; }
}

public class Square extends Rectangle {
    // ์ •์‚ฌ๊ฐํ˜•์€ ๊ฐ€๋กœ=์„ธ๋กœ์—ฌ์•ผ ํ•˜๋ฏ€๋กœ ๋‘˜ ๋‹ค ๋ฐ”๊ฟˆ
    public void setWidth(int w)  { this.width = w; this.height = w; }
    public void setHeight(int h) { this.width = h; this.height = h; }
}

๊ฒ‰๋ณด๊ธฐ์—” "์ •์‚ฌ๊ฐํ˜•์€ ์ง์‚ฌ๊ฐํ˜•์˜ ์ผ์ข…"์ด๋ผ ๋งž์•„ ๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์ฝ”๋“œ๋Š” ๊นจ์ง„๋‹ค.

void resize(Rectangle r) {
    r.setWidth(5);
    r.setHeight(4);
    assert r.area() == 20;   // Rectangle์ด๋ฉด ํ†ต๊ณผ, Square๋ฉด 16 → ์‹คํŒจ!
}

Rectangle์„ ๊ธฐ๋Œ€ํ•œ ์ฝ”๋“œ์— Square๋ฅผ ๋„ฃ์œผ๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค. ์น˜ํ™˜์ด ์•ˆ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
์ƒ์† ๊ด€๊ณ„๊ฐ€ "is-a"์ฒ˜๋Ÿผ ๋ณด์—ฌ๋„, ํ–‰์œ„๊ฐ€ ์ผ๊ด€๋˜์ง€ ์•Š์œผ๋ฉด ์ƒ์†ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค๋Š” ๊ฒŒ LSP์˜ ๊ตํ›ˆ์ด๋‹ค.
์ด ๊ฒฝ์šฐ์—” ์ƒ์† ๋Œ€์‹  ๋‘˜์„ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ์„ค๊ณ„ํ•˜๋Š” ๊ฒŒ ๋งž๋‹ค.


I — ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™ (Interface Segregation)

ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์‹ ์ด ์“ฐ์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ์— ์˜์กดํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. ๊ฑฐ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ํ•˜๋‚˜๋ณด๋‹ค, ์ž‘๊ณ  ๊ตฌ์ฒด์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋‚ซ๋‹ค.

// ์•ˆํ‹ฐํŒจํ„ด: ๋งŒ๋Šฅ ์ธํ„ฐํŽ˜์ด์Šค
public interface Machine {
    void print(Document doc);
    void scan(Document doc);
    void fax(Document doc);
}

// ๊ตฌํ˜• ํ”„๋ฆฐํ„ฐ๋Š” ์ธ์‡„๋งŒ ๋˜๋Š”๋ฐ, ์•ˆ ์“ฐ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์–ต์ง€๋กœ ๊ตฌํ˜„
public class OldPrinter implements Machine {
    public void print(Document doc) { /* ์ •์ƒ */ }
    public void scan(Document doc) { throw new UnsupportedOperationException(); }
    public void fax(Document doc)  { throw new UnsupportedOperationException(); }
}

OldPrinter๋Š” ์Šค์บ”·ํŒฉ์Šค๋ฅผ ๋ชป ํ•˜๋Š”๋ฐ๋„ ๋นˆ ๊ตฌํ˜„์ด๋‚˜ ์˜ˆ์™ธ๋ฅผ ๊ฐ•์ œ๋กœ ๋– ์•ˆ๋Š”๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐœ๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค.

// ๊ฐœ์„ : ๊ธฐ๋Šฅ๋ณ„๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ถ„๋ฆฌ
public interface Printer { void print(Document doc); }
public interface Scanner { void scan(Document doc); }
public interface Fax     { void fax(Document doc); }

// ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๊ตฌํ˜„
public class OldPrinter implements Printer {
    public void print(Document doc) { /* ์ธ์‡„๋งŒ */ }
}

// ๋ณตํ•ฉ๊ธฐ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๊ตฌํ˜„
public class AllInOne implements Printer, Scanner, Fax {
    public void print(Document doc) { /* ... */ }
    public void scan(Document doc)  { /* ... */ }
    public void fax(Document doc)   { /* ... */ }
}

๊ฐ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•œ ๋Šฅ๋ ฅ๋งŒ ๊ตฌํ˜„ํ•œ๋‹ค. ์•ˆ ์“ฐ๋Š” ๋ฉ”์„œ๋“œ์— ๋ฌถ์ด์ง€ ์•Š๋Š”๋‹ค.


D — ์˜์กด์„ฑ ์—ญ์ „ ์›์น™ (Dependency Inversion)

๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ์ด ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ์— ์˜์กดํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. ๋‘˜ ๋‹ค ์ถ”์ƒ(์ธํ„ฐํŽ˜์ด์Šค)์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค. SOLID์˜ ๋งˆ์ง€๋ง‰ ๊ธ€์ž์ด์ž, ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ์ด๋‹ค.

// ์•ˆํ‹ฐํŒจํ„ด: ๊ณ ์ˆ˜์ค€(์ฃผ๋ฌธ)์ด ์ €์ˆ˜์ค€(๊ตฌ์ฒด ๊ฒฐ์ œ ๊ตฌํ˜„)์— ์ง์ ‘ ์˜์กด
public class OrderService {
    private final KakaoPayClient payClient = new KakaoPayClient();  // ๊ตฌ์ฒด ํด๋ž˜์Šค์— ๋ชป๋ฐ•ํž˜

    public void order() {
        payClient.pay();   // ๊ฒฐ์ œ์‚ฌ ๋ฐ”๊พธ๋ฉด ์ด ์ฝ”๋“œ๋„ ๋ฐ”๋€๋‹ค
    }
}

OrderService๊ฐ€ KakaoPayClient๋ผ๋Š” ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ๋งŒ๋“ ๋‹ค. ๊ฒฐ์ œ์‚ฌ๋ฅผ ๋ฐ”๊พธ๋ ค๋ฉด ์ฃผ๋ฌธ ๋กœ์ง์„ ๊ณ ์ณ์•ผ ํ•œ๋‹ค.
์ถ”์ƒ์— ์˜์กดํ•˜๋„๋ก ๋’ค์ง‘์œผ๋ฉด ์ด๋ ‡๊ฒŒ ๋œ๋‹ค.

// ๊ฐœ์„ : ์ถ”์ƒ(์ธํ„ฐํŽ˜์ด์Šค)์— ์˜์กด
public interface PayClient {
    void pay();
}

@Service
public class OrderService {

    private final PayClient payClient;   // ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กด

    // ๊ตฌํ˜„์ฒด๋Š” ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›๋Š”๋‹ค (์Šคํ”„๋ง DI)
    public OrderService(PayClient payClient) {
        this.payClient = payClient;
    }

    public void order() {
        payClient.pay();   // ์–ด๋–ค ๊ตฌํ˜„์ฒด๋“  ์ƒ๊ด€์—†๋‹ค
    }
}

OrderService๋Š” PayClient๋ผ๋Š” ์ถ”์ƒ์—๋งŒ ์˜์กดํ•˜๊ณ , ์‹ค์ œ ๊ตฌํ˜„์ฒด(KakaoPayClient, TossPayClient)๋Š” ์Šคํ”„๋ง์ด ์ฃผ์ž…ํ•œ๋‹ค.
์Šคํ”„๋ง์˜ ์˜์กด์„ฑ ์ฃผ์ž…(DI)์ด ๋ฐ”๋กœ DIP์˜ ๊ตฌํ˜„์ฒด๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์“ธ ๋•Œ๋งˆ๋‹ค ์‚ฌ์‹ค DIP๋ฅผ ์‹ค์ฒœํ•˜๊ณ  ์žˆ๋Š” ์…ˆ์ด๋‹ค.


๋งˆ์น˜๋ฉฐ

SOLID๋Š” ์‹œํ—˜์— ๋‚˜์˜ค๋Š” ์•”๊ธฐ ๊ณผ๋ชฉ์ด ์•„๋‹ˆ๋ผ, ์ฝ”๋“œ๋ฅผ ๋ณด๋Š” ๋‹ค์„ฏ ๊ฐ€์ง€ ์งˆ๋ฌธ์— ๊ฐ€๊น๋‹ค.

  • ์ด ํด๋ž˜์Šค๋Š” ํ•œ ๊ฐ€์ง€ ์ด์œ ๋กœ๋งŒ ๋ฐ”๋€Œ๋Š”๊ฐ€? (SRP)
  • ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์•ˆ ๊ณ ์น˜๊ณ  ๋˜๋Š”๊ฐ€? (OCP)
  • ์ž์‹์„ ๋ถ€๋ชจ ์ž๋ฆฌ์— ๋„ฃ์–ด๋„ ์•ˆ ๊นจ์ง€๋Š”๊ฐ€? (LSP)
  • ์•ˆ ์“ฐ๋Š” ๋ฉ”์„œ๋“œ์— ๋ฌถ์—ฌ ์žˆ์ง€ ์•Š์€๊ฐ€? (ISP)
  • ๊ตฌ์ฒด ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๋Š”๊ฐ€? (DIP)

๊ทธ๋ฆฌ๊ณ  SOLID๋Š” ๋””์ž์ธ ํŒจํ„ด๊ณผ ํ•œ ๋ชธ์ด๋‹ค. OCP๋ฅผ ์ง€ํ‚ค๋ ค๋‹ค ๋ณด๋ฉด ์ „๋žต ํŒจํ„ด์ด ๋‚˜์˜ค๊ณ , DIP๋ฅผ ์ง€ํ‚ค๋ ค๋‹ค ๋ณด๋ฉด ์˜์กด์„ฑ ์ฃผ์ž…์ด ๋‚˜์˜จ๋‹ค.
ํŒจํ„ด์€ SOLID๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ•์ด๊ณ , SOLID๋Š” ๊ทธ ํŒจํ„ด๋“ค์ด ์™œ ์ข‹์€์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์›๋ฆฌ๋‹ค.

๋ฌผ๋ก  ๋ชจ๋“  ์ฝ”๋“œ์— SOLID๋ฅผ 100% ์ ์šฉํ•  ํ•„์š”๋Š” ์—†๋‹ค. ๊ณผํ•˜๊ฒŒ ์ถ”์ƒํ™”ํ•˜๋ฉด ์˜คํžˆ๋ ค ์ฝ๊ธฐ ์–ด๋ ค์šด ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค.
์ค‘์š”ํ•œ ๊ฑด "์ง€๊ธˆ ์ด ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ์— ์•ฝํ•œ ์ง€์ ์€ ์–ด๋””์ธ๊ฐ€"๋ฅผ ๋ฌป๊ณ , ๊ฑฐ๊ธฐ์—๋งŒ ์›์น™์„ ์ ์šฉํ•˜๋Š” ๊ฐ๊ฐ์ด๋‹ค.


์ฐธ๊ณ  ์ถœ์ฒ˜