Struts의 Model
스트럿츠에서 모델은 Business Logic을 처리하는 부분과 처리된 결과를 저장 하기 위한 부분으로 나누어 볼 수 있는데 처리된 결과를 저장 하는 빈은 Value Object 또는 DTO라고 부르고 있습니다.
Value Object로 볼 수 있는 DTO(Data Transfer Object)는 대부분 비즈니스 객체를 원격지 뷰에 제공 하는데 사용 합니다.
DTO는 원격 객체의 비즈니스 로직을 표현하지만 비즈니스 로직 안에 있을 필요는 없습니다. 앞의 로그인 예제에서 UserInfoVO.java가 DTO의 역할을 한다고 할 수 있습니다.
DTO를 이용하는 것은 분산 환경에선 거의 필수 이며 네트웍 부하를 줄일 수 있으며 스트럿츠에서 DTO를 사용하는 것은 비즈니스 객체와 프리젠테이션을 분리하며 유지 보수를 용이 하게 합니다.
이전의 로그인 예제를 다시 돌아가 보면 LoginAction에서는 실제 로그인을 처리하는 과정은 포함되어 있지 않습니다. Action 클래스는 Controller의 일부라고 이전에 이야기 했습니다.
Action 클래스에서는 인증 처리를 LoginDAO.java에 위임을 했는데 이렇게 분리 하는 경우 인증 모듈에 변경이 가해 지더라도 Action 클래스에는 영향을 끼치지 않는 것 입니다.
아래 소스 코드를 보도록 하죠…( LoginAction.java)
package login2;
import org.apache.struts.action.Action;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;
import login2.LoginForm;
import login2.Constants;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionServlet;
/**
* @author 이종철
*/
public class LoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {
String id = ((LoginForm)form).getId();
String pwd = ((LoginForm)form).getPwd();
//Model을 이용하기 이용하여 인증부분의 처리를 합니다.
LoginDAO loginDAO = new LoginDAO();
UserInfoVO userinfo = loginDAO.authUser(id, pwd);
//에러 내용을 담을 ActionErrors 객체를 생성
ActionErrors errors = new ActionErrors();
if (userinfo==null) {
//인증 실패
errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error.login.invalid"));
}
else {
//사용자 아이디와 비밀번호가 틀릴경우 비밀번호가 틀리다는 에러 메세지 출력
if ( !id.equals(userinfo.getPwd()) ) {
errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("error.login.invalid"));
}
}
//로그인 과정에서 에러가 있을 경우 Action클래스의 saveErrors 메소드를 이용해 에러를 저장하고
//이전의 로그인 페이지로 돌려 보내면 login.jsp의 <html:errors/> 태그에 의해 오류가 출력 돔
//mapping의 getInputForward()에서 반환하게 되는 정보는 struts-config.xml의 action태그의
//input 속성에 정의된 페이지로 이동하게 됩니다.
if (!errors.isEmpty()) {
saveErrors(request, errors);
return (mapping.getInputForward());
}
//인증 성공한 경우 세션에 LoginInfoVO(로그인한 사용자 정보를 담은 객체)저장
HttpSession session = request.getSession();
session.setAttribute(Constants.USER_KEY, userinfo);
//로그를 남기자.
StringBuffer buf = new StringBuffer("LoginAction : User --> ");
buf.append(id + "logged in session");
servlet.log(buf.toString());
return (mapping.findForward(Constants.SUCCESS));
}
}
LoginDAO loginDAO = new LoginDAO();
UserInfoVO userinfo = loginDAO.authUser(id, pwd);
이 부분을 보면 LoginDAO의 authUser라는 메소드가 인증을 수행 함을 알 수 있는데…
실행 후 결과를 리턴 하는 부분을 보면 USerInfoVO라는 DTO(Data Transfer Object)를 리턴함을 알 수 있습니다.
LoginDAO는 비즈니스 로직을 수행하는데(인증처리), 이 처리가 정상적으로 된 경우 사용자 정보(UserInfoVO)를 어디엔가 저장 해 두고 (ID와 PWD이외의 정보가 DB에서 읽혀져서 포함 될 수 있습니다.) 나중에 VIEW에서도 꺼내 볼 수 있는데 이때 UserInfoVO 빈이 DTO or Value Object가 됨을 알 수 있습니다.
이 USerInfoVO는 LoginAction에서 인증 결과가 성공 이었음을 확인 후 session에 setAttribute로 저장 됩니다.
//인증이 성공한 경우 세션에 UserInfoVO(로그인한 사용자 정보를 담은 객체)저장
HttpSession session = request.getSession();
session.setAttribute(Constants.USER_KEY, userinfo);
아래는 LoginDAO.java 파일의 내용 입니다.
package login2;
public class LoginDAO {
public UserInfoVO authUser(String id, String pwd) {
/**
* 이부분은 실제 DB에서 ID와 PASWORD로 인증을 해야 하는 부분 입니다.
* 예제를 간략히 하기 위해 이부분의 처리는 생략 했으며 ID가 "jclee", Password가 "jclee" 인 경우엔
* 인증을 허용 합니다.
*/
if ( id.equals("jclee")&& pwd.equals("jclee")) {
//ID:jclee, PASSWORD:jclee인 경우 인증이 성공, 사용자의 정보(아이디, 패스워드)를 저장 합니다.
return new UserInfoVO(id, pwd);
} else {
return null;
}
}
}
아래는 DTO인 UserInfoVO.java 입니다.
package login2;
/**
* 로그인이 정상적으로 이루어진 경우 사용자의 정보 등을 저장 하는 빈
* 본 예제에서는 ID와 PASSWORD를 저장 합니다.
*/
public class UserInfoVO {
private String id = null;
private String pwd = null;
//LoginDAO에서 인증이 성공인 경우 아래의 생성자를 불러 값을 setting 합니다.
public UserInfoVO(String id, String pwd){
this.id = id;
this.pwd = pwd;
}
public String getId() {
return id;
}
public String getPwd() {
return pwd;
}
}
다음은 VIEW쪽에서 세션에 저장 되어 있는 UserInfoVO 빈을 이용하는 예 입니다.
<body>
<h3>반갑습니다.<bean:write name="user" property="id"/>님!</h3>
<ul>
<li>
<html:link forward="logoff">로그아웃</html:link>
</li>
</ul>
<body>
스트럿츠에서 모델은 Business Logic을 처리하는 부분과 처리된 결과를 저장 하기 위한 부분으로 나누어 볼 수 있는데 처리된 결과를 저장 하는 빈은 Value Object 또는 DTO라고 부르고 있습니다.
Value Object로 볼 수 있는 DTO(Data Transfer Object)는 대부분 비즈니스 객체를 원격지 뷰에 제공 하는데 사용 합니다.
DTO는 원격 객체의 비즈니스 로직을 표현하지만 비즈니스 로직 안에 있을 필요는 없습니다. 앞의 로그인 예제에서 UserInfoVO.java가 DTO의 역할을 한다고 할 수 있습니다.
DTO를 이용하는 것은 분산 환경에선 거의 필수 이며 네트웍 부하를 줄일 수 있으며 스트럿츠에서 DTO를 사용하는 것은 비즈니스 객체와 프리젠테이션을 분리하며 유지 보수를 용이 하게 합니다.
이전의 로그인 예제를 다시 돌아가 보면 LoginAction에서는 실제 로그인을 처리하는 과정은 포함되어 있지 않습니다. Action 클래스는 Controller의 일부라고 이전에 이야기 했습니다.
Action 클래스에서는 인증 처리를 LoginDAO.java에 위임을 했는데 이렇게 분리 하는 경우 인증 모듈에 변경이 가해 지더라도 Action 클래스에는 영향을 끼치지 않는 것 입니다.
아래 소스 코드를 보도록 하죠…( LoginAction.java)
package login2;
import org.apache.struts.action.Action;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;
import login2.LoginForm;
import login2.Constants;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionServlet;
/**
* @author 이종철
*/
public class LoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {
String id = ((LoginForm)form).getId();
String pwd = ((LoginForm)form).getPwd();
//Model을 이용하기 이용하여 인증부분의 처리를 합니다.
LoginDAO loginDAO = new LoginDAO();
UserInfoVO userinfo = loginDAO.authUser(id, pwd);
//에러 내용을 담을 ActionErrors 객체를 생성
ActionErrors errors = new ActionErrors();
if (userinfo==null) {
//인증 실패
errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error.login.invalid"));
}
else {
//사용자 아이디와 비밀번호가 틀릴경우 비밀번호가 틀리다는 에러 메세지 출력
if ( !id.equals(userinfo.getPwd()) ) {
errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("error.login.invalid"));
}
}
//로그인 과정에서 에러가 있을 경우 Action클래스의 saveErrors 메소드를 이용해 에러를 저장하고
//이전의 로그인 페이지로 돌려 보내면 login.jsp의 <html:errors/> 태그에 의해 오류가 출력 돔
//mapping의 getInputForward()에서 반환하게 되는 정보는 struts-config.xml의 action태그의
//input 속성에 정의된 페이지로 이동하게 됩니다.
if (!errors.isEmpty()) {
saveErrors(request, errors);
return (mapping.getInputForward());
}
//인증 성공한 경우 세션에 LoginInfoVO(로그인한 사용자 정보를 담은 객체)저장
HttpSession session = request.getSession();
session.setAttribute(Constants.USER_KEY, userinfo);
//로그를 남기자.
StringBuffer buf = new StringBuffer("LoginAction : User --> ");
buf.append(id + "logged in session");
servlet.log(buf.toString());
return (mapping.findForward(Constants.SUCCESS));
}
}
LoginDAO loginDAO = new LoginDAO();
UserInfoVO userinfo = loginDAO.authUser(id, pwd);
이 부분을 보면 LoginDAO의 authUser라는 메소드가 인증을 수행 함을 알 수 있는데…
실행 후 결과를 리턴 하는 부분을 보면 USerInfoVO라는 DTO(Data Transfer Object)를 리턴함을 알 수 있습니다.
LoginDAO는 비즈니스 로직을 수행하는데(인증처리), 이 처리가 정상적으로 된 경우 사용자 정보(UserInfoVO)를 어디엔가 저장 해 두고 (ID와 PWD이외의 정보가 DB에서 읽혀져서 포함 될 수 있습니다.) 나중에 VIEW에서도 꺼내 볼 수 있는데 이때 UserInfoVO 빈이 DTO or Value Object가 됨을 알 수 있습니다.
이 USerInfoVO는 LoginAction에서 인증 결과가 성공 이었음을 확인 후 session에 setAttribute로 저장 됩니다.
//인증이 성공한 경우 세션에 UserInfoVO(로그인한 사용자 정보를 담은 객체)저장
HttpSession session = request.getSession();
session.setAttribute(Constants.USER_KEY, userinfo);
아래는 LoginDAO.java 파일의 내용 입니다.
package login2;
public class LoginDAO {
public UserInfoVO authUser(String id, String pwd) {
/**
* 이부분은 실제 DB에서 ID와 PASWORD로 인증을 해야 하는 부분 입니다.
* 예제를 간략히 하기 위해 이부분의 처리는 생략 했으며 ID가 "jclee", Password가 "jclee" 인 경우엔
* 인증을 허용 합니다.
*/
if ( id.equals("jclee")&& pwd.equals("jclee")) {
//ID:jclee, PASSWORD:jclee인 경우 인증이 성공, 사용자의 정보(아이디, 패스워드)를 저장 합니다.
return new UserInfoVO(id, pwd);
} else {
return null;
}
}
}
아래는 DTO인 UserInfoVO.java 입니다.
package login2;
/**
* 로그인이 정상적으로 이루어진 경우 사용자의 정보 등을 저장 하는 빈
* 본 예제에서는 ID와 PASSWORD를 저장 합니다.
*/
public class UserInfoVO {
private String id = null;
private String pwd = null;
//LoginDAO에서 인증이 성공인 경우 아래의 생성자를 불러 값을 setting 합니다.
public UserInfoVO(String id, String pwd){
this.id = id;
this.pwd = pwd;
}
public String getId() {
return id;
}
public String getPwd() {
return pwd;
}
}
다음은 VIEW쪽에서 세션에 저장 되어 있는 UserInfoVO 빈을 이용하는 예 입니다.
<body>
<h3>반갑습니다.<bean:write name="user" property="id"/>님!</h3>
<ul>
<li>
<html:link forward="logoff">로그아웃</html:link>
</li>
</ul>
<body>
오라클자바커뮤니티교육센터, 개발자전문교육, 개인80%환급
www.oraclejavacommunity.com
평일주간(9:30~18:10) 개강
(7/28)[기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍
(7/28)[기업100%환급]안드로이드개발자과정
(8/04)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
(8/04)[기업100%환급]PL/SQL,ORACLE HINT,TUNING
(8/08)[기업100%환급]SQL기초에서 Schema Object까지
(8/08)[기업100%환급]Spring ,MyBatis,Hibernate실무과정
(8/11)[채용예정교육]오라클자바개발잘하는신입뽑기프로젝트,교육전취업확정
평일야간(19:00~21:50) 개강
(7/24)SQL기초에서실무까지
(7/29)안드로이드개발자과정
(7/29)Spring3.X, MyBatis, Hibernate실무과정
(8/04)웹퍼블리싱 마스터
(8/05)JSP,Ajax,jQUERY,Spring,MyBatis,Hibernate속성과정
(8/08)닷넷(C#,Network,ADO.NET,ASP.NET)마스터과정
(8/28)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
주말(10:00~17:50) 개강
(7/26)Spring3.X, MyBatis, Hibernate실무과정
(7/26)개발자를위한PLSQL,SQL튜닝,힌트
(8/02)C#,ASP.NET마스터
(8/02)웹퍼블리싱 마스터
(8/02)SQL초보에서 Schema Object까지
(8/09)안드로이드개발자과정
(8/09)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(8/23)JAVA,Network&WEB&Framework(자바기초에서웹스프링까지)
주말저녁(18:30~22:20) 개강
(8/02)JAVA,Network&WEB&Framework
(8/09)SQL기초에서실무까지
www.oraclejavacommunity.com
평일주간(9:30~18:10) 개강
(7/28)[기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍
(7/28)[기업100%환급]안드로이드개발자과정
(8/04)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
(8/04)[기업100%환급]PL/SQL,ORACLE HINT,TUNING
(8/08)[기업100%환급]SQL기초에서 Schema Object까지
(8/08)[기업100%환급]Spring ,MyBatis,Hibernate실무과정
(8/11)[채용예정교육]오라클자바개발잘하는신입뽑기프로젝트,교육전취업확정
평일야간(19:00~21:50) 개강
(7/24)SQL기초에서실무까지
(7/29)안드로이드개발자과정
(7/29)Spring3.X, MyBatis, Hibernate실무과정
(8/04)웹퍼블리싱 마스터
(8/05)JSP,Ajax,jQUERY,Spring,MyBatis,Hibernate속성과정
(8/08)닷넷(C#,Network,ADO.NET,ASP.NET)마스터과정
(8/28)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
주말(10:00~17:50) 개강
(7/26)Spring3.X, MyBatis, Hibernate실무과정
(7/26)개발자를위한PLSQL,SQL튜닝,힌트
(8/02)C#,ASP.NET마스터
(8/02)웹퍼블리싱 마스터
(8/02)SQL초보에서 Schema Object까지
(8/09)안드로이드개발자과정
(8/09)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(8/23)JAVA,Network&WEB&Framework(자바기초에서웹스프링까지)
주말저녁(18:30~22:20) 개강
(8/02)JAVA,Network&WEB&Framework
(8/09)SQL기초에서실무까지
댓글 없음:
댓글 쓰기