ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring의 동기식 / 비동기식
    Spring 2023. 4. 6. 14:25

    Sping의 동기/비동기식 통신 방식

    기본적인 통신방식

     웹 브라우저 -> Controller -> .jsp

     


    동기식 통신방식

     - 회원가입 페이지로 이동

    웹 브라우저 -> MemberController(Controller) -> Member.jsp(회원가입 화면으로 이동)

     - 회원가입 버튼을 클릭

    웹 브라우저 -> MemberController(Controller) -> MemberVO(model 회원가입 정보 수집) -> MemberService(Service) -> MemberMapper(mapper(dao)) -> Member Table insert

     

     - 로그인 페이지로 이동

    웹 브라우저 -> MemberController(Controller) -> Login.jsp(회원가입 화면으로 이동)

     - 로그인 버튼을 클릭

    웹 브라우저 -> MemberController(Controller) <-> MemberVO(model 회원가입 정보 수집)< -> MemberService(Service) <-> MemberMapper(mapper(dao)) <-> Member Table Select

     

     

    비동기식 통신방식 ( ajax )

     : .jsp 파일의 브라우저에서 데이터를 가지고 가는 것이 아니라, 백 그라운드에서 생성된 ( java Script ) 브라우저에서 데이터를 가지고 가는 방식

     : model 대신에 Json이 데이터를 운반한다. 

     : Spring 프레임워크는 기본적으로 자바언어이고 비동기식은 데이터 타입 javascript 또는 xml이 주 언어이기 때문에

    pom.xml 에 jackson-databind ( javascript 타입 ) 과 jackson-dataformat-xml ( xml 타입 ) 을 추가해야한다.

     


    Spring의 동기식 처리

     : 기본적으로 스프링도 single thread 방식으로 명령어를 처리하기 때문에 동기식으로 진행된다.

    @RequestMapping(value="/board/list", method = RequestMethod.GET)
    	public String list (Model model, CriteriaVO cri) {
        		명령어
        	return " page "
        }

     - HTML의 파라미터나 form 태그로 부터 전달받은 데이터를 Controller에 전달하고, medel에 저장시켜서 매개변수로 활용한다.

     

     


    Spring의 비동기식 처리

     : 비동기식으로 처리 할 경우 여러개의 명령어를 동시에 실행하기 때문에 대량의 데이터를 취급할 때 유리하다.

    @RequestMapping(value = "/replies/{board_no}/{page}", method = RequestMethod.GET)
    	public ResponseEntity <ReplyPageVO> getList(@PathVariable("page") int page,@PathVariable("board_no") int board_no){
    		CriteriaVO cri = new CriteriaVO(page,10);
    		return new ResponseEntity<>(rs.list(cri, board_no),HttpStatus.OK);
    	}

     - Controller로 데이터를 전달할 때, javascript로 부터 데이터를 받을 수 있다. 이 때, 데이터를 입력하고 전달하기 위한 form 태그도 비동기식으로 처리되어야 하기 때문에, javascript로 생성해야만 한다.

     

     - 비동기식의 특징으로는 Controller로 전달되는 데이터가 일반 매개변수가 아니라 특수한 어노테이션을 거처서 온다는 것과, return 요청이 ResponseEnitiy을 통해 이루어 진다는 점이다.

    -> 위에서 사용된 방법은 get 방식으로, 파라미터를 매개변수로 사용하기 위해

    @PathVariable( "param_name" ) 타입 변수명

    의 형태로 매개변수를 선언했다.

     

     

    ** 비동기식으로 controller와 상호작용 하는 방법

     1) GET 방식

     : get 방식은 controller에 파라미터를 보내고 그에 대한 응답으로 return 값을 얻을 수 있다

    데이터베이스로부터 댓글의 정보를 받아와서 댓글 리스트를 작성하는 script를 보자.

    function list(param){// list함수 선언 시작
    	var board_no = param.board_no;
    	var page = param.page;
    	
    	$.getJSON("/replies/"+board_no+"/"+page+".json",function(data){
    		
    		var str="";
    		
    		for(var i=0;i<data.list.length;i++){
    			str+="<li>"+data.list[i].id+"</li>"
    			str+="<li><textarea id='replycontent"+data.list[i].rno+"'>"+data.list[i].content+"</textarea></li>"
    			str+="<li>"
    			str+="<input class='update' type='button' value='수정' data-rno="+data.list[i].rno+">"
    			str+="<input class='remove' type='button' value='삭제' data-rno="+data.list[i].rno+">"
    			str+="</li>"
    		}
    		
    		$("#replyUL").html(str);
    		
    		showReplyPage(data.replycnt,page);
    	});
    }

     

     - 파라미터를 보내고 원하는 데이터를 Json 형식응로 받으려면,

    컨트롤러의 value 값인 "/replies/{board_no}/{page}" 에 맞춰서 데이터를 요청해야한다.

     

    $.getJSON("/replies/"+board_no+"/"+page+".json",function(data){
    	실행문
    }

     -> 특정 URL로 Json 형식의 데이터를 요청한 후, 해당 데이터를 매개변수로 뒤에 따라오는 함수를 실행할 수 있다.

     

    위의 js는 댓글에 대한 데이터를 가지고와서 댓글 리스트를 jsp에 추가할 수 있다.

     

    2) POST 방식

    @RequestMapping(value = "/replies/new", method = RequestMethod.POST)
    		public ResponseEntity<String> replywrite(@RequestBody ReplyVO reply , HttpSession session){
    			reply.setId((String)session.getAttribute("login"));
    			int result=rs.rewrite(reply);
    			
    			return result==1? new ResponseEntity<>("success",HttpStatus.OK)
    					: new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
    		}

     - Controller에서 다음과 같이 선언했다.

    js에서 Json 형식으로 데이터를 전송한 경우, Controller에서는 @RequestBody 어노테이션을 이용해서 Json 형식의 데이터를 Java Object로 변환해야한다.

     

     - rs.rewrite() 함수의 경우, return 값이 int 이기 때문에, 해당 명령을 성공하면 1을 반환하고, 실패하면 0을 반환한다.

    이를 이용해서 return에 삼항연산자를 이용해 controller의 결과를 원하는 방향으로 조절할 수 있다.

     

     - 댓글을 작성할 때 현재 로그인 중인 아이디를 모델에 입력하기 위해 session으로부터 id 값을 받아서 setId() 로 값을 저장했다.

     

    function add(reply){	
    	$.ajax({
    		type:"post",	// method방식(get, post, put, delete)
    		url:"/replies/new",
    		data:JSON.stringify(reply),
    		contentType:"application/json; charset=utf-8",
    		success:function(result){
    			if(result=="success"){
    				alert("댓글쓰기 성공")
    				list(reply.board_no)
    			}
    		}
    	})
    }

     - Controller로 Json형태의 데이터를 전달하기 위해서 js에서는 $.ajax를 활용해야한다.

     

     

Designed by Tistory.