좋은 객체지향 설계의 5가지 원칙(SOLID)
인프런 강의 中
김영한 강사님의 '스프링 핵심 원리' 내용을 정리했습니다.
정보처리기사를 공부해 봤던 사람들이라면 SOLID를 알 것이다. 필자도 대학교 4학년 때 벼락치기로 공부해서 어렴풋이 기억은 나지만 이 내용이 객체 지향 프로그래밍을 할 때 이렇게 중요한 부분인 줄 몰랐다. 김영한 강사님께서 잘 설명해주신만큼 확실하게 정리하고 가려고 한다.
이전 시간에 우리는 스프링이 왜 탄생하게 되었는지 배웠다. 스프링 이전 EJB를 사용할 당시 객체지향의 이점을 살려서 개발을 진행하지 못했던 부분이 스프링 프레임워크를 탄생시킨 주요 원인 중 하나라고 배웠다. 그렇다면 객체지향의 이점을 살린 코드는 어떤 코드인가?라는 모호한 생각이 들 수 있는데, 좋은 객체지향 설계 원칙을 보면 바로 이해할 수 있다.
좋은 객체지향 설계의 5가지 원칙(SOLID)
-클린 코드로 유명한 로버트 마틴이 좋은 객체지향 설계의 5가지 원칙을 정리했음-
SRP(Single Responsibility Principle) 단일 책임 원칙
- 한 클래스는 하나의 책임만 가져야 한다. 여기서 책임은 상황에 따라 다를 수 있기 때문에 수정을 중요한 기준으로 두면 된다.
ex) UI를 수정할 때 모든 코드를 다 고치게 된다면 그건 SRP를 지키지 못한 코드이다.
OCP(Open/Closed Principle) 개방-폐쇄 원칙
- 소프트웨어 요쇼가 확장에는 열려 있으나 변경에는 닫혀야 한다. 즉, 확장은 가능하되 기존 코드를 변경하면 안된다.(엄밀히 말하면 생성 코드 변경이 안됨)
- 인터페이스와 구현체를 분리(다형성을 활용)
다형성 ex) 자동차라는 인터페이스와 테슬라, 기아라는 구현체를 분리시켜 놓은 느낌. 즉, 역할과 구현을 분리
스프링 없이 개발시 OCP 법칙을 위반할 수 있다?
인터페이스와 구현체를 분리하면 다형성은 지켜지지만 의존성 주입까지 해주지 않았을 경우 기존 코드(생성 코드) 변경을 하지 않을 수 없다. 그래서 OCP를 지키려면 역할과 구현 분리 뿐만 아니라 연관관계를 맺어주는 별도의 조립, 설정자가 필요한데, 이것을 나중에 스프링 컨테이너가 해줄거다.
LSP(Liskov Substitution Principle) 리스코프 치환 법칙
- 다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야 한다.
ex) 자동차 엑셀을 '앞으로 이동' 이라고 규약 했으면 앞으로 이동하도록 만들어야 한다.
=> 뒤로 이동하도록 만들면 LSP 위반.
ISP(Interface Segregation Principle) 인터페이스 분리 법칙
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나 보다 낫다.
- 자동차 인터페이스 -> 운전, 정비 인터페이스로 분리
- 사용자 인터페이스 -> 운전자, 정비사 인터페이스로 분리
- 분리하면, 정비쪽에 수정사항이 생겼을 때 사용자 중 운전자 인터페이스에는 영향을 주지 않을 수 있다.
- 인터페이스가 명확해지고, 대체 가능성이 높아진다.
DIP(Dependency Inversion Principle) 의존관계 역전 법칙
- 의존관계 역전 법칙은 '프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다.'라는 원칙을 따르는 방법 중 하나다. 쉽게 말해서, 클래스에 의존하지 말고, 인터페이스에 의존하라는 뜻이다.
- 영화로 비유하면 영화 감독(프로그래머)가 '로미오'라는 역할(인터페이스)보다 '로미오'를 연기할 배우(구현체)를 더 잘 아는 느낌이다. 좋지 않다는 소리다.
- 클라이언트가 인터페이스에 의존해야 구현체(클래스)를 유연하게 바꿀 수 있다.
- 언제든지 갈아 끼울 수 있게 설계할 수 있도록 코드 설계를 해야 한다는 목적을 가진다. 이것은 역할을 따로 분리 시키는 OCP의 목적과 비슷하며, 실제로 DIP가 지켜지면 OCP도 지켜지는 코드가 된다.
좋은 객체지향 설계 원칙을 알아보며 중간중간 스프링이 필요한 이유에 대해 설명해보았다. 결과적으로는 OCP, DIP를 지키기 위해서 사용하고 이 중심에는 스프링 컨테이너가 있다는 내용이였는데, 사실 순수 자바를 사용해도 위 내용들을 지키며 개발을 진행할 수 있다. 하지만 그 이상의 편리함과 효율성을 스프링 프레임워크가 제공할 것이고 우리는 이것을 순수 자바 코드와 스프링 코드를 비교해보며 직접 스프링의 힘을 느껴볼 것이다.
다음시간부터 강의 순서대로 순수 자바로 개발을 시작해보자.
!!김영한 강사님 강의