[ Spring Framework ]

carrotsman·2022년 4월 11일
22

백엔드

목록 보기
2/6
post-thumbnail

Spring Framework

스프링 프레임워크는 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크로서 간단히 스프링이라고도 한다. 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다.

spring 이전, 엔터프라이즈 어플리케이션을 개발할땐 EJB (Enterprise Java Beans) 를 사용하여 구현했다. 하지만 이 EJB는 컨테이너에 대한 환경 구성의 종속성이 높았고, 프로그래밍 모델도 복잡했으며 무겁고 사용하기 불편한 단점이 많았다. 한마디로 만들기 어려운데 환경빨도 많이 받아서 운용하기도 겁나 피곤한 그런 녀석이었다. 이 얘기다.

이를 개선하기 위해 spring이 개발 되었다. spring 1.0이 2004년 릴리즈 되었고 EJB의 기능을 포괄하여 더 경량화된 컨테이너와 프로그래밍 모델로 많은 사랑을 받고있다. 사랑이라기 보단 이용당하는거지..


Spring 특징

Spring은 다음과 같은 특징을 갖고있다.

1. Spring 컨테이너를 갖고있다.

Spring 컨테이너는 Java 객체의 LifeCycle을 관리하며, Spring 컨테이너로부터 필요한 객체를 주입받아 사용할 수 있다. 쉽게 말하자면 기존의 Java에선 class안에 포함되어있는 메소드를 쓰기위해선 그 class를 new로 생성된 객체를 통해 호출했다. 하지만 Spring에선 미리 객체 하나를 생성해놓고 그 놈을 돌려쓰는 구조를 띄는데 이걸 가능케해주는 것이 Spring 컨테이너와 뒤에서 설명할 DL/DI 개념이다. Spring 컨테이너는 미리 선언된 Bean (Java 객체) 을 담아두는 바구니라고 생각하면 쉽다. 미리 선언된 Bean의 생명 주기를 관리하고 필요한 곳에 끼워넣는 역할을 한다.

2. IOC 기반으로 DL/DI 를 통해 객체의 재사용성을 높인다.

IOC (Inversion of Control) 란 제어의 역전을 뜻한다. 기존의 Java는 개발자가 객체의 생성과 사용, 파기 등을 제어했다. 하지만 Spring의 경우는 Spring 컨테이너를 통해 객체에 대한 생명 주기를 관리한다. 그렇기 때문에 Spring을 IOC 기반 프레임워크라 부르는 것이다. DL (Dependency Lookup) 은 각 컨테이너에서 관리해야 하는 객체들을 관리하기 위한 별도의 저장소를 가지게 되는데, Spring 컨테이너가 관리중인 객체 저장소 (Pool) 에서 객체를 검색하여 참조하는 방법이다. DI (Dependency Injection) 는 class 사이에 필요로 하는 의존관계가 있다면 이를 컨테이너가 자동적으로 연결시켜 주는 것으로 @Annotation 태그를 활용하여 각 Class 사이의 의존관계를 Bean 설정 정보를 바탕으로 컨테이너가 자동적으로 연결해 주는 것이다.

3. MVC2 디자인 패턴을 사용한다.

Spring을 처음에 접하면 진짜 200번도 더듣게 되는 디자인 패턴이다. 프로그램 아키텍쳐를 Model, View, Controller로 분리하여 구성하는 디자인 패턴인데 어렵게 생각할꺼 없이 Model은 DB, View는 JSP/HTML, Controller는 controller Java를 의미한다고 생각하면 된다. 이 세가지 구성 요소가 상호 작용하는 디자인 패턴이라고 보면된다.

4. POJO 를 지원한다.

Spring 컨테이너에 저장되는 Java객체는 특정 인터페이스를 사용하거나, 특정 클래스를 상속받지 않아도 된다. 보통 VO (Value object)와 같은 형태를 띈 POJO가 일반적이다. (getter, setter 구조)

5. AOP 를 지원한다.

Spring은 트랜젝션이나 로깅, 보안과 같이 공통적으로 필요로 하는 모듈들을 실제 핵심 모듈에서 분리해서 적용 할 수 있다. 그니깐 AOP의 핵심은 중복되거나 반복되는 코드를 별도의 모듈로 분리하여 적시적소에 땡겨다 쓴다~ 이거다.


