(Spring) 객체 지향 설계와 스프링

유인근·2021년 4월 11일
0

글 소개

김영한님의 스프링 핵심 원리 - 기본편 강의 내용을 정리!

스프링의 핵심 가치

스프링의 핵심 가치는 객체 지향에 있다.

이야기 - 자바 진영의 추운 겨울과 스프링의 탄생

  • 옛날 옛적에... 자바 진영의 표준 기술인 EJB(Enterprise Java Beans) 등장
  • EJB는 한 마디로 자바 종합 선물 세트
  • 하지만 EJB 지옥이 열림
  • 이론 자체는 좋지만, 가격이 비싸고 사용하기 어렵고 느림
  • EJB에 의존적으로 개발하게 됨
  • 순수했던 과거인 POJO로 돌아가자!

POJO(Plain Old Java Object): 오래된 방식의 간단한 자바 오브젝트, 프레임워크에 종속된 무거운 객체를 만들게 된 것에 반발해서 사용하게 된 용어

  • 로드 존슨 - 스프링을 만듦
  • 개빈 킹 - 하이버네이트 만듦
  • 이 2가지가 메인 기술로 자리 잡음

스프링 역사

  • 로드 존슨이 EJB 없이도 좋은 애플리케이션을 개발할 수 있음을 보여줌
  • 유겐 휠러, 얀 카로프가 로드 존슨에게 오픈소스 프로젝트를 제안
  • 스프링의 핵심 코드의 상당수는 유겐 휠러가 지금도 개발
  • 스프링은 EJB라는 겨울을 넘어 새로운 봄이 온다라는 뜻으로 지음

스프링 부트

  • 스프링에서 자주 사용되는 조합을 미리 만들어 놔서, 쉽고 간편하게 프로젝트를 구성
  • 각종 starter dependency로 손쉬운 빌드 구성
  • 내장 Tomcat 제공으로 별도로 웹 서버를 설치하지 않아도 됨

스프링 왜 만들었을까?

  • 핵심 컨셉을 이해하는 것이 중요 🌟🌟🌟
  • 자바는 객체 지향 언어
  • 스프링은 객체 지향 언어가 가진 강력한 특징을 살려내는 프레임워크
  • 즉, 스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크

다형성의 본질

인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경 가능

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

  • 객체 지향의 핵심은 다형성
  • ex) 운전자 - 자동차
    • 운전자는 자동차의 종류 바뀌어도 운전하는 데 문제가 없음
  • ex) 공연 무대 - 로미오와 줄리엣
    • 로미오 역할의 배우는 줄리엣 역할의 배우가 바뀌어도 문제가 없음
  • 즉, 클라이언트는 인터페이스만 알면 됨
  • 클라이언트는 구현 대상의 내부 구조를 몰라도 됨
  • 역할(인터페이스)과 구현(구현 클래스)을 명확히 분리하면 유연해지며 변경도 편리해짐

스프링과 객체 지향

  • 스프링에서 다형성이 가장 중요!
  • 스프링의 의존성 주입(DI), 제어권 역전(IoC)은 다형성을 활용해 역할과 구현을 편리하게 분리하도록 도와줌
  • 즉, 스프링을 사용하면 마치 레고를 조립하듯 구현을 편리하게 변경할 수 있음

좋은 객체 지향 설계의 5가지 원칙(SOLID)

SRP(단일 책임 원칙)

  • 하나의 클래스는 하나의 책임만 가짐
  • 하지만 하나의 책임이라는 것이 실세계에서는 모호함
  • 중요한 기준은 변경 - 변경이 있을 때 파급 효과가 적으면 SRP를 잘 따른 것

OCP(개방 폐쇄 원칙) 🌟

  • 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 함
  • 확장을 하려면 변경을 하게 될텐데?
  • 다형성을 사용해도 OCP를 지킬 수 없음

LSP(리스코프 치환 원칙)

  • 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 교체 가능해야 함
  • ex) 자동자 인터페이스
    • 엑셀을 밟으면 앞으로 가는 것이 원칙이라고 하면, 뒤로 가는 구현 클래스를 만드는 것은 LSP 위배

ISP(인터페이스 분리 원칙)

  • 인터페이스 여러 개가 범용 인터페이스 하나보다 좋음
  • 인터페이스가 명확해지고 대체 가능성이 높아짐

DIP(의존관계 역전 원칙) 🌟

  • 구체화가 아닌 추상화에 의존해야 함
  • 즉, 역할에 의존해야 함

=> 다형성만으로는 OCP, DIP를 지킬 수 없다

객체 지향 설계와 스프링

  • 스프링의 핵심 가치는 객체 지향
  • 스프링은 DI, DI 컨테이너 제공으로 다형성과 OCP, DIP를 가능하게 함
  • 즉, 쉽게 부품을 교체하듯이 개발 가능하게 함
profile
끊임없이 성장하는 개발자 🔥

0개의 댓글