21.02.15

민주·2021년 2월 15일

[DAO와 DTO]

- Controller는 받은 일을 직접 처리하거나 다른 Model에 전달한다.
- Model은 Controller로 부터 요청 받은 일을 처리하고 통지한다.
- 이 때 DB에 요청할일이 생길 경우 DB처리 만을 위한 class를 생성한다
- service : Controller로부터 받은 일을 수행하고 결과를 알려준다.
            그런데 여기서 DB를 사용할 작업이면 DAO에게 맡긴다.
- DAO : 실제로 DB에 접근하는 객체이다. service로 부터 받은 내용을 DB에 붙어서 처리한다.
- DTO : 계층간 데이터 교환을 위한 객체이다. DB에서 데이터를 얻어 service나 Controller 등으로 
  보낼 때 사용한다.

[회원가입 시스템 구현]

[index.jsp]
<body>
	<form action="join" method="post">
		아이디 : <input type="text" name="id"/><br/>
		비밀번호 : <input type="password" name="pw"/><br/>
		이름 : <input type="text" name="name"/><br/>
		성별 : <input type="radio" name="gender" value=""/>&nbsp;&nbsp;&nbsp;&nbsp;
		<input type="radio" name="gender" value=""/><br/>
		나이 : <input type="text" name="age"/><br/>
		이메일 : <input type="text" name="email"/><br/>
		<input type="submit" value="회원가입"/>
	</form> 
</body>
[JoinController.java]

@WebServlet("/join") //join으로 들어오면 여기로 이동
public class JoinController extends HttpServlet {
	
	
  //회원정보는 노출되면 안되니까 post로만 받는다.
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
  	throws ServletException, IOException {
	//1.파라메터 받기
	req.setCharacterEncoding("utf-8");
	String id = req.getParameter("id");
	String pw = req.getParameter("pw");
	String name = req.getParameter("name");
	String age = req.getParameter("age");
	String gender = req.getParameter("gender");
	String email = req.getParameter("email");
	System.out.println(id+"/"+pw+"/"+name+"/"+age+"/"+gender+"/"+email);
		
	//2. 서버에게 일 시키기(회원가입시켜줘 -> 내가 받은 정보를 DB에 넣어줘)
	JoinService service = new JoinService(); //service 객체화
        //MemberDTO를 객체화 시켜 전달할 데이터를 담는다.
	MemberDTO dto = new MemberDTO();//여러 파라메터를 하나로 묶어서 전달
	dto.setId(id);
	dto.setPw(pw);
	dto.setName(name);
	dto.setAge(age);
	dto.setGender(gender);
	dto.setEmail(email);
        //dto를 JoinService에 전달하고 결과값을 success로 받는다.
	int success = service.join(dto);
	System.out.println("회원가입 성공 여부: "+success);
		
	String msg = "회원가입에 실패 했습니다.";
	if(success>0) {
		msg="회원가입에 성공하였습니다.";
	}
	//성공여부에 따라 msg를 담아서 result.jsp로 이동
	req.setAttribute("result", msg);
	RequestDispatcher dis = req.getRequestDispatcher("result.jsp");
	dis.forward(req, resp);
    }
}
[JoinService.java]

public class JoinService {
	
  //서비스에서는 컨트롤러가 시킨일을 한다.
  public int join(MemberDTO dto) {
  	//DB가 필요한 작업 인가?(받은 정보를 DB에 넣어야하므로 필요함)
  	//DB가 필요하면 DAO 사용
  	MemberDAO dao = new MemberDAO();
  	//dao의 join함수를 실행시켜 return값을 success에 담아서 그 값을 또 return
  	int success = dao.join(dto); 
  	return success;
  }
}
[MemberDAO.java]
public class MemberDAO {
  //이 클래스의 모든 메서드에서 사용 할 것이므로 여기에 선언
  Connection conn = null;/
  PreparedStatement ps = null;
  //DB를 사용한다-> DAO를 객체화한다-> 생성자가 실행된다.
  //DB접속 -> 쿼리 실행 -> 결과 내용 처리
  public MemberDAO(){ 
    //MemberDAO가 객체화 되자마자 실행되어야 하므로 생성자에 DB접속을 넣는다.
    try {
    //DB접속
    Context ctx = new InitialContext();
    DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/Oracle");
    conn = ds.getConnection();
    } catch (Exception e) {
	e.printStackTrace();
    }
  }
  public int join(MemberDTO dto) {
    //1. 쿼리준비
    String sql = "INSERT INTO member(id,pw,name,age,gender,email)VALUES(?,?,?,?,?,?)";
    int success = 0;
    try {
    	//2. PreparedStatement 준비
	ps = conn.prepareStatement(sql);
	//3. ?가 있을 경우 ? 대응
	ps.setString(1, dto.getId());
	ps.setString(2, dto.getPw());
	ps.setString(3, dto.getName());
	ps.setString(4, dto.getAge());
	ps.setString(5, dto.getGender());
	ps.setString(6, dto.getEmail());
	success = ps.executeUpdate();//4. 쿼리 실행
    //5. 결과 반환
    } catch (SQLException e) {
	e.printStackTrace();
	return -1;
    } finally {
	try {
	    ps.close();
	    conn.close();
	} catch (SQLException e) {
	    e.printStackTrace();
	}
    }
    return success;
  }
}
- 결국 DAO에서 나온 return값이 service의 return값이고 그 값이 Controller의 success에 
  담기게 되어 성공여부에 따라 msg를 담아서 result.jsp로 이동하게 된다.

