yeon's blog

[Spring] 스프링 컨테이너 본문

Spring/Spring 개념

[Spring] 스프링 컨테이너

yeonii 2023. 11. 30. 21:18

 SRP: 단일 책임 원칙(single responsibility principle)

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


💡 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것!

 

OCP: 개방-폐쇄 원칙 (Open/closed principle)

확장에는 열려있으나 변경에는 닫혀 있어야 한다는 원칙.


소스코드 변경은 없고 다형성을 이용하여 객체 생성 코드만 늘어나게 한다.
💡 객체를 생성하고, 연관관계를 맺어주는 별도의 조립, 설정자가 필요하다 → Config

 

LSP: 리스코프 치환 원칙 (Liskov substitution principle)

프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다는 원칙

 

💡 LSP를 이해하기 위해서는 예시를 기억하는 것이 편함

Animal 클래스를 상속하는 Eagle 자식 클래스가 부모 클래스의 `go()` 메소드 타입을 바꾸고 매개변수의 갯수도 바꾸었다.

부모 클래스의 행동 규약을 어겼으므로 LSP에 위반되는 것이다.

class Animal {
    int speed = 100;

    int go(int distance) {
        return speed * distance;
    }
}

class Eagle extends Animal {
    String go(int distance, boolean flying) {
        if (flying)
            return distance + "만큼 날아서 갔습니다.";
        else
            return distance + "만큼 걸어서 갔습니다.";
    }
}

public class Main {
    public static void main(String[] args) {
        Animal eagle = new Eagle();
        eagle.go(10, true);
    }
}

 

ISP: 인터페이스 분리 원칙 (Interface segregation principle)

클라이언트는 자신이 사용하지 않는 메소드에 의존관계를 맺으면 안된다는 원칙

  • 자동차 인터페이스 => 운전 인터페이스, 정비 인터페이스로 분리
  • 사용자 클라이언트 => 운전자 클라이언트, 정비사 클라이언트로 분리

위와 같이 분리하면 정비 인터페이스 자체가 변해도 운전자 클라이언트에 영향을 주지 않는다.

따라서 인터페이스가 명확해지고, 대체 가능성이 높아진다.

 

DIP: 의존관계 역전 원칙 (Dependency inversion principle)

추상화에 의존해야지, 구체화에 의존하면 안된다는 원칙 (=> 인터페이스에 의존하라는 뜻)

 

💡 구현체에 의존하게 되면 변경이 아주 어려워진다.
ex) MemberRepository m = new MemoryMemberRepository(); ⇒ DIP 위반

     : 빨간 강조가 구현 클래스에 의존 하고 있는 부분)

 

 


References

https://inpa.tistory.com/entry/OOP-%F0%9F%92%A0-%EC%95%84%EC%A3%BC-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-LSP-%EB%A6%AC%EC%8A%A4%EC%BD%94%ED%94%84-%EC%B9%98%ED%99%98-%EC%9B%90%EC%B9%99

 

'Spring > Spring 개념' 카테고리의 다른 글

[Spring] Spring Security 처리 과정  (0) 2023.12.12
[Spring] Spring Security 개념  (0) 2023.12.12
[Spring] 프로그램 구조 설계  (0) 2023.12.12
[Spring] Annotation?  (0) 2023.11.30
[Spring] Spring? Spring Boot?  (2) 2023.11.30