4.비동기통신(fetch)

강재영's avatar
Sep 11, 2024
4.비동기통신(fetch)
 

1. 부분 로딩(Partial Reloading)

가장 대표적인 이유는 페이지 전체를 다시 로드하지 않고, 필요한 부분만 갱신할 수 있다는 점입니다. 서버와 통신을 하더라도 페이지 전체를 새로고침할 필요가 없기 때문에, 사용자에게 더 빠르고 부드러운 경험을 제공합니다. 예를 들어, 댓글 작성이나 게시글 목록 갱신 등에서 페이지 전체가 아닌 해당 부분만 업데이트됩니다.

2. 사용자 경험 개선 (UX 향상)

비동기 통신은 사용자가 웹 페이지와 상호작용할 때 끊김 없이 작업을 수행할 수 있게 해줍니다. 비동기 요청을 사용하는 경우, 요청이 처리되는 동안에도 사용자는 페이지에서 다른 작업을 계속할 수 있어 인터랙티브한 경험을 제공합니다.
예시:
  • 사용자가 버튼을 클릭한 후 서버에 요청을 보내고, 그 동안 다른 작업을 계속 수행할 수 있다.
  • 로딩 화면 없이 실시간으로 정보를 받아서 화면에 표시할 수 있다.

3. 서버 자원 절약

페이지 전체를 다시 로드하는 대신, 필요한 데이터만 서버로부터 받아오기 때문에 서버 자원의 사용이 최적화됩니다. 특히 데이터가 많이 중복되는 경우, 비동기 통신을 사용하면 트래픽과 서버의 부담을 줄일 수 있습니다.
 
💡
필요한 데이터만 요청받으므로 (전체html이 아닌) 네트워크 트래픽이 줄어든다.
즉 줘야하는 데이터가 적어져서 돈이 덜든다.
but 만드는 시간이 오래걸리니 인건비는 더 들어갈 수 있다.
 

사용 방법(문법 )

1.get + 쿼리스트링

let isSameUsername = true; async function sameCheck(){ //1. username 가져오기 let username =$("#username").val(); //2. fetch로 통신하기() let response = await fetch(`/user/samecheck?username=${username}`,{}); let responseBody = await response.json(); //3 중복됐으면 ->isSameUsername = true //4 중복안됐으면 -> isSameUsername = false; ->usernmae input을 readOnly if(responseBody.body){ isSameUsername =true; alert("중복된 유저네임이예요"); }else { isSameUsername =false; alert("사용할 수 있는 유저네임이에요"); $("#username").attr("readonly",true); } // }

2.post

//1. 책임 -> 통신해서 데이터 요청하고 응답받으면 CSR하기 async function saveReply(){ //1.Reply 객체 만들기 (id로 찾아서) let reply ={ comment:$("#comment").val(), boardId:$("#boardId").val() }; //2.fetch 요청하기 let response = await fetch(`/api/reply`,{ method:"post", body: JSON.stringify(reply), headers: { "Content-Type": "application/json; charset=utf-8" }, }) let responseBody = await response.json();//DTO !! console.log(responseBody); //3.CSR하기 $("#reply-box").prepend(replyItem(responseBody.body)); $("textarea").val(""); }
await 를 설정하지 않으면 프로미스객체가 리턴이되어버리니 await 를 걸고 그러면 함수가 멈춰버리니 async로 함수를 빠져나가게 설정한다.
 
ReplyController
//인터셉터 api를 낙아챔 @PostMapping("/api/reply") public ResponseEntity<?> save(@RequestBody ReplyRequest.SaveDTO saveDTO){ User sessionUser = (User)session.getAttribute("sessionUser"); ReplyResponse.DTO replyDTO = replyService.댓글쓰기(saveDTO, sessionUser); return ResponseEntity.ok(Resp.ok(replyDTO)); }
 

JSON과 Form Data의 차이점 요약:

  • Form 데이터: application/x-www-form-urlencodedmultipart/form-data 형식으로 데이터를 전송하며, 서버에서 이를 처리하려면 각각의 필드에 매핑해야 합니다 (@RequestParam, @ModelAttribute 등 사용).
  • JSON 데이터: application/json 형식으로 데이터를 전송하며, @RequestBody를 사용하여 하나의 객체로 받을 수 있습니다.
 
필요없는 get 요청을 할 수 있기에 ReplyResponse.DTO replyDTO 이렇게 dto로 반환한다.
 
ReplyService(jpa)
@Transactional public ReplyResponse.DTO 댓글쓰기(ReplyRequest.SaveDTO saveDTO, User sessionUser) { //1. 게시글 존재 유무 확인 Board board = boardRepository.findById(saveDTO.getBoardId()) .orElseThrow(() -> new Exception404("게시글을 찾을 수 없습니다.")); //2. 비영속 댓글 객체 만들기 Reply reply = saveDTO.toEntity(sessionUser, board); //2. 댓글 저장 replyRepository.save(reply); return new ReplyResponse.DTO(reply); }
 
 
Share article

강재영 블로그