백앤드/SpringBoot + Java 좋은 객체 지향 설계

[SpringBoot + Java] 좋은 객체 지향 설계(SOLID)

맏리믓 2023. 7. 28. 17:29

들어가며

- 인프런 김영한 님의 "좋은 객체 지향 설계과 스프링" 강의 정리 내용입니다.

- 좋은 프로젝트 설계란 프로그램을 유연하고 변경에 용이하게 만들었을 때를 말한다.

 . 이렇게 개발 하게 되면 말 그대로 유지 보수에 효과적이며 보다 체계적으로 만들 수 있다.


객체지향과 다형성

- 객체 지향의 특징으로는 "추상화, 캡슐화, 상속성" 등이 있지만 좋은 설계에 가장 중요한 요소는 "다형성" 이다.

 

- 다형성

 . 다형성이란 하나의 객체가 여러가지 타입을 가질 수 있는 것을 의미 하며 여기서는 기능을 역할과 구현으로 구분 한다고 보았다.

 . 예를 들어 운전을 하기 위해서 "운전자 역할" 과 "자동차 역할" 을 구분 하고 이 자동차를 또 자동차 구현으로 구분 짓는다.

 . 이렇게 하게되면 미래에 자동자가 바뀌게 되어도(아반떼 구현 -> 테슬라 구현) 자동차의 역할(엑셀을 누르면 앞으로 간다)만 정확히 해 준다면 운전자 역할의 사람은 자동차를 운전 할 수 있게 된다.

 

- 역할과 구현을 분리 

 . 즉 이렇게 되면 클라이언트(운전자 역할) 은 자동차의 역할만 알고 있으면 되며 자동차의 내부 구조를 몰라도 상관이 없다.

 . 또한 내부 구조에 상관이 없으니 내부 구조를 변경하여도 영향을 받지 않는다.


 

SOLID

- 로버트 마틴이 정리한 좋은 객체 지향 설계의 5가지 원칙이다.

 . SRP : 단일 책임 원칙(Single Responsibility Principle)

  - 하나의 클래스는 하나의 책임만(하나의 기능만) 가진다.

  - 이때 하나의 책임 이라는 것은 그 책임이 변경 될 때 파급 효과를 최소화 되게 나누어야 한다.

 

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

  - software 는 확장에는 열려 있지만 변경에는 닫혀 있어야 한다.

  - 즉 어떠한 기능을 추가 한다고 가정 할 때 기존 코드는 최대한 변경 하지 않아야 한다.

  - 이 때 객체를 생성 하고 연결 지어주는 조립 도구가 있으면 편리하다.

 

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

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

  - 즉 단순히 컴파일을 성공 하는데 그치는 것이 아니라 자동차 엑셀은 밟으면 앞으로 간다 처럼 인터 페이스의 하위 class 는 상속 받는 인터페이스의 규약을 모두 지켜야 한다.

 

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

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

  - 이렇게 분리 하게 되면 운전 프로그램 에서 운전자의 인터페이스가 변해도 자동차 쪽에는 영향을 주지 않는다.

  - 즉 인터페이스가 명확해 지고 대체 가능성이 높아 진다.

 

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

  - 구현 class 에 의존 하지 말고 interface 에 의존 해야 한다.

  - 구현 클래스를 바로 의존 하지 말고 interface 를 통해 의존 해야 한다.