Spring 구성 요소

spring 구조에 대해 검색하면 이런 이미지를 많이 봤을 것이다. 이건 spring의 구조라기 보단 spring 앱을 구현함에 있어 구성할 수 있는 요소들이다. '저중에 하나 없다고 spring 앱이 아니다.' 라고 말할 수 없다는 얘기다. 물론 Spring Core, Spring Web/MVC, Spring Context의 경우는 있어야되겠지만...

중요도 순으로 정리해본다. (주관적인 시각)

1. Spring Core

말그대로 core, Spring의 중심으로 core의 내부 기능을 활용하여 구현체를 만들 수 있다. 아까 특징에서 Spring framwork는 IOC 기반으로 구성된다고 했다. core 내부에 보면 Bean container 항목이 보이는데 저 녀석이 사실상 core의 핵심이다. Bean container 안에는 개발자가 정의한 bean 들이 존재한다. DL/DI를 통해 필요한 부분해 bean을 밀어넣고 프로그램을 완성한다.

2. Spring Context

Spring Context에는 JNDI, EJB, Validation, Scheduiling, Internaliztaion 등 엔터프라이즈 서비스들을 포함하고 있다. Spring Core에서 지원하는 기능 외 추가적인 기능들과 쉬운 개발을 위한 서브 셋을 지원하는 녀석이라고 보면된다.

3. Spring Web

Web Application 개발에 필요한 Web Application Context와 Multipart Request 등의 기능을 지원한다. 웹 개발 관련 모듈이 포함되어있다.

4. Spring Web MVC

Spring 프레임워크에서 독립적으로 Web UI Layer에 Model-View-Controller를 지원하기 위한 기능으로 지금까지 Struts, Webwork가 담당했던 기능들을 Spring Web MVC를 이용하여 대체하는 것이 가능하다. 또한 Velocity, Excel, PDF와 같은 다양한 UI 기술들을 사용하기 위한 API를 제공한다.

5. Spring ORM

Object Relation Mapping 프레임워크인 Hibernate, IBatis/MyBatis, JDO와의 결합을 지원하기 위한 기능으로 Spring ORM을 이용할 경우 DBMS와 쉽게 연결하는 것이 가능하다. 그니깐 웬만한 엔터프라이즈 프로젝트를 한다면 무조건 쓴다 생각하면 된다.

6. Spring DAO

기존의 DAO 사용방식보다 간결하게끔 도와주는 녀석으로 Spring DAO를 이용할 경우 지금까지 개발하던 DAO보다 적은 코드와 쉬운 방법으로 DAO를 개발하는 것이 가능하다.

7. Spring AOP

Spring 프레임워크에 Aspect Oriented Programming을 지원하는 기능이다. 직역하면 관점지향 프로그래밍인데 요약하면 중복된 특정 기능을 정리하여 필요한 관점에서 적시적소에 사용할 수 있게끔 해주는 역할을 한다고 생각하면 된다. 깊게 들어가면 골치아픈 녀석이니 궁금하면 다른 블로그 찾아보세욘 뿌잉


정리하며

Java Spring framework의 개요와 특징, 구성 요소를 알아봤다. 여기에 쓴 내용이 이해하기 힘들 수 있다. 지금 나도 내가 알고있던 내용과 비교하며 정리 중인데 각자가 이해하는 방식이 다름을 느낀다. 내가 이해한 Spring은 객체 저장소인 컨테이너와 기능을 활용하여 객체에 대한 생명 주기 관리, 재사용성을 높여 경량화된 프레임워크라는 것이다. 아주 벗어나지 않는 선에서 본인이 이해하기 편하게 이해하는게 좋다. 쓰는데 문제없으면 그만이지..

오늘 저녁은 초밥이다. 🥕


참조 : https://nive.tistory.com/228
https://shlee0882.tistory.com/200
https://khj93.tistory.com/entry/Spring-Spring-Framework%EB%9E%80-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-%ED%95%B5%EC%8B%AC-%EC%A0%95%EB%A6%AC

profile
당근먹고 강력한 개발

2개의 댓글

comment-user-thumbnail
2022년 4월 27일

덕분에 Spring framework에 관해서는 잘 이해하였습니다. 다음시간엔 Summer framework로 부탁 드립니다.

1개의 답글