-
< Spring Boot > RESTfulSpring Boot 2023. 11. 2. 22:46
프로젝트를 하면서 ajax 를 통해 처음으로 RESTful 을 혼자 힘으로 구현해봤다.
그래서 내가 이해한 개념과 코드를 포스팅해보려고한다 ( 까먹지 않기 위해..)
우선 RESTful 을 알기위해서 REST 부터 설명해보겠습니다.
REST(Representational State Transfer)는 웹 서비스를 위한 아키텍처 스타일 중 하나로, 자원을 URI로 표현하고 HTTP 메서드를 이용하여 해당 자원에 대한 행위를 정의합니다.
RESTful 을 구현하기 위해선
@RestController 또는 @Controller + @Responsbody 를 이용해야합니다.
우선 저는 restcontroller 를 사용하지 않았다 controller 와 responsebody 를 통해 RESTful 을 구현해봤다.
우선 Viewer(html) 코드이다.
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>회원 목록</title> <style> <!-- 넘 길어져서 비워둠 --> </style> </head> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <body> <h1>회원 목록</h1> <table> <thead> <tr> <th>이메일</th> <th>이름</th> <th>가입유형</th> <th>가입날짜</th> <th>회원삭제</th> </tr> </thead> <tbody> <tr th:each="member : ${members}" th:if="${member.email != 'admin@aaa'}"> <td th:text="${member.email}"></td> <td th:text="${member.name}"></td> <td th:text="${member.provider}"></td> <td th:text="${member.joinDate}"></td> <td> <button th:onclick="'deleteMember(\'' + ${member.id} + '\')'">삭제</button> </td> </tr> </tbody> </table> <script> function deleteMember(memberId) { if (confirm('정말로 이 회원을 삭제하시겠습니까?')) { $.ajax({ type : 'DELETE', url : '/admin/deleteMember/' + memberId, success : function(response) { if (response === 'success') { // 삭제 성공한 경우, 페이지를 새로고침합니다. location.reload(); } else { console.log("삭제 중 예외 발생"); alert('삭제 중 오류가 발생했습니다.'); } }, error : function() { alert('삭제 중 오류가 발생했습니다.'); } }); } } </script> </body> </html>
여기서 보면 script function 안에 ajax 가 있는 걸 확인 할 수 있다.
나는 DB 에 id 로 회원 가입 하면 자동으로 1씩 증가하도록 해놨고
pk 로 지정해 절대 중복되지 않는다
@Controller /@ ResponseBody
package my.project.shop.controller; @Controller @RequestMapping("/admin") public class AdminController { @Autowired private MemberService memberService; @GetMapping("/user_list") public String user_list(Model model) { // 전체 회원 목록을 가져온다 List<Member> members = memberService.getAllMembers(); model.addAttribute("members", members); return "user_list"; } @DeleteMapping("/deleteMember/{memberId}") @ResponseBody public String deleteMember(@PathVariable Long memberId) { try { // 회원을 삭제하는 비즈니스 로직 수행 memberService.deleteMemberById(memberId); return "success"; } catch (Exception e) { System.err.println("삭제 중 예외 발생 : " + e.getMessage()); return "error"; } }
그리고 여기 컨트롤을 보면 @ResponsBody 가 있다.
이걸 이용하면 rest API 를 이용가능하다.
그리고 @PathVariable 를 이용하면 Rest API에 URI 에 변수로 들어오는 값을 파라미터로 받아 올 수 있다.
deleteMemberById 는
아래에서 보여주겠다.
package my.project.shop.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import my.project.shop.entity.Member; import my.project.shop.entity.Product; import my.project.shop.repository.MemberRepository; import java.util.List; import java.util.Optional; @Service public class MemberService { private final MemberRepository repository; @Autowired public MemberService(MemberRepository repository) { this.repository = repository; } public void deleteMemberById(Long id) { repository.deleteById(id); } }
현재 MemberRepository 는 인터페이스로 extends 해서 JPARepository 를 상속받고 있는 상태이다
그래서 jpa 에 deleteByid 를 이용해 Long 타입인 id 를 받아서 그에 해당하는 데이터를 삭제 하는 것이다.
여기 화면에서 회원삭제 optional 아래에 삭제 버튼을 클릭하면 function 으로 지정한 deleteMeber() 스크립트가 실행되어 ajax 로 post 메서드를 deleteMapping 으로 정해둔 uri 로 넘긴다.
그럼 서버에선 해당 uri 에 들어온 json 에 id 부분을 찾아 파라미터로 넘기고 JPA에 deleteById 를 받은 deleteMemberById 를 실행시켜 해당 데이터를 삭제하는 비즈니스 로직이 수행된다.
총정리
@DeleteMapping 어노테이션은 Spring Framework에서 제공하는 어노테이션 중 하나로,HTTP DELETE 메서드에 해당하는 요청을 처리하는 데 사용됩니다.
이 요청은 /deleteMember/{memberId} 엔드포인트에 대한 DELETE 요청을 처리하며,
중괄호로 둘러싸인 memberId 경로 변수를 통해 삭제할 회원의 ID를 전달합니다.
해당 메서드(deleteMember)는 경로 변수로 전달된 memberId를 받아들이고,해당 ID를 사용하여 회원을 삭제하는 비즈니스 로직을 호출합니다.
성공적으로 회원을 삭제한 경우 "success" 문자열을 반환하며, 예외가 발생한 경우 "error" 문자열을 반환합니다.
따라서 RESTful API에서 DELETE 메서드를 사용하여 회원 정보를 삭제하는 엔드포인트를 제공하는 것입니다.
이렇게 오늘 ajax 와 RESTful 을 이용한 로직을 나중에 안 까먹게 적어보았다.
'Spring Boot' 카테고리의 다른 글
< Spring Boot > Security (0) 2023.10.16 <Spring Boot> 간단한 스프링부트를 이용한 회원가입, 로그인 (0) 2023.09.05 < Spring Boot > ThymLeaf (0) 2023.08.30 <Spring Boot> queryAnnoation (0) 2023.08.25 <Spring Boot> queryMethod (0) 2023.08.25