ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Early Return
    Java 2023. 11. 18. 23:48

    개요

    친구에게 프로젝트 피드백을 받던 중

    라는 피드백을 받게되었다.

    해당 기능은 메일을 전송하는 API였는데, 받는 사람이 아무도 없는 경우, 내게 메일 쓰기로 판단하고 내게 메일 쓰기 처리가 되도록 하는 기능이었다. 여러 if문이 중첩되고 부분이 있고, else if문까지 있었기 때문에 가독성이 떨어졌었다.그래서 early return을 정리해보려고 한다!

     

    Early Return은 무엇인가?

    Early Return은 메서드를 만드는 방법 중 하나로 특정 조건이 충족되면 함수나 메서드가 끝나기 전에 일찍 반환되는 것을 말한다.
    즉, 함수가 메서드가 실행 중에 조건을 확인하고, 조건이 충족되면 나머지 코드를 실행하지 않고 즉시 반환한다.

     

    프로젝트 코드에 적용하기

    Early Return으로 수정 전

    //메일 보내기 API 일부
    
    		//Mail_Rec테이블 insert (MappingTable -- 받은 사람들 저장하기)
    		String msg = "메일전송이 완료되었습니다!";
    		if(addressListStr != null) {
    			String addressList[] = addressListStr.split(" ");
    			List<Integer> rec_numList = dao.findMemberNumByMailAddress(addressList);
    			
    			int res = 0;
    			for(int i=0; i<rec_numList.size(); i++) {
    				mailRecDto.setRec_num(rec_numList.get(i));
    				mailRecDto.setMail_receiver(addressList[i]);
    				res += dao.saveReceiveTable(mailRecDto); //insert 작업
    			}
    			
    			if(res != rec_numList.size()) {
    				msg = "다시 시도해주세요";
    				return "redirect:writeMail";
    			}
    		} 
    		//내게쓰기인 경우
    		else if(addressListStr == null) {
    			mailRecDto.setRec_num(mailDto.getMember_num());
    			mailRecDto.setMail_receiver(mailDto.getMail_sender()); //보내는 사람이 받는 사람이기 떄문
    			dao.saveReceiveTable(mailRecDto); //insert 작업
    		}
    		return msg;
    	}

     

    Early Return으로 수정 후

    		//Mail_Rec테이블 insert (MappingTable -- 받은 사람들 저장하기)
    		String msg = "메일전송이 완료되었습니다!";
    		int res = 0;
    		int resCheck = 0;
    		//내게쓰기인 경우
    		if(addressListStr == null) {
    			mailRecDto.setRec_num(mailDto.getMember_num());
    			mailRecDto.setMail_receiver(mailDto.getMail_sender()); //보내는 사람이 받는 사람이기 떄문
    			dao.saveReceiveTable(mailRecDto); //insert 작업
    			return msg;
    		}
    		
    		if(addressListStr != null) {
    			String addressList[] = 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[i]);
    				res += dao.saveReceiveTable(mailRecDto); //insert 작업
    			}
    			return msg;
    		}
    		
    		if(res != resCheck) {
    			msg = "다시 시도해주세요";
    			return "redirect:writeMail";
    		}
    		
    		return msg;
    	}

    확실히 중첩 if문, if-else문을 써는 것 보다 if문 하나만 쓰니 들여쓰기가 통일되면서 가독성이 높아졌다.
    현재 코드는 간단해서 별 차이를 못느낄 수 있으나, 나중에 코드가 더 길어지게되면 확실히 정리된 느낌을 더 많이 받을 거 같다.

    유의점

    대신 if else를 사용하지 않기 때문에 if문 조건의 범위와 순서를 잘 고려해서 논리 오류를 피해야한다.

    만약 아래와 같이 코드를 생성하게 될 경우

    public String getValue(final int id) {
    
    	if (id > 1) {
    		return "Valid id.";
    	}
    
    	if (id == 2) {
    		return "This id is two."
    	}
    
    	if (id < 0) {
    		return "Invalid id.";
    	}
    
    	return "Id is greater than 10.";
    }

    순서가 1보다 큰지를 먼저 검사하고 리턴해버리기 때문에 id가 2인 경우는 검사하지 못하게 된다.

     


    참고 블로그

    https://jheloper.github.io/2019/06/write-early-return-code/

    https://thearchivelog.dev/article/are-early-returns-any-good/

    'Java' 카테고리의 다른 글

    @Transactional이란 무엇인가  (0) 2023.11.22
    생성자 주입(Constructor Injection)을 권장하는 이유  (1) 2023.11.20
    JVM  (0) 2023.11.16
    Token인증 방식(JWT)과 Session인증 방식  (0) 2023.11.13
    MVC 패턴  (0) 2023.11.12
Designed by Tistory.