@RequestBody / @ResponseBody

@RequestBody : HTTP 요청의 body 내용을 자바 객체로 매핑한다.

@ResponseBody : 자바 객체를 HTTP 요청의 body로 매핑한다.

예제 : test.jsp

function test(){
        var rowData = $("#main_grid").getRowData();    
      
        var json = JSON.stringify(rowData) ;
        var jsonInfo = JSON.parse(json) ;
   
        var actionUrl = "/test/testList.do";
         
 
       
            $.ajax({
                type:"POST",
                dataType : 'json',
                data : json,
                url: actionUrl,
                processData : true /*querySTring make false*/,
                contentType : "application/json; charset=UTF-8",             
                
                success:function(result) {
                    var jsonResult = JSON.parse(JSON.stringify(result)) ;
                     
                    if(jsonResult.result == "success" ) {
                        alert(jsonResult.resultMsg) ;                        
                          
                    } else if (jsonResult.result == "failure" ) {
                        alert(jsonResult.resultMsg) ;
                        return false ;
                    }
                },
                complete : function () {
                },               
                error: AjaxError
            }) ;
       
     } else {
            return false;
        }       
    }

$(“#main_grid”) 라는 jqGrid에서 getRowData()를 통해 전체 Row를 가져왔다.
그 후 Json형식으로 변환한 뒤 파라미터로 던져주었다.

test.java

 

@RequestMapping("/test/testList.do")
 @ResponseBody
 public Object testList(HttpServletRequest request, @RequestBody List> list) throws Exception {
  Map  resultMap =  new HashMap();
   
  String result = "";
  String resultMsg = "";
   
  try {  
   for(Map tList : list) {
    aVO authVO = new AuthVO() ;
     
    aVO.setUse_auth(tList.get("use_auth").toString());
    aVO.setMenu_id(tList.get("menu_id").toString());
    aVO.setUse_yn(tList.get("use_yn").toString());
 
    authMgmtService.mergeAuthMgmtList(aVO) ;
   }
    
   result = "success";
   resultMsg = "성공" ;
    
  } catch (Exception e) {
   result = "failure";
   resultMsg = "실패" ;
  }
   
  resultMap.put("result", result);
  resultMap.put("resultMsg", resultMsg);
   
  return resultMap;
 }

전송 된 파라미터를 List> 형식으로 받아온다. 앞에 @RequestBody를 쓰면 그대로 list에 매핑되어진다.
그리고 list의 size만큼 for문을 실행하는데 aVo라는 vo객체를 하나 생성해서 list에서 받아온 map의 value값을 넣어준다.
작업을 수행한 뒤 result와 resultMsg를 resultMap에 담아 리턴한다. @ResponseBody를 명시했기 때문에 응답데이터에 Map객체가 매핑되어 전달된다.

@Autowired

의존관계를 자동설정할 때 사용하며 타입을 이용하여 의존하는 객체를 삽입해 준다. 그러므로 해당 타입의 빈객체가 존재하지 않거나 또는 2개 이상 존재할 경우 스프링은 예외를 발생시키게 된다.

options:

required: Autowired 어노테이션을 적용한 프로퍼티 중 반드시 설정할 필요가 없는 경우에 false값을 주어 프로퍼티가 존재하지 않더라도 스프링이 예외를 발생하지 않도록 한다. 기본값은 TRUE. ex) @Autowired(required=false)
사용하려면 클래스를 빈으로 등록시켜줘야 한다. 해당 설정 대신에 태그를 사용해도 된다.

@Autowired를 적용할 때 같은 타입의 빈이 2개 이상 존재하게 되면 예외가 발생하는데, Autowired도 이러한 문제가 발생한다. 이럴 때 @Qualifier를 사용하면 동일한 타입의 빈 중 특정 빈을 사용하도록 하여 문제를 해결할 수 있다.

public class SpringTest {
      private SpringTestService service; 

     @Autowired public void setSpringTestService(SpringTestService service){
                 this.service = service;
      }
 }

DTO 와 DAO

DAO(Data Access Object)는 DB를 사용해 데이터를 조화하거나 조작하는 기능을
전담하도록 만든 오브젝트를 말한다.

사용자는 자신이 필요한 Interface를 DAO에게 던지고 DAO는 이 인터페이스를
구현한 객체를 사용자에게 편리하게 사용 할 수 있도록 반환해줍니다.

DB에 대한 접근을 DAO가 담당하도록 하여 데이터베이스 엑세스를 DAO에서만
하게 되면 다수의 원격호출을 통한 오버헤드를 VO나 DTO를 통해 줄일 수 있고
다수의 DB 호출문제를 해결할 수 있습니다. 또한 단순히 읽기만 하는 연산이므로
트랜잭션 간의 오버헤드를 감소할 수 있습니다.

DTO(Data Transfer Object)는 VO(Value Object)로 바꿔 말할 수 있는데
계층간 데이터 교환을 위한 자바빈즈를 말한다. 여기서 말하는 계층간의
컨트롤러, 뷰, 비즈니스 계층, 퍼시스턴스 계층을 말하며 각 계층간 데이터 교환을
위한 객체를 DTO 또는 VO라고 부른다.

대표적인 DTO로는 폼데이터빈, 데이터베이스 테이블빈 등이 있으며, 각 폼요소나,
데이터베이스 레코드의 데이터를 매핑하기 위한 데이터 객체를 말한다. 즉 폼 필드들의
이름을 그대로 가지고 있는 자바빈 객체를 폼 필드와 그대로 매핑하여 비즈니스 계층으로
보낼 때 사용하나다. 이런 객체를 DTO라고 부르며 VO(Value Object) 패턴이라고도 한다.
VO 패턴은 데이터 전달을 위한 가장 효율적인 방법이지만, 클래스 선언을 위해 많은
코드가 필요하다는 단점이 있다.

일반적인 DTO는 로직을 갖고 있지 않다. 순수한 데이터 객체이며 속상과 그 속성에
접근하기 위한 getter, setter 메소드만 가진 클래스를 말한다. 여기에 추가적으로
toString(), equals(), 등의 Object 클래스 메소드를 작성할 수 있다.

즉, 계층 간의 데이터 전달에 사용하는 데이터 객체들을 말한다.

1. DTO 클래스 예제

public class DTOBean {

private String name;

private int value;

private String data;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getValue() {
return value;
}

public void setValue(int value) {
this.value = value;
}

public String getData() {
return data;
}

public void setData(String data) {
this.data = data;
}
}

2. DAO 클래스 예제

//DB와 연결할 Connection을 가져온다.
//어떤 DB를 사용할 것이며, 어떤 드라이브와 로그인 정보를 사용할 것인가.
//작업이 끝나면 사용한 리소스를 시스템에 돌려준다.
public class TestDao {

public void add(DTOBean dto) throws ClassNotFoundException, SQLException{
Class.forName(“com.mysql.jdbc.Driver”);

Connection c= DriverManager.getConnection(“jdbc:mysql://localhost/springbook”, “spring”, “book”);

PreparedStatement ps = c.prepareStatement(“insert into users(id,name,password) value(?,?,?)”);

ps.setString(1, dto.getName());
ps.setInt(2, dto.getValue());
ps.setString(3, dto.getData());

ps.executeUpdate();

ps.close();
c.close();
}
}