-
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를 활용해야한다.
'Spring' 카테고리의 다른 글
회원가입, 로그인, 게시판 백엔드 실습( 댓글 리스트 , pagenation ) (0) 2023.04.06 회원가입, 로그인, 게시판 백엔드 실습( 댓글 작성 ) (0) 2023.04.06 회원가입, 로그인, 게시판 백엔드 실습( 게시판 디테일 ) (0) 2023.04.05 회원가입, 로그인, 게시판 백엔드 실습( 게시판 글쓰기 ) (0) 2023.04.05 회원가입, 로그인, 게시판 백엔드 실습( 게시판 리스트 ) (0) 2023.04.05