ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] 스프링과 객체 지향 설계
    Backend Dev/Spring Framework 2022. 3. 3. 05:24
    728x90

    Spring이란?

     

     

    스프링을 나타내는 의미는 문맥에 따라 다양한데 스프링 DI 컨테이너 기술, 스프링 프레임워크, 스프링 생태계 자체를 의미하기도 한다. 스프링의 주 기술은 스프링 DI 컨테이너, AOP, 이벤트와 같은 것들이 있다.

     

    핵심적인 건 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크라는 것이다. 객체 지향 언어인 자바 언어 기반의 프레임워크로써, 객체 지향 언어가 가진 강력한 특징을 살려낸다.

    그렇다면 스프링 부트라는 것도 자바로 백엔드 개발 공부를 하다보면 들어봤을 법한 단어인데, 이는 스프링을 편리하게 사용할 수 있도록 지원해주며 스프링 프레임워크 사용 시 때에 따라 필요한 라이브러리들을 불러올 수 있게 해준다.

     

    스프링 부트의 대표적인 특징은 다음과 같다. 


    - 단독으로 실행 가능한 스프링 앱을 쉽게 생성
    - Tomcat과 같은 웹 서버를 내장하므로 별도의 웹 서버 설치가 필요 X
    - 손쉬운 빌드 구성을 위한 starter 종속성 제공 및 스프링과 외부 라이브러리 자동 구성
    - 상태 확인, 외부 구성같은 프로덕션 준비 기능 제공

    - 프로젝트 설정의 간결함

     

    결국 스프링 프레임워크를 사용하는 목적이 좋은 객체 지향 앱을 개발하기 위한 것인데, 먼저 객체 지향 프로그래밍이 정확히 어떤 것이고 이를 실세계와 비유했을 때 어떠한 방식으로 적용될 수 있을지 살펴보겠다.

     


    객체 지향 프로그래밍 

     

     

    프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위. 즉, "객체"들의 모임으로 파악하고자 하는 것이며 각각의 객체는 메시지를 주고받고, 데이터를 처리하는 걸 의미한다. 또한, 유연하고 변경이 용이하게 만들기때문에 대규모 소프트웨어 개발에 많이 사용된다.

    유연하고, 변경이 용이하다는 건 완전히 설명하기에 부족한 부분이 있지만 간단하게 말하면 컴퓨터 부품을 조립하고 갈아 끼우는 것처럼 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법을 의미한다.

    객체 지향 특징에는 대표적으로 추상화, 캡슐화, 상속 등이 있겠지만 주로 언급되는 부분은 다형성이다. 다형성은 하나의 객체가 여러가지 타입을 가질 수 있는 것으로써 특정 타입의 기능을 실행할 때 오버라이딩 된 메서드가 실행되며, 다형성으로 인터페이스를 구현한 클래스를 실행 시점에 유연하게 변경할 수 있다. 

     

     

     

     

    이를 역할(인터페이스)과 구현(인터페이스 구현체)으로 세상을 구분지어 실세계에 비유를 할 수 있다. 예컨대, 운전자와 자동차의 관계, 사용자와 키보드/마우스와 같은 표준 인터페이스를 말한다. 


    인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있고, 다형성은 협력이라는 객체사이의 관계에서 시작된다. 즉, 클라이언트를 변경하지 않고 서버의 구현 기능을 유연하게 변경할 수 있다는 의미이다.

     

     

    아래의 그림과 같이 클라이언트를 운전자라 하고 서버를 자동차라 하였을 때 구현체가 변경되어도 자동차라는 건 똑같기때문에 운전자는 영향을 받지않으면서 똑같이 자동차의 기능을 새롭게 제공받을 수 있는 것이다. 이처럼 클라이언트-서버의 다형성을 다양하게 실세계에도 적용될 수 있다.

     

     

     


    역할과 구현이 구분되는 것을 다형성과 연관지어 위 예시를 통해 파악할 수 있었는데 정리하자면 다음과 같다.

     


    - 클라이언트는 대상의 역할(인터페이스)만 알면되고, 내부 구조는 알 필요가 없다.
    - 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않고 새로운 기능을 제공받을 수 있다.
    - 확장 가능한 설계가 가능하고, 클라이언트에 영향을 주지 않게 변경이 가능하다. 

     


    하지만, 인터페이스를 안정적으로 잘 설계하는 것이 가장 중요하다. 인터페이스 자체가 변하면 클라이언트, 서버 모두에 큰 변경이 발생하기 때문이다.


    실제 개발 시에도 위와 같이 객체를 설계할 때 역할과 구현을 명확히 분리시키는데, 이때 역할을 먼저 부여하고 그 역할을 수행하는 구현 객체를 만드는 편이다. 수 많은 객체 클라이언트와 객체 서버는 서로 협력 관계를 가지며, 독립적인 객체는 없다.

     

    다음 그림은 클라이언트-서버 협력 관계를 도식화한 것이다. 클라이언트가 서버가 되어 또 다른 서버와 협력하여 모든 객체가 독립적이지 않다는 것을 확인할 수 있다.

     

     

     

    그렇다면 좋은 객체 지향 설계 원칙, 순수 자바 코드로 개발을 했을 때 원칙에 어긋나는 문제점과 스프링 프레임워크가 적용됨으로써 이를 어떻게 해결하는지 다음 포스팅에서 알아보겠다.

     

     

    본 내용은 인프런-스프링 핵심원리 기본편 김영한님의 강의를 참고하였습니다.
    728x90

    댓글

Designed by Tistory.