목차

    ⏳ 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; // 리다이렉트 후 메서드 즉시 종료 및 추가 이동 차단
    }