자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크이다.
동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다. 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준프레임워크의 기반 기술로서 쓰이고 있다. ( 출처 : 위키백과 )
▶ 라이브러리
라이브러리는 개발에 필요한 기능이 있을 때 직접 가져와 사용할 수 있도록 자주 사용되는 기능들을 모아 미리 구현해 둔 것이다.
예를 들어 자바에서는 문자열을 사용할 때 String name = "안덕찬" ;
이렇게 사용한다. String은 java.lang.String 에 미리 만들어져있는 기능이고 우리는 java.lang.String 이라는 라이브러리에서 기능을 가져와 사용하는 것이다.
▶ 프레임워크
프레임워크도 개발에 필요한 기능이 미리 구현되어 있는 것이다. 하지만 프레임워크에는 라이브러리와 달리 기본 틀이 정해져있다. 때문에 제약없이 사용할 수 있는 라이브러리와 달리 프레임워크는 정해진 틀 안에서 미리 구현 된 기능을 사용해야한다.
스프링 프레임워크에서는 MVC라는 정해진 구조 안에서 개발자가 프로그램을 개발한다.
▶ 프레임워크, 라이브러리 차이 정리
프레임 워크, 라이브러리의 가장 큰 차이는 "흐름을 누가 결정하는가" 이다. 라이브러리는 개발자가 직접 프로그램의 흐름을 결정하지만 프레임워크는 정해진 흐름에 맞게 개발자가 프로그램을 개발한다.
▶ 스프링은 아래 그림과 같이 구성되어있는 프레임워크이다. (출처)
스프링 프레임워크는 MVC 구조로 이루어져있다.
▶ MVC 구조란?
Model - View - Controller 의 줄임말
Spring의 MVC 구조를 살펴보면 아래와 같다.
View - Controller - Service - Serviceimpl - DAO - DAOimpl - DTO
각 구조에 대해 보면 크게 View, Controller, Service, DAO, DTO로 이루어져있다. 이 외에도 DispatcherServlet, servlet-context가 있지만 우선 위 구조만 살펴본다.
View
말 그대로 사용자에게 보여지는 화면을 View라고 한다. Spring에서는 JSP를 통해 화면을 구성하고 Controller를 통해 백엔드 서버와 연결한다.
Controller
View와 Service 사이를 연결한다. 클라이언트에서 입력한 URL에 맞는 View를 보여주고, View에서 처리하는 데이터를 Service로 전달해준다.
@RequestMapping(value = "/")
public String home() {
service.method();
return "index";
} // localhost:port/로 접속한 클라이언트에게 index.jsp를 반환한다.
public class temp { // 데이터베이스 테이블 컬럼과 GETSET만 가지고있다.
private int id;
private String name;
public int getId() {return id;}
public void setId(int id) {this.id = id;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
}
▶ Service - Serviceimpl / DAO - DAOimpl 은 무엇일까?
impl은 implement의 줄임말로 Serviceimpl은 Service라는 인터페이스를 implements, DAOimpl은 DAO라는 인터페이스를 implements한 것이다.
interface와 impl을 나누어 설계하는 이유
IoC를 그대로 해석하면 제어의 역전이다. 무엇인가 제어하는 주체가 바뀐다는 의미인데 어떤 제어가 어떻게 바뀌는 것일까?
Spring을 사용해 본 사람이면 알듯이 Service, DAO 같은 객체를 사용자가 직접 생성(new)하지 않는다. @Autowired를 통해 받아 사용하는데 이 @Autowired가 IoC(제어의 역전)이다.
// 기존 자바 프로젝트
public class order {
private customer customer;
public order() {
this.customer = new customer();
}
}
// Spring 프로젝트
public class order {
@Autowired
private customer customer;
}
스프링 컨테이너(IoC container)는 프로젝트에서 사용되는 객체들을 Bean으로 관리하고있고 @Autowired를 통해 객체를 주입해준다.
기존엔 사용자가 생성(new)해 파라미터로 다른 객체로 보내거나, 사용할 일이 없을 경우 객체를 소멸하는 등 객체에 대한 제어를 직접 진행했다. 하지만 Spring에서는 위처럼 제어를 사용자가 아닌 Spring Framework가 진행하기 때문에 제어의 역전이라고 표현한다.
Spring Bean
Spring에서 Bean은 스프링 프레임워크에 의해서 관리되는 자바 객체이다.
▶ Spring Bean은 Java Bean과 다른 의미이다. (Java Bean vs Spring Bean 차이점)
제 3자가 제어를 관리하는 순간 제어의 역전이고, 스프링이 생기기 전부터 있던 개념이었기에 IoC는 다른 프레임워크와 다른 스프링만의 차별점을 설명하기 부족했다. 그래서 스프링만의 차별점을 설명하기 위해 만들어진 개념이 DI이다.
DI는 Spring에서 IoC 구조를 만드는 방식이다.
DI를 그대로 해석하면 의존성 주입이다. 의존성은 무엇이고 왜 주입할까? 프로그래밍에서 뜻하는 의존성은 객체간의 관계를 먼저 알아야 이해하기 쉽다.
클래스 사이의 관계
DI를 사용하는 이유는 객체간의 의존성을 줄이기 위함이다. 밖에서 객체를 생성해 넣어주기 때문에 재사용성이 늘어나고 수정에 용이해진다.
// 기존 자바 프로젝트
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 함수가 필요하지만, DI처럼 의존성을 주입해 사용한다면 Blog_log 하나의 클래스 만으로 모든 글을 관리할 수 있다.
최종 수정 : 2021-03-31
개념 정리가 필요했는데 도움 많이 됐습니다. 감사합니다