[Spring] Spring Framework 란?

Minit88·2023년 3월 31일
0

Spring

목록 보기
1/16
post-thumbnail

Lab_01 : Framework 란?

소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 일련의 협업화된 형태로 클래스들을 제공하는 것

Frame은 어떤 대상의 큰 틀이나 외형적인 구조를 의미하는데 프로그래밍 세계에서의 Frame 역시 이와 비슷한 의미를 지닌다.

위와 같은 맥락으로 소프트웨어 관점에서의 Framework는 우리가 어떠한 애플리케이션을 만들기 위한 틀 혹은 구조를 제공하는 개념으로 해석이 가능하다.

Framework 사용의 예

  • Java에서 Framework의 의미를 찾아볼 수 있는데, 바로 Collections Framework이다.

  • Java에서 자주 사용하는 Map이나 Set,List 등의 Collection들은 데이터를 저장하기 위해 널리 알려져 있는 자료구조를 바탕으로 비슷한 유형의 데이터들을 가공 및 처리하기 쉽도록 표준화 된 방법을 제공하는 클래스의 집합이다.

  • Java클래스의 유형 중에서 기본적인 뼈대로만 구성되어 있는 것은 바로 추상 메서드만 정의되어 있는 인터페이스이다. java에서 Colleciton은 바로 Map,Set,List 같은 인터페이스와 그 인터페이스들을 구현한 구현체들의 집합이다.

Framework 사용 장점

  • 효율적인 코드를 작성 가능
    • 개발하고자 하는 애플리케이션을 그 밑바닥부터 일일이 전부 개발하는 것이 아닌 다양한 기능들을 Framework 라이브러리 형태로 제종함으로써 개발자가 애플리케이션의 핵심 로직을 개발하는 것에 집중
  • 정해진 규약이 있어 애플리케이션을 효율적으로 관리 가능
    • Framework 의 규약에 맞게 코드를 작성하기 때문에, 유지보수가 필요한 경우 더 빠르고 쉽게 문제점을 파악해 수정할 수 있다.

Framework 사용 단점

  • 사용하고자 하는 Framework에 대한 학습이 필요하다
    • Framework에서 정하는 규약들을 학습할 시간이 필요하다는 의미
    • Spring의 경우 java언어에 대한 이해도 필요하지만 추가로 Spring 이라는 Framework에 대한 학습이 필요한 이유
  • 자유롭고 유연한 개발이 어렵다.
    • 예시를 들어 집의 구조자체를 변경할 경우 이미 만들어진것들을 모두 허물고 새롭게 구조부터 만들어야하는 단점이 있다.
      즉, 소프트웨어의 관점에서도 마찬가지이다.

Framework와 Library의 차이

간단한 예시를 들면, 애플리케이션을 하나의 자동차로 비유하자.

차체를 구성하는 Frame, 바퀴 혹은 핸들 엔진과 같은 당야한 부품들이 모여 하나의 자동차를 이루고 있다.
이 자동를 구성하고 있는 요소에서 Framework는 자동차의 뼈대 즉, Frame을 의미한다.
그리고, Library는 자동차에서 다양한 기능을 제공하는 부품을 의미한다. 자동차가 나아가기 위한 바퀴,엔진 또는 라이트 등이 부품에 해당된다.

실제로 자동차를 구매 후 , 부품을 교체할 때 Frame은 쉽게 교체할 수 없다. 하지만, 바퀴나 와이퍼, 라이트는 언제든지 쉽게 교체가 가능하다. 즉, 소프트웨어 과넘에서도 한번 정해진 Framework를 교체하는 일은 어렵지만, Library는 수비게 교체가능 하며, 필요한 Library들을 선택적으로 사용할 수 있다는 의미이다.

Lab_02 : SpringFramework 란?

우리가 웹 애플리케이션 개발을 위한 Framework에는 Spring 뿐만 아니라, Django,Express,Flask,Lalavel 등 다양한 Framework를 통해 개발이 가능하다.

이 중에서 Spring Framework만의 장점은 어떤 점이 있는지에 대해 알아보자

SpringFramework 장점

  • POJO(plan Old Java Oject)기반의 구성
  • DI(Dependency Injection) 지원
  • AOP(Aspect Oriented Programming, 관점지향 프로그래밍) 지원
  • Java 언어를 사용함으로써 얻는 장점
    • 정적 타입 언어로서 변수의 타입, 메서드의 입력과 출력이 어떤 타입을 가져야 하는지를 강제한다. 즉, 유지 및 보수가 용이

SpringFramework은 개발 생산성을 향상 시키고 애플리케이션의 유지 보수를 용이하게 하는 Framework의 기본 목적 그 이상을 달성하게 해준다.

JSP,Servlet,Spring

JSP

  • JSP는 Java Server Page의 약자로 초창기 Java 기반의 웹 애플리케이션 개발은 JSP을 통해 이루어졌다.
  • 웹 브라우저를 통해 사용자에게 클라이언트 측 html/javascript 코드와 사용자의 요청을 서버 측 java코드가 뒤섞여 있는 방식이다.
  • 코드 자체가 너무 길어서 가독성도 떨어지고 너무 복잡하다.
  • 애플리케이션의 유지 보수 측면에서 최악의 방식이다
  • 웹 디자이너와 html 퍼블리셔 개발자 간에 효율적으로 협업하는 것이 불가능할 수준이다.

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 기반의 애플리케이션의 기본 구조를 잡는 설정 작업이 여전히 불편하다.

profile
" To be BE "

0개의 댓글