TeamController, Interceptor, ControllerAdvice와 유사하므로 추가적인 설명은 생략하겠습니다.

 

1. LeagueController, LeagueAdvice

@RestController
@RequiredArgsConstructor
@RequestMapping("/league")
public class LeagueController {
    private final LeagueService leagueService;


    @GetMapping("/")
    public RestLeagueDto findByName(@RequestParam(name = "leagueName") String leagueName){
        return leagueService.findLeagueByName(leagueName);
    }

    @GetMapping("/rest")
    public List<RestLeagueDto> findRestLeagueDto(){
        return leagueService.findRestLeagueSeat();
    }

    @GetMapping("/request/{leagueId}")
    public List<RequestLeagueDto> findRequestList(@PathVariable(name = "leagueId") Long leagueId){
        return leagueService.findRequestList(leagueId);
    }

    @PostMapping("/request/{requestLeagueId}")
    public String acceptLeague(@PathVariable(name = "requestLeagueId")Long requestLeagueId){
        leagueService.acceptLeague(requestLeagueId);
        return "ok";
    }

    @PostMapping("/")
    public Long createLeague(@RequestBody LeagueDto leagueDto, @LoginUser SessionDto hostUser){
        return leagueService.createLeague(leagueDto, hostUser.getId());
    }
}
@RestControllerAdvice(assignableTypes = LeagueController.class)
public class LeagueControllerAdvice {

    @ExceptionHandler
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ErrorDto alreadyExistLeague(AlreadyLeagueException e){
        return new ErrorDto(e.getMessage());
    }

    @ExceptionHandler
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ErrorDto alreadyAccept(AlreadyAcceptTeamException e){
        return new ErrorDto(e.getMessage());
    }

    @ExceptionHandler
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ErrorDto notExistLeagueName(NotExistLeagueNameException e){
        return new ErrorDto(e.getMessage());
    }

    @ExceptionHandler
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ErrorDto duplicateLeagueName(DuplicateLeagueNameException e){
        return new ErrorDto(e.getMessage());
    }
}

2. LeagueInterceptor 

@Component
@RequiredArgsConstructor
public class LeagueInterceptor implements HandlerInterceptor {

    private final RequestLeagueRepository requestLeagueRepository;
    private final LeagueRepository leagueRepository;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        HttpSession session = request.getSession(false);

        if(session==null){
            response.sendRedirect("/err/league/noLeague");
            return false;
        }

        SessionDto sessionUser = (SessionDto) session.getAttribute(SessionConst.LOGIN_MEMBER);
        String requestURI = request.getRequestURI();
        if(requestURI.equals("/league/") && request.getMethod().equals("GET")){
            return true;
        }

        if(!sessionUser.getRole().equals(ROLE.LEAGUE_HOST)){
            response.sendRedirect("/err/league/noAuthority");
            return false;
        }
        if(requestURI.equals("/league/")){
            return true;
        }

        if(requestURI.contains("/league/request") && request.getMethod().equals("GET")){
            Long pathVariable = Long.parseLong(requestURI.substring(16));
            League league = leagueRepository.findById(pathVariable).get();
            if(!league.getEmail().equals(sessionUser.getEmail())){
                response.sendRedirect("/err/league/noAuthority");
                return false;
            }
        }
        else{
            Long pathVariable = Long.parseLong(requestURI.substring(16));
            RequestLeague requestLeague = requestLeagueRepository.findFetchLeagueById(pathVariable).get();
            if(!requestLeague.getLeague().getEmail().equals(sessionUser.getEmail())){
                response.sendRedirect("/err/league/noAuthority");
                return false;
            }
        }
        return true;
    }
}
  • TeamInterceptor와 매우 유사합니다.
  • session이 없다면 로그인을 하도록 ErrorController로 보냅니다.
  • GET /league/: league의 이름을 검색하는 로직이므로 바로 통과시켜줍니다.
  • POST /league/: league를 생성하는 로직이므로 역할을 확인하여 없다면 ErrorController로 보냅니다.
  • GET /league/request/{pathVariable}: league에 온 가입 신청을 확인하는 로직으로 sessionUser와 비교해봅니다.
  • POST /league/request/{pathVariable}: league에 온 가입 신청을 확인하는 로직으로 sessionUser와 비교해봅니다. 

3. WebConfig 추가

registry.addInterceptor(new LeagueInterceptor(requestLeagueRepository,leagueRepository))
        .addPathPatterns("/league/**")
        .excludePathPatterns("/rest");
  • LeagueInterceptor를 추가해줍니다.
  • /rest는 모두 요청할 수 있어야 하므로 exclude 패턴에 넣어줍니다.

4. Postman Test

1. LeagueHost1 가입

2. LeagueHost2 가입

3. LeagueHost1 로그인

4. League 개설

5. TeamFounder 가입

6. TeamFounder 로그인 

6. Team 개설

7. Team이 League에 참가 신청

8. LeagueHost2 로그인

9. LeagueHost2가 URL을 조작하여 LeagueHost1이 주최한 League에 참가 신청을 수락하려 했으나 Interceptor로 인하여 실패

10. LeagueHost1 로그인

11. LeagueHost1 참가 신청 수락

지금까지 Member, Team, League에 대한 Repository, Service, Controller, Interceptor, ControllerAdvice를 만들어봤습니다. 애플리케이션의 동작 시 작동 정보 등을 기록하는 Log를 AOP를 이용하여 만들어보겠습니다. 감사합니다.

 

모든 코드는 아래 링크에서 확인 가능합니다.

https://github.com/rlaehdals/blogProject

 

GitHub - rlaehdals/blogProject

Contribute to rlaehdals/blogProject development by creating an account on GitHub.

github.com