Backend/Spring Basic

[Spring Basic] 스프링의 본질, 다형성에 대해

스프링은 객체지향에 특화되어있는 자바를 사용하여 프레임워크를 구축했습니다.

MVC 같은 웹 기술과 DB, 트랜잭션 같은 데이터 접근 기술 등 개발함에 있어서 편리하고 효율적으로 사용할 수 있도록 다양한 프레임워크 기술들을 지원합니다.

 

그러나 이것이 스프링의 핵심 기술들이긴 하나, 본질은 아닙니다.

저희는 스프링이란 프레임워크 기술을 왜 만들었는지 그 핵심 컨셉, 본질을 알고자 합니다.

 

스프링의 본질

클라이언트에게 원하는 데이터를  최대한 빠르게 전달하며, 이해하기 쉬운 UI를 제공하고, DB로부터 접근 비용을 최소화해야합니다. 즉, 클라이언트에게 최소한의 부담과 최대한의 편의성을 제공하는 것이 목적입니다.

 

또한 개발자 입장에서도 기업이 원하는 비즈니스 요구사항이 변경될 수 있음을 대비하여 유연하고 변경이 용이하게 설계해야 합니다.

 

회사 입장에서는 누구에게 개발을 맡기던 좋은 결과물을 기대하므로 이에 충족하는 결과를 가져와야 합니다.

 

객체지향 프로그래밍은 이를 모두 충족시켜 줄 수 있습니다.

스프링은 객체지향 어플리케이션을 개발 할 수 있게 도와주는 즉, 객체 지향 특징을 최대한 살려서 프로그래밍을 할 수 있게 도와줍니다.

 

객체 지향 특징

"객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지 를 주고받고, 데이터를 처리할 수 있다." - 위키백과

객체들간의 협력을 통해 수행됨을 알 수 있습니다.

 

추상화, 캡슐화, 상속, 다형성 등 객체지향 언어를 처음 배울 때 등장하는 이 용어들이 전부 객체 지향 프로그래밍의 특징입니다. 그 중에서 객체 지향 특성 중 스프링에 가장 비중을 많이 차지하는 특징인 다형성에 대해 설명하겠습니다.

 

다형성

먼저 예시를 들어보겠습니다.

 

여기 운전자가 있고, 자동차가 있습니다.

자동차에도 K3, 아반떼, 소나타 등 다양한 모델들이 존재합니다.

평소 K3를 몰고 다니던 운전자는 어떤 기회로 인해 소나타를 타보게 되었습니다. 다른 차종임에도 불구하고 운전자는 평소 타던대로 운전을 잘 했습니다. 왜그럴까요?

어떤 모델이 와도 자동차의 운전법 등이 표준으로 통일되어 있다면 운전자는 모델을 알 필요 없이 운전하는 법 하나만 알면 문제가 없기 때문입니다.

 

클라이언트와 서버와의 관계도 마찬가지입니다.

서버 내에서 다른 DB를 써도 DB에서 가져오는 기술 API가 정의되어 있다면 "마치 K3에서 소나타로 차종이 변경된 것 처럼" 클라이언트는 이를 모르고 있어도 사용할 수 있게 됩니다.

 

여기서 다형성의 장점이 나옵니다.

역할과 구현으로 나누게 되면

클라이언트는 대상의 역할만 알면 되고 어떻게 구현되었는지는 알 필요가 없게 됩니다. 즉, 내부 구조를 몰라도 클라이언트에겐 전혀 영향이 가지 않게 됩니다.

 

자바는 다형성을 interface, class, overriding을 통해 지원해줍니다. 자세한 구현 예시는 다음 시리즈에서 설명드릴 예정입니다.

 

정리하면 이렇습니다.

  • 인터페이스를 구현한 인스턴스는 "실행 시점"에서 유연하게 변경할 수 있습니다.
  • 다형성은 객체 혼자만 있는것이 아닌 객체의 협력이라는 관계 사이에서 출발합니다.
  • 클라이언트를 변경하지 않고 서버의 구현 기능을 유연하게 변경할 수 있습니다.

 

다형성의 단점

역할인 인터페이스 자체가 변경되면 클라이언트나 서버 둘 다 대규모의 변경이 있어야 합니다.

위의 예시에서 K3에서 소나타가 아닌 자동차 자체를 비행으로 바꾸어야 한다면 어떨까요.. 매우 복잡해질 것입니다.

 

스프링의 다형성

스프링은 다형성을 활용한 기술인 IoC(제어의 역전), DI(의존관계 주입)을 통해 역할과 구현을 편리하게 다룰 수 있도록 지원합니다.