-
컨트롤러: 웹 서비스의 친절한 안내자 ( Controller 클래스 Java 개발 )☕Java 2024. 12. 29. 19:46728x90
웹 서비스의 세계로 초대합니다!
인터넷 세상에는 수많은 웹 서비스들이 존재합니다. 우리
가 매일 사용하는 네이버, 유튜브, 쇼핑몰 등이 모두 웹 서비스의 예시죠. 이러한 웹 서비스들은 사용자의 요청을 받아 정보를 제공하거나, 기능을 실행하는 역할을 합니다. 마치 레스토랑에서 손님이 주문을 하면, 요리사가 음식을 만들어 제공하는 것과 같은 원리입니다.
컨트롤러 등장!
웹 서비스에서 컨트롤러는 바로 이 요리사와 같은 역할을 수행합니다. 사용자의 요청을 받아 어떤 작업을 수행해야 할지 결정하고, 필요한 데이터를 처리하여 결과를 응답으로 반환하는 것이죠. 컨트롤러는 웹 서비스의 핵심 구성 요소 중 하나이며, 사용자와 웹 서비스 사이의 다리 역할을 담당합니다.
컨트롤러는 어떻게 작동할까요?
컨트롤러의 작동 방식을 이해하기 위해 레스토랑을 다시 한번 떠올려 봅시다.
- 손님(클라이언트)이 메뉴판을 보고 원하는 음식을 주문합니다. (예: "김치찌개 주세요!")
- 웨이터(컨트롤러)는 주문을 받아 요리사에게 전달합니다.
- 요리사는 주문에 따라 음식을 준비합니다.
- 웨이터는 준비된 음식을 손님에게 제공합니다.
웹 서비스에서도 이와 비슷한 과정을 거칩니다.
- 사용자(클라이언트)가 웹 브라우저 또는 앱을 통해 특정 기능을 요청합니다. (예: "/users" 페이지에 접속하여 사용자 목록 보기)
- 컨트롤러는 요청을 받아 어떤 기능을 실행해야 할지 결정합니다. ("/users" 페이지 요청은 사용자 목록을 보여주는 기능을 실행해야 함)
- 컨트롤러는 필요한 데이터를 가져오거나 처리합니다. (데이터베이스에서 사용자 목록을 가져옴)
- 컨트롤러는 처리된 데이터를 사용자에게 응답으로 반환합니다. (웹 브라우저에 사용자 목록을 표시)
컨트롤러의 역할
컨트롤러는 웹 서비스에서 다음과 같은 다양한 역할을 수행합니다.
- 요청 처리: 사용자의 요청을 받아들이고, 요청에 따라 적절한 작업을 수행합니다.
- 데이터 처리: 요청에 필요한 데이터를 가져오거나, 처리하여 응답에 포함시킵니다.
- 응답 생성: 사용자에게 보여줄 응답을 생성합니다. HTML 페이지, JSON 데이터 등 다양한 형식의 응답을 생성할 수 있습니다.
- 뷰 선택: 웹 페이지를 보여줄 때, 어떤 뷰(HTML 템플릿)를 사용할지 결정합니다.
- 리다이렉션: 필요에 따라 사용자를 다른 페이지로 리다이렉션합니다. (예: 로그인 성공 후 메인 페이지로 이동)
- 예외 처리: 예상치 못한 오류 발생 시, 적절한 처리를 수행합니다. (예: 오류 메시지 표시, 로그 기록)
Spring Framework에서 컨트롤러
Java 웹 개발에서 많이 사용되는 Spring Framework에서는 @Controller 어노테이션을 사용하여 컨트롤러 클래스를 정의합니다.
@Controller public class UserController { @GetMapping("/users") public String getUsers(Model model) { // ... 사용자 목록을 가져오는 로직 ... model.addAttribute("users", users); return "users"; // users.html 뷰를 사용하여 사용자 목록을 표시 } }
@GetMapping 어노테이션은 /users 페이지에 대한 GET 요청을 처리하는 메서드를 지정합니다. 이 메서드는 데이터베이스에서 사용자 목록을 가져와 model 객체에 추가하고, users라는 이름의 뷰를 반환합니다.
REST API에서 컨트롤러
REST API는 웹 서비스들이 서로 데이터를 주고받기 위한 인터페이스입니다. REST API에서 컨트롤러는 JSON 또는 XML 형식의 데이터를 주고받는 역할을 합니다. Spring Framework에서는 @RestController 어노테이션을 사용하여 REST 컨트롤러를 정의합니다.
Controller
- 역할: 사용자의 요청을 받아 처리하고, 그 결과를 응답으로 반환하는 역할을 합니다.
- 주요 기능:
- HTTP 요청 수신 및 처리 (GET, POST, PUT, DELETE 등)
- 요청 파라미터 분석 및 검증
- 비즈니스 로직 호출 (Service 계층)
- 응답 데이터 생성 및 반환 (DTO 사용)
- 예외 처리
- 인텔리제이 활용:
- @Controller 또는 @RestController 어노테이션을 사용하여 컨트롤러 클래스를 정의합니다.
- @RequestMapping, @GetMapping, @PostMapping 등의 어노테이션을 사용하여 HTTP 요청을 매핑합니다.
- 인텔리제이의 코드 자동 완성, 디버깅 기능 등을 활용하여 컨트롤러 코드를 작성하고 테스트합니다.
인텔리제이를 활용하여 실습을 진행하며, 많이 사용하는 어노테이션
1. 컨트롤러 클래스를 정의하는 어노테이션
- @Controller: 해당 클래스를 Spring MVC 컨트롤러로 지정합니다. 주로 뷰를 반환하는 웹 페이지 컨트롤러에 사용됩니다.
- @RestController: @Controller와 @ResponseBody를 결합한 어노테이션입니다. REST API 컨트롤러를 정의할 때 사용하며, 메서드의 반환 값이 HTTP 응답 본문에 직접 포함됩니다.
2. 요청 매핑을 위한 어노테이션
- @RequestMapping: 클래스 또는 메서드 레벨에서 요청 URL을 지정합니다.
- value 속성: URL 경로를 지정합니다. (예: @RequestMapping(value = "/users"))
- method 속성: HTTP 메서드를 지정합니다. (예: @RequestMapping(value = "/users", method = RequestMethod.GET))
- @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping: @RequestMapping의 축약형 어노테이션으로, 각각 GET, POST, PUT, DELETE, PATCH 요청에 대한 매핑을 간편하게 지정할 수 있습니다. (예: @GetMapping("/users"))
3. 요청 파라미터 처리를 위한 어노테이션
- @PathVariable: URL 경로에 포함된 변수 값을 메서드 파라미터에 매핑합니다. (예: @GetMapping("/users/{id}")에서 {id} 값을 @PathVariable Long id로 받아옵니다.)
- @RequestParam: 쿼리 파라미터 값을 메서드 파라미터에 매핑합니다. (예: /users?name=john에서 name 값을 @RequestParam String name으로 받아옵니다.)
- @RequestBody: HTTP 요청 본문에 포함된 JSON 또는 XML 데이터를 객체에 매핑합니다. 주로 POST, PUT 요청에서 사용됩니다.
- @RequestHeader: HTTP 요청 헤더 값을 메서드 파라미터에 매핑합니다.
- @CookieValue: 쿠키 값을 메서드 파라미터에 매핑합니다.
- @ModelAttribute: 모델 객체에 속성 값을 추가하거나, 기존 모델 속성을 가져옵니다.
4. 응답 처리를 위한 어노테이션
- @ResponseBody: 메서드의 반환 값을 HTTP 응답 본문에 직접 포함시킵니다. @RestController를 사용하면 모든 메서드에 @ResponseBody가 적용됩니다.
- @ResponseStatus: HTTP 응답 상태 코드를 지정합니다. (예: @ResponseStatus(HttpStatus.CREATED))
5. 기타 어노테이션
- @CrossOrigin: Cross-Origin Resource Sharing (CORS)을 설정합니다. 다른 도메인에서 API를 호출할 수 있도록 허용합니다.
- @ControllerAdvice: 컨트롤러 전반에 걸쳐 예외 처리, 바인딩 설정 등을 적용합니다.
- @InitBinder: 요청 파라미터를 객체에 바인딩할 때 사용할 커스텀 에디터를 등록합니다.
728x90'☕Java' 카테고리의 다른 글
Spring Boot 기반 REST API 개발: 회원가입/로그인 기능 구현하기, ( Spring Boot, Spring Security, JWT 활용 ) (0) 2024.12.29 Java [ ArrayList 와 HashMap ] (0) 2024.12.17 Java에서 문자열과 숫자 간 변환: 쉽게 이해하기(부록 문자열 함수소개) (0) 2024.12.16 Java 추상(Abstract) 클래스와 인터페이스(Interface): 개념 잡고 활용하기 (0) 2024.12.16 Java 상속이란? + 문제풀이 (1) 2024.12.15