일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 오라클클라우드에 젠킨스 설치하기
- 제이쿼리
- 오라클주별데이터
- 세션
- 스프링 에러
- 자바왕기초
- Spring Boot가 해결하려고 했던 문제
- HTML
- 오라클통계
- 스프링
- jsp
- 스프링 부트가 해결하려고 했던 문제
- 자바 왕기초
- 스프링 구글차트로 기간별 현황 조회하기
- 썸머노트
- 오라클월별데이터
- 스프링 Ioc Container
- 스프링 Ioc
- 오라클
- maven
- 스프링 구글차트
- 자바
- CSS
- 오라클일별데이터
- 자바기초
- 자바왕초보
- 자바 기초
- 스프링과 스프링부트 차이점
- java
- 스프링 제어역전
- Today
- Total
Just Do it
스프링 MVC의 Controller 본문
*출처: Chapter06 스프링 MVC의 Controller, 코드로 배우는 스프링 웹 프로젝트 개정판, 구멍가게 코딩단, 남가람북스
스프링 MVC를 이용하는 경우 작성되는 Controller는 다음과 같은 특징이 있다.
- HttpServletRequest, HttpServletResponse를 거의 사용할 필요 없이 필요한 기능 구현
- 다양한 타입의 파라미터 처리, 다양한 타입의 리턴 타입 사용 가능
- GET 방식, POST 방식 등 전송 방식에 대한 처리를 어노테이션으로 처리 가능
- 상속/인터페이스 방식 대신에 어노테이션만으로도 필요한 설정 가능
스프링 MVC는 어노테이션을 중심으로 구성되기 때문에 각 어노테이션의 의미에 대해 주의해가며 학습해야한다.
1. @Controller, @RequestMapping
- @Controller 어노테이션을 붙이면 자동으로 스프링의 객체(Bean)로 등록 된다.
- 그 이유는 servlet-context.xml 내 <context:component-scan>이라는 태그때문인데, 이 태그는 지정된 패키지를 스캔하도록 설정되어있다. <context:component-scan> 태그는 해당 패키지에 선언된 클래스들을 스캔하면서 스프링에서 객체(Bean) 설정에 사용되는 어노테이션들을 가진 클래스들을 파악하고, 필요하다면 이를 객체로 생성해서 관리하게 된다.
- 클래스가 스프링에서 관리되면 Project Explorer 상에는 클래스 옆에 작게 's' 모양의 아이콘이 추가된다.
클래스 선언부에는 @Controller와 함께 @RequestMapping을 많이 사용한다.
-@RequestMapping은 현재 클래스의 모든 메서드들의 기본적인 URL 경로가 된다.
-@RequestMapping 어노테이션은 클래스의 선언과 메서드 선언에 사용할 수 있다.
2. @RequestMapping의 변화
- @GetMapping: Http 요청 방식으로 GET 방식 이용
@GetMapping("/register/add")
@RequestMapping(value="/register/add", method=RequestMethod.GET)
//위의 두 코드는 서로 같다.
- @PostMapping: Http 요청 방식으로 POST 방식 이용
@PostMapping("/register/add")
@RequestMapping(value="/register/add", method=RequestMethod.POST)
//위의 두 코드는 서로 같다.
3. Controller의 파라미터 수집
- Controller를 작성할 때 가장 편리한 기능은 파라미터가 자동으로 수집되는 기능이다. 이 기능을 이용하면 매번 request.getParameter() 를 이용하는 불편함을 없앨 수 있다.
3.1. 파라미터의 수집과 변환
- Controller가 파라미터를 수집하는 방식은 파라미터 타입에 따라 자동으로 변환하는 방식을 이용한다.
3.2 리스트, 배열 처리
- 동일한 이름의 파라미터가 여러 개 전달되는 경우에는 ArrayList<>등을 이용해서 처리가 가능하다.
3.3 객체 리스트
- 여러 개의 객체 생성도 가능하며 '[ ]'안에 인덱스 번호에 맞게 객체의 속성값이 셋팅된다.
3.4 @InitBinder
- 파라미터의 수집을 다른 용어로는 'binding(바인딩)'이라고 한다. 변환이 가능한 데이터는 자동으로 변환되지만 경우에 따라서는 파라미터를 변환해서 처리해야 하는 경우도 있다.
예) 화면에서 '2018-01-01'과 같이 문자열로 전달된 데이터를 java.util.Date 타입으로 변환하는 작업
- 스프링 Controller에서는 파라미터를 바인딩할 때 자동으로 호출되는 @InitBinder를 이용해서 이러한 변환을 처리할 수 있다.
3.5 @DateTimeFormat
-@InitBinder를 이용해서 날짜를 변환할 수도 있지만, 파라미터로 사용되는 인스턴스 변수에 @DateTineFormat을 적용해도 변환이 가능하다. (@DateTimeFormat을 이용하는 경우에는 @InitBinder는 필요하지 않다.)
4. Model이라는 데이터 전달자
- Controller의 메서드를 작성할 때는 특별하게 Model이라는 타입을 파라미터로 지정할 수 있다.
- Model객체는 컨트롤러에서 생성된 데이터를 담아서 JSP에 전달하는 역할을 한다. 이를 이용해서 JSP와 같은 View로 전달해야하는 데이터를 담아서 보낼 수 있다.
- 메서드의 파라미터에 Model 타입이 지정된 경우에는 스프링은 특별하게 Model 타입의 객체를 만들어서 메서드에 주입하게 된다.
- Model은 모델 2 방식에서 사용하는 request.setAttribute()와 유사한 역할을 한다.
- 메서드의 파라미터를 Model 타입으로 선언하게 되면 자동으로 스프링 MVC에서 Model 타입의 객체를 만들어 준다.
- Model을 사용해야 하는 경우는 주로 Controller에 전달된 데이터를 이용해서 추가적인 데이터를 가져와야 하는 상황이다.
예) 리스트 페이지 번호를 파라미터로 전달 받고, 실제 데이터를 View로 전달해야 하는 경우
파라미터들에 대한 처리 후 결과를 전달해야하는 경우
4.1 @ModelAttribute 어노테이션
- Model의 경우 파라미터로 전달된 데이터는 존재하지 않지만 화면에서 필요한 데이터를 전달하기 위해서 사용한다.
예) 페이지 번호는 파라미터로 전달되지만, 결과 데이터를 전달하려면 Model에 담아서 전달한다.
- @ModelAttribute는 강제로 전달받은 파라미터를 Model에 담아서 전달하도록 할 때 필요한 어노테이션.
- @ModelAttribute가 걸린 파라미터는 타입에 관계없이 무조건 Model에 담아서 전달되므로, 파라미터로 전달된 데이터를 다시 화면에서 사용해야할 경우에 유용하게 사용된다.
4.2 @RedirectAttributes
- Model 타입과 더불어 스프링 MVC가 자동으로 전달해주는 타입으로 일회성으로 데이터를 전달하는 용도로 사용된다.
- Model과 같이 파라미터로 선언해서 사용한다.
5. Controller의 리턴 타입
5.1 Controller의 메서드가 사용할 수 있는 리턴 타입은 주로 다음과 같다.
*String: jsp를 이용하는 경우에는 jsp 파일의 경로와 파일 이름을 나타내기 위해서 사용한다.
String 타입에는 아래와 같이 특별한 키워드를 붙여서 사용할 수 있다.
*redirect: 리다이렉트 방식으로 처리하는 경우
*forward: 포워드 방식으로 처리하는 경우
*void: 호출하는 URL과 동일한 이름의 jsp를 의미한다.
*VO(Value Object),DTO(Datat Transfer Object) 타입: 주로 JSON 타입의 데이터를 만들어서 반환하는 용도로 사용한다.
*ResponseEntity 타입: response할 때 Http 헤더 정보와 내용을 가공하는 용도로 사용한다.
*Model, ModelAndView: Model로 데이터를 반환하거나 화면까지 같이 지정하는 경우에 사용한다. (최근에는 많이 사용하지 않음)
*HttpHeaders: 응답에 내용 없이 Http 헤더 메세지만 전달하는 용도로 사용한다.
5.2 파일 업로드 처리
출처 교재 149~154쪽 참고
6. Controller의 Exception 처리
Controller의 예외 처리는 다음과 같은 방식으로 처리할 수 있다.
- @ExceptionHandler와 @ControllAdvice를 이용한 처리
- @ResponseEntity를 이용하는 예외 메세지 구성
6.1 @ControllerAdvice
- @ControllerAdvice는 AOP(Aspect-Oriented-Programming)를 이용한 방식이다.
*AOP: 핵심적인 로직은 아니지만 프로그램에서 필요한 '공통적인 관심사(cross-concern)는 분리'하자는 개념
- Controller를 작성할 때 메서드의 모든 예외사항을 전부 핸들링해야 한다면 중복적이고 많은 양의 코드를 작성해야 하지만, AOP 방식을 이용하면 공통적인 예외사항에 대해서는 별도로 @ControllerAdvice를 이용해서 분리하는 방식이다.
-@ControllerAdvice는 해당 객체가 스프링의 컨트롤러에서 발생하는 예외를 처리하는 존재임을 명시하는 용도로 사용한다.
@ControllerAdvice // 모든 패키지에서 발생한 예외를 처리한다.
@ControllerAdvice("com.xxxx.xxx") // "com.xxxx.xxx" 패키지에서 발생한 예외만 처리한다.
-@ExceptionHandler는 해당 메서드가 ( ) 들어가는 예외 타입을 처리한다는 것을 의미한다.
-@ExceptionHandler 어노테이션 속성으로는 Exception 클래스 타입을 지정할 수 있다.
예) @ExceptionHandler(Exception.class)
'신입 개발자가 되기 위해 공부했던 독학 자료들 > Spring' 카테고리의 다른 글
Spring DI 활용하기: 이론 (0) | 2022.02.14 |
---|---|
스프링 WebDataBinder의 데이터 변환과 검증 (0) | 2022.02.11 |
@RequestParam과 @ModelAttribute (0) | 2022.02.10 |
스프링 웹 출력시 한글 깨짐 방지를 위해 web.xml 파일에 입력하면 되는 <filter> 태그 (0) | 2022.02.10 |
web.xml 에 입력해놓으면 편리한 한글 변환 필터 코드 (0) | 2022.02.07 |