spring 16

[TIL] - ThreadLocal을 활용해 사용자 정보 관리하기

Ch2 - MSA 기반 물류 시스템 개발 프로젝트 배운 것이번 프로젝트를 진행하면서 MSA 환경에서 서비스를 나눠서 개발을 진행했다. 그 중 사용자 인증과 권한 관리를 효율적으로 처리하기 위해 JWT(Json Web Token)를 활용했다.유저 서비스에서 사용자 인증이 이루어지면, 게이트웨이 서비스에서 토큰 검증을 수행하고, 유효한 토큰에 포함된 사용자 정보를 헤더에 추가하여 각 서비스로 전달하며, 이후 각 서비스는 이 헤더 값을 활용하여 사용자 정보를 확인하고 API를 처리하도록 설계했다. 각 서비스에서는 넘어온 사용자 정보를 어떻게 저장하고 활용할지 고민을 하던 중 Spring Security를 사용하는 방법을 먼저 고려했다. 하지만 Security는 모든 요청에 대해 필터 체인을 거치고 컨텍스트를 ..

[TIL] - MSA 프로젝트 구조 복습 및 생각 정리

Ch2 - MSA 학습 (MSA 프로젝트 구조 및 흐름 복습) 배운 것제공 받은 MSA 강의를 다 들었지만, 분산화된 서비스 애플리케이션을 연결하고 관리하는 기술들인 Eureka Server, API Gateway, Config Server 등을 어떻게 설정하고 흐름은 어떻게 되는지에 관한 개념들이 파편화 되어 있어서 오늘은 프로젝트를 만들어보면서 하나씩 연결하고 설정해보는 시간을 가졌다. 내일부터는 로컬환경에서 만든 프로젝트를 어떻게 관리하고 배포해야 하는지 공부하고 정리하면 좋을 것 같다. 클라이언트가 요청을 하고 응답을 받는 과정을 정리하면 다음과 같다. 1. 클라이언트가 API Gateway로 HTTP 요청을 보낸다.2. API Gateway는 이 요청을 받아 처리하며, 요청 URL과 미리 설정된..

[TIL] - Spring Cloud Gateway 적용하기

Ch2 - MSA 학습 (Spring Cloud Gateway 적용 및 내부 구조 정리) 배운 것각 도메인 별로 서비스 어플리케이션을 만들어서 Eureka Server에 등록하여 사용하는 방법을 배웠다. 하지만 클라이언트가 서비스별 API를 요청하려면 각 서비스의 URL을 직접 입력해서 들어가야 한다. 이는 클라이언트 측에서 여러 서비스의 엔드포인트를 관리해야 하는 번거로움을 초래하고, 서비스의 위치가 변경될 때마다 클라이언트 코드를 수정해야 하는 유지보수 문제를 야기한다.API Gateway를 통해 클라이언트에게 단일 진입점을 제공함으로써 요청을 적절한 서비스로 라우팅하고, 공통 기능을 중앙에서 처리할 수 있게 된다. 또한, 보안, 로깅, 모니터링, 요청 필터링 등을 처리한다. 이해한 흐름은 다음과 같..

[Spring] 예외처리(Exception Handling) 정리

