반응형


몇달 전 모빌리티 회사로 이직하게 되었고 내가 처음 맡은 분야는 혜택(포인트, 쿠폰) 쪽이였다.


이러한 테스트 소스를 구현하게 된 계기

인계받은 기존 소스를 양산형으로 구현해서 (공장에서 찍어낸듯한..) 말그래도 돌아가게만 만들어 놓은 상태였다.
우리는 일반적인 JAVA로 개발된 API가 그렇듯 DTO로 필드로 받아서 내부 로직을 처리하도록 설계되어있었는데
DTO에 거의 모든 (데이터 컬럼에 맞는) 필드를 생성해놓고 그 중 일부만 request 받는 그런 식이였다.
이게 한두개면 별일이 아니였을텐데 대략 50개 정도(그것도 포인트 관련 소스만)가 이런 상태였고
다음과 같은 원칙일 경우에만 DTO를 중복으로 사용해야했다. (DTO생성을 최소화 하기 위함)

1. DTO파일 명칭이 업무적인 의미상 생뚱맞지 않을 경우
2. DTO에 생성된 필드가 70%이상 사용될 경우
3. INPUT은 반드시 Request, OUPUT은 반드시 Response 명칭의 파일로 사용(혹은 생성)

위 조건의 경우에만 기존 사용하던 DTO를 사용할 수 있었고
그렇지 않은 경우에는 DTO를 새로 생성해야 했다

이미 만들어져있는 소스가 너무 양산형이라 아예 처음부터 시작하는게 낫겠다 싶었지만
구현해야하는 API가 너무 많았기에 하나씩 차근차근 수정해보기로 하고
아래와같은 소스를 구현하게 됐다

DTO가 재사용해도 되는 지 판단하기 위한 소스

    public static void main(String[] args) {
        try {
            File file = new File(
                    "C:/Users/test/test.java");
            
            FileReader filereader = new FileReader(file);
            BufferedReader br = new BufferedReader(filereader);
            String readLine = null;

            List<String> dtoContent = new ArrayList<>();

            dtoContent.add("user");
            dtoContent.add("domain");
            dtoContent.add("test");
            dtoContent.add("test2");
            dtoContent.add("date");
            dtoContent.add("userNum");
            dtoContent.add("ETC");
            
            Integer count = 0;
            Integer privateCnt = 0;
            Integer needsCnt = 0;
            
            StringBuffer sb = new StringBuffer();
            String allContents = "";
            
            System.out.println("DTO 파일에서 필요 없는 리스트 : ");
            while ((readLine = br.readLine()) != null) {
                Boolean exsistFlag = false;
                if(readLine.indexOf("private") > -1 && readLine.indexOf("final") < 0){
                    privateCnt++;
                    String cut = readLine.split("private")[1];
                    String word = cut.split(" ")[2].replace(";", "");
                    allContents += "@" + word;
                    for (String search : dtoContent) {
                        if (readLine.indexOf(search) > -1) {
                            count++;
                            exsistFlag = true;
                            continue;
                        }
                    }
                    
                    if(!exsistFlag) {
                        System.out.println(word);
                    }
                }
            }
            
            for (String needs : dtoContent) {
                if(allContents.indexOf("@" + needs) < 0) {
                    sb.append(needs + "\n");
                    needsCnt++;
                }
            }
            
            int percent = (int) (((double)count/(double)privateCnt) * 100);
            System.out.println("DTO파일의 요소 총 "+ privateCnt + "개 중, 필요한 INPUT이 " + count + "개 부합함(" + percent+"%)");
            System.out.println("\nINPUT요소 " + dtoContent.size() + "개 중 DTO파일에서 " + needsCnt + "개 부족함");
            System.out.println("DTO파일에 필요한 리스트 : \n" + sb);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


DTO파일 절대경로로 파일을 읽어서
해당 DTO는 그대로 써도 좋을 지, 아니면 새로 만들어야 할 지 판단했다
list에 set해주는 부분은 vi를 사용해 편집하여 붙여넣었다
vi로 새 파일을 만들고 필요한 필드를 세로로 나열한 후에

라인마다 맨 앞에 dtoContent(“를 붙이겠다

:%s/^/dtoContent(“/g

라인마다 맨 뒤에 “);를 붙이겠다

:%s/$/“);/g

이렇게해서 소스에 붙여넣어 사용했다

나와같은 상황을 마주할 사람들이 얼마나 있을지는 모르겠지만..

이걸통해 누군가가 힌트를 얻길 바란다

반응형
복사했습니다!