Spring 개발을 시작한지 거의 2년이 다되어 가지만, 아직 Spring 이란 친구와 너무 먼 사이 같다고 느끼는 찰나에
해당 강의를 만나게 되었습니다. 스프링 핵심 원리강의는 어느정도 현업을 하다가 와서 그런지 정말 잘 짜여진 강의
라고 느껴졌고, Spring 이 어떤 친구인지 조금 더 자세히 알아볼 수 있는 시간이 되었던 것 같습니다. 항상 정리를
하며 복습을 해야 진짜 공부한 것이라고 생각해서, 포스트를 작성하게 되었으니, 그냥 글 읽듯이 쭉쭉 읽으시며 조
금은 도움이 되었으면 좋겠습니다.
Spring
Spring 이란 Java 언어를 기반으로 한 웹 프레임워크 이지만, 웹 뿐만 아니라 (아직 웹 외의 프로그램은 본 적 없습
니다) 다양한 앱을 만들기 위한 Framework 입니다. Spring 이란 영역은 너무 넓기 때문에, 무엇을 말하냐라고 할
때는 다소 추상적일 수 있지만, Spring 모든 기술을 포함한 Spring 생태계를 말한다고 보시면 될 것 같습니다. 대표
적인 Spring 제공 기술들을 살펴보겠습니다.
Spring Framework - Spring 기능의 기반이 되는 핵심 코드들을 모아놓은 집약체
Spring Boot - Spring의 기술들을 편리하게 지원하는 프레임워크, Tomcat 을 내장하여 WAS 연동을 지원
Spring Data - Database 와의 통신을 지원해주는 기술
Spring Session - 웹 세션 기술을 편리하게 쓸 수 있도록 지원해주는 기술
Spring Security - Authentication, Authorization 측면에서 앱의 보안을 강화해주는 기술
Spring Batch - 대규모 데이터 처리를 위한 기술.
...
그밖의 많은 Spring 기술들이 Spring 생태계를 이루고 있습니다. 이 모든 Spring에 전반적으로 깔려 있는 핵심 원
리들을 이해해야 추후 많은 기술들을 소화하는데 밑거름이 됩니다. 저 역시 해당 강의를 들으면서 지금까지 접했던
많은 내용들을 보았고, 그제서야 Spring 이 내부적으로 무슨 일을 했는지 이해할 수 있었습니다. (IoC, DI, AOP
등)
Spring 의 간단한 역사
예전에 사용하던 Java 기반 프레임워크 기술은 EJB (Enterprise Java Bean) 이였습니다. 역사는 지루하니 간단히
살펴보겠습니다. 이 EJB 는 너무 어려웠고, 이를 제대로 만들기 위해 Rod Johnson 이란 사람이 Spring
Framework 를 만들게 되었고, 핵심 기술인 Database 통신 기술을 Gavin King 이란 사람이 Hibernate 를 만들게
되었습니다.
해당 기술들은 전 세계적으로 열광하게 되었고, 이들은 Java 프레임워크의 새로운 시작이란 의미로 Spring 이라고
이름을 짓게 되었습니다. 왜 Spring 이 이렇게 주목을 받았는지가, 중요한 요소입니다.
Spring 핵심 원리
본 강의를 통들어 가장 강조되는 부분은, 바로 Spring 은 Java Framework 이며, OOP 언어란 점입니다. Spring
Framework 은 이 객체 지향 언어가 가진 강력한 특징을 살려내는, 좋은 객체지향 앱을 설계할 수 있도록 도와주는
프레임워크입니다. 즉, Rod Johnson은 EJB 가 Java의 순수한 OOP 특성을 다 잃어버린다고 판단하였고, OOP의
가치를 확실히 살릴 수 있도록 만들고 싶었던 것입니다.
객체 지향 언어 (Object Oriented Programming)
객체지향의 정의부터 살펴보자면, '컴퓨터 프로그램을 명령어의 목록으로 보는 시각으로부터 벗어나, 여러 개의 독
립된 단위인 [객체]들의 모임으로 파악하는 것' 입니다. 즉, 위에서 아래로 내려오는 딱딱한 명령어들의 집합에서 벗
어나, 메인 코드 안에서 많은 객체들이 서로 데이터를 주고 받으며 협력관계를 통해 설계되는 언어를 말합니다. (개
인적으로 이 객체 지향적인 관점이, 우리 실생활과 가장 비슷한 언어라고 생각이 듭니다)
이 객체 지향 언어를 가장 유연하게 만드는 중요한 요소 중 하나는 바로 다형성 (Polymorphism) 입니다. 혹시라도
OOP, 다형성 등의 용어들이 이해가 안되신다면, 필히 Java 에 대한 학습 후 진행하셔야 합니다.

