[Spring] 용어 및 개념정리
Spring 프레임 워크
자바 플랫폼을 위한 오픈소스 어플리케이션 프레임워크로서 엔터프라이즈급 어플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션이다. 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다.
엔터프라이즈급 개발이란 기업을 대상으로 하는 개발이라는 뜻이다. 일반적인 프레임워크의 경우 고가의 WAS를 갖추어야만 동작했지만 Spring 프레임워크는 가볍고 단순한 환경에서 사용할 수 있다.
라이브러리 : 라이브러리는 개발에 필요한 기능이 있을 때 직접 가져와 사용할 수 있도록 자주 사용되는 기능들을 모아 미리 구현해 둔 것이다.
프레임워크 : 프레임워크도 개발에 필요한 기능이 미리 구현되어 있는 것이다. 하지만 프레임워크에는 라이브러리와 달리 기본 틀(프레임)이 정해져있다. 때문에 제약없이 사용할 수 있는 라이브러리와 달리 프레임워크는 정해진 틀안에서 미리 구현 된 기능을 사용해야한다.
MVC 디자인 패턴
MVC는 Model, View, Controller의 약자이며, 클라이언트와 상호작용하는 소프트웨어를 설계함에 있어 세가지 요소로 나누어 설계하는 것을 말한다.
Model
애플리케이션의 정보, 데이터의 가공을 책임지며 데이터베이스와 상호작용하여 비즈니스 로직을 처리하는 모듈. 즉, 컴포 넌트를 말한다. 다음과 같은 규칙을 가지고 있다.
- 사용자가 이용하려는 모든 데이터를 가지고 있어야 한다.
- View(뷰) 또는 Controller(컨트롤러)에 대해 어떤 정보도 알 수 없어야 한다.
- 변경이 일어났을 때 처리 방법을 구현해야 한다.
- 모델은 재사용이 가능해야 하며 다른 인터페이스에서도 변하지 않아야 한다.
View
클라이언트 단에서 보여지는 결과화면을 반환하는 모듈. 즉, 사용자 인터페이스 요소를 말한다.
다음과 같은 규칙을 가지고 있다.
- Model(모델)이 가지고 있는 데이터를 저장하면 안된다.
- Model(모델)이나 Controller(컨트롤러)에 대한 정보를 알면 안된다.
- 데이터를 받아 단순히 화면에 표시해주는 역할만 가진다.
- 재사용이 가능하게끔 설계를 해야 하며 다른 정보들을 표현할 때 쉽게 설계해야 한다.
Controller
client로부터 request가 들어왔을 때 그 입력을 처리하고 어떤 로직을 실행시킬 것인지 Model(모델)과 View(뷰)를 연결해주며 제어하는 모듈을 말한다.
다음 같은 규칙들을 가지고 있다.
- Model(모델) 또는 View(뷰)에 대한 정보를 알아야 한다.
- Model(모델) 또는 View(뷰)의 변경을 인지하여 대처를 해야한다.
- 모델이나 뷰의 변경 통지를 받으면 이를 해석해서 각각의 구성 요소에게 통지를 해야 한다.
- 애플리케이션의 메인 로직을 담당한다.
Spring MVC 동작 구조
애플리케이션으로 들어오는 Request를 받는 역할을 Dispatcher Servlet이라는 컴포넌트가 처리한다.
Dispatcher란 분배라는 뜻을 지니고 있는데 요청을 각 컨트롤러에 분배하는 역할이다.
다음은 Controller 차례다. 회원가입 요청을 받은 UserController는 그에 맞는 처리를 하고 결과를 돌려준다.
Dispatcher Servlet에 바로 돌려주지 않고 ModelAndView라는 객체에 결과를 준다.
ViewResolver라는 컴포넌트가 ModelAndView 컴포넌트에서 반환한 View를 가지고 클라이언트에 응답으로 보낸다. 그리고 마지막으로 View 컴포넌트가 실제 결과를 화면에 보여준다.
IoC (Inversion of Control)
직역하면 제어의 역전이다.
// java 프로젝트
public class order {
private customer customer;
public order() {
this.customer = new customer();
}
}
// Spring 프로젝트
public class order {
@Autowired
private customer customer;
}
기존 자바 프로젝트 코드는 객체를 사용자가 직접 생성하지만(new), Spring의 경우 그렇지 않다. @Autowired를 받아서 사용하는데 이것이 제어의 역전이다.
스프링 컨테이너는 프로젝트에서 사용되는 객체를 Bean으로 관리하고 있고, @Autowired를 통해 객체를 주입해준다.
기존에는 사용자가 생성해(new) 매개변수로서 다른 객체로 보내고 삭제하는 등 객체 제어를 직접 수행했으나 Spring은 객체의 제어를 사용자가 아닌 spring framework가 진행한다. 그래서 제어의 역전이라고 한다.
Bean : 스프링 프레임워크에 의해 관리되는 자바 객체
DI (Dependency Injection)
직역하면 의존성 주입이다.
프로그래밍에서 말하는 의존성이란 코드에서 두 모듈(클래스)간의 연결 혹은 관계를 말하는데, 예를 들어 클래스 A가 클래스 B를 이용할 때 A가 B에 의존한다고 한다. 이런 관계에서는 A가 B없이는 작동할 수 없고, B가 변하면 A에 영향을 끼친다.
DI는 Spring에서 IoC 구조를 만드는 방식이다. 이를 사용하는 이유는 객체간 의존성을 줄이기 위함이다. 외부에서 객체를 생성해 주입하기 때문에 재사용성 및 수정이 용이하다.
// java 프로젝트
class concept_api implements Post(){}
class concept_Spring implements Post(){}
class Blog_log() {
private Post post; // 블로그 글 클래스
public Blog_log() {
this.post = new concept_api();
this.post = new concept_Spring();
}
}
// DI
private Post post; // 블로그 글 클래스
public Blog_log(Post post) {
this.post = new Post();
}
만약 기존 프로젝트처럼 interface를 직접 만든다면 글마다 CRUD (Create Read Update Delete)함수가 필요하지만, DI처럼 의존성을 주입해 사용한다면 Blog_log 하나의 클래스 만으로 모든 글을 관리할 수 있다.