@ExceptionHandler와 @ControllerAdvice 예외처리를 위한 메서드를 작성하고 @ExceptionHandler를 붙인다. 전역 예외 처리 클래스를 작성할 때는 @ControllerAdvice를 붙인다. (패키지 지정 가능) -> 모든 컨트롤러에서 예외처리 적용 클래스 내에서 예외처리 @Controller public class ExceptionController { @ExceptionHandler(Exception.class) public String cather(Exception e) { return "error"; } @ExceptionHandler(NullPointerException.class) public String cather2(Exception e) { return "..

[Spring] 쿠키(Cookie)와 세션(Session)에 대해 알아보자

HTTP 프로토콜의 특징 HTTP의 특성을 알아보고 쿠키와 세션이 필요한 이유에 대해 알아보자 1. 무상태 프로토콜(Stateless) 통신이 끝나면 상태를 유지하지 않는 특징 클라이언트의 요청과 그에 따른 서버의 응답이 끝나면 통신이 끝나며 해당 상태 정보는 유지되지 않는다. 2. 비 연결성(Connectionless) 클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어 버리는 특징 비 연결성을 가지는 HTTP에서는 실제로 요청을 주고 받을 때만 연결을 유지하고 응답을 주고나면 TCP/IP 연결을 끊는다. 이를 통해 최소한의 자원으로 서버 유지를 가능하게 한다. 쿠키와 세션은 위의 두 가지 특징을 해결하기 위해 사용한다. 쿠키(Cookie)란? 클라이언트를 식별할 때 사용. 클라이언트(브라우저) ..

[Spring] Redirect와 Forward에 대해 알아보자

JSP에서 Redirect와 Forard 처리 과정 Redirect - 위와 같이 Redirect는 요청이 2번이며, 각 요청은 서로 다른 객체(request)이다. - 첫 번째 요청을 GET으로 하던 POST로 하던 Redirect로 인해서 두 번째 요청을 보낼 때는 자동으로 GET으로 요청을 보낸다. 예시 1. 클라이언트가 /doc으로 요청을 보낸다. ( 1번째 요청: 수동 ) 2. 서버에서 응답 헤더를 통해 300번(Redirect)대의 상태코드와 메시지를 응답한다. (300번대는 Body정보가 없다.) 3. 클라이언트는 응답메시지를 보고 자동으로 다른 URL (/doc_new) 로 재요청을 한다. ( 2번째 요청: 자동 GET으로 ) 4. 서버는 요청에 대한 응답메시지를 클라이언트에 보낸다. 실생..

[Spring] @GetMapping과 @PostMapping

@GetMapping과 @PostMapping Spring 4.3 이후에 추가된 Get/Post 요청 전용 매핑 어노테이션으로 기존 @RequestMapping 대신 @GetMapping과 @PostMapping을 사용할 수 있다. @Controller public class RegisterController { //@RequestMapping(value="/register/add", method=RequestMethod.GET) @GetMapping("/register/add") public String registerForm() { return "registerForm"; } //@RequestMapping(value="/register/add", method=RequestMethod.POST) @P..

[Spring] @RequestParam에 대해 알아보자

@RequestParam 요청의 파라미터를 연결할 매개변수에 붙이는 어노테이션 예제 1 @RequestMapping("/requestParam") //public String main(@RequestParam(name = "year", required = false) String year) { public String main(String year) { // 위와 동일 System.out.println("년도 : " + year); return "yoil"; } 속성 name : 쿼리스트링 이름 required : 필수여부 (false면 필수 x) http://localhost/requestParam --> year = null http://localhost/requestParam?year --> yea..

[Spring] Servlet/JSP Filter에 대해 알아보자

Servlet Filter Client에서 Server로 요청이 들어오기 전에 서블릿을 거쳐서 먼저 필터링 하는 것을 서블릿 필터라고 한다. 서블릿마다 공통된 로직을 처리하기위해서 Filter를 사용한다. 공통적인 기능들을 서블릿이 호출되기 전에 수행(전처리)되게 하고 싶거나 서블릿이 호출 되고 난 뒤에 수행(후처리) 하고 싶으면 공통적인 기능들을 서블릿 필터로 구현하면 된다. Filter Chain 필터가 한개 이상 있을 때를 Filter Chain이라고 한다. Filter1의 전처리 -> Filter2의 전처리 -> Filter3의 전처리 -> 서블릿 호출 -> Filter3의 후처리 -> Filter2의 후처리 -> Filter1의 후처리 순으로 처리된다. 어떻게 쓰이나? 예제 - 수행시간 측정 /..

[Spring] Servlet에 대해 간단히 알아보자

Spring Framework는 Servlet이 발전된 형태이기 때문에 Servlet과 닮은 부분이 많다. 또한 브라우저에서 요청을 받을 때도 Servlet인 DispatcherServlet을 사용하기 때문에 간단하게 알아보고자 한다. Servlet과 Controller 비교 - TestServlet 작성 (Servlet) @WebServlet("/testServlet") public class TestServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException { String name = r..