"인프런의 스프링 핵심원리 - 기본편 강의를 듣고 작성한 글 입니다."
스프링과 스프링 부트
스프링은 어떤 특정한 하나의 기술을 지칭하는 것이 아니라, 여러가지 기술들이 포함되어 있다.
스프링 프레임워크, 스프링 부트, 스프링 데이터, 스프링 세션, 스프링 시큐리티, 스프링 클라우드 등등 관련된 많은 기술들을 한데 묶어 하나의 스프링이라고 본다.
스프링 부트는 스프링을 편리하게 사용할 수 있도록 지원하는 기술이다.
단독으로 실행할 수 있는 스프링 애플리케이션을 쉽게 생성할 수 있고, 내장 톰캣 서버가 있으므로 별도의 웹 서버를 설치하지 않아도 된다.
손쉬운 빌드 구성을 위해 starter 종속성을 제공하며, 스프링과 3rd parth(외부) 라이브러리를 자동으로 구성해준다.
그리고 설정을 잡아주는 것부터 어려운 스프링과 달리 스프링 부트는 좀 더 간결하게 설정해 줄 수 있다.
(데이터베이스 연결, 외부 라이브러리 의존성 주입 등등)
즉, 스프링 부트는 스프링 프레임워크에서 제공하는 여러가지 기능들을 중간에서 편리하게 사용할 수 있게끔 해주는 기술이다.
스프링 이라는 단어는 문맥에 따라 다르게 사용된다.
- 스프링 DI 컨테이너 기술
- 스프링 프레임워크
- 스프링 부트, 스프링 프레임워크 등을 모두 포함한 생태계(최근 추세)
스프링은 왜 만들어 졌을까?
스프링의 핵심 개념, 또는 컨셉에 대해서 얘기해보자.
- 스프링은 자바 언어 기반의 프레임워크 이다.
: 자바 언어의 가장 큰 특징은 객체 지향 언어라는 것인데, 스프링은 객체 지향 언어가 가진 강력한 특징을 살려내는 프레임워크 이다.
즉, 스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크인 것이다.
결국, 스프링 DI 컨테이너 등 스프링 프레임워크가 제공해주는 기능들은 좋은 객체지향 어플리케이션을 개발하기 위한 도구가 되는 것이다.
그렇다면 좋은 객체지향 프로그래밍은 뭘까?
- 객체지향의 특징으로 추상화, 캡슐화, 상속, 다형성 등이 있다.
- 객체지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러개의 독립된 단위, 즉 "객체" 들의 모임으로 파악하고자 하는 것이다.
- 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.(협력)
- 객체지향 프로그래밍은 프로그램을 유연하게 하고, 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다.
여기서 유연하고, 변경이 용이하다는 말은 어떻게 받아들여야 할까?
- 마치 레고 블럭을 조립하듯이 컴포넌트를 쉽고 유연하게 변경하면서 개발할수 있는 방법, 스프링 입문 강의에서 사용되는 데이터베이스가 변경됨에 따라 스프링 컨테이너에 등록될 Repository 객체를 쉽고 빠르게 변경했던 부분을 생각하면 좋을 듯 하다.
- 이게 바로 객체지향의 핵심적인 개념 중 하나인 다형성에 해당한다.
* 다형성이라는 특징의 핵심은 객체를 역할과 구현으로서 구분하여 설계하는 것으로 드러난다.
- 클라이언트는 대상의 역할(인터페이스) 만 알면 된다.
- 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
- 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.
- 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.
자동차와 운전자를 예로 들어 보았을 때, 운전자를 클라이언트, 자동차의 기능을 역할 이라고 하자.
자동차의 기능은 다음과 같이 역할이 부여되어 있다.
- 핸들을 돌리면 방향 전환이 가능하다.
- 엑셀을 밟으면 속도가 빨라진다.
- 브레이크를 밟으면 속도가 느려진다.
운전자는 위와 같은 자동차의 기능, 즉 자동차의 '역할' 을 알고 제대로 활용할 줄 알면, 자동차의 구현체가 아반떼이든, 벤츠이든, 볼보이든 상관없이 자동차를 정상적으로 운행할 수 있다.
즉, 역할(자동차의 기능) 과 구현(자동차의 종류) 으로 구분하여 프로그램을 설계할 경우, 구현체가 달라지더라도(자동차의 종류) 클라이언트는 영향을 받지 않고 어플리케이션을 정상적으로 이용할수 있는 것이다.
이와 같이 구현체가 달라져도 정상적인 기능의 제공을 보장하는 것을 다형성 이라고 하며, 이를 통해 프로그램이 유연해지며 변경도 편리해지는 것이다.
* 이를 자바 언어와 객체지향 프로그래밍에 접목시키면 다음과 같다.
자바 언어의 다형성은 다음과 같이 활용된다.
- 역할 : 인터페이스
- 구현 : 인터페이스를 구현한 클래스, 구현 객체
- 객체를 설계할 때 역할과 구현을 명확히 분리하여, 객체 설계 시 역할(인터페이스) 을 먼저 부여하고, 그 역할을 수행하는 구현 객체를 만든다.
** 인터페이스에 선언된 메소드를 클래스에서 구현할 때 메소드 오버라이딩을 통해 구현하게 되는데, 이 때 서로 다른 클래스에서 구현을 하더라도 같은 인터페이스를 구현하는 것이기 때문에, 구현체의 변경 자체가 굉장히 용이하다.
** 이로 인해 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경할 수 있다.
** 물론, 클래스 상속 관계에서도 다형성과 오버라이딩이 적용 가능하다.
다형성의 본질
- 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다.
- 다형성의 본질을 이해하려면 협력 이라는 객체 사이의 관계에서 시작해야 한다.
- 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경해 줄 수 있다.
정리
- 실세계의 역할과 구현이라는 편리한 컨셉을 다형성을 통해 객체 세상으로 가져올 수 있다.
- 유연하고 변경이 용이하다.
- 확장이 가능하도록 설계할 수 있다.
- 클라이언트에 영향을 주지 않는 변경이 가능하다.
- 인터페이스를 안정적으로 잘 설계하는 것이 중요하다.
역할과 구현을 분리하는 설계의 한계점?
* 역할(인터페이스) 자체가 변하면, 클라이언트, 서버 모두에 큰 변경이 발생하게 된다.
- 조금 극단적이지만, 자동차를 비행기로 변경해야 되는 경우
- 드라마나 영화에서 대본 자체가 변경되는 경우
- USB 인터페이스가 변경되는 경우
때문에 인터페이스를 변화가 크지 않게끔 안정적으로 잘 설계하는 것이 중요하다.
스프링과 객체지향
- 객체지향 에서는 다형성 이라는 특징이 가장 중요하다.(객체지향의 꽃은 다형성이다.)
- 스프링은 다형성을 극대화해서 이용할 수 있게 도와준다.
- 스프링에서 이야기하는 제어의 역전(IOC), 의존관계 주입(DI) 은 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원한다.
- 스프링을 사용하면 마치 레고 블럭 조립하듯이, 공연 무대의 배우를 선택하듯이, 구현을 편리하게 변경할 수 있다.
그런데 스프링과 객체지향 설계에 대해서 제대로 이해하려면 다형성 외에 1가지를 더 알아야 한다.
바로 SOLID 원칙을 말한다.(좋은 객체 지향 설계의 5가지 원칙)
'Spring basic' 카테고리의 다른 글
스프링 핵심원리 : 기본편 - 회원 도메인 설계 (0) | 2022.02.09 |
---|---|
스프링 핵심원리 : 기본편 - 좋은 객체지향 설계의 5가지 원칙(SOLID) (0) | 2022.02.09 |
스프링 입문 : 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - AOP #2 (0) | 2021.11.17 |
스프링 입문 : 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - AOP #1 (0) | 2021.11.17 |
스프링 입문 : 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - Spring Data JPA (0) | 2021.11.16 |