본문 바로가기

스프링

좋은 객체 지향 설계란? with spring #1

다들 잘 지내시나요?
저는 요즘 인프런의 Spring을 주제로 주말마다 스터디를 하게되어서
너무나도 바쁘게 지내고 있는데요. 🥲
매일 퇴근하고 공부하는게 어느새 일상이 되어가는 것 같아요. 좋은거겠죠? 🙃
김영한님 스프링 로드맵을 따라가며 왜 스프링을 사용하고 있는지
핵심이 무엇인지 저의 시각으로 정리해서 공유하고자 합니다.
잘부탁드려요.

 

스프링은 왜 만들어졌을까요?

 

스프링이 나오기 이전에 자바진영에서는 EJB(Enterprise Java Bean)를 사용했다고 해요.

EJB는 규모가 큰 애플리케이션을 개발하는데 객체를 관리하는 컨테이너를 만들어서 필요할 때 자바 객체를 재사용할 수 있도록 도와주는 것이 목표였어요. 의도는 좋으나 객체들이 너무 복잡하게 의존되어있거나 무엇보다 객체를 직렬화하는 과정에서 실행속도가 너무나 느렸던 문제가 있었다고 하네요.

 

그래서 2002년 로드존슨님이 EJB 없이도 BeanFactory, ApplicationContext, POJO, 제어의 역전, 의존관계 주입 등의 핵심 개념과 30000라인 이상의 기반 기술이 들어있는 예제코드를 선보이는데, 요것이 바로 expert one-on-one J2EE Design and Development 입니다.
느리고 복잡한걸 싫어하는 개발자들에게 안 쓸이유가 없는거죠.
객체 지향적이며, 간결하게 만들어져서 EJB라는 겨울을 넘어 봄이 왔다. 라고 하여 Spring이라고 부르게 됩니다. 스프링의 역사가 시작되게 된거죠.

 

 

그래서 스프링이 뭔데? 뭐가 좋은건데?

 

스프링은 결국 자바에서 시작됩니다.

자바라는 언어의 특징 중 하나는 객체 지향 언어라는 것 인데요. 산은 산이고 물은 물이고 이것또한 객체니라. 아시죠? 객체 ㅎㅎ
저는 실생활에서 보는 시각으로 코드를 바라보고 만드는 것이라고 생각하는데요.

객체 지향은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 규모가 있는 소프트웨어 개발에서 많이 쓰입니다. 결국 스프링은 자바의 객체 지향의 특징을 잘 살려낼 수 있도록 도와주는 프레임 워크라는 것 입니다.

 

 

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

 

객체 지향의 특징으로는 다들 아시다시피 추상화, 캡슐화, 상속, 다형성 등이 있습니다.

앞서 제가 유연하고 변경이 용이하다고 말씀드렸는데, 이것을 자세하게 풀어보면 하나 하나의 객체를 쉽게 재사용 가능하게 하고 쉽게 갈아 끼울 수 있게 하는 것입니다. 마치 필요에 따라 컴퓨터 부품을 갈아 끼우듯이 말이죠. 그렇다면 어떠한 특징을 잘 살릴 수 있어야 할까요? 

 

 

실세계에서의 역할과 구현

 

아무리 객체 지향적으로 만든다고 하여도 복잡한 실세계와 비교했을때 참 부족합니다.

그래도 가장 실세계를 이해하기 가장 좋은 방법은 역할과 구현으로 세상을 구분하는 것입니다.

밑을 그림을 보시기 바랍니다.

 

다형성의 이해 - 공연무대

로미오와 줄리엣이라는 공연무대에서 줄리엣을 하기 위해서는 무엇이 필요할까요?

꼭 김태희가 필요할까요? 송혜교가 필요할까요? 아닙니다. 단지 어떠한 사람이던 줄리엣이라는 역할만 할 줄 알면 되는 거에요. 새로 오디션으로 줄리엣 연기를 할 줄 아는 신인배우를 뽑거나 갑자기 줄리엣 역할을 하는 배우가 부재했을 때 제가 좋아하는 "박소담"님이 그 역할만 할 줄 안다면 공연무대를 만들 수 있다는 거죠.

 

 

