본문 바로가기
Spring Boot 개념 정리

너무 복잡한 @Service 코드 리팩토링 해보기

by 반오십 코린이 2023. 2. 18.
728x90
프로젝트를 진행하다보니 하나의 메서드 Service 코드가 너무 길어져 가독성이 떨어지는 문제가 발생.

 

어떻게 해결할지 고민해보니 기존 복잡한 해당 Service 메서드를 2개의 메서드로 나누어  Controller에서  

2가지의 Service 메서드를 호출할 수 있도록 설계하면 되겠다는 생각이 들었다.


Controller

 

 

Controller 부분인데 원래는 하나의 Service 메서드를 호출하는 방식으로 response를 return하였으나

현재는 2개의 메서드를 호출하여 데이터를 처리하는 모습.


Service

 

 

서비스 단에서 원래 하나의 메서드였던 코드를 2개로 나누어 상단 메서드의 return 값이 하단 메서드의 매개 변수로 사용 되게 끔 설계하였다.

 


ServiceImpl(1번 메서드)

 

 

해당 메서드의 return 값인 params가 하단 메서드의 매개변수로 들어가는 구조.


ServiceImpl(2번 메서드)

 

@Transactional(readOnly = false)
@Override
public List<JSONObject> getFacilityResponse(MultiValueMap<String, String> params, Form.RealEstateForm form, String email) {

    String is_end = "false";
    int page = 0;

    RestTemplate rest = new RestTemplate();
    HttpHeaders httpHeaders = new HttpHeaders();

    //헤더 세팅
    httpHeaders.set("Authorization", "KakaoAK " + kakaoProperties.getRestapi());

    HttpEntity<String> httpEntity = new HttpEntity<>(httpHeaders);

    //편의시설 결과를 담을 map 자료 구조를 저장한다.
    List<JSONObject> results = new ArrayList<>();

    while (is_end == "false") {
        page += 1;
        params.remove("page");
        params.add("page", Integer.toString(page));

        //한번에 페이지 하나만 불러올 수 있음
        URI targetUrl = UriComponentsBuilder
                .fromUriString("https://dapi.kakao.com/v2/local/search/category.json")
                .queryParams(params)
                .build()
                .encode()
                .toUri();
        //post 방식 보내기
        ResponseEntity<String> res = rest.exchange(targetUrl, HttpMethod.POST, httpEntity, String.class);

        //String to json 역할을 하는 method
        JSONParser jsonParser = new JSONParser();

        //res의 body 부분을 담을 곳
        JSONObject body = null;

        //String to json 시도
        try {
            body = (JSONObject) jsonParser.parse(res.getBody().toString());
        } catch (ParseException e) {
            logger.info("변환 실패");
            e.printStackTrace();
        }
        //마지막 페이지 여부 확인
        JSONObject meta = (JSONObject) body.get("meta");

        //documents를 열어보면 JsonArray가 추출됨
        JSONArray docu = (JSONArray) body.get("documents");

        //헤당 페이지가 마지막이 아닐경우
        if (docu.size() != 0) {
            for (int i = 0; i < docu.size(); i++) {
                JSONObject temp = (JSONObject) docu.get(i);
                logger.info("편의점 :: {}", temp);
                results.add(temp);
            }
        }
        is_end = String.valueOf(meta.get("is_end"));
        logger.info("is_end :: {}", is_end);
    }
    for (JSONObject result : results) {
        System.out.println("result.toString() = " + result.toString());
    }

    RealEstate realEstate = new RealEstate();
    realEstate.createRealEstate(form.getSigungu(),
            Double.parseDouble(form.getLatitude()), Double.parseDouble(form.getLongitude()),
            form.getRoadName(), form.getBuildType(),
            form.getFloor(), form.getArea(),
            form.getDealType(), form.getPrice(),
            form.getDeposit(), form.getMonthlyPay(), form.getDescription(),
            ""
    );

    registerWithFacility(results, realEstate, email);

    return results;
}

 

데이터 가공을 마무리 하고 Controller로 response로 사용할 데이터를 return하는 모습.

 


원래 코드가 100줄 훨씬 넘게 넘어갔던 것을 감안하면 보기 굉장히 깔끔해졌다.

- 내용을 세부적으로 분리하였다는 점이 핵심

728x90