220920_광고 관리 플랫폼 대행사 센터 제작 23_광고 관리 버그 수정

창고·2022년 9월 21일
0

해당 게시글은 개인 프로젝트인 "광고 관리 플랫폼 대행사 센터 제작"
#66 "광고 관리 버그 수정" 이슈를 다루고 있습니다.

1. 오류 내용 및 조치 사항

(1) 오류 내용 및 원인

  • 오류 내용
    • manage/광고주ID/campaigns/캠페인ID/ + post(form/delete),
      manage/광고주ID/campaigns/캠페인ID/creatives/소재ID + post(form/delete)
      에서 연관관계가 없는 상위 객체로 URI를 수정해서 접근해도 접근이 가능함
    • 다만 잘못된 URI로 접근을 하더라도 실제 생성, 수정, 삭제는 원래 연관관계가 있는 상위 객체에서 이뤄짐.
  • 원인
    • Controller 및 Service에서 광고주-캠페인-소재 간의 연관관계 validation을 하지 않았음

(2) 조치 사항

  • Controller, Service에서 validation을 수행하며 메소드에서 매개변수를 상위 객체 ID까지 받게 변경
  • Controller : Mapping 시 상위 객체까지 매개변수를 받아서 Service에 전달 + Service의 validate 실행
    @GetMapping("/{campaignId}/form")
    public String updateCampaignForm(
            @PathVariable("clientId") String clientId,
            @PathVariable Long campaignId,
            ModelMap map
    ) {
        campaignService.validateClientAndCampaign(campaignId, clientId);
        CampaignResponse campaign = CampaignResponse.from(campaignService.getCampaign(campaignId));
        ClientUserWithCampaignsResponse clientUser = ClientUserWithCampaignsResponse.from(manageService.getClientUserWithCampaigns(clientId));

        map.addAttribute("clientUser", clientUser);
        map.addAttribute("campaign", campaign);
        map.addAttribute("formStatus", FormStatus.UPDATE);

        return "manage/campaign-form";
    }
  • Service : 메소드에 상위 객체까지 매개변수를 받음, validation 기능을 수행하는 메소드 추가
    public void updateCampaign(Long campaignId, String clientId, CampaignDto dto) {

        try {
            validateClientAndCampaign(campaignId, clientId);
            Campaign campaign = campaignRepository.getReferenceById(campaignId);
            ClientUser clientUser = clientUserRepository.getReferenceById(dto.clientUserDto().userId());

            if (campaign.isDeleted()) {
                throw new EntityNotFoundException();
            }

            if (campaign.getClientUser().equals(clientUser))
                if (dto.name() != null) {
                    campaign.setName(dto.name());
                }
            campaign.setBudget(dto.budget());
        } catch (EntityNotFoundException e) {
            log.warn("캠페인을 수정하는데 필요한 정보를 찾을 수 없습니다. - dto : {}", e.getLocalizedMessage());
        } catch (IllegalArgumentException e) {
            log.warn("캠페인-광고주가 매칭되어 있지 않습니다. 잘못된 경로로 접근하였습니다.", e.getLocalizedMessage());
        }
    }
    public void validateClientAndCampaign(Long campaignId, String clientId) {

        Campaign campaign = campaignRepository.getReferenceById(campaignId);
        ClientUser clientUser = clientUserRepository.getReferenceById(clientId);

        if (!campaign.getClientUser().equals(clientUser)) {
            throw new IllegalArgumentException("캠페인-광고주가 매칭되어 있지 않습니다.");
        }
    }

2. 결과

  • 잘못된 URI로 생성하려고 할 경우

3. 미흡한 점

  • 잘못된 URI로 접근 시 에러 페이지가 출력되어 생성 자체를 하지는 못하지만, 올바른 URI로 생성 / 수정 폼을 띄운 뒤 브라우저 상에서 URI를 수정하고 실행하면 에러 페이지는 출력되나 생성 / 수정이 진행됨 (원래 올바른 URI로 접근하였으므로)
  • 이 부분은 @Transactional 로 처리를 해야 할 지... 추가 테스트 해보고 반영해보는 것으로
profile
공부했던 내용들을 모아둔 창고입니다.

0개의 댓글