본문 바로가기

Spring(Web)

Spring 핵심 원리 1 - 객체지향 기본 개념

앞쪽 부분은 기본적인 프로젝트 세팅이나 인터페이스 / 간단한 구현체 생성 정도였기 때문에 기록을 생략한다.

하면서 중요하다고 생각이 든 부분들

SOLID 객체지향 5대 원칙

그냥 매번 달달 외우는식으로 공부를 했었는데, 초반에 자세하게 설명해주셔서 개발시 실제로 적용되는 부분들에 대해 생각을 할 수 있었다.

Single Responsibility Principle
단일 책임 원칙
하나의 클래스는 하나의 책임만을 가져야한다.


Open - Closed Principle
개방 - 폐쇄 원칙
확장에 열려있어야하고, 변경에 닫혀있어야한다.


이 원칙과 아래에 나올 DIP 원칙이 가장 중요하다고 생각이 든다.
인터페이스 구현 -> 구현체 적용 과 같은 방식으로 개발을하게 되는데, 인터페이스를 잘 구현해 두면 따로 인터페이스 수정 없이 구현체를 바꾸는것으로 다양하게 개발을 할 수 있게 된다. 해당 원칙이 지켜지지 않으면 인터페이스를 계속해서 변경해야하므로 클라이언트 코드를 자주 수정하는일이 벌어진다.

Liskov Substituion Principle
리스코프 치환 원칙


상위 객체를 하위 타입의 객체로 바꾸어도, 프로그램의 실행에는 문제가 없어야한다.

당연한 소리인것 같다. 결국 하위 타입의 객체를 상위 객체를 상속해 만든 클래스의 객체이기 때문에, 추가적인 메소드가 있을 뿐 상위 클래스의 메소드들도 정상적으로 작동해야하기 때문.

Interface Segregation Principle
인터페이스 분리 원칙


하나의 범용 인터페이스보다, 특정 클라이언트를 위한 여러개의 인터페이스가 더 낫다.

쉽게 말해서, 하나의 인터페이스가 여러 타입의 기능들을 모두 갖고있어서는 안 된다.
강의에서 좋은 예를 들어주셔서 이해가 쉬웠다.

자동차에대한 인터페이스들을 만든다고 생각해보면, 운전 인터페이스 + 정비 인터페이스와 같이 각각의 역할에따라 인터페이스들을 나누는것이 자동차 인터페이스 하나로 사용하는것보다 더 좋다.

이렇게 인터페이스들을 따로 나누어 놓게 되면, 사용자를 정비사/운전자와 같이 역할을 분리해서 저장 할 수 있고 이후에 기능이 늘어 코드를 수정해야하는 경우가 생기면, 해당 부분들만 건드리면 되기 때문에 운용도 더 편해진다.
++ 인터페이스의 역할이 명확해지고, 대체 가능성이 높아진다..

Dependency Inversion Principle
의존관계 역전 원칙


프로그래머는 추상화에 의존해야하고, 구체화에 의존하면 안 된다.

구현체는 언제든지 바뀔 수 있으므로, 해당 구현체를 보고 개발을하면 안 된다. 같은 기능을 하는 구현체들을 보고 개발을 하는것이 아닌, 인터페이스를 기준으로 개발을 진행해야 후에 다른 구현체로 바뀌었을 때에도 정상적으로 동작 할 것이다.

다형성만으로는 개방 - 폐쇄 원칙과 의존관계 역전 원칙을 지킬 수 없다.

인터페이스를 만들어두고 구현체를 선택하는방식으로 다형성을 지켜도, 결국 해당 인터페이스를 구현체와 함께 가져다 쓰는 부분에서 코드로 구현체를 지정하기 때문에 해당 원칙들을 지킬 수 없다. 동적으로 컨테이너에서 구현체를 선택하는 방식으로 구현해야 한다.