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