Spring 핵심 원리1
Spring을 왜 쓰는가?
항상 개발공부를 하다보면 Spring은 이해하기 어렵다는 글들이 많이 보였다.
자바 백엔드 개발자로 깊이있게 성장하기 위해서는 스프링의 핵심원리와 깊이있는 이해가 필요할 것이라고 막연하게 생각만 했었는데, 이번 기회에 깊이있게 학습하고 기록을 남기고자 한다.
정말 순수한 자바코드로만 웹 어플리케이션을 만든다고 가정을 해보자.
핵심은 스프링은 정말 객체지향 코드를 지향 한다.
결국 객체지향언어로 알려진 자바로만 웹어플리케이션을 개발하는데는 한계가 있다는 것을 의미한다. 왜 한계가 있을까? 어떤 한계가 있을까? 일단 객체지향적으로 설계하는데는 다음과 같은 조건을 만족해야한다.
객체지향 설계원칙 (SOLID)
- 단일 책임 원칙(Single Responsible Principle)
- 개방-폐쇄 원칙(Open Closed Principle)
- 리스코프 치환 원칙(Liskov Substitution Principle)
- 인터페이스 분리 원칙(Interface Segregation Principle)
- 의존 역전 원칙(Dependency Inversion Principle)
1. 단일 책임의 원칙
한 개의 클래스는 단 하나의 책임만 가져야한다.
- 이 말이 무슨뜻인가?
한 클래스 내부에서 동작하는 메소드나, 필드 등과 같은 것들은 모두 단 하나의 책임 또는 단 하나의 역할을 수행하기 위해서만 존재해야한다는 것이다. 불필요하게 이 클래스 내부에서 엉뚱한 다른 의미의 메소드나 필드는 지양해야한다.
2. 개방-폐쇄의 원칙
이상하게 들릴 수도 있지만 확장에는 열려있고 수정에는 닫혀있는 설계가 되어야 함을 의미한다. 아니 어떻게 확장에는 열려있고 수정에는 닫혀있을까, 확장이 되려면 수정이 필요한 것이 아닐까? 라는 의문을 가질 수 있다.
예를 들어보면, 우리가 운전면허가 있고 자동차를 운전할 수 있을 때, 자동차의 내부구조와 내연기관을 모조리 다 안 상태에서만 운전이 가능할까?
아니다. 우리는 엑셀과 브레이크, 핸들 조작법을 알면 운전을 할 수 있다. 또 우리는 운전면허, 즉 운전하는 방법만 알면 K7, 모닝, 아반떼 등 어떠한 자동차든 운전을 할 수가 있다. 어떠한 자동차든 운전을 할 수 있다는 것이 확장에는 열려있게 되는 것이고, 새로운 자동차로 바뀌게 될 때 새로운 운전 연습을 하거나 자동차 내부의 어떤 수정없이도 운전 가능하다는 것이 수정에는 닫혀있게 되는 것이다.
3. 리스코프 치환원칙
하위 타입은 상위 타입을 대체할 수 있어야 한다.
부모는 마음이 넓기 때문에 자식을 수용할 수 있다…
클라이언트 코드에서 사용하는 객체가 상위(부모)타입에서 하위(자식)타입으로 바뀌어도 차이점을 인식하지 못한채 정상적으로 실행 되어야한다.
4. 인터페이스 분리 원칙
역할이 각각 다른 클라이언트가 있다면 인터페이스를 통해서 적절하게 분리해야 한다는 원칙이다. 탈것(Vehicle)이라는 구현클래스가 있는데 어떤 클라이언트는 자동차(Car)라는 역할 만을 필요로 한다면 별도의 자동차 인터페이스를 만들어서 제공해주어야 한다.
5. 의존 역전 원칙
결국 각 클래스는 구체화가 아닌 추상화에 의존해야한다는 의미다. 구체화에 의존하게 된다면 코드가 더 복잡해질뿐더러 1원칙이었던 단일 책임의 원칙을 만족하지 못할 가능성이 크다.
다음에 계속…
Leave a comment