⏳ Time Log/1. One Day (Daily · TIL)

Day 26 (11/24) - 팀프로젝트 및 JSP Action 패턴 및 메서드 반환

this.Serena 2026. 2. 20. 11:48
Java 개발 시 메서드 실행을 중단하고 제어권을 넘길 때 사용하는 return과 return null의 명확한 차이 및 활용법 정리

 

1. 반환 타입에 따른 메서드 종료 방식

  • void 메서드 (return;)
    • 반환값이 없는 메서드에서 사용
    • 특정 조건 만족 시 메서드 실행을 즉시 중단하고 호출한 곳으로 복귀함
  • 반환형이 있는 메서드 (return null; 등)
    • String, Object 등 참조 타입을 반환해야 하는 경우 반드시 반환값을 명시해야 함
    • 더 이상 실행할 필요가 없거나 예외 상황일 경우 null을 반환하여 종료 가능

 

2. Action 인터페이스에서의 return null 활용

  • 프레임워크 신호 전달
    • execute 메서드의 반환 타입이 String(이동할 페이지 경로)인 경우, return null;은 추가로 이동할 페이지가 없음을 의미
  • 중복 처리 방지
    • 메서드 내부에서 이미 response.sendRedirect()나 forward를 수행한 경우, 프레임워크가 다시 포워딩을 시도하면 에러가 발생함
    • 이때 return null;을 사용하여 프레임워크의 추가적인 뷰(View) 이동 처리를 차단함
  • 회원가입 로직 예시
    • 성공 후 리다이렉트 처리를 완료했다면, 하단 코드 실행을 막고 명확한 종료를 위해 return null; 사용 권장

💡 추가 학습 내용: Null 처리 시 주의사항

  • NullPointerException(NPE) 방지
    • 메서드가 null을 반환할 수 있다면, 해당 메서드를 호출한 곳에서 반드시 null 체크 로직을 포함해야 함
  • Optional 클래스 활용 (Java 8 이상)
    • null을 직접 반환하는 대신 Optional.empty()를 사용하여 반환값이 없음을 명시적으로 표현하는 최신 트렌드 반영 권장
  • 반환 타입별 기본값
    • 기본 자료형(int, boolean 등)은 null을 반환할 수 없으므로 0 또는 false와 같은 기본값 사용 필수

 

💻 코드 예시: Action 클래스에서의 제어 흐름

1. Success 케이스 (정상적인 페이지 이동)

회원가입 성공 후, 결과 페이지로 이동해야 하는 경우의 코드 구성

public String execute(HttpServletRequest request, HttpServletResponse response) {
    // 1. 비즈니스 로직 수행 (예: DB 저장)
    boolean isSuccess = memberService.join(member);

    if (isSuccess) {
        // 성공 시 이동할 뷰(View)의 경로를 반환함
        // 프레임워크가 이 문자열을 받아 포워딩을 수행함
        return "/view/joinSuccess.jsp";
    }
    
    return "/view/error.jsp";
}

 

2. Failure 또는 직접 응답 케이스 (중복 이동 방지)

이미 응답(response) 처리를 완료하여 프레임워크의 추가 이동이 필요 없는 경우

public String execute(HttpServletRequest request, HttpServletResponse response) {
    // 1. 유효성 검사 실패 시
    if (request.getParameter("id") == null) {
        // 자바스크립트로 알림창을 띄우고 직접 응답을 종료함
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<script>alert('아이디를 입력하세요.'); history.back();</script>");
        
        // 중요: 이미 직접 응답(Response)을 처리했으므로 
        // 프레임워크가 또 다른 페이지로 포워딩하지 않도록 null 반환함
        return null; 
    }

    // 2. 리다이렉트를 직접 수행한 경우
    // response.sendRedirect("main.do");
    // return null; // 리다이렉트 후 메서드 즉시 종료 및 추가 이동 차단
}