SPRING

Spring SOLID원칙

도원좀비 2025. 3. 25. 19:03

✅ SOLID 원칙이란?

SOLID 원칙은 유지보수성, 확장성, 유연성을 갖춘 소프트웨어를 만들기 위한 5가지 설계 원칙

원칙이름설명

원칙 이름 설명
SRP 단일 책임 원칙 하나의 클래스는 하나의 책임만 가져야 한다
OCP 개방-폐쇄 원칙 확장에는 열려 있고, 변경에는 닫혀 있어야 한다
LSP 리스코프 치환 원칙 부모 타입은 자식 타입으로 대체 가능해야 한다
ISP 인터페이스 분리 원칙 하나의 범용 인터페이스보단, 여러 개의 작은 인터페이스가 낫다
DIP 의존관계 역전 원칙 구체적인 구현보다 추상화에 의존해야 한다

1️⃣ SRP - 단일 책임 원칙

하나의 클래스는 오직 하나의 책임만 가져야 한다.

더보기

🚫 위반 예시

public class User {
    public void login() { /* 로그인 */ }
    public void saveUser() { /* DB 저장 */ }
}

 

 적용 예시

public class User { /* 사용자 정보 */ }

public class AuthService {
    public void login(User user) { ... }
}

public class UserRepository {
    public void saveUser(User user) { ... }
}

2️⃣ OCP - 개방/폐쇄 원칙

소프트웨어 요소는 확장에 열려 있고, 변경에는 닫혀 있어야 한다

더보기

🚫 위반 예시

public double calculate(Shape shape) {
    if (shape.type.equals("circle")) ...
}

 

 적용 예시

public interface Shape {
    double calculateArea();
}

public class Circle implements Shape {
    public double calculateArea() { ... }
}

3️⃣  LSP - 리스코프 치환 원칙

더보기

🚫 위반 예시

class ElectricCar extends Car {
    @Override
    public void accelerate() {
        throw new UnsupportedOperationException();
    }
}

 

 적용 예시

interface Acceleratable { void accelerate(); }

class Car implements Acceleratable { ... }
class ElectricCar implements Acceleratable { ... }

 

4️⃣ ISP - 인터페이스 분리 원칙

불필요한 메서드에 의존하지 않도록, 인터페이스를 작게 분리해야 한다.

더보기

🚫 위반 예시

interface Animal {
    void fly(); void run(); void swim();
}

 

 적용 예시

interface Runnable { void run(); }
interface Swimmable { void swim(); }

class Dog implements Runnable, Swimmable { ... }

5. DIP - 의존관계 역전 원칙

더보기

🚫 위반 예시

class NotificationService {
    private EmailNotifier emailNotifier = new EmailNotifier();
}

 

 적용 예시

interface Notifier { void send(String msg); }

class EmailNotifier implements Notifier { ... }
class SMSNotifier implements Notifier { ... }

class NotificationService {
    private final Notifier notifier;
    public NotificationService(Notifier notifier) {
        this.notifier = notifier;
    }
}

🍃  SOLID만으로 부족하다? → Spring의 역할

다형성으로는 OCP, DIP를 완벽하게 구현하기 어렵다.

이때 등장한 것이 바로 Spring Framework