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 |
최근댓글