-
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는:
- 요청 흐름을 제어합니다.
- 미들웨어가 자신의 작업을 수행한 후 다음 미들웨어 또는 최종 핸들러로 요청을 넘깁니다.
- 필요할 경우, 요청을 차단하여 더 이상 처리가 진행되지 않도록 할 수 있습니다.
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. 재사용 가능한 미들웨어 작성
- 미들웨어를 작은 단위로 분리하고 재사용 가능한 구조로 작성해야 합니다.
- 예: 로깅 미들웨어는 인증, 데이터 검증과 독립적으로 동작해야 합니다.
결론
- Golang과 Java Spring Boot 모두 next는 요청을 다음 단계로 전달하는 데 필수적인 역할을 합니다.
- next를 통해 요청의 흐름을 제어하고, 각 작업을 분리하여 가독성과 유지보수성을 향상시킬 수 있습니다.
- 올바른 순서와 조건에 따라 next를 호출하는 것이 요청 처리의 핵심입니다.
반응형'Back-End' 카테고리의 다른 글
오버 페치(Over-Fetch)와 언더 페치(Under-Fetch)란? (0) 2024.11.25 라우터(Router)란? (1) 2024.11.20