현대적인 REST API는 대부분의 데이터를 HTTP Body에 JSON 형식으로 담아 통신한다. 이번 편에서는 HTTP Body를 처리하는 방법과 서버의 처리 결과를 클라이언트에 효과적으로 전달하는 방법을 알아본다.HTTP Body 데이터 처리: @RequestBody@RequestBody는 HTTP 요청의 Body 내용을 읽어 자바 객체로 변환(역직렬화)하는 역할을 한다. JSON 형식의 요청을 처리하는 데 필수적이다.요청: POST /api/json-user, Content-Type: application/jsonBody: {"username": "hello", "age": 20}@RestControllerpublic class RequestBodyJsonController { @PostMap..
스프링 MVC는 클라이언트의 HTTP 요청을 특정 컨트롤러 메서드에 연결(매핑)하고, 요청에 포함된 데이터를 메서드 파라미터에 바인딩하는 강력한 기능을 제공한다. 서블릿 기반의 request.getParameter() 방식과 비교하여, 애노테이션 기반의 접근법이 어떻게 생산성과 코드의 가독성을 높이는지 알아본다.요청 매핑 (Request Mapping)요청 매핑은 특정 URL과 HTTP 메서드 조합을 처리할 핸들러(컨트롤러 메서드)를 지정하는 과정이다.@Controller와 @RestController의 차이점구분@Controller@RestController역할메서드의 반환 값을 논리적인 뷰(View) 이름으로 간주한다.@Controller + @ResponseBody. 반환 값을 HTTP 응답 Bod..
스프링 MVC 구조를 공부하다 보면 DispatcherServlet, HandlerAdapter, ViewResolver 같은 구성 요소들이 등장하며 어댑터 패턴과 다형성이라는 개념이 반복적으로 등장한다.해당 내용을 찾아보면서 평소 아무 생각 없이 사용하던 것들이 왜 이렇게 만들어졌는지 조금은 이해할 수 잇었다.스프링 MVC 주요 구조구성요소설명DispatcherServlet모든 HTTP 요청의 진입점HandlerMapping요청 URL에 따라 실행할 컨트롤러 매핑HandlerAdapter다양한 타입의 컨트롤러를 실행할 수 있도록 중계ViewResolver논리적인 뷰 이름을 실제 뷰로 변환하는 역할문제 상황컨트롤러가 버전마다 인터페이스가 다르다고 가정하자.// V1 컨트롤러 인터페이스public inte..
인프런 김영한 강사님의 스프링 MVC 강의를 들으며 애매모호하게 알고 있던 개념에 대해 다시 배우고 있다.아래는 웹 애플리케이션에 대한 강의를 간략하게 정리한 것이다.모든 건 HTTP로부터 시작된다 – 서블릿과 스프링 웹의 기본 이해HTTP 요청 하나가 오면, 그 뒤에서 어떤 일이 일어날까?서버는 어떻게 요청을 해석하고, 어떻게 응답을 만들어줄까?이번 글에서는 웹 서버와 서블릿, WAS의 역할을 이해하면서 스프링 웹의 기반이 되는 구조를 정리한다.웹 시대의 중심은 HTTPHTTP는 모든 것을 전송할 수 있다.텍스트, 이미지, 음성, 영상은 물론이고, 우리가 자주 쓰는 JSON, XML 같은 데이터 형식도 모두 HTTP로 오간다.심지어 서버 간 데이터 통신도 대부분 HTTP를 사용한다.요즘 시대, 웹을 다..
문제 상황: 로그가 요청마다 섞여버린다스프링 웹 애플리케이션에서는 여러 사용자가 동시에 요청을 보낼 수 있다.하지만 로그는 시간 순으로 출력되기 때문에어떤 요청에서 발생한 로그인지 구분이 어렵다.예를 들어 이런 로그가 찍혔다고 해보자:회원 가입 처리 시작 상품 주문 시작 회원 가입 처리 시작 회원 가입 처리 완료 상품 주문 시작 상품 주문 완료같은 메시지가 반복되거나,서로 다른 요청의 로그가 뒤섞여 있다면,이게 어떤 요청에서 나온 건지 디버깅이 매우 어렵다.해결 전략: 요청마다 UUID를 붙여서 로그를 구분하자각 HTTP 요청마다 UUID를 하나 생성하고,그 UUID를 로그 메시지 앞에 붙이면같은 요청에서 나온 로그끼리는 쉽게 묶어 볼 수 있다.이를 구현하기 위해스프링의 @RequestScope..
의존성 주입 방식 4가지 — 어떤 차이가 있을까?스프링에서 객체 간 의존성을 주입하는 방법은 크게 4가지가 있다.구분설명생성자 주입생성자를 통해 필요한 객체를 주입필드 주입클래스 내부 필드에 직접 주입수정자(Setter) 주입세터 메서드를 통해 주입일반 메서드 주입일반 메서드를 통해 주입1. 생성자 주입 — 가장 권장되는 방식@Componentpublic class OrderService { private final MemberService memberService; public OrderService(MemberService memberService) { this.memberService = memberService; }}객체를 생성할 때 필수 의존성을 한 번에 받아서 주입..
스프링 빈 자동 등록과 주입, 제대로 이해하기스프링은 객체를 직접 new로 생성하지 않아도,스프링 컨테이너가 대신 객체를 만들고 관리하며필요한 곳에 자동으로 의존성을 주입해주는 프레임워크다.이 과정에서 @ComponentScan은 빈을 자동으로 찾아 등록하고,@Component는 해당 클래스를 스프링 빈으로 표시하며,@Autowired는 필요한 빈을 자동으로 주입해주는 역할을 한다.또한, 개발자가 직접 빈을 등록하고 싶을 때는 @Configuration을 사용해 수동으로 설정할 수 있다.@ComponentScan — 어디서 자동으로 빈을 찾을지 알려주는 기능@Configuration@ComponentScan(basePackages = "com.example")public class AppConfig {}..
수동 DI(Dependency Injection)의 문제객체를 필요할 때 직접 생성하면,계속 새로운 인스턴스가 생성되어 메모리 낭비와 일관성 문제가 발생한다.OrderService.java (문제 버전)public class OrderService { private PaymentProcessor paymentProcessor; public OrderService() { // 필요한 시점마다 새로 객체를 생성 this.paymentProcessor = new PaypalProcessor(); } public void checkout(Order order) { paymentProcessor.processPayment(order.getTotalAmou..