[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="남"/>남
<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")
public class JoinController extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
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);
JoinService service = new JoinService();
MemberDTO dto = new MemberDTO();
dto.setId(id);
dto.setPw(pw);
dto.setName(name);
dto.setAge(age);
dto.setGender(gender);
dto.setEmail(email);
int success = service.join(dto);
System.out.println("회원가입 성공 여부: "+success);
String msg = "회원가입에 실패 했습니다.";
if(success>0) {
msg="회원가입에 성공하였습니다.";
}
req.setAttribute("result", msg);
RequestDispatcher dis = req.getRequestDispatcher("result.jsp");
dis.forward(req, resp);
}
}
[JoinService.java]
public class JoinService {
public int join(MemberDTO dto) {
MemberDAO dao = new MemberDAO();
int success = dao.join(dto);
return success;
}
}
[MemberDAO.java]
public class MemberDAO {
Connection conn = null;/
PreparedStatement ps = null;
public MemberDAO(){
try {
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) {
String sql = "INSERT INTO member(id,pw,name,age,gender,email)VALUES(?,?,?,?,?,?)";
int success = 0;
try {
ps = conn.prepareStatement(sql);
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();
} 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);
RequestDispatcher dis =null;
switch(subAddr) {
case "/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");
page= "main";
msg =loginId+"님, 반갑습니다.";
req.getSession().setAttribute("loginId", loginId);
}
req.setAttribute("msg", msg);
dis = req.getRequestDispatcher(page);
dis.forward(req, resp);
break;
case "/logout":
req.getSession().removeAttribute("loginId");
resp.sendRedirect("index.jsp");
break;
case "/main":
System.out.println("Main page!!");
ArrayList<MemberDTO> list = service.main();
req.setAttribute("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();
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();
ArrayList<MemberDTO> list = dao.list();
return list;
}
}
public class MemberDAO {
Connection conn = null;
ResultSet rs = null;
PreparedStatement ps = null;
public MemberDAO() {
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();
} 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);
}
} 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로 보낸다.
- 보낼 데이터가 없으므로 페이지 이동만한다.