2013년 8월 12일 월요일

struts2 Type Conversion 개요

struts2 Type Conversion 개요


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)  

HTML 폼에서 요청 파라미터로 데이터를 전송하면 모두 String 형태로 데이터를 전송한다. 그러므로 Action에서 받아 일일이 형 변환을 해주어야 하는데 Struts2에서는 Type Conversion을 지원한다.
 
먼저 execute 메소드에서 수동으로 형 변환하는 경우를 보자.
 
[CreateUser.java]
 
package action;
 
import java.text.SimpleDateFormat;
import java.util.Date;
 
import interceptor.UserServiceAware;
import model.Email;
import model.User;
import service.UserService;
import com.opensymphony.xwork2.ActionSupport;
 
public class CreateUser extends ActionSupport implements UserServiceAware {
 
           String name;
           String age;
           String birthday;
           String email;
           UserService userService;
 
           @Override
           public String execute() throws Exception {
                     // 형변환을 한다.
                     int realAge = Integer.parseInt(age);
                     SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
                     Date realBirthday = df.parse(birthday);
                     Email realEmail = Email.parse(email);
 
                     // 빈을 생성하고 형변환한 필드들을 빈에 세팅한다.
                     User user = new User();
                     user.setName(name);
                     user.setAge(realAge);
                     user.setBirthday(realBirthday);
                     user.setEmail(realEmail);
 
                     // 빈을 인자로 넣어서 비즈니스 메서드를 호출한다.
                     userService.createUser(user);
                     return SUCCESS;
           }
 
           public void setUserService(UserService userService) {
                     this.userService = userService;
           }
 
           public void setName(String name) {
                     this.name = name;
           }
 
           public void setAge(String age) {
                     this.age = age;
           }
 
           public void setBirthday(String birthday) {
                     this.birthday = birthday;
           }
 
           public void setEmail(String email) {
                     this.email = email;
           }
}
 
위에서는 execute() 메소드에서 일일이 수동으로 형 변환을 했다. 만약 form에서 넘어오는 데이터가 많다면 애로 사항이 있을 것이다. Struts2에서는 이렇게 형 변환이나 유효성 체크 등의 일은 별도로 하고 execute() 메소드에서는 형 변환된 원하는 데이터로 본질적인 기능에 충실하도록 지원한다.
 
아래의 Action을 보자.
 
package action;
 
import java.util.Date;
 
import interceptor.UserServiceAware;
import model.Email;
import model.User;
import service.UserService;
import com.opensymphony.xwork2.ActionSupport;
 
public class CreateUser2 extends ActionSupport implements UserServiceAware {
           /*
            * 필드들이 적절한 타입으로 선언되어 있다.
            */
           String name;
           int age;
           Date birthday;
           Email email;
           UserService userService;
 
           @Override
           public String execute() throws Exception {
                     User user = new User();
                     user.setName(name);
                     user.setAge(age);  //내장 Converter에 의해 자동 형변환된다. (String -> int)
                     user.setBirthday(birthday);
                     user.setEmail(email);
 
                     userService.createUser(user);
                     return SUCCESS;
           }
 
           public void setUserService(UserService userService) {
                     this.userService = userService;
           }
 
           public void setName(String name) {
                     this.name = name;
           }
 
           public void setAge(int age) {
                     this.age = age;
           }
 
           public void setBirthday(Date birthday) {
                     this.birthday = birthday;
           }
 
           public void setEmail(Email email) {
                     this.email = email;
           }
}
 
Action Property를 원하는 적절한 Type으로 선언하고 형변환은 자동으로 처리되도록 하고 있다. String int로 바꾸는 것은 내장된 형 변환 기능을 이용해서 처리하고 String Email로 바꾸는 것은 EmailConverter, Date Type으로 바꾸는 것은 DataConverter에서 처리한다.
 
이렇게 형 변환이 자동적으로 이루어진다면 도메인 오브젝트를 이용할 수 있는데 User age email String이 아닌 int, Email Type이다. ModelDriven 액션을 사용할 때 도메인 오브젝트인 user가 상단에 올라가므로 위 예제에서 Action Property에 형 변환 되는 것과 아래 예제에서 user Property가 자동 형 변환 되는 것은 동일한 동작 이다.
 
package action;
 
import interceptor.UserServiceAware;
import model.User;
import service.UserService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
 
public class CreateUser3 extends ActionSupport implements ModelDriven, Preparable, UserServiceAware {
           User user;
           UserService userService;
 
           public Object getModel() {
                     return user;
           }
 
           public void prepare() throws Exception {
                     user = new User();
           }
 
           @Override
           public String execute() throws Exception {
                     userService.createUser(user);
                     return SUCCESS;
           }
 
           public void setUserService(UserService userService) {
                     this.userService = userService;
           }
}
 
[Email.java]
 
package model;
 
/**
 * Created by IntelliJ IDEA. User: plightbo Date: Apr 11, 2005
 */
public class Email {
           String username;
           String domain;
 
           public Email() {
           }
 
           public Email(String username, String domain) {
                     this.username = username;
                     this.domain = domain;
           }
 
           public String getUsername() {
                     return username;
           }
 
           public void setUsername(String username) {
                     this.username = username;
           }
 
           public String getDomain() {
                     return domain;
           }
 
           public void setDomain(String domain) {
                     this.domain = domain;
           }
 
           public String toString() {
                     return username + '@' + domain;
           }
 
           public static Email parse(String email) {
                     Email e = new Email();
                     int at = email.indexOf('@');
                     if (at == -1) {
                                throw new IllegalArgumentException("Invalid email address");
                     }
 
                     e.setUsername(email.substring(0, at));
                     e.setDomain(email.substring(at + 1));
 
                     return e;
           }
}
 
[User.java]
 
package model;
 
import java.util.Date;
 
public class User {
           String name;
           int age;
           Date birthday;
           Email email;
 
           public String getName() {
                     return name;
           }
 
           public void setName(String name) {
                     this.name = name;
           }
 
           public int getAge() {
                     return age;
           }
 
           public void setAge(int age) {
                     this.age = age;
           }
 
           public Date getBirthday() {
                     return birthday;
           }
 
           public void setBirthday(Date birthday) {
                     this.birthday = birthday;
           }
 
           public Email getEmail() {
                     return email;
           }
 
           public void setEmail(Email email) {
                     this.email = email;
           }
 
           @Override
           public String toString() {
                     return String.format("[User:name=%s,age=%s,birthday=%s,email=%s]", name, age, birthday,
                                          email);
           }
}
 

댓글 없음:

댓글 쓰기