섹션3. 서블릿, JSP, MVC 패턴

허현진·2021년 11월 13일
0

servlet

  • servlet을 이용해서 response로 html 내보낼 때 자바코드로 html 다 작성해야 함
    (자바코드에 html) : 복잡하고 비효율적

=> 템플릿 엔진 사용
: html 에다가 자바코드를 넣는 것.
ex) JSP, Thymeleaf (고전 : JSP -> 최근 :Thymeleaf)

servlet --> jsp

  • servlet 과 jsp 파일 서비스 로직 동일하게 작성.

<jsp파일>
1. html 태그 위에서 <%%>내에 로직을 작성하고
--> request, reponse 그냥 사용 가능 (jsp도 내부적으로 servlet으로 변환되어 사용됨)
2. html 내에서 <%%>내에 자바 코드 작성

  • <%%> : 자바 코드 입력
  • <%=%> : 자바 코드 출력
  • <%%> + out : 자바코드 출력
    --> servlet의 setcontent+getwriter 함수 대신 jsp는 html코드로 작성

servlet보다 jsp가 조금 더 편하긴 하지만 하나의 jsp 파일에 비지니스 로직 + view부분 모두 작성해 주어야 함.

변경의 라이프 사이클이 다른 부분은 분리해야 함

MVC 패턴 시작

비지니스 로직은 서블릿 처럼 다른곳에서 처리하고, JSP는 목적에 맞게 HTML로 View을 그리도록!

  • Controller에 비지니스 로직 작성하고 model에 데이터 전달 (servlet)
  • model : 뷰에 출력할 데이터를 담아둠.
  • View에서 model의 데이터를 참조해서 화면 렌더링 (jsp)![]

    구체적인 로직
  1. 컨트롤러는 http요청이 제대로 맞는지 확인 하는 역할
  2. http가 제대로 맞으면 서비스, 리포지토리에서 기능 수행 (원래는 서비스에서 비지니스 로직 처리)
  3. model에 수행한 기능의 결과 담음
  4. view에서 model을 참조하여 화면 렌더링

MVC 패턴 적용

서블릿 -> 컨트롤러
JSP ->
HttpServletRequest 객체 -> 모델

  • request는 내부에 데이터 저장소를 가지고 있는데, request,setAttibute(), request.getAttribute()를 사용하면 데이터를 보관하고, 조회할 수 있다.
  • 컨트롤러에서는 setAttribute로 데이터 저장, 뷰에서는 getAttribute() 로 데이터 참조
  • jsp에서 getAttribute 대신 ${name.property}로 가능

경로

jsp에서

form action ="/save"면 절대경로
form action ="save"면 상대경로 --> 현재 path에서 이동(마지막 경로만 save로 변환)

  • dispatcher.forward() : 다른 서블릿이나 JSP로 이동할 수 있는 기능
    : 클라이언트에 응답이 갔다 웹브라우저가 다시 redirect X
    : 그냥 서버에서 method 호출하듯이 한번 실행

  • 원래 web-app내에 있는 파일의 경로 localhost:8080뒤에 입력하면 페이지 호출 되었음.

  • WEB-INF폴더 내에 있는 파일들은 controller를 거쳐서만 호출되고 싶은 파일들. 따라서 외부에서 직접적으로 경로로 호출되지 않음 (servlet단에서 forward를 통해서만 호출)

  • redirect vs forward
    redirect는 실제 클라이언트에 응답이 나갔다가, 클라이언트가 redirect 경로로 다시 요청한다. 따라서 클라이언트가 인지할 수 있고 URL경로도 실제로 변경됨. (두번 호출)
    forward는 서버 내부에서 일어나는 호출이기 때문에 클라이언트가 인지하지 못한다.

MVC 패턴 한계

MVC 패턴을 적용한 덕분에 컨트롤러의 역할과 뷰를 렌더링 하는 역할 명확하게 구분 가능
뷰는 단순하게 모델에서 필요한 데이터를 꺼내고, 화면을 만들면 되지만 컨트롤러는 아직 중복이 많고, 필요하지 않은 코드도 존재
<단점>


  • 공통 처리가 어려움 --> 컨트롤러 호출 전에 공통 기능을 먼저 처리해야 한다.(문지기 역할)
    ==> 프론트 컨트롤러 패턴을 도입하면 문제 해결 가능(입구를 하나로)

--> 우리들만의 프레임워크.. spring MVC도 프론트 컨트롤러 패턴을 구현한 것임.

profile
코딩일지..

0개의 댓글