만약 맛집 레스토랑에 갔다고 한다면 식당이 원활하게 돌아가려면 역할 분담이 확실해야 한다.
주문 받는 매니저는 손님 응대와 결제만 신경을 쓰고, 주방의 요리사는 요리하는 것에만 집중하고, 식자재 보급직원은 창고에서 신선한 재료를 관리하는 일만 한다.
만약 요리사가 갑자기 카운터로 가 손님의 결제를 받고, 매니저가 주방에 들어가 요리를 한다면 식당은 망하게 엉망진창이 될 것이다.
SW 개발도 똑같다. 하나의 자바 클래스가 HTTP 요청도 받고 비즈니스 로직도 계산하고, DB까지 직접하면 나중에 기획을 조금이라도 수정한다면 코드를 다 수정해야 한다. 스프링은 이 역할들을 철저하게 쪼개어 관리하도록 하는데 이를 **관심사 분리(SoC, Separation of Concerns)라고 부른다.
스프링에서는 관심사를 분리하는 기준이 크게 3가지로 나뉜다.
가장 기본이 되는 분리 기준이다. 웹 애플리케이션의 흐름을 계층(Layer)별로 나눠서 각 계층이 자신이 맡은 구역에만 집중하게 만들어야 한다.
3계층인 Controller, Service, Repository이 있다.
이 계층은 사용자의 요청이 가장 먼저 도착하는 입구라고 생각하면 된다.
브라우저나 앱에서 요청이 들어오면, 요청을 받아서 어떤 기능을 실행해야 하는지 연결해준다.
예를 들어보면 사용자가 회원가입 버튼을 누르면 컨트롤러는 /signup을 받고 그 요청을 회원가입 서비스로 넘긴다. 이 과정에서 요청값을 DTO로 바꾸거나, 필수값이 비어 있는지 같은 간단한 검증도 함께 처리한다.
→ Controller은 사용자와 백엔드 사이에서 요청을 받아 정리해서 전달하는 창구라고 보면 된다.
식당으로 비유하면 손님에게 주문을 받고 주문서를 정리해서 주방에 전달하는 직원과 비슷하다.
여기서 우리가 알아야 할 점은 Controller가 직접 비지니스 로직을 처리하면 안된다는 것이다.
식당에서 주문을 받았다고 직원(Controller)이 재고를 확인하고 결제를 승인하면 안된다. 이런 일은 Service가 해야 한다. Controller은 오직 요청을 받고 연결해주는 역할에만 집중해야 한다.
스프링에서는 Controller를 등록해주는 방법이 2가지가 있다.
1. @Controller : 주로 화면(View)을 반환할 때 사용한다.(HTML, JSP등)
2. @RestController : 주로 JSON 데이터를 반환할 때 사용한다.

여기서 좀 더 컨트롤러의 핵심 역할에 대해 알아보자면 3가지로 나눌 수 있다.
첫 번째는 요청을 받아서 적절한 메서드로 연결하고, 필요한 형태로 변환하는 일이다.
클라이언트는 보통 JSON, 퀄리 파라미터, 폼 데이터 같은 형태로 요청을 보낸다. 하지만 자바는 이 데이터를 그대로 이해할 수 없기 때문에, 스프링이 이를 자바 객체로 변환해줘야 한다.
이때 @Controller와 @RestControll는 해당 클래스를 요청 처리한다는 의미로 스프링 빈으로 등록하고 @RequestMapping, @GetMapping, @PostMapping같은 어노테이션은 어떤 URL 요청을 어떤 메서드각 처리할지 매핑한다.
또한 JSON 요청 본문은 @RequestBody를 통해 DTO로 변환되는데, 이 과정에서 스프링의 HttpMessageConveter와 Jackson 라이브러리가 사용된다.
두 번째는 입력값 검증(Validation)이다.
비즈니스 로직으로 이상한 데이터가 들어가지 않도록 1차적으로 걸러내는 역할을 한다. 예를 들어 @Valid, @NotBlank, @Email, @Size 같은 어노테이션을 활용하면, "비밀번호는 최소 8자 이상인가?", "이메일 형식이 올바른가?" 같은 조건을 서비스 레이어로 넘기기 전에 검사할 수 있다.
→ 즉, Controller는 잘못된 요청을 초반에 차단해서 서비스가 핵심 비지니스 로직에만 집중할 수 있도록 도와준다.
세 번째는 보안 및 접근 제어이다.
먼저 예를 들어보면 인증되지 않은 사용자가 마이페이지나 결제 API에 접근하려고 할 때, 서비스 로직이 실행되기 전에 요청을 막고 401 Uhauthorized 또는 403 Forbidden 같은 응답을 반환할 수 있다. 다만 보안 처리는 보통 Controller가 직접 하기보다는 실제로는 Spring Security같은 보안 프레임워크가 필터나 인터셉터 단계에서 처리하는 경우가 많다. Controller는 보안 이후 인증과 인가를 통과한 요청을 받아 실제 로직으로 연결하는 역할이라고 생각하면 된다.
정리하자면 Controller는 요청 매핑, 데이터 변환, 입력값 검증, 보안이라는 중요한 책임을 가진 계층이다.
→ 💡핵심 차이점 요약
Q. AWS 배우는 이유
**A. 전 세계는 물론 한국 기업에서도 대부분 인프라로 AWS를 채택하고 있기 때문에
그리고 자바와 스프링 부트 생태계는 AWS와 궁합이 좋다.
스프링에서는 AWS의 다양한 서비스(S3 파일 서버, 파라미터 스토어, EC2 등)를 코드 몇 줄로 아주 쉽게 연동할 수 있다.
내배캠 강의 자료