위 그림처럼, 우리 실생활에서 자동차라는 큰 분류가 있습니다. 우리들은 이 자동차라는 객체를 통해서 운전이라는
행동을 수행하게 됩니다. 이 추상적인 자동차라는 객체를, 더욱 구체화시킨다면 K3, Tesla, Avante 등 수많은 모델
들이 존재할 것입니다. 중요한 점은, 이 모델들이 바뀌어도, 일부 기능들은 개선될 수 있으나, 핵심 로직들은 변하지
않는다는 점입니다. 객체 지향 언어에서는, 운전자가 이 자동차라는 추상 객체 (Interface) 를 사용(의존)하더라도,
실질적으로 구현하는 K3 와 같은 객체 (Class) 를 사용하게 됩니다. 하지만, 수행하는 운전 (method) 이란 로직은
변하지 않습니다.
차를 Avante 로 바꾼다고 해도 뭐가 변할까요? 운전을 수행함에 있어서는 변함이 없습니다. Tesla 로 바꾸면 자율
주행이라는 새로운 로직 (method) 이 추가될 수는 있으나, 운전을 수행함에 있어서는 역시 변함이 없습니다.
이렇게 해당 인터페이스 (서버) 를 요청하는 객체(클라이언트)에게 영향을 주지 않고 새로운 기능을 제공할 수 있는
것이 다형성의 핵심입니다. 이를 [역할과 구현의 분리] 라고 합니다.
다음과 같은 예시를 보겠습니다.

로미오와 줄리엣 공연에는, 배우 A씨와 B씨가 로미오 역할을 하고, 배우 C씨와 D씨가 줄리엣 역할을 하게 됩니다.
이 때, 로미오 역할을 A씨가 한다고, 줄리엣 역할을 D씨가 한다고 연극이 변하지 않습니다. 역할을 구현하는 배우
A~D씨들은 누구든지 해당 역할을 수행할 수 있습니다.
객체 관점에서도 항상 서로 서버가 되기도 하고, 클라이언트가 되기도 하며, 항상 협력 관계에 있습니다. 이 협력 관
계들을 통해 OOP 로 설계를 하면 즉, 역할과 구현을 구분하면, 앱은 단순해지고, 유연해지고, 변경도 편리해집니
다. Client 는 Server의 내부 사정은 알 필요 없이, 해당 Server 역할을 할 수 있는 객체만 있으면 되며, 내부 구조가
변경되어도 아무 영향을 받지 않아야 하는 것이, 다형성의 핵심입니다.
안정적인 OOP, 안정적인 Interface 를 설계하기 위해선, 이 [역할과 구현의 분리] 를 항상 명심해야 합니다. 객체 지향 설계의 5대 원칙인 SOLID에 대해서 더 자세히 안다면, 이 Spring 이 얼마나 OOP를 위한 Framework 인지 확
인할 수 있습니다.
포스트 요약
- Spring 은 OOP 의 성능을 극대화시켜줄 수 있도록 설계된 Framework 입니다.
- 제대로 된 OOP 설계를 위해선 [역할과 구현의 분리]를 잘 이해하여야 하며, Spring 에서는 IoC, DI 를 통해서 이를 편리하게 성취할 수 있습니다.
출처
[스프링 기본]으로 엮인 모든 포스트들은 교육 사이트 인프런의 지식공유자이신 김영한님의 [스프링 핵심 원리] 강
의를 기반으로 작성되었습니다. 열심히 정리하고 스스로 공부하기 위해 만든 포스트이지만, 제대로 공부하고 싶으
시면 해당 강의를 꼭 들으시는 것을 추천드립니다.
스프링 핵심 원리 - 기본편 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...
www.inflearn.com
'Spring > Spring 기본' 카테고리의 다른 글
| [Spring 기본] Component Scan을 통한 Bean 자동화 관리 (0) | 2022.10.17 |
|---|---|
| [Spring 기본] Spring Container의 Singleton 전략 (0) | 2022.10.14 |
| [Spring 기본] Container와 Bean과 조금 더 친해져보자 (0) | 2022.10.13 |
| [Spring 기본] Spring의 객체 지향 IoC, DI, Bean, Container (0) | 2022.10.13 |
| [Spring 기본] 앱 기본 설계, Config 클래스 및 주입의 시작 (0) | 2022.10.13 |