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는:
- 요청 흐름을 제어합니다.
- 미들웨어가 자신의 작업을 수행한 후 다음 미들웨어 또는 최종 핸들러로 요청을 넘깁니다.
- 필요할 경우, 요청을 차단하여 더 이상 처리가 진행되지 않도록 할 수 있습니다.
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를 호출하는 것이 요청 처리의 핵심입니다.
반응형