Back-End

Back-End: Golang(Next)와 Spring(Interceptor)

슝슝이입니다 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를 호출하는 것이 요청 처리의 핵심입니다.
반응형