basic/spring

[spring 03] Controller 파라미터 수집, 의존성 주입, 어노테이션종류

못지(Motji) 2021. 8. 2. 15:58

Controller 리턴타입

• String : jsp 파일의 경로 또는 jsp 파일이름(view name) 

• void : 요청하는 url과 동일한 이름의 jsp를  의미

• VO, DTO : 주로 JSON 타입의 데이터를 만들어서 리턴하는 용도로 사용 (ajax)

• ResponseEntity : 응답할때 Http 헤더정보와 데이터를 함께 보내야할때

• Model, ModelAndView : Model로 데이터를 리턴하거나 화면까지 같이 지정하는 경우에 사용한다

• HttpHeaders : 응답의 내용 없고 Http 헤더 메세지만 보낼 용도로 사용

Controller의 파라미터 수집

Controller를 작성할 때 가장 편리한 기능은 파라미터가 자동으로 수집되는 기능이다.

이 기능을 이용하면 매번 request.getParameter()를 이용하는 불편함을 없앨 수 있다.

 

✔ 파라미터 수집 (파라미터 바인딩)

  1. 매개변수 작성 (넘어오는 파라미터의 이름(form이라면 name속성값)과 매개변수의 이름이 동일해야 잘 바인딩 된다.
  2. 원하는 타입으로 매개변수 작성 : 매개변수의 타입 원하는 타입으로 지정
  3. DTO로 받기

✔ 기본형, 문자형 파라미터 받기

@Requset Param

파라미터로 사용된 변수의 이름과 전달되는 파라미터의 이름이 다른경우에 유용하게 사용할 수 있다.

 

✔ 리스트, 배열 처리

동일한 이름의 파라미터가 여러개 전달되는 경우 ArrayList 등을 이용해 처리할 수 있다.

 

✔ request, response, session 사용하고 싶을때는 매개변수로 지정해주면 된다.

HttpServletRequest request

HttpServletResponse respon

HttpSession session


데이터를 뷰에 전달

Model 전달자 📌

• Controller의 메소드를 작성할때 특별하게 Model이라는 타입을 파라미터로 지정할 수 있다.

• Model 객체는 컨트롤러에서 생성된 데이터를 담아서 jsp에 전달하는 역할을 하는 존재이다.

  1. request 속성에 추가해서 데이터 보내기
    request.setAtribute("이름", 값);
  2. Model
    ∙ 웹페이지의 구조는 Request에 전달된 데이터를 가지고 필요하다면 추가적인 데이터를 생성해서 화면으로 전달하는 방식으로 동작한다.
    ∙ Model의 경우는 파라미터로 전달된 데이터는 존재하지 않지만 화면에서 필요한 데이터를 전달하기 위해서 사용한다.
    ∙ model.addAttribute(attributeName, attributeValue) ▸ ("이름", 값)

ModelAndView

• 데이터와 뷰의 이름을 함께 전달하는 객체

• 매핑한 메소드의 리턴타입을 ModelAndView로 지정

 

☑ 사용방법

▹메소드 내에서 ModelAndView 객체 생성

▹.addObject(key, value) 로 view로 전달할 데이터 추가

▹.setViewNam("뷰 경로") 로 view 페이지의 경로 저장

▹메소드 끝에서 ModelAndView 객체 리턴

@ModelAttribute

• 스프링 MVC의 Controller는 기본적으로 JavaBeans 규약에 맞는 객체는 다시 화면으로 객체를 전달한다.

• 전달될때에는 클래스명의 앞글자는 소문자로 처리된다.

☑ 사용 처

▸매개변수 앞 : 요청시 넘어온 데이터를 바인딩해주고, Model 속성에 주입되기까지되어 view에서 꺼낼수 있음

▸메소드 위 : 해당클래스에서 넘어가는 모든 View에 공통적으로 필요한 객체가 존재할 경우 사용됨

의존성 주입 Dependency Injection

• 의존 : 객체(Object)와 객체간의 의존을 말한다

• A객체에서 B객체를 필요로 한다면? A객체는 B객체에 의존한다~ 말한다

• 스프링에서는 이러한 의존도를 낮추기 위해서 개발자가 직접 new를 하지 않고 설정파일에 설정만 함으로써 프레임워크에서 알아서 객체생성하고 알아서 객체를 주입까지 해줄수 있다.

 

✔ @Autowired 의존성 자동 주입 어노테이션을 활용한 방법

∙ 변수위에 어노테이션 부착

▹xml 설정파일에 <bean> 태그로 객체 생성할것 작성

▹객체 생성할 변수위에 @Autowired 작성

 

☑ <property> : set 메소드를 호출하여 지정한 값을 채워서 객체 생성해줌

▪ name="변수명" : 해당 객체의 변수이름과 동일하게 변수의 set메소드가 존재해야함

▪ 변수에 저장할 값을 채워주는 속성은 value와 ref가 있음

▫ value : 기본형, 문자열형

▫ ref : 객체형태의 데이터

 

☑ <constructor-arg> : 매개변수 있는 생성자 호출할 때 사용

▫ value : 기본형, 문자열형 값 지정

▫ ref : 객체형태의 데이터 값 지정

▫ index : 생성자로 보내는 매개변수의 값의 순서 지정 (0 ~ )

▫ type : 값의 데이터 타입을 지정

▫ name : 생성자의 매개변수명을 name속성으로 지정해 매핑하기

주의점은 이렇게 name속성으로 설정할 경우, 해당 클래스를 컴파일시 디버그 플래그가 활성화 되어 있어야 한다는 것

.class 파일에 생성자 파라미터 이름이 유지가 되기 때문에 name속성 지정이 원활히 처리됨

디버그 플래스 활성화 안된상태에서 진행할때

 

@ConstructorProperties 어노테이션을 생성자 위에 붙히고 매개변수의 이름을 순서대로 나열

이클립스에서 디버그를 활성화 해주는 방법 (javac -g ...)

Window-Proferences-Java-Compiler-Classfile Generation-Add variable attribute to generated class files (used by the debugger) 체크

 

❔ 같은 데이터형을 가진 변수가 여러개라면 어떻게 할것인가?

index 속성으로 순서를 지정 / type / index+type / name

 

❔ 같은타입의 빈이 여러개있을때 @Autowired가 어떤 객체를 주입시켜줄까?

변수의 데이터 타입 우선 ▹ 변수명 == <bean id="값"

 

✔ set 메소드를 활용한 주입


어노테이션들

@RequestMapping

∘ value : 주소

∘ method : GET/POST 전송방식
∘ param : 파라미터

 

@RequestParam

• 요청 파라미터를 메소드의 매개변수에 넣어주는 어노테이션

∘ value : 파라미터명

∘ defaultValue : 기본값(default) 지정

∘ required : 필수 요소 (true▸(default) / false)

 

@ResponseBody

• 요청에 대한 응답결과를 리턴타입이 String이면 return ""; 문자열 형태로 전달

• 스크립트에서 메세지만 받을떄 주로 사용

• 직접적으로 view에 응답하는 용도로는 사용하지 않음