Spring이란?
Spring Framework란?
- 엔터프라이즈급 어플리케이션을 구축할 수 있는 가벼운 솔루션이자, 원스-스탑-숍(One-Stop-Shop)이다.
- 여기서 원스-스탑-숍이란 모든 과정을 한꺼번에 해결하는 상점을 의미한다.
특징
- 모듈화가 굉장히 잘 되어 있어서 원하는 부분만 가져다 사용할 수 있다.
- IoC 컨테이너다.
- 선언적으로 트랜잭션을 관리할 수 있다.
- 완전한 기능을 갖춘 MVC Framework를 제공한다.
- AOP 지원
- 스프링은 도메인 논리 코드와 쉽게 분리될 수 있는 구조로 되어 있다.
프레임워크 모듈
- 스프링 프레임워크는 약 20개의 모듈로 구성되어 있다.
- 필요한 모듈만 가져다 사용할 수 있다.
그 밖에 제공하는 기능
- AOP와 Instrumentation
- 메시징(Messaging)
- 데이터 액세스(Data Access) / 통합(Integration) : JDBC와 같은 기능 제공
- 웹 (Web) : spring-web, spring-webmvc, spring-websocket, spring-webmvc-portlet 모듈로 구성되어 있다.
프레임워크 vs 라이브러리
위에서 Spring은 프레임워크라고 했다. 그렇다면 프레임워크와 라이브러리는 어떤 차이가 있을까?
우선 프레임워크는 어떤 것을 구성하는 뼈대나 기반구조를 의미한다. 즉, 완성된 제품이 아니라 어려운 부분이나 복잡한 부분은 이미 만들어져 있는 뼈대로, 이 뼈대 위에 프로그래머가 코드를 작성해서 제품을 완성시켜야 하는 반제품이다. 사전적 정의는 다음과 같다 "소프트웨어의 특정 문제를 해결하기 위해서 상호 협력하는 클래스와 인터페이스의 집합"
라이브러리는 단순활용가능한 도구들의 집합이다. 특정 기능을 가진 도구나 함수들의 집합으로 개발자가 만든 클래스에서 호출하여 사용한다. 대표적인 예로 Java에서 List를 사용할 때 import javax.util.List 로 이미 만들어진 자료구조를 불러와서 List라는 클래스 이름으로 가져다 쓴다. 이와 같이 라이브러리는 이미 완성된 도구로 가져다 쓰는 것이다.
좀더 자세히 설명하자면 둘의 차이는 흐름(Flow)의 권한이 누구에게 있느냐에 따라 다르다. 프레임워크에게는 제어의 역전이 적용되어 있다.
제어의 역전이란?
어떠한 일을 하도록 만들어진 프레임워크에 제어의 권한을 넘김으로서 클라이언트 코드가 신경써야 할 것을 줄이는 전략을 의미한다.
일반적으로 프로젝트를 생성하고 프로그래머가 어떠한 순서를 부여하느냐에 따라 흐름을 제어하는데, 프레임워크는 우리가 프레임워크를 사용해 프로젝트를 생성하고 뼈대를 만들어서 그안에 코드를 넣기 때문에 제어의 권한이 프레임워크에게 있다.
다르게 설명하자면, 제어 흐름에 대한 주도성이 누구에게/어디에 있느냐의 차이다.
라이브러리를 사용하는 어플리케이션은 어플리케이션의 흐름을 직접 제어한다. 단지 동작 중에 필요한 기능이 있을 때만 능동적으로 라이브러리를 사용한다.
반면에 프레임워크는 거꾸로 어플리케이션 코드가 프레임워크에 의해 사용된다. 보통 프레임워크 위에 개발한 코드를 두고, 프레임워크가 흐름을 주도하는 중에 개발자가 짠 코드를 사용하는 방식이다. 즉, 개발자가 짠 어플리케이션 코드는 프레임워크가 짜놓은 틀에서 수동적으로 동작한다.
Spring IoC/DI 컨테이너
컨테이너
컨테이너는 인스턴스의 생명주기를 관리하며, 생성된 인스턴스에게 추가적인 기능을 제공한다. = 라이프 사이클 관리
인스턴스를 직접 생성해서 실행해서 소멸하는 작업들을 대신 해주는 것
대표적인 예로, Servlet을 실행해주는 WAS는 Servlet 컨테이너를 갖고 있다. 클래스는 개발자가 작성해도 실제로 메모리에 올리고 실행하는 것은 WAS가 가지고 있는 Servlet 컨테이너다. Servlet컨테이너는 동일한 서블릿에 해당하는 요청을 받으면, 또 메모리에 올리지 않고 기존에 메모리에 올라간 서블릿을 실행하여 그 결과를 웹 브라우저에게 전달해준다.
JSP도 마찬가지다. JSP를가 Servlet으로 바뀌고 다시 Servlet이 인스턴스를 만들고 하는 과정은 컨테이너가 대신 해주는 것이다.
IoC
Inversion of Control의 약자로, 제어의 역전이라고 변역한다.
개발자는 프로그램의 흐름을 제어하는 코드를 작성한다. 그런데, 이 흐름의 제어를 개발자가 하는 것이 아니라 다른 프로그램이 그 흐름을 제어하는 것을 제어의 역전이라고 한다.
예를 들어, 서블릿 클래스는 개발자가 만들지만, 그 서블릿의 메소드를 알맞게 호출하는 것은 WAS다.
컨테이너가 코드 대신 오브젝트의 제어권을 갖고 있어 IoC(제어의 역전)이라 한다.
DI
Dependency Injection의 약자로, 의존성 주입이란 의미다.
클래스 사이의 의존 관계를 빈(Bean) 설정정보를 바탕으로 컨테이너가 자동으로 연결해주는 것을 의미한다.
Spring에서 제공하는 IoC/DI 컨테이너
- BeanFactory : IoC/DI에 대한 기본 기능을 가지고 있다.
- ApplicationContext : BeanFactory의 모든 기능을 포함하며, 일반적으로 BeanFactory보다 추천됩니다. 트랜잭션처리, AOP등에 대한 처리를 할 수 있다. BeanPostProcessor, BeanFactoryPostProcessor등을 자동으로 등록하고, 국제화 처리, 어플리케이션 이벤트 등을 처리할 수 있다.
- BeanPostProcessor : 컨테이너의 기본로직을 오버라이딩하여 인스턴스화 와 의존성 처리 로직 등을 개발자가 원하는 대로 구현 할 수 있도록 한다.
- BeanFactoryPostProcessor : 설정된 메타 데이터를 커스터마이징 할 수 있다.
책으로 공부하다가 Spring 사용할때 나오는 DI(의존성 주입), 컨테이너, BeanFactory 등 xml 파일 설정하는 것도 그렇고 이해가 잘 안되서 부스트코스 강의 들으러 왔는데 그냥 책만 보고 코드만 치다가 이렇게 설명을 들으니 좀 알것 같기도 하다. IoC, DI 개념이 매우 중요해 보이는데 완전히 이해가 가는 건 아니지만 계속 공부해봐야겠다.
이번 포스팅을 마지막으로 부스터즈 활동이 끝난다. 이제는 혼자 Spring 공부하다가 이해 안되면 강의 들으러 가고 해야겠다. 그동안 강의를 들으면서 느낀 점은 초반에 확실히 개념을 다져주는 것은 좋지만 웹개발에 대해 아무것도 모르는 사람이 강의를 듣기에는 좀 힘들것 같다는 것이다. 그러니 파이썬 장고나 Node.js 같이 쉽게 웹개발을 해볼 수 있는 프레임워크들을 먼저 접하고서 웹개발이 무엇인지 대강 알고서 이 강의를 듣는 것이 좋겠다. 또는 Java로 웹개발을 해보고 싶을 때 들어도 좋을것이다. 나도 Node.js로 웹개발하다가 Java Spring이 많이 쓰이다 보니 배워야겠다 싶어서 듣기 시작했던 거라.
앞으로도 꾸준히 공부해나갈 수 있으면 좋겠다.
참고사이트
★ 라이브러리와 프레임워크의 차이
https://webclub.tistory.com/458
프레임워크와 라이브러리의 차이점
Framework Vs Library 프레임워크와 라이브러리의 정확한 차이점은 무엇일까요? 대중 알것 같지만 정확히 어떠한 차이점이 있는지 모르고 있는 경우가 많을지도 모릅니다. 프레임워크는 단지 미리 만들어 둔 반제..
webclub.tistory.com
'공부 > [부스트코스] 웹 프로그래밍' 카테고리의 다른 글
[부스트코스] 웹 프로그래밍 - 2차 코드리뷰 (0) | 2020.03.19 |
---|---|
[부스트코스] 웹 프로그래밍 - REST API 와 WEB API (0) | 2020.03.12 |
[부스트코스] 웹 프로그래밍 - JSP (0) | 2020.03.04 |
[부스트코스] 웹 프로그래밍 - 1차 코드리뷰 (0) | 2020.02.26 |
[부스트코스] 웹 프로그래밍 - Servlet (0) | 2020.02.21 |