ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [리팩토링] 가독성을 위한 리팩토링2
    프로젝트/웹 ERD 프로젝트 2023. 12. 8. 23:59

    지난번 포스팅했던 코드를 리뷰받았는데. 가독성이 떨어지는 것을 따로 private 메서드로 만들어서 가독성을 높혔었었던 작업을 더 진행하면 좋을것 같다고 했다. 그리고 null값으로 직접 비교 하는게 아닌, isEmpty를 사용하면 더 좋겠다고 했다.

     

    그래서 지난번 리팩토링에 이어서 추가적으로 가독성을 올리기 위해 비즈니스 로직들을 더 추상화 시켜봤다!

     

    리팩토링 전 코드

    @Transactional
    public String sendMail(MailDTO mailDto, String addressListStr, MultipartFile attachmentFile) {
    
        dao.saveMail(mailDto);
    
        //보낸 메일 고유번호
        int recentMailNum = mailDto.getMail_num();
        //DB에 넘겨줄 MailRecDto
        MailRecDTO mailRecDto = new MailRecDTO();
        mailRecDto.setMail_num(recentMailNum);
    
        //Mail_Rec테이블 insert (MappingTable -- 받은 사람들 저장하기)
        String msg = "메일전송이 완료되었습니다!";
        int res = 0;
        int resCheck = 0;
    
        if(addressListStr != null) {
            List<String>addressList = Arrays.asList(addressListStr.split(" "));
            List<Integer> rec_numList = dao.findMemberNumByMailAddress(addressList);
            resCheck = rec_numList.size();
    
            for(int i=0; i<rec_numList.size(); i++) {
                mailRecDto.setRec_num(rec_numList.get(i));
                mailRecDto.setMail_receiver(addressList.get(i));
                res += dao.saveReceiveTable(mailRecDto); //insert 작업
            }
            return msg;
        }
    
    	// (생략) ...
    
        //첨부파일 저장
        if(!attachmentFile.isEmpty()) {
            saveAttachmentFile(mailDto, attachmentFile);
        }
        return msg;
    }

     

     

    리팩토링 후 코드

    private final String SUCCESS_MESSAGE = "메일전송이 완료되었습니다.";
    private final String FAIL_MESSAGE = "메일전송이 실패했습니다.";
    
    //메일 보내기
    @Transactional
    public String sendMail(MailDTO mailDto, List<String> addressList, MultipartFile attachmentFile) {
        //DB에 넘겨줄 MailRecDto(수신자 정보 객체)
        MailRecDTO mailRecDto = saveMail(mailDto);
        //내게쓰기인 경우
        boolean isSendToMe = checkSendToMe(addressList);
        try {
            if(isSendToMe) {
                sendMailToMe(mailDto, mailRecDto);
                saveAttachmentFile(mailDto, attachmentFile);
                return SUCCESS_MESSAGE;
            } 
            else {   
                sendMailToAnother(addressList, mailRecDto);
                saveAttachmentFile(mailDto, attachmentFile);
                return SUCCESS_MESSAGE;
            }
        } 
        catch (Exception e) {
            return FAIL_MESSAGE;
        }
    }

    boolean타입의 변수를 만들어서 내게쓰기인지 확인 후 if문에 넣어서 읽었을 때 무슨 의미인지 바로 알 수 있도록 하고,

    msg와 같은 것도 위로 빼서 final변수로 SUCCESS/FAIL_MESSAGE로 주게 되니 따로 "무슨 메세지일까?" 라는 생각을 해도 되지 않도록 만들었다.

     

    로직들을 추상화하면서 확실히 비즈니스 로직이 깔끔하게 정리된 모습이다.

    리팩토링을 하기 전에는 "코드를 이렇게까지 따로 빼서 쓰게되면 오히려 읽는게 불편하지 않을까?" 라는 생각을 가지고 있었는데, 리팩토링을 하고나니까 확실히 비즈니스 로직이 어떻게 흘러가고 있는지 직관적으로 보이고, 자잘한 내용들이 추상화가 되어서 가독성이 훨씬 높아진것 같다.

     

    현재 메일쓰기 메서드만 리팩토링을 진행했었는데, 나머지 메서드들도 바꿔봐야겠다.

Designed by Tistory.