Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- cannot determine url for
- 자동으로 줄내리기
- 7기
- System
- /js/app/index.js
- sysout자동입력
- http://localhost:8080/js/app/index.js
- 싸피
- 줄변경
- SSAFY
- 회고
- Word Wrap
- 줄바꿈
- Java
- 사피
- 구글 로그인 후 js
- 삼성청년소프트웨어아카데미
- System.out.println
- 취업퇴소
- 이클립스
- 특화프로젝트
- sysout
- 중도퇴소
- 구글 로그인 후 redirect
- Cannot determine URI for
- 구글 로그인 후 경로
Archives
- Today
- Total
IT탐험
모델2 본문
- 모델1 : 뷰와 비즈니스로직을 모두 JSP 페이지 하나에서 처리하는 구조
- 구성요소 : JSP , 자바빈 or 서비스 클래스
- 장점 : 구조가 단순하여 배우기 쉽고, 숙련된 개발자가 아니여도 구현이 용이
- 단점 : 뷰코드, 자바코드가 섞이기 때문에 JSP 코드자체가 복잡해지고 재사용성이 떨어지며, 프론트와 백의 분업이 용이하지 않고 유지보수가 어렵다
- 모델2 : 웹 앱의 기능들( 클라이언트의 요청 처리, 응답 처리, 비즈니스, 로직 처리)을 분리해서 구현
- 현재 모든 웹 프로그램은 모델2 방식으로 개발한다고 봐도 무방
- 특징
- 각 기능이 서로 분리되어 있어 개발 및 유지보수가 쉽다
- 각 기능의 재사용송이 높다
- 디자이너와 개발자의 작업을 분업화해서 쉽게 개발가능
- 모델2 방식과 관련된 기능이나 개념의 학습이 필요
- 동작 방식
- 클라이언트 요청 -> 요청 처리 -> 로직 처리 -> DB 조회 -> 로직 처리 -> 요청 처리 -> 화면 기능 -> 결과 출력
MVC 디자인 패턴
- 모델2 구조의 여러 가지 개념들 중 가장 자주 사용되는 개념이 MVC이다
- MVC : Model-View-Controller
- MVC 구성 요소와 특징
- Model
- 데이터베이스 연동과 같은 비즈니스 로직을 수행
- 일반적으로 DAO와 VO 클래스로 이루어져 있다
- View
- JSP가 화면 기능을 담당
- Model에서 처리한 결과를 화면에 표시
- Controller
- 서블릿이 컨트롤러의 역할을 한다
- 클라이언트의 요청을 분석
- 요청에 대해서 필요한 모델을 호출
- Model에서 처리한 결과를 보여주기 위해 JSP를 선택
- Model
MVC를 이용한 구현
- 조회 기능 구현
- 흐름
- 브라우저에서 요청
- 서블릿이 요청을 받아 DAO의 조회 메서드를 호출
- DAO의 조회 메서드에서 SQL문으로 정보 조회 후 정보를 VO에 설정하여 반환
- 서블릿에서 조회한 정보를 JSP로 포워딩
- JSP에서 포워딩한 정보를 브라우저로 출력
- 구현 예시
-
더보기
@WebServlet("/mem.do") public class MemberController extends HttpServlet { private static final long serialVersionUID = 1L; MemberDAO memberDAO; @Override public void init() throws ServletException { memberDAO = new MemberDAO(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doHandle(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doHandle(request, response); } private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); List<MemberVO> membersList = memberDAO.listMembers(); request.setAttribute("membersList", membersList); RequestDispatcher dispatch = request.getRequestDispatcher("/test01/listMembers.jsp"); dispatch.forward(request, response); } }
public class MemberDAO { private DataSource dataFactory; private Connection conn; private PreparedStatement pstmt; public MemberDAO() { try { Context ctx = new InitialContext(); Context envContext = (Context) ctx.lookup("java:/comp/env"); dataFactory = (DataSource) envContext.lookup("jdbc/oracle"); }catch (Exception e) { e.printStackTrace(); } } public List<MemberVO> listMembers() { List<MemberVO> membersList = new ArrayList<MemberVO>(); try { conn = dataFactory.getConnection(); String query = "select * from t_member order by joinDate desc"; System.out.println(query); pstmt = conn.prepareStatement(query); ResultSet rs = pstmt.executeQuery(); while(rs.next()) { String id = rs.getString("id"); String pwd = rs.getString("pwd"); String name = rs.getString("name"); String email = rs.getString("email"); Date joinDate = rs.getDate("joinDate"); MemberVO memberVO = new MemberVO(id,pwd,name,email,joinDate); membersList.add(memberVO); } rs.close(); pstmt.close(); conn.close(); }catch (Exception e) { e.printStackTrace(); } return membersList; } }
public class MemberVO { private String id; private String pwd; private String name; private String email; private Date joinDate; public MemberVO(String id, String pwd, String name, String email, Date joinDate) { super(); this.id = id; this.pwd = pwd; this.name = name; this.email = email; this.joinDate = joinDate; } getter/setter 추가 }
<%@ page language="java" contentType="text/html; charset=UTF-8" import="java.util.*, ex01.*" isELIgnored="false" pageEncoding="UTF-8"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% request.setCharacterEncoding("utf-8"); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>정보 출력</title> <style> .cls1 { font-size: 40px; text-align: center; } .cls2 { font-size: 20px; text-align: center; } </style> </head> <body> <p class="cls1">회원정보</p> <table align="center" border="1"> <tr align="center" bgcolor="lightgreen"> <td width="7%"><b>아이디</b></td> <td width="7%"><b>비밀번호</b></td> <td width="7%"><b>이름</b></td> <td width="7%"><b>이메일</b></td> <td width="7%"><b>가입일</b></td> </tr> <c:choose> <c:when test="${ empty membersList }"> <tr> <td colspan=5> <b>등록된 회원이 없습니다</b> </td> </tr> </c:when> <c:when test="${ !empty membersList }"> <c:forEach var="mem" items="${membersList}"> <tr align="center"> <td>${mem.id}</td> <td>${mem.pwd}</td> <td>${mem.name}</td> <td>${mem.email}</td> <td>${mem.joinDate}</td> </tr> </c:forEach> </c:when> </c:choose> </table> <a href="#"> <p class="cls2">회원 가입하기</p> </a> </body> </html>
-
- 흐름
- 추가 기능 구현
- 컨트롤러는 브라우저로부터 전달되는 요청을 구분하고 그 요청에 해당하는 모델을 선택하여 작업을 요청할 때 커맨드 패턴을 사용
- 커맨더 패턴 : 브라우저가 URL 패턴을 이용해 컨트롤러에게 수행 작업을 요청하는 방법
- 컨트롤러는 HttpServletRequest의 getPathInfo() 메서드로 URL 패턴에서 요청명을 받아와 작업을 수행
- 예시 : http://localhost:8080/pro17/member/listMember.do
- 흐름
- 브라우저에서 정보를 입력하고 URL 패턴으로 서버에 추가 요청
- 컨트롤러에서 getPathInfo() 메서드로 URL 패턴의 추가 요청명을 받음
- 요청명에 대해 DAO의 추가 메서드를 호출
- 추가 메서드에서 SQL문으로 테이블에 회원 정보 추가
- 구현 예시
-
더보기
private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String nextPage = null; request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); String action = request.getPathInfo(); System.out.println("action : " + action); if(action == null || action.equals("/listMembers.do")) { List<MemberVO> membersList = memberDAO.listMembers(); request.setAttribute("membersList", membersList); nextPage = "/test02/listMembers.jsp"; } else if(action.equals("/addMember.do")) { String id = request.getParameter("id"); String pwd = request.getParameter("pwd"); String name = request.getParameter("name"); String email = request.getParameter("email"); MemberVO memberVO = new MemberVO(id, pwd, name, email); memberDAO.addMember(memberVO); nextPage = "/member/listMembers.do"; } else if(action.equals("/memberForm.do")) { nextPage = "/test02/memberForm.jsp"; } else { List<MemberVO> membersList = memberDAO.listMembers(); request.setAttribute("membersList", membersList); nextPage = "/text02/listMembers.jsp"; } RequestDispatcher dispatch = request.getRequestDispatcher(nextPage); dispatch.forward(request, response); }
public class MemberDAO { ...생략 public void addMember(MemberVO m) { try { conn = dataFactory.getConnection(); String id = m.getId(); String pwd = m.getPwd(); String name = m.getName(); String email = m.getEmail(); String query = "insert into t_member(id, pwd, name, email) VALUES(?, ?, ?, ?)"; System.out.println(query); pstmt = conn.prepareStatement(query); pstmt.setString(1, id); pstmt.setString(2, pwd); pstmt.setString(3, name); pstmt.setString(4, email); pstmt.executeUpdate(); pstmt.close(); conn.close(); }catch (Exception e) { e.printStackTrace(); } } }
<%@ page language="java" contentType="text/html; charset=UTF-8" import="java.util.*, ex01.*" isELIgnored="false" pageEncoding="UTF-8"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:set var="contextPath" value="${pageContext.request.contextPath}" /> <% request.setCharacterEncoding("utf-8"); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>정보 출력</title> <style> .cls1 { font-size: 40px; text-align: center; } .cls2 { font-size: 20px; text-align: center; } </style> </head> <body> <p class="cls1">회원정보</p> <table align="center" border="1"> <tr align="center" bgcolor="lightgreen"> <td width="7%"><b>아이디</b></td> <td width="7%"><b>비밀번호</b></td> <td width="7%"><b>이름</b></td> <td width="7%"><b>이메일</b></td> <td width="7%"><b>가입일</b></td> </tr> <c:choose> <c:when test="${ empty membersList }"> <tr> <td colspan=5> <b>등록된 회원이 없습니다</b> </td> </tr> </c:when> <c:when test="${ !empty membersList }"> <c:forEach var="mem" items="${membersList}"> <tr align="center"> <td>${mem.id}</td> <td>${mem.pwd}</td> <td>${mem.name}</td> <td>${mem.email}</td> <td>${mem.joinDate}</td> </tr> </c:forEach> </c:when> </c:choose> </table> <a href="${contextPath}/member/memberForm.do"> <p class="cls2">회원 가입하기</p> </a> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:set var="contextPath" value="${pageContext.request.contextPath}" /> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>회원 가입창</title> </head> <body> <form method="post" action="${contextPath}/member/addMember.do"> <h1 style="text-align:center">회원 가입창</h1> <table align="center"> <tr> <td width="200"> <p align="right">아이디</p> </td> <td width="400"> <input type="text" name="id"> </td> </tr> <tr> <td width="200"> <p align="right">비밀번호</p> </td> <td width="400"> <input type="password" name="pwd"> </td> </tr> <tr> <td width="200"> <p align="right">이름</p> </td> <td width="400"> <input type="text" name="name"> </td> </tr> <tr> <td width="200"> <p align="right">이메일</p> </td> <td width="400"> <input type="text" name="email"> </td> </tr> <tr> <td width="200"> <p> </p> </td> <td width="400"> <input type="submit" value="가입하기"> <input type="reset" value="다시입력"> </td> </tr> </table> </form> </body> </html>
-
- 수정 및 삭제 기능 구현
- 수정 흐름
- 브라우저에서 URL 패턴으로 컨트롤러에 수정 요청과 수정할 정보 전송
- 컨트롤러가 전송된 정보를 가져온 후 테이블의 정보 수정
- 컨트롤러가 수정된 회원 목록창 전송
- 삭제 흐름
- 브라우저에서 URL 패턴으로 컨트롤러에 삭제 요청과 삭제할 기본키 전송
- 컨트롤러는 request의 getPathInfo() 메서드로 요청명을 가져옴
- 회원 ID를 SQL문으로 전달하여 테이블에서 정보 삭제
- 구현 예시
-
더보기
private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String nextPage = null; request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); String action = request.getPathInfo(); System.out.println("action:" + action); if (action == null || action.equals("/listMembers.do")) { List<MemberVO> membersList = memberDAO.listMembers(); request.setAttribute("membersList", membersList); nextPage = "/test03/listMembers.jsp"; } else if (action.equals("/addMember.do")) { String id = request.getParameter("id"); String pwd = request.getParameter("pwd"); String name = request.getParameter("name"); String email = request.getParameter("email"); MemberVO memberVO = new MemberVO(id, pwd, name, email); memberDAO.addMember(memberVO); request.setAttribute("msg", "addMember"); nextPage = "/member/listMembers.do"; } else if (action.equals("/memberForm.do")) { nextPage = "/test03/memberForm.jsp"; }else if(action.equals("/modMemberForm.do")){ String id=request.getParameter("id"); MemberVO memInfo = memberDAO.findMember(id); request.setAttribute("memInfo", memInfo); nextPage="/test03/modMemberForm.jsp"; }else if(action.equals("/modMember.do")){ String id=request.getParameter("id"); String pwd=request.getParameter("pwd"); String name= request.getParameter("name"); String email= request.getParameter("email"); MemberVO memberVO = new MemberVO(id, pwd, name, email); memberDAO.modMember(memberVO); request.setAttribute("msg", "modified"); nextPage="/member/listMembers.do"; }else if(action.equals("/delMember.do")){ String id=request.getParameter("id"); memberDAO.delMember(id); request.setAttribute("msg", "deleted"); nextPage="/member/listMembers.do"; }else { List<MemberVO> membersList = memberDAO.listMembers(); request.setAttribute("membersList", membersList); nextPage = "/test03/listMembers.jsp"; } RequestDispatcher dispatch = request.getRequestDispatcher(nextPage); dispatch.forward(request, response); }
public void modMember(MemberVO memberVO) { String id = memberVO.getId(); String pwd = memberVO.getPwd(); String name = memberVO.getName(); String email = memberVO.getEmail(); try { conn = dataFactory.getConnection(); String query = "update t_member set pwd=?,name=?,email=? where id=?"; System.out.println(query); pstmt = conn.prepareStatement(query); pstmt.setString(1, pwd); pstmt.setString(2, name); pstmt.setString(3, email); pstmt.setString(4, id); pstmt.executeUpdate(); pstmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } public void delMember(String id) { try { conn = dataFactory.getConnection(); String query = "delete from t_member where id=?"; System.out.println(query); pstmt = conn.prepareStatement(query); pstmt.setString(1,id); pstmt.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:set var="contextPath" value="${pageContext.request.contextPath}" /> <% request.setCharacterEncoding("UTF-8"); %> <html> <head> <c:choose> <c:when test='${msg=="addMember" }'> <script> window.onload=function(){ alert("회원을 등록했습니다."); } </script> </c:when> <c:when test='${msg=="modified" }'> <script> window.onload=function(){ alert("회원 정보를 수정했습니다."); } </script> </c:when> <c:when test= '${msg=="deleted" }'> <script> window.onload=function(){ alert("회원 정보를 삭제했습니다."); } </script> </c:when> </c:choose> <meta charset="UTF-8"> <title>회원 정보 출력창</title> <style> .cls1 { font-size:40px; text-align:center; } .cls2 { font-size:20px; text-align:center; } </style> </head> <body> <p class="cls1">회원정보</p> <table align="center" border="1" > <tr align="center" bgcolor="lightgreen"> <td width="7%" ><b>아이디</b></td> <td width="7%" ><b>비밀번호</b></td> <td width="7%" ><b>이름</b></td> <td width="7%"><b>이메일</b></td> <td width="7%" ><b>가입일</b></td> <td width="7%" ><b>수정</b></td> <td width="7%" ><b>삭제</b></td> </tr> <c:choose> <c:when test="${empty membersList}" > <tr> <td colspan=5> <b>등록된 회원이 없습니다.</b> </td> </tr> </c:when> <c:when test="${!empty membersList}" > <c:forEach var="mem" items="${membersList }" > <tr align="center"> <td>${mem.id }</td> <td>${mem.pwd }</td> <td>${mem.name}</td> <td>${mem.email }</td> <td>${mem.joinDate}</td> <td><a href="${contextPath}/member/modMemberForm.do?id=${mem.id }">수정</a></td> <td><a href="${contextPath}/member/delMember.do?id=${mem.id }">삭제</a></td> </tr> </c:forEach> </c:when> </c:choose> </table> <a href="${contextPath}/member/memberForm.do"><p class="cls2">회원 가입하기</p></a> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:set var="contextPath" value="${pageContext.request.contextPath}" /> <% request.setCharacterEncoding("UTF-8"); %> <head> <meta charset="UTF-8"> <title>회원 정보 수정창</title> <style> .cls1 { font-size:40px; text-align:center; } </style> </head> <body> <h1 class="cls1">회원 정보 수정창</h1> <form method="post" action="${contextPath}/member/modMember.do?id=${memInfo.id}"> <table align="center" > <tr> <td width="200"><p align="right" >아이디</td> <td width="400"><input type="text" name="id" value="${memInfo.id}" disabled ></td> </tr> <tr> <td width="200"><p align="right" >비밀번호</td> <td width="400"><input type="password" name="pwd" value="${memInfo.pwd}" > </td> </tr> <tr> <td width="200"><p align="right" >이름</td> <td width="400"><input type="text" name="name" value="${memInfo.name}" ></td> </tr> <tr> <td width="200"><p align="right" >이메일</td> <td width="400"><input type="text" name="email" value="${memInfo.email}" ></td> </tr> <tr> <td width="200"><p align="right" >가입일</td> <td width="400"><input type="text" name="joinDate" value="${memInfo.joinDate }" disabled ></td> </tr> <tr align="center" > <td colspan="2" width="400"><input type="submit" value="수정하기" > <input type="reset" value="다시입력" > </td> </tr> </table> </form> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:set var="contextPath" value="${pageContext.request.contextPath}" /> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>회원 가입창</title> <body> <form method="post" action="${contextPath}/member/addMember.do"> <h1 style="text-align:center">회원 가입창</h1> <table align="center"> <tr> <td width="200"><p align="right">아이디</td> <td width="400"><input type="text" name="id"></td> </tr> <tr> <td width="200"><p align="right">비밀번호</td> <td width="400"><input type="password" name="pwd"></td> </tr> <tr> <td width="200"><p align="right">이름</td> <td width="400"><p><input type="text" name="name"></td> </tr> <tr> <td width="200"><p align="right">이메일</td> <td width="400"><p><input type="text" name="email"></td> </tr> <tr> <td width="200"><p> </p></td> <td width="400"> <input type="submit" value="가입하기"> <input type="reset" value="다시입력"> </td> </tr> </table> </form> </body> </html>
-
- 수정 흐름
답변형 게시판
- 게시판 기능은 모든 웹 페이지의 기본 기능을 포함한다. 때문에 게시판을 만들 수 있다면 모든 웹 페이지를 쉽게 만들 수 있다
- 실제 개발에서는 Service 클래스를 거쳐서 DAO 클래스의 기능을 수행하도록 구현한다
- DAO는 DB에 접근하는 기능을 수행하고 Service는 실제 프로그램을 업무에 적용하는 사용자 입장에서 업무 단위, 즉 트랜잭션으로 작업을 수행한다
- 트랜잭션 : 사용자 입장에서 하나의 논리적인 기능을 의미하고, 일반적으로 묶어서 처리하는 단위 기능을 뜻함
- 실제 개발에서는 유지보수와 시스템의 확장성을 위해 Service 클래스의 메서드를 이용해 큰 기능을 단위 기능으로 나눈 후 Service 클래스의 각 메서드는 세부적인 기능을 하는 DAO의 SQL문들을 조합하여 자신의 기능을 구현한다
- 구현 예시는 스프링 프레임워크로 적용하며 기록
'게시판만들기기록 > 스프링 프레임워크' 카테고리의 다른 글
스프링 JDBC (0) | 2021.10.07 |
---|---|
스프링 MVC (0) | 2021.10.06 |
관점 지향 프로그래밍 (0) | 2021.10.06 |
의존성 주입과 제어의 역전 (0) | 2021.10.06 |
프레임워크란 (0) | 2021.10.05 |
Comments