2022-04-18(월)

MVC 모델 1의 한계

Client 측 장비가 다양화 됨 -> 요구하는 응답 데이터의 포맷이 다양해졌다.
PC, Android, iOS 등

장비 다양화 -> 응답 데이터 포맷 다양화
PC -> HTML, CSS, JS
모바일 -> XML, JSON
기타 -> Excel, PDF, JPEG

Web Browser → list.jsp → BoardService → BoardDao → MyBatis → JDBC Driver → DBMS

Androd/iOS → list_xml.jsp → BoardService → BoardDao → MyBatis → JDBC Driver → DBMS

기타 → list_json.jsp → BoardService → BoardDao → MyBatis → JDBC Driver → DBMS

• 서비스 객체를 사용하기 전에 입력 데이터를 가공하는 코드
• 출력할 데이터를 준비하는 코드
• 서비스 객체를 호출하는 코드
가 중복된다
⇒ 중복 코드 제거 필요!

모델1 구조를 개선

모델1에서 모델2로 진화

MVC 모델 2 등장

모델1의 한계 극복
"입∙출력 데이터 가공, 서비스 객체 호출 코드"가 중복되는 문제

BoardListController → BoardService → BoardDao → MyBatis → JDBC Driver → DBMS

웹 페이지를 요구하면 list.jsp를 실행
xml을 요구하면 list_xml.jsp를 실행
JSON 데이터를 요구하면 list_json.jsp를 실행
PDF를 요구하면 list_pdf.jsp를 실행

중간에서 어떤 jsp를 실행할지

어떤 뷰를 실행할지 통제한다

🔹 Controller 역할
• 입력 데이터 가공
• 서비스 객체 실행
• 출력 데이터 준비
• 뷰

🔹 View 역할
온전히 출력할 데이터를 가공하는 일에만 집중한다

MVC 모델 2 예 - 게시글 목록 조회

BoardListController : 출력 데이터 준비

forward

list.jsp : 목록 페이지 생성 및 출력

jsp는 서비스 객체와 연결고리가 없다
Controller만 그 일을 한다

http://localhost:8080/board/list?pageNo=1&pageSize=5

둘 다 같은 url을 가리키면 안 됨

getAttribute 리턴타입이 Object 이므로 형변환 해줘야 됨
Board board = (Board) request.getAttribute("board");

http://localhost:8080/board/list

컨트롤러에게 요청해야지 jsp에게 요청하면 안 됨

MVC 모델2에서 모든 요청은 Controller가 받아야 한다
jsp가 받지 않도록 한다
일관성이 중요
같은 방식을 써야 유지보수가 편해진다

http://localhost:8080/board/detail?no=62xxx

<jsp:useBean id="pageNo" type="java.lang.Integer" scope="request"></jsp:useBean>
<jsp:useBean id="pageSize" type="java.lang.Integer" scope="request"></jsp:useBean>
<jsp:useBean id="totalPageSize" type="java.lang.Integer" scope="request"></jsp:useBean>
<jsp:useBean id="list" type="java.util.List<Board>" scope="request"></jsp:useBean>

태그가 소속된 패키지 이름이 namespace

jsp 액션 태그

<jsp:태그명 속성명="값" ...></jsp:태그명> → 자바 코드 생성 (.java)
namespace: 태그가 소속된 그룹. 자바의 패키지와 유사한 개념.

예1)

<jsp:include page="url"/>
→ 자바 코드 생성 →
request.getRequestDispatcher("url").include()

예2)
type에는 반드시 전체 이름을 적어줘야 한다. 위에 import가 안 된다.

<jsp:useBean id="객체명" type="클래스" class="클래스" scope="보관소"/> 

→ 자바 코드 생성 →

java.util.List<Board> list = (java.util.List<Board>) request.getAttribute("list");
if (list == null) {
  list = (List<Board>) new ArrayList();
  request.setAttribute("list", list);
}

jsp 엔진이

특정 자바 코드 생성

<jsp:useBean id="board" type="com.eomcs.mylist.domain.Board" class="com.eomcs.mylist.domain.Board" scope="request"></jsp:useBean>

type이랑 class가 같으면 class만 입력해도 된다

느낌표가 뜨면 안 된다

https://search.maven.org/artifact/javax.servlet/jstl/1.2/jar

implementation 'javax.servlet:jstl:1.2'

"jstl 사용법" 검색

for (Board board : boards) {
%>
  <tr>
    <td><%=board.getNo()%></td>
    <td><a href='detail?no=<%=board.getNo()%>'><%=board.getTitle()%></a></td>
    <td><%=board.getWriter().getName()%></td>
    <td><%=board.getViewCount()%></td>
    <td><%=board.getCreatedDate()%></td>
  </tr>
<%
}

<c:forEach var="board" items="${requestScope.list}">
  <tr>
    <td>${board.getNo()}</td>
    <td><a href='detail?no=${board.getNo()}'>${board.getTitle()}</a></td>
    <td>${board.getWriter().getName()}</td>
    <td>${board.getViewCount()}</td>
    <td>${board.getCreatedDate()}</td>
  </tr>
</c:forEach>

EL (Expression Language)

OGNL 표기법 사용해서 객체의 getter 호출

EL과 보관소

/Users/nana/git/eomcs-java/eomcs-servlet/app

eomcs-java/eomcs-servlet/app

좋은 웹페이지 즐겨찾기