MVC2
https://seongmun-hong.github.io/spring/MVC1-MVC2
MVC1 vs MVC2 Architecture
MVC1와 MVC2 1. MVC란 ? Model, View, Controller의 약자로 사용자와 상호작용 하는 S/W를 디자인 함에 있어서 세 가지 요소로 나누는 ...
Seongmun-Hong.github.io
MODEL
비즈니스 로직을 처리하는 영역
VIEW
사용자에게 보여지는 부분
CONTROLLER
사용자의 요청에 대한 흐름을 제어하는 부분
1. 사용자에게 요청이 들어오면 Servlet로 만든 Controller에서 받는다. (직접 JSP에서 받는 일이 없다.)
Controller에서는 MODEL과 VIEW를 연결하고 데이터의 흐름을 제어하는 역할을 한다.
2. 비즈니스 로직에 관해서는 모델 객체을 활용한다. (Service - Dao - Vo)
3.
- 비즈니스 로직을 처리하는 객체, 트랜잭션이 처리하고 컨트롤러로 결과를 리턴 = Service,
- 필요한 Value Object 제공 = VO,
- 데이터 베이스와 연결되어 데이터를 가져오거나 하는 역할 = DAO
4. 처리된 결과를 다시 Servlet으로 전달한다. 그러면 결과 중에 사용자에게 보여줄 페이지에 필요한 데이터만 JSP(View)로 forwarding해서 전달한다.
5. JSP 페이지에서는 사용자에게 보여줄 페이지를 그려주기만 한다. 즉, VIEW에서는 MODEL이 처리한 데이터를 Controller를 통해서 받아서 보여준다.
6. View에서 브라우저(사용자)로 결과를 응답한다.
** 장점 : 유지보수 용이, 확장성, 재사용이 가능
** 단점 : 관리할 파일이 많다.
MVC2 패턴을 활용하여 회원가입 페이지를 만들 때 사용했던 구조 하나하나에 대한 기록 작성
로그인
01. LoginServlet.java
- mvc > member > controller 밑에 생성
- 로그인 후 메인 페이지로 오게 만들 때에는 리다이렉트 메소드를 사용한다.
- why? forward는 URL이 변경되지 않기 때문에
response.sendRedirect(request.getContextPath() + "/");
- 여기에서는 비즈니스 로직을 구현하지 않고 VIEW 페이지에 포워딩 하는 역할만 한다.
- member 관련한 서비스 로직은 누가? -> private MemberService service = new MemberService(); 객체를 만들고 위임한다.
- 로그인에 성공하면 로그인한 멤버 객체를 리턴, 실패하면 null을 리턴
02. MemberService.java
- mvc > member > model > service 밑에 생성
- 필요한 비즈니스 로직을 처리한다.
- 직접 데이터베이스에 접근하지 않기 때문에 역할을 할 객체인 Dao가 필요하다.
- Dao 객체를 생성한다. private MemberDao dao = new MemberDao();
03. Member.java
- mvc > member > model > vo 밑에 생성
04. login 메소드 생성
- MemberService 클래스 안에 생성
- 사용자로부터 넘겨받은 파라미터를 로그인에 사용할 매개변수로 지정한다.
05. MemberDao.java
- mvc > member > model > dao 밑에 생성
- 아이디를 데이터베이스로부터 찾아올 메소드를 생성한다.
- 데이터 베이스에서 찾는 하나의 행을 객체로 만들어서 변경해준다.
- 필요한 객체들을 가져오기 전에 변수를 먼저 선언한다.
1) Connection (java.sql)
2) PreparedStatement (java.sql)
3) ResultSet (java.sql)
- 다운로드 받은 DBMS Driver를 등록한다.
Class.forName("oracle.jdbc.driver.OracleDriver"); 하고 try~catch 예외처리한다.
- DriverManager 클래스를 통해서 Connection을 얻어온다. 매개 값으로 ("URL", "ID", "PASSWORD") 전달하고 add catch로 예외처리를 해줄 것 = SQLExeption
DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "아이디", "패스워드");
DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "아이디", "패스워드");
- 미리 생성해 놓은 Connection 객체의 변수로 받는다.
- 쿼리문을 작성한다.
- 작성한 쿼리를 준비할 수 있는 preparedStatement를 미리 생성해 놓은 PreparedStatement 객체의 변수로 받는다.
- 쿼리문을 수행하기 전에 미리 ? 에 해당하는 파라미터를 setting 한다.
- PreparedStatement 를 executeQuery() 메소드로 실행하고, 그 결과를 ResultSet 변수에 담는다.
- ResultSet 변수에 우리가 원하는 데이터가 담겨져 있을테니, 원하는 조건문을 작성한다.
- 컬럼명이나 순번을 넣어서 해당하는 데이터를 조회한다. (순번보다는 컬럼명이 더 쉽다.)
- 예외처리 구문 마지막 finally 블록에 사용한 객체를 닫아준다. 에러나는 것들은 finally 구문 안에서도 예외처리를 해준다.
데이터 베이스에서 조회한 하나의 행들에서 각 컬럼에 해당하는 데이터를 객체로 만들어서 저장한다.
즉, 데이터 베이스에 있는 하나의 행을 자바로 가져오면 하나의 객체가 되는 것이다. 그래서 필드를 만들고 각각 데이터를 조회할 수 있는 getter, setter를 만든다.
06. Member.java
- 클래스 안에서 멤버 객체 안에 들어갈 필드 변수를 만든다. (순서는 상관없다.)
- 다시 dao로 가서 결과로 나올 member 객체를 만들어준다. 데이터가 없으면 null을, 데이터가 있으면 member를 return할 것이다.
- 조건문 안에서 멤버 member 객체를 만들어 주고, 각각 필드에 값들을 set 해주면 된다.
07. MemberService.java
- 데이터가 없어서 나오는 null일 경우, 처리해줄 로직을 구현한다. (null 체크)
08. LoginServlet.java
- 로그인은 세션 객체에서 관리한다.
- loginMember가 null이면 로그인이 실패한 것이고, null이 아니면 로그인이 성공한 것이다.
- 로그인이 성공했다면 loginMember 객체를 세션에 속성(Attribute)로 담아준다.
로그인이 되었다면 로그인 폼은 보이지 않아도 된다.
VIEW에 있는 HTML 부분에 <c:if test="${ empty loginMember}"></c:if>을 작성한다.
- 로그인 실패에 대한 메시지를 띄워주거나 하는 로직이 필요하다면 작성한다.
- 공용으로 사용하는 에러 메시지 출력 페이지에 전달한 메시지와 페이지를 request 객체에 저장한다.
- request 객체의 데이터를 유지를 위해서는 forward 방식으로 페이지를 전환한다. request.getRequestDispatcher("/URL").forward(request, response)
'Programming > SERVER' 카테고리의 다른 글
DAY 120. MVC2 패턴 - 회원가입 (0) | 2021.12.16 |
---|---|
DAY 119. MVC2 패턴 - JDBCTemplate (0) | 2021.12.15 |
DAY 118. MVC2 패턴 - 인코딩, 암호화 필터 (0) | 2021.12.14 |
DAY 117. MVC2 패턴 - 로그아웃 기능 (0) | 2021.12.13 |
DAY 116. JDBC - JDBC 객체 (0) | 2021.12.12 |