SpringBoot [스프링부트] 시작하기(6) MemberController 만들기
UserController를 만들었던 거 처럼 MemberController를 만들겠습니다.
1. MemberController
- Controller위에 @RequestMapping("member")을 주면 모든 메소드에 적용됩니다. /member/~~이런식으로 식별됩니다.
@PostMapping("/request/{teamId}") public Long requestTeam(@PathVariable(name = "teamId")Long teamId,HttpServletRequest request){ HttpSession session = request.getSession(false); SessionDto sessionUser = (SessionDto) session.getAttribute(SessionConst.LOGIN_MEMBER); Long okId = memberService.requestTeam(memberRequestToTeamDto, sessionUser.getId()); return okId; }
@PostMapping으로 /member/request/{teamId} 요청입니다.
- @PathVariable: uri의 {}감싸진 변수를 가져올 수 있습니다. 이때 name속성으로 어떤 값을 가져오는지 구별이 가능합니다.
- 앞에서 Session에 User의 정보를 저장했으므로 HttpServletRequest에서 저장한 데이터를 가져올 수 있습니다.request.getSession()에서의 false속성은 Session이 없으면 생성하지 않겠다는 설정입니다.
- Session의 Session.Const.LOGIN.MEMBER에 저장을 했으므로 getAttribute(SessionConst.LOGIN_MEMBER)로 가져옵니다.
- 그 후 이미 만들었던 MembeService를 실행합니다.
- 현재 Team을 생성하는 TeamService를 만들지 않아 오류가 뜹니다.
@GetMapping("/request") public List<RequestTeamDto> requestList(HttpServletRequest request){ HttpSession session = request.getSession(false); SessionDto sessionUser = (SessionDto) session.getAttribute(SessionConst.LOGIN_MEMBER); return memberService.findRequestList(sessionUser.getId()); }
@GetMapping으로 /member/request 요청입니다.
- 마찬가지로 Session을 이용하여 정보를 가져옵니다.
@DeleteMapping("/request/{teamId}") public String deleteRequest(@PathVariable(name = "teamId") Long teamId,HttpServletRequest request){ HttpSession session = request.getSession(false); SessionDto sessionUser = (SessionDto) session.getAttribute(SessionConst.LOGIN_MEMBER); memberService.WithdrawalTeamRequest(sessionUser.getId(),teamId); return "ok"; }
@DeleteMapping으로 /member/request/{teamId} 요청입니다.
- 마찬가지로 Session을 이용하여 정보를 가져옵니다.
- Team가입 신청을 취소하는 로직이므로 teamId를 @Pathvariable로 받습니다. 해당 팀에게 신청한 것을 취소합니다.
@DeleteMapping("/request") public String leavingTeam(HttpServletRequest request){ HttpSession session = request.getSession(false); SessionDto sessionUser = (SessionDto) session.getAttribute(SessionConst.LOGIN_MEMBER); memberService.leavingTeam(sessionUser.getId()); return "ok"; }
@DeleteMapping으로 /member/request 요청입니다.
- 마찬가지로 Session을 이용하여 정보를 가져옵니다.
- Member가 팀에게 속해 있다면 탈퇴하는 로직입니다.
2. MemberController전체코드
@RestController @RequiredArgsConstructor @RequestMapping("/member") public class MemberController { private final MemberService memberService; @PostMapping("/request/{teamId}") public Long requestTeam(@PathVariable(name = "teamId")Long teamId,HttpServletRequest request){ HttpSession session = request.getSession(false); SessionDto sessionUser = (SessionDto) session.getAttribute(SessionConst.LOGIN_MEMBER); Long okId = memberService.requestTeam(teamId,sessionUser.getId()); return okId; } @GetMapping("/request") public List<RequestTeamDto> requestList(HttpServletRequest request){ HttpSession session = request.getSession(false); SessionDto sessionUser = (SessionDto) session.getAttribute(SessionConst.LOGIN_MEMBER); return memberService.findRequestList(sessionUser.getId()); } @DeleteMapping("/request/{teamId}") public String deleteRequest(@PathVariable(name = "teamId") Long teamId,HttpServletRequest request){ HttpSession session = request.getSession(false); SessionDto sessionUser = (SessionDto) session.getAttribute(SessionConst.LOGIN_MEMBER); memberService.WithdrawalTeamRequest(sessionUser.getId(),teamId); return "ok"; } @DeleteMapping("/request") public String leavingTeam(HttpServletRequest request){ HttpSession session = request.getSession(false); SessionDto sessionUser = (SessionDto) session.getAttribute(SessionConst.LOGIN_MEMBER); memberService.leavingTeam(sessionUser.getId()); return "ok"; } }
3. MemberControllerAdvice
@RestControllerAdvice(assignableTypes = MemberController.class) // 패키지가 아닌 클래스 직접 지정 public class MemberControllerAdvice { @ExceptionHandler @ResponseStatus(HttpStatus.BAD_REQUEST) public ErrorDto alreadyTeam(AlreadyTeamException e){ return new ErrorDto(e.getMessage()); } @ExceptionHandler @ResponseStatus(HttpStatus.BAD_REQUEST) public ErrorDto duplicateRequest(DuplicateRequestToTeamException e){ return new ErrorDto(e.getMessage()); } }
지금까지 MemberController와 MemberControllerAdvice를 만들어보았습니다. Controller는 Http메소드를 통해 같은 URL이라도 다른 로직이 실행되는 모습을 보입니다.
MemberController의 전체적인 코드를 보면 HttpServletRequest에서 Session을 가져오는 코드가 중복됩니다. 해당 코드를 ArgumentResolver를 통해서 자동화 하는 법을 알아보겠습니다. 감사합니다.
모든 코드는 아래 링크에서 확인 가능합니다.
https://github.com/rlaehdals/blogProject
GitHub - rlaehdals/blogProject
Contribute to rlaehdals/blogProject development by creating an account on GitHub.
github.com
'SpringBoot > spring 프로젝트 만들기' 카테고리의 다른 글
SpringBoot [스프링부트] 시작하기(8) Interceptor 만들기 (0) | 2022.01.16 |
---|---|
SpringBoot [스프링부트] 시작하기(7) ArgumentResolver 만들기 (0) | 2022.01.15 |
SpringBoot [스프링부트] 시작하기(5) Member 관련 완성하기 (0) | 2022.01.15 |
SpringBoot [스프링부트] 시작하기(4) RestController, RestControllerAdvice,ExceptionHanlder Restful API 예외 처리 (0) | 2022.01.14 |
SpringBoot [스프링부트] 시작하기(3) User Repository, Service, test 작성 (0) | 2022.01.14 |
댓글
이 글 공유하기
다른 글
-
SpringBoot [스프링부트] 시작하기(8) Interceptor 만들기
SpringBoot [스프링부트] 시작하기(8) Interceptor 만들기
2022.01.16앞서 만들었던 MemberController에 대한 로직들은 로그인이 없어도 호출이 가능했고, 비록 다른 사용자여도 로그인만 하여 세션이 있다면 다른 사용자의 정보를 이용할 수 있었습니다. 이러한 현상을 방지하기 위해 Interceptor를 만들도록 하겠습니다. Interceptor란? Controller의 Handler를 호출하기 전, 호출한 후를 가로채서 가공을 할 수 있는 것을 의미합니다. 기본적인 spring Interceptor의 흐름은 아래와 같습니다. 1. MemberInterceptor @Component @RequiredArgsConstructor public class MemberInterceptor implements HandlerInterceptor { private final Us… -
SpringBoot [스프링부트] 시작하기(7) ArgumentResolver 만들기
SpringBoot [스프링부트] 시작하기(7) ArgumentResolver 만들기
2022.01.15전 시간에 Controller에서 Session을 가져오는 데 있어서 중복 코드가 있었습니다. 해당 코드를 ArgumentResolver로 해결해보겠습니다. ArgumentResolver란? 컨트롤러의 메소드의 인자로 사용자가 임의의 값을 전달하는 방법을 제공할 때 사용합니다. 저희가 활용할 부분은 세션에 저장되어 있는 것을 메소드의 파라미터로 넘겨주는 역할을 하게 됩니다. 1. argumentresolver 패키지 먼저 만듭니다. SessionConst와 SessionDto를 사용하므로 Dto에 있던 것을 옮겨줍니다. 2. ArgumentResolver에 사용될 LoginUser Annotation만들기 @Target(ElementType.PARAMETER) @Retention(RetentionPoli… -
SpringBoot [스프링부트] 시작하기(5) Member 관련 완성하기
SpringBoot [스프링부트] 시작하기(5) Member 관련 완성하기
2022.01.15Member는 ROLE이라는 Enum으로 나누어진 User이므로 UserRository를 사용합니다. 1. MemberService에서 사용될 TeamRepository, RequestTeamRepsitory먼저 만들어줍니다. public interface RequestTeamRepository extends JpaRepository { } public interface TeamRepository extends JpaRepository { } 2. MemberService, MemberServiceImpl에서 필요로 하는 로직 먼저 살펴봅시다. Member는 팀에 가입 요청을 할 수 있다. (단 한 팀에게 한 번 요청할 수 있다.) Member는 가입요청 한 것을 취소할 수 있다. Member는 팀을 탈… -
SpringBoot [스프링부트] 시작하기(4) RestController, RestControllerAdvice,ExceptionHanlder Restful API 예외 처리
SpringBoot [스프링부트] 시작하기(4) RestController, RestControllerAdvice,ExceptionHanlder Restful API 예외 처리
2022.01.14앞서 UserRepostory, UserService, test작성, 예외 클래스를 만들었습니다. 이제 Controller와 예외가 터졌을 때 클라이언트에게 예외에 대한 내용을 알려줄 수 있도록 ControllerAdvice, ExceptionHandler를 알아보겠습니다. 1. UserController @RestController @RequiredArgsConstructor public class UserController { private final UserService userService; @PostMapping("/signup") public ResponseEntity signup(@RequestBody UserDto.SignupDto signupDto){ userService.signup(s…
댓글을 사용할 수 없습니다.