[Java] Spring과 SOLID - 1편
웹/백엔드, Spring

[Java] Spring과 SOLID - 1편

이번에는 스프링과 SOLID에 대해서 알아봅시다.

 

목차

  • 스프링이란?
  • 객체지향이란?
  • SOLID란?

서론

저는 엔테크서비스 인턴 면접중 이런 질문을 받았습니다. "스프링에 대해서 설명해주세요."

스프링에 대해서 잘 안다고 할 순 없지만 그래도 관련 플젝 경험이 몇 번 있기 때문에, 자신있게 대답했죠.

 

"웹 서버를 만들기 쉽게 하기위한 라이브러리들의 집합이며, DB 연결도 편리하게 해주는 역할을 합니다. 또한 유지보수 측면에서 효과적이고, 기본적인 구조는 동일하기 때문에 개발자들 끼리 의견공유가 쉬워집니다..."

 

틀린 말은 아닙니다. 그 당시엔 정답이라고 생각했지만, 지금 생각해보면 면접관이 원하는 답은 아니라고 생각합니다.

결정적으로 면접관 얼굴표정도 그닥 만족스럽지 않았구요.

그래서 이번 기회에 다시 한번 개념을 정리하려고 합니다.

 

본론

스프링이란?

객체 지향 언어의 특징을 살린 프레임워크

 

그렇다면 객체지향 언어의 특징은 무엇일까요.

  • 추상화
  • 캡슐화
  • 상속
  • 다형성

객체지향 프로그래밍이란? 

유연하고 변경이 용이하게 만들기 위한 특성

감이 잘 안오기 때문에, 그림과 같이 설명하겠습니다.

위 그림 처럼 면허만 있다면 모든 차를 운전이 가능합니다. K3 면허, 아반떼 면허등 차종에 따라 면허를 따로 따는게 아니죠. 

 

위의 4가지 특징 중 스프링에서 가장 중요한 특성은 다형성입니다.

또한 그림에서 말하는 것도 다형성의 예시입니다. 

  • 클라이언트(운전자)는 대상의 역할(인터페이스)만 알면 됩니다.
  • 클라이언트는 내부구조(K3,테슬라의 엔진구조)등을 몰라도 됩니다
  • 클라이언트는 대상자체를(차) 바꿔도 영향 받지 않습니다

위의 구조가 가능한 이유가 역할(운전자,자동차)구현(k3,테슬라,아반뗴)을 명확히 분리했기 때문.

 

 

객체지향 5가지 원칙

  • SRP 단일 책임 원칙(Single responsibility principle)
  • OCP 개발-폐쇄 원칙(Open/closed principle)
  • LSP 리스코프 치환 원칙(Liskov substitution principle)
  • ISP 인터페이스 분리 원칙(Interface segregation principle)
  • DIP 의존관계 역전 원칙(Dependency inversion principle)

 

SRP

한 클래스는 하나의 책임을 가진다

예시) 남자의 역할이 많기 때문에, 분리할 필요가 있습니다.

오른쪽 처럼 변경하면 하나의 책임만을 가지게 됩니다.

하나의 클래스 안에 기능을 여러개의 클래스로 나눈다고 생각하면 편합니다.

LSP

다형성에서 하위클래스는 상위클래스로 대체될 수 있어야합니다.

예시) 자동차 인터페이스의 엑셀기능이 있습니다. 하위 클래스에서 엑셀을 "뒤로가기"로 구현하면 LSP위반 입니다.

 

ISP

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

예시) 

자동차 인터페이스 -> 운전, 정비 분리

사용자 클라이언트 -> 운전자, 정비사 분리

정비 인터페이스 자체가 변해도 운전자 클라이언트에 영향을 주지 않습니다.

 

 

OCP,DIP는 중요하기 때문에 다음글에 자세히 설명하겠습니다.

계속...

 


출처

김영한. 스프링 핵심 원리-기본편

리셋 되지 말자: https://not-to-be-reset.tistory.com/167