소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 일련의 협업화된 형태로 클래스들을 제공하는 것
Frame은 어떤 대상의 큰 틀이나 외형적인 구조를 의미하는데 프로그래밍 세계에서의 Frame 역시 이와 비슷한 의미를 지닌다.
위와 같은 맥락으로 소프트웨어 관점에서의 Framework는 우리가 어떠한 애플리케이션을 만들기 위한 틀 혹은 구조를 제공하는 개념으로 해석이 가능하다.
Java에서 Framework의 의미를 찾아볼 수 있는데, 바로 Collections Framework이다.
Java에서 자주 사용하는 Map이나 Set,List 등의 Collection들은 데이터를 저장하기 위해 널리 알려져 있는 자료구조를 바탕으로 비슷한 유형의 데이터들을 가공 및 처리하기 쉽도록 표준화 된 방법을 제공하는 클래스의 집합이다.
Java클래스의 유형 중에서 기본적인 뼈대로만 구성되어 있는 것은 바로 추상 메서드만 정의되어 있는 인터페이스이다. java에서 Colleciton은 바로 Map,Set,List 같은 인터페이스와 그 인터페이스들을 구현한 구현체들의 집합이다.
간단한 예시를 들면, 애플리케이션을 하나의 자동차로 비유하자.
차체를 구성하는 Frame, 바퀴 혹은 핸들 엔진과 같은 당야한 부품들이 모여 하나의 자동차를 이루고 있다.
이 자동를 구성하고 있는 요소에서 Framework는 자동차의 뼈대 즉, Frame을 의미한다.
그리고, Library는 자동차에서 다양한 기능을 제공하는 부품을 의미한다. 자동차가 나아가기 위한 바퀴,엔진 또는 라이트 등이 부품에 해당된다.
실제로 자동차를 구매 후 , 부품을 교체할 때 Frame은 쉽게 교체할 수 없다. 하지만, 바퀴나 와이퍼, 라이트는 언제든지 쉽게 교체가 가능하다. 즉, 소프트웨어 과넘에서도 한번 정해진 Framework를 교체하는 일은 어렵지만, Library는 수비게 교체가능 하며, 필요한 Library들을 선택적으로 사용할 수 있다는 의미이다.
우리가 웹 애플리케이션 개발을 위한 Framework에는 Spring 뿐만 아니라, Django,Express,Flask,Lalavel 등 다양한 Framework를 통해 개발이 가능하다.
이 중에서 Spring Framework만의 장점은 어떤 점이 있는지에 대해 알아보자
SpringFramework은 개발 생산성을 향상 시키고 애플리케이션의 유지 보수를 용이하게 하는 Framework의 기본 목적 그 이상을 달성하게 해준다.
JSP
Servlet
위에서 설명한 JSP 방식 역시 내부적으로는 Servlet 방식을 사용한다. Servlet은 클라이언트 웹 요청 처리에 특화된 Java 클래스의 일종이라고 보면 되는데, Spring을 사용한 웹 요청을 처리할때에도 내부적으로는 Servlet을 사용한다.
@WebServlet(name = "TodoServlet")
public class TodoServlet extends HttpServlet {
// (1) Database를 대신한다.
private List<ToDo> todoList;
@Override
public void init() throws ServletException {
super.init();
this.todoList = new ArrayList<>();
}
// (2)
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String todoName = request.getParameter("todoName");
String todoDate = request.getParameter("todoDate");
todoList.add(new ToDo(todoName, todoDate));
RequestDispatcher dispatcher =
request.getRequestDispatcher("/todo.jsp");
request.setAttribute("todoList", todoList);
dispatcher.forward(request, response);
}
// (3)
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("Hello Servlet doGet!");
RequestDispatcher dispatcher =
request.getRequestDispatcher("/todo.jsp");
dispatcher.forward(request, response);
}
}
[코드] 서블릿 방식의 예제 코드
클라이언트 측의 JSP 코드에서 서버 측 Java 코드는 서블릿 클래스로 분리했기 때문에 클라이언트와 서버 간에 어느 정도 역할이 분리되었다.
하지만, 한눈에 봐도 코드 자체가 길어 보인다.
Spring
위 Servlet 예제 코드를 Spring을 사용해 재작성해보면,
@Controller
public class ToDoController {
@RequestMapping(value = "/todo", method = RequestMethod.POST)
@ResponseBody
public List<ToDo> todo(@RequestParam("todoName")String todoName,
@RequestParam("todoDate")String todoDate) {
ToDo.todoList.add(new ToDo(todoName, todoDate));
return ToDo.todoList;
}
@RequestMapping(value = "/todo", method = RequestMethod.GET)
@ResponseBody
public List<ToDo> todoList() {
return ToDo.todoList;
}
}
[코드] Spring 예제코드
코드 자체가 간결해진 것을 볼 수 있다.
하지만, 이런 편리함과 간결함에도 불구하고 Spring 기반의 애플리케이션의 기본 구조를 잡는 설정 작업이 여전히 불편하다.