[회원 관리 시스템 구현]

[login.jsp]
<body>
    <h3>회원 관리 로그인</h3>
    <form action="login" method="post">
	<table>
	    <tr>
		<th>ID</th>
		<td><input type="text" name="userId"/></td>
	    </tr>
	    <tr>
		<th>PW</th>
		<td><input type="password" name="userPw"/></td>
	    </tr>
	    <tr>
		<td colspan="2">
		<input type="submit" value="login"/>
		<input type="button" value="회원가입" 
        		onclick="location.href='joinFrom.jsp'"/>
	 	</td>
	    </tr>
	</table>
    </form>
</body>
<script>
    var msg="${msg}";
    if(msg!=""){
	alert(msg);
    }
</script>
[MemberController]
@WebServlet({"/login","/logout","/main"})
public class MemberController extends HttpServlet{

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException {
	dual(req,resp);
  }

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException {
	dual(req,resp);
  }

  private void dual(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException {
	req.setCharacterEncoding("UTF-8");
	System.out.println("요청 확인");
	String uri = req.getRequestURI();
	String ctx = req.getContextPath();
	String subAddr = uri.substring(ctx.length());
	System.out.println("subAddr : " +subAddr);
		
	MemberService service = new MemberService(req, resp);
		
	//들어온 요청에 따라서 Service에 일을 시키고 응답을 받아서 View에 전송한다.
	RequestDispatcher dis =null;
	switch(subAddr) {
	  case "/login": //login으로 들어올 경우
		System.out.println("로그인 요청");
		boolean success = service.login();
		System.out.println("로그인 결과 : " +success);

		String page= "index.jsp";
		String msg = "아이디와 비밀번호를 확인해 주세요.";
		if(success) { //로그인 성공시
		  String loginId = req.getParameter("userId");
          	  //main으로 만 설정 해줬기 때문에 case "main"으로 넘어가게됨
		  page= "main";
		  msg =loginId+"님, 반갑습니다.";
		  req.getSession().setAttribute("loginId", loginId);//세션값할당
		}
        	//msg라는 이름으로 데이터를 담아 page로 보낸다.
		req.setAttribute("msg", msg);
		dis = req.getRequestDispatcher(page);
		dis.forward(req, resp);
		break;
	  //로그아웃은 처리가 간단해서 컨트롤러에서 모두 처리
	  case "/logout": //logout으로 들어올경우
		req.getSession().removeAttribute("loginId");
		//session에서 값을 지우고 index.jsp로 보낸다.(보낼값이 있는가?)
        	//보낼 데이터가 없으므로 페이지 이동만한다.
		resp.sendRedirect("index.jsp");
		break;
	  case "/main": 
		System.out.println("Main page!!");
		//service로 memBerList요청, 파라메터가 없음
		ArrayList<MemberDTO> list = service.main();
		req.setAttribute("list", list);//${list}
		dis = req.getRequestDispatcher("main.jsp");
		dis.forward(req, resp);
		break;
	}
    }
}
public class MemberService {
	
    HttpServletRequest req = null;
    HttpServletResponse resp = null;
	
    public MemberService(HttpServletRequest req, HttpServletResponse resp) {
	this.req= req;
	this.resp= resp;
    }
	
