Servlet 은 Java를 이용해 동적으로 웹 페이지를 생성하는 스크립트 언어이다.

하지만 Servlet에서 코드를 작성하게 되면

@WebServlet(name = "memberSaveServlet", urlPatterns = "/servlet/members/save")
public class MemberSaveServlet extends HttpServlet {

    private final MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        final String username = request.getParameter("username");
        final int age = Integer.parseInt(request.getParameter("age"));
        final Member member = new Member(username, age);
        memberRepository.save(member);

        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");
        final PrintWriter printWriter = response.getWriter();
        printWriter.write("<html>\n" +
            "<head>\n" +
            " <meta charset=\"UTF-8\">\n" +
            "</head>\n" +
            "<body>\n" +
            "성공\n" +
            "<ul>\n" +
            " <li>id=" + member.getId() + "</li>\n" +
            " <li>username=" + member.getUsername() + "</li>\n" +
            " <li>age=" + member.getAge() + "</li>\n" +
            "</ul>\n" +
            "<a href=\"/index.html\">메인</a>\n" +
            "</body>\n" +
            "</html>");
    }
}

이와 같이 자바코드 안에 HTML 코드를 작성해야 해서 생산성과 유지보수 측면에서 많은 에로사항이 발생했다..(딱 봐도 태그 하나 잘못 쓰면 하루종일 찾아야 할것 처럼 보임;;)

이와 같은 문제를 해결하기 위해서 JSP 스크립트 언어가 나왔다. JSP 는 오히려 HTML 코드에 자바 코드를 넣어 Servlet에서 HTML 코드를 짜는 데 있어서 불편함을 해결 할 수 있었다.

<%@ page import="hello.servlet.basic.domain.member.Member" %>
<%@ page import="hello.servlet.basic.domain.member.MemberRepository" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    final MemberRepository memberRepository = MemberRepository.getInstance();
    final String username = request.getParameter("username");
    final int age = Integer.parseInt(request.getParameter("age"));
    final Member member = new Member(username, age);
    memberRepository.save(member);
%>
<html>
<head>
    <title>Title</title>
</head>
<body>
성공
<ul>
    <li>id=<%=member.getId()%>
    </li>
    <li>username=<%=member.getUsername()%>
    </li>
    <li>age=<%=member.getAge()%>
    </li>
</ul>
<a href="/index.html">메인</a>
</body>
</html>

근데 그러면 JSP나 Servlet중 둘중 하나 정해서 페이지 만들면 되지 왜 두개를 같이 사용할까?

 

여전히 보이는 문제는 화면단에 비즈니스로직, 데이터 조회와 같은 자바코드가 들어가 있어 유지보수하기 불편합니다.( UI 를 변경할 떄나 비즈니스로직을 변경할 때나 똑같은 파일을 수정해야함!)

 

이러한 문제를 해결 하기 위해 MVC 패턴이 등장했다.

 

Servlet은 자바코드를 통해 서버단 비즈니스 로직을 처리하는데 특화되어있고

JSP 같은 뷰 템플릿은 화면을 렌더링 하는데 최적화 되어있기 때문에 각 부분의 업무만 담당하는 것이 가장 효과적일 것이다.

 

따라서, Servlet은 데이터를 읽어 DB와 통신하고 비즈니스 로직을 호출 및 실행하는 Controller 역할을 맡고

Model은 비즈니스로직을 통해 처리된 데이터들을 담아두는 역할을 맡고 (데이터베이스 관련 로직처리)

JSP는 모델에 담겨진 데이터를 사용해 HTML을 생성하는 View 역할을 맡아 각 모듈간 의존성을 낮춰 유지보수성을 높일 수 있다.

 

MVC패턴의 흐름을 말하면

클라이언트가 요청을 보내면 

Controller 는 HTTP 요청을 받아 알맞은 비즈니스로직과 Model을 호출하고

Model은 뷰에 출력할 데이터베이스나 파일과 같은 데이터 들을 제어한다.  (DAO ,DTO)

View 는 모델에 담겨진 데이터를 가져와 HTML을 응답으로 클라이언트에게 보내주게 된다.

 

또한 대부분 위 사진처럼 Controller와 Reposiotry를 분리하여 작성하는데 이유는 컨트롤러에서 비즈니스 로직까지 처리하면 유지보수가 불편해 비즈니스로직과 데이터 접근하는 기능을 Repository로 분리하여 개발하게 된다.

 

이러한 패턴을 사용하기 편하게 하기위해 MVC 프레임워크인 Spring 이 등장하게 된다.

 

Spring 주요기능

  • POJO(Plain Old Java Object)
    • 상속, 인터페이스가 필요없는 객체
    • 순수하게 getter, setter로 이루어진 bean
  • DI(Dependency Injection) : 객체를 직접 생성하지 않고 외부에서 생성한 후 주입시켜 주는 방식
    • 의존형 주입
    • 객체의 의존성을 외부에서 주입하는 개념 -> 각각 의존성이 존재할 경우 Spring이 서로 연결시켜줌
    • 애플리케이션 구성
    • ex) 다양한 DB 사용 가능
  • AOP(Aspect Orientated Programming)
    • 관점지향프로그래밍
    • 여러 곳에서 공통적으로 쓰이는 기능들을 분리하여 관리해 재사용한다.
    • 횡단 관심사 분리
  • IOC (Inversion Of Control) : 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것

    Bean(Spring는 객체를 Bean이라고함)들은 싱글턴 패턴의 특징을 가져 Spring이 실행될 때 필요한 곳에 만들어준다.

 

 

 

 

출처 : https://steady-coding.tistory.com/463

 

 

'TIL' 카테고리의 다른 글

[TIL] Vue 정리  (0) 2021.11.05
마크다운(MarkDown) 사용법  (0) 2021.10.04
운영체제 CS  (0) 2021.10.01
Git 브랜치 전략  (0) 2021.09.28
[TIL] JWT TOKEN, Cookie & Session  (0) 2021.09.26
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기