자바에서의 역할과 구현

 

자바에서는 어떻게 역할과 구현을 분리한다 ? 어떤 특징을 사용해서 ?

여기서 다형성이 나옵니다.
역할을 인터페이스로, 구현을 인퍼페이스를 구현한 클래스로 !!!!!!!!!!!!!!! <- 이게 핵심

모든 객체는 협력하는 관계입니다.

다형성의 이해 - Java

예를 들어 볼게요.

자바에서 비즈니스로직을 관리하는 MemberService가 있다고 가정할게요.
MemberService는 Member를 저장하고 싶습니다. 
어디에다 저장할까요? Memory에 저장할까요? JDBC를 이용해서 DB에 저장할까요? MemberService를 클라이언트라고 했을때 어떤 때는 Memory에 어떤 때는 DB에 저장하고 싶을 수 도 있잖아요? 다형성을 이용하면 MemberService는 save()해주는 역할을 하는 MemberRepository만 알면 됩니다.
MemberService는 어디다 저장되는지 구현된 애들이 어떻게 구현되었는지 내부구조를 몰라도 말이죠.


이러면 MeberService 코드는 수정하지 않고,
단지  필요에 따라서 MemberRepository 인터페이스를 구현한 MemoryMemberRepository던 JdbcMemberRepository로 쉽게 갈아 끼울 수 있으면 유연하고 변경이 용이해 지는 거죠.

마치 공연무대를 세우기 위해서 로미오, 줄리엣 역할을 할 줄 아는 배우만 있으면 되듯이요... ㅎㅎ 

 

 

다형성의 본질

 

인터페이스를 구현한 객체는 실행시점에 유연하게 변경할 수 있어, 확장이 가능하도록 설계될 수 있고 객체사이의 협력이라는 관계를 보다 간결하게 구분하여 구현을 유연하게 할 수 있는 것입니다. 결국 객체 지향의 진짜 핵심은 다형성이라는 특징을 잘 활용해서 역할과 구현을 분리하는 것입니다.

 

 

스프링과 객체지향

 

스프링은 자바의 객체 지향의 특징을 잘 살려낼 수 있도록 도와주는 프레임워크라고 위에서 말씀 드렸죠?
풀어서 정리하면 스프링은 역할과 구현을 분리할 수 있도록 자바의 다형성을 극대화해서 사용할 수 있도록 도와준다.
이게 좀 더 명확한 정의라고 말할 수 있습니다.

 

조금 도움이 되셨나요?
저는 워낙 영한님의 강의가 좋아서 신나게 공부하게 되었던 것 같네요. 🙃
다음은 좋은 객체 지향 설계의 5가지 원칙인 SOLID를 소개하고 자바의 다형성만으로는 어떻게 SOLID원칙에 위배가 되는지, 이 문제를 스프링이 어떻게 도와주는지에 대해서 정리 해보려고 합니다. 제가 이해한 것을 바탕으로 정리하여서 쓰고나니 제 생각이 공유가 되었을까? 하는 걱정이 드네요. 🥹
부족한 글 읽어 주셔서 감사합니다. 또한 잘못된 내용 있으면 지적해주시면 감사하겠습니다.

 

Reference

https://ko.wikipedia.org/wiki/%EC%97%94%ED%84%B0%ED%94%84%EB%9D%BC%EC%9D%B4%EC%A6%88_%EC%9E%90%EB%B0%94%EB%B9%88%EC%A6%88 - EJB 위키백과

 

엔터프라이즈 자바빈즈 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 엔터프라이즈 자바빈즈(Enterprise JavaBeans; EJB)는 기업환경의 시스템을 구현하기 위한 서버측 컴포넌트 모델이다. 즉, EJB는 애플리케이션의 업무 로직을 가지고

ko.wikipedia.org

https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D - 객체지향 프로그래밍 위키백과

 

객체 지향 프로그래밍 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목

ko.wikipedia.org

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8 - 스프링 핵심원리 - 기본편 (김영한)

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

 

하얀종이개발자