ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Back-End: Golang(Next)와 Spring(Interceptor)
    Back-End 2024. 11. 22. 13:21
    반응형

    Back-End next란 무엇인가?

    1. Back-End에서 next란?

    next는 미들웨어 체인에서 다음 단계로 요청을 전달하기 위한 메커니즘입니다. 현대적인 백엔드 프레임워크(예: Golang, Java Spring Boot)에서는 요청 처리를 분리하고 재사용성을 높이기 위해 미들웨어 패턴을 사용합니다.

    이 과정에서 next는:

    1. 요청 흐름을 제어합니다.
    2. 미들웨어가 자신의 작업을 수행한 후 다음 미들웨어 또는 최종 핸들러로 요청을 넘깁니다.
    3. 필요할 경우, 요청을 차단하여 더 이상 처리가 진행되지 않도록 할 수 있습니다.

    next는 요청 처리의 유연성가독성을 높이는 데 핵심적인 역할을 합니다.


    2. Golang과 Java Spring Boot에서의 예시

    Golang에서의 next

    Golang에서는 net/http 패키지 기반의 미들웨어를 작성할 때 next를 핸들러 체인으로 전달합니다. 예를 들어, 인증, 로깅 등 요청의 각 단계를 개별 미들웨어로 처리할 수 있습니다.

    package main
    
    import (
    	"fmt"
    	"net/http"
    )
    
    // 첫 번째 미들웨어: 로깅
    func loggingMiddleware(next http.Handler) http.Handler {
    	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    		fmt.Println("Logging Middleware: Before")
    		next.ServeHTTP(w, r) // 다음 미들웨어 또는 핸들러 호출
    		fmt.Println("Logging Middleware: After")
    	})
    }
    
    // 두 번째 미들웨어: 인증
    func authMiddleware(next http.Handler) http.Handler {
    	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    		if r.Header.Get("Authorization") != "Bearer valid_token" {
    			http.Error(w, "Unauthorized", http.StatusUnauthorized)
    			return // 요청 중단
    		}
    		fmt.Println("Auth Middleware: Authorized")
    		next.ServeHTTP(w, r) // 다음 단계 호출
    	})
    }
    
    // 최종 핸들러
    func finalHandler(w http.ResponseWriter, r *http.Request) {
    	fmt.Fprintln(w, "Hello, Golang Middleware!")
    }
    
    func main() {
    	// 기본 라우터 설정
    	mux := http.NewServeMux()
    
    	// 미들웨어 체인 생성
    	final := http.HandlerFunc(finalHandler)
    	mux.Handle("/", loggingMiddleware(authMiddleware(final)))
    
    	// 서버 실행
    	http.ListenAndServe(":8080", mux)
    }

    출력 결과

    1. 정상 요청:

    Logging Middleware: Before
    Auth Middleware: Authorized
    Logging Middleware: After

     

    • 브라우저 출력: Hello, Golang Middleware!

    2. 비정상 요청 (인증 실패):

    Logging Middleware: Before

     

    브라우저 출력: Unauthorized


    Java Spring Boot에서의 next

    Java Spring Boot에서는 Filter 또는 HandlerInterceptor를 사용해 미들웨어 패턴을 구현합니다. 여기서 FilterChain 또는 HandlerInterceptor의 preHandle, postHandle 메서드가 next의 역할을 합니다.

    import org.springframework.stereotype.Component;
    import org.springframework.web.filter.OncePerRequestFilter;
    
    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @Component
    public class LoggingFilter extends OncePerRequestFilter {
    
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
                throws ServletException, IOException {
            // 요청 전 로직
            System.out.println("Logging Filter: Before");
            
            // 다음 단계 호출
            filterChain.doFilter(request, response);
    
            // 응답 후 로직
            System.out.println("Logging Filter: After");
        }
    }
    import org.springframework.stereotype.Component;
    import org.springframework.web.servlet.HandlerInterceptor;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @Component
    public class AuthInterceptor implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            // 요청 전 인증 처리
            if (!"Bearer valid_token".equals(request.getHeader("Authorization"))) {
                response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
                return false; // 다음 단계로 진행하지 않음
            }
            System.out.println("Auth Interceptor: Authorized");
            return true; // 다음 단계로 진행
        }
    }

    3. 주의사항 및 추가 사항

    1. next 호출은 필수

    • Golang: next.ServeHTTP를 호출하지 않으면 요청이 더 이상 처리되지 않습니다.
    • Java Spring Boot: filterChain.doFilter 또는 return true를 호출하지 않으면 다음 핸들러로 요청이 전달되지 않습니다.

    2. 요청 중단 조건 확인

    • 인증, 권한, 데이터 검증 실패 시 next를 호출하지 않고 요청을 중단해야 합니다.
    • 예: 인증 토큰이 잘못된 경우 응답을 반환하고 체인을 종료.

    3. 로직 순서 보장

    • 미들웨어는 등록된 순서대로 호출됩니다.
    • 예: 로깅 → 인증 → 최종 핸들러 순서로 등록되었다면, 요청은 로깅 → 인증 → 최종 핸들러 순으로 처리됩니다.

    4. 재사용 가능한 미들웨어 작성

    • 미들웨어를 작은 단위로 분리하고 재사용 가능한 구조로 작성해야 합니다.
    • 예: 로깅 미들웨어는 인증, 데이터 검증과 독립적으로 동작해야 합니다.

    결론

    • GolangJava Spring Boot 모두 next는 요청을 다음 단계로 전달하는 데 필수적인 역할을 합니다.
    • next를 통해 요청의 흐름을 제어하고, 각 작업을 분리하여 가독성과 유지보수성을 향상시킬 수 있습니다.
    • 올바른 순서와 조건에 따라 next를 호출하는 것이 요청 처리의 핵심입니다.
    반응형

    'Back-End' 카테고리의 다른 글

    오버 페치(Over-Fetch)와 언더 페치(Under-Fetch)란?  (0) 2024.11.25
    라우터(Router)란?  (1) 2024.11.20
Designed by Tistory.