관리 메뉴

Just Do it

스프링 MVC의 Controller 본문

신입 개발자가 되기 위해 공부했던 독학 자료들/Spring

스프링 MVC의 Controller

Seojoo21 2022. 2. 8. 15:00

*출처: 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)