    public boolean login() {
	MemberDAO dao = new MemberDAO();//DB가 필요?
	//파라메터를 뽑아서 dao에 전달
	String id = req.getParameter("userId");
	String pw = req.getParameter("userPw");
	System.out.println(id+"/"+pw);
	return dao.login(id, pw);
    }
	
    public ArrayList<MemberDTO> main() {
	MemberDAO dao = new MemberDAO();//DB가 필요?
	ArrayList<MemberDTO> list = dao.list();
	return list;
    }
}
public class MemberDAO {

  Connection conn = null;
  ResultSet rs = null;
  PreparedStatement ps = null;
	
  public MemberDAO() {
    //DB를 사용한다-> DAO를 객체화한다-> 생성자가 실행된다	
    try {
	Context ctx = new InitialContext();
	DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/Oracle");
	conn = ds.getConnection();
    } catch (Exception e) {
	e.printStackTrace();
    }
}
	
  public boolean login(String id, String pw) {
    boolean success = false;
    String sql = "SELECT id FROM member WHERE id=? AND pw=?";
    try {
	ps = conn.prepareStatement(sql);
	ps.setString(1, id);
	ps.setString(2, pw);
	rs = ps.executeQuery();
	success = rs.next(); //값이 없으면 false, 있으면 true반환
    } catch (SQLException e) {
	e.printStackTrace();
    } finally {
	try {
	  ps.close();
	  rs.close();
	  conn.close();
	} catch (SQLException e) {
	  e.printStackTrace();
	}
    }
    return success;
  }
	
  public ArrayList<MemberDTO> list(){
		
    String sql = "SELECT id,name,email FROM member";
    ArrayList<MemberDTO> list = new ArrayList<MemberDTO>();
    try {
      ps = conn.prepareStatement(sql);
      rs = ps.executeQuery();
			
      while(rs.next()) {
	MemberDTO dto = new MemberDTO();
	dto.setId(rs.getString("id"));
	dto.setName(rs.getString("name"));
	dto.setEmail(rs.getString("email"));
	list.add(dto); //list를 만들어서 값 있을때마다 넣어주기
      }
    } catch (SQLException e) {
	e.printStackTrace();
    } finally {
	try {
	  rs.close();
	  ps.close();
	  conn.close();
	} catch (SQLException e) {
	  e.printStackTrace();
	}
    }
    return list;
  }
}
- controller에서 login으로 받은 경우
1. MemberService의 login() 실행
2. MemberService의 login()는 파라메터를 뽑아서 DAO에게 전달
- 이때 retrun값이 MemberDAO의 login(id,pw)이다.
3. MemberDAO의 login()은 MemberService에서 전달 받은 id와 pw를 가지고 쿼리실행을 한다.
- 이 때 쿼리는 파라메터로 받은 id와 pw가 member에 속해있나? 있으면 id 추출
- 그래서 값이 있으면 true이고 없다면 falser가 반환된다.
4. 이 success값은 MemberService의 login()의 return값이고 MemberService의 login()의 
   return값은 MemberController에 success의 값으로 들어가기 때문에 success의 값이 true라면
   (id와 pw 제대로 들어갔다면) 로그인에 성공
5. 로그인 성공시 세션값을 할당 받고 msg라는 이름으로 데이터를 담아 page로 보낸다.
6. 근데 여기서 page를 main으로 설정해줬기 때문에 다시 이 컨트롤러를 통해
case "/main"으로 넘어간다.
7. main으로 들어오면 MemberService의 main()이 실행된다.
8.  MemberService의 main()에서는 MemberDAO의 list()를 실행
9. list는 SELECT쿼리를 실행하는데 ResultSet으로 값을 받아 dto에 넣는다.
10. ArrayList를 만들어 ResultSet으로 받은 값을 list에 차곡차곡 넣어준다.
11. 반환값은 데이터를 담은 list가 된다.
12. 이 list는 MemberService의 main()의 retrun값이 되고 이 retrun값은 MemberController에 
    return값이 된다.
13. 결과적으로 이 list를 담아 main.jsp로 보내게 된다.
14. main.jsp에서는 MemberList를 확인할수 있게 된다.

- controller에서 logout으로 받은 경우
  - session에서 값을 지우고 index.jsp로 보낸다.
  - 보낼 데이터가 없으므로 페이지 이동만한다.
profile
개발이좋아요

0개의 댓글