병갈이 블록

2-01. Spring 기본 본문

IT(Old)/Spring 공부 기록

2-01. Spring 기본

woojang 2017. 7. 20. 00:06

이클립스에서 실습하기.

1. 메이븐 웹 프로젝트를 생성한다.

2. 새로운 프로젝트 생성에서 메이븐 프로젝트를 선택한다.

3. 생성 완료하기 전에 서버를 선택하는 곳에서 Artifact Id를 "maven-archetype-webapp 1.0"으로 선택화고 완료한다.

(그래야 서버구동시킬 수 있다.)

4. 프로젝트 위에서 우측 마우스 Run As -> Run on Server 선택이 가능하면 된다. (index.jsp페이지가 호출된다.)


메이븐 프로젝트의 설정 파일들.

1. pom.xml

: 프로젝트단위에서 필요한 설정들을 한다.

: 각종 <dependency>와 <builder>의 <plugin> 등을 설정한다.

2. web.xml

: 스프링 MVC를 위한 설정들을 하는 곳. JSP의 web.xml과 같은 역할이다.

3. 빈설정.xml

: ViewResolver 등 구동에 필요한 빈을 등록하는 곳이다.


스프링 MVC 설정

1. web.xml

- DispatcherServlet 설정. 

모든 클라이언트 요청을 여기서 1차적으로 처리함. 서블릿 매핑으로 uri등록.

- 캐릭터 인코딩 필터 설정

3. 스프링 MVC 설정 (빈설정.xml)

- HandlerMapping, HandlerAdapter 설정 -> 빈 등록은 <mvc:annotation-driven />으로 자동 등록됨.

- ViewResolver 설정.    -> 직접 등록해야됨.


서블릿 매핑에 따른 컨트롤러 경로매핑의 변화.

1. 서블릿 매핑에 따라 @RequestMapping의 주소 접근이 달라진다.

서블릿에 앞쪽 일부를 포함한 모든 경로(예 "/member/*") 등록되었으면 @RequestMapping에는 

등록된 경로 이후의 경로(최종경로)만 등록

서블릿에 뒤쪽 마지막 일부를 포함한 모든 경로(예 "*.do")등록되었다면 @RequestMapping에는 전체경로 등록.

2. 1번처럼 하기 싫고 일괄 동일한 주소선택방법을 택하려면 

A. <mvc:annotation-dreven /> 사용 안할때.

handlerMapping이란 이름으로 RequestMappingHandlerMapping클래스를 등록하고, 

alwaysUserFullPath란 이름의 프로퍼티의 value를 "true"로 설정.

B. <mvc:annotation-dreven /> 사용 할 때.

- 서블릿 매핑설정에서 URL패턴을 "/"로 지정. -> jsp를 제외한 모든 요청을 DispatcherServlet 에서 처리하도록 지정.

- 스프링 MVC설정에 <mvc:default-servlet-handler />를 등록함으로 디폴트 서블릿 핸들러 설정. 

- > 매칭되는 컨트롤러가 없으면 디폴트 서블릿을 이용해서 요청을 처리하도록 설정.

 



컨트롤러 구현.

1. @Controller / @RequestMapping / Model

@Controller : 컨트롤러로 사용할 클래스에 적용.

@RequestMapping : 요청을 처리할 메서드에 적용. 요청 경로를 지정.

- 구현된 메서드는 '뷰'의 이름을 리턴한다.


** Controller는 데이터를 Model에 담아서 전달하고 View는 필요한 데이터를 Model에서 가져와서 사용한다.

즉, Model이 데이터를 공유하는 공간인 셈.


1.1. @Controller 사용.

- 컨트롤러로 지정할 클래스에 사용.

- 컨트롤러에서 Model을 사용하여 데이터를 주고받을 수 있다.

- Model을 메서드의 파라미터로 추가한다. (ModelMap을 사용해도 동일한 결과)

- Model클래스의 메서드로 데이터를 저장한다. (메서드 체이닝 지원한다. 줄줄이 사탕으로 가능.)

- Model addAttribute(String name, Object value)     : 사용할 모델이름과 데이터를 쌍으로 추가.

- Model addAllAttributes(Map<String, ?> attribute)  : 모델들을 <모델이름, 자료>형태로 담은 Map을 추가.

- boolean containsAttribute(String name)               : 모델이름이 있는지 여부.


** 저장된 모델은 등록된 이름으로 EL식에서 사용이 가능. -> ${eventList.id}


1.2. @RequestMapping 이용.

- @RequestMapping("경로")가 지정된 메서드는 "경로"로 요청이 들어올 때 수행된다. 

("경로"는 DispacherServlet에서 매핑된 URL패턴에 따라 다른 요청(URL)을 처리한다.)

- 클래스에서 지정해도 된다. 클래스에서 경로 지정 시 클래스 내부 @RequestMapping에서 

지정된 경로는 클래스에서 지정한 경로를 기준으로 하위 경로만 처리.

- 속성들. (여러 속성 사용 시 괄호 안헤서 콤마로 구분한다.)

- value : 경로를 지정한다. 경로만 지정하려면 value는 적지 않아도 된다. 예) value="/event/list" , @RequestMapping("/event/list")

- method : GET, POT등 처리한 요청방법을 지정한다. 값으로 RequestMethod클래스를 사용한다. 

예) method=RequestMethod.POST 

- consumes : 요청 컨텐트 타입을 한정하고 싶다면. 

예) consumes="application/json" -> Content-Type 요청헤더가 "application/json"인 경우에만 처리.

- produces : 응답 결과 타입을 지정하고 싶다면. 

예) produces="application/json" -> Accept 요청헤더에 "application/json"가 포한된 경우에만 처리.

RequestMethod 에서 지원하는 전송 방식들. : GET, POST, PUT, DELETE, HEAD, PATCH, OPTION, TRACE


** 클래스에서는 경로를, 하위 메서드에서는 전송방식을 지정해서 사용하기도 한다.

** 자바 스크립트는 GET, POST 이 외의 전송방식을 지원하지 않는다. 

스프링의 HiddenHttpMethodFilter를 사용하여 나머지 전송방식을 처리할 수 있다. Ajax요청도 처리가능.(추후에...)


- @PathVariable 사용하기.

@RequestMapping에서 지정한 경로에 변수로 적용되는 부분을 메서들의 매개변수로 연결하는 역할을 한다.

파라미터 이름과 매개변수 이름을 똑같이.

@RequestMapping("/test/{name}")    //{name}에 들어오는 값을 @PathVariable이 적용된 name에 전달한다.

public String testMethod( @PathVariable String name, Model model) {...

name -> name


파라미터 이름과 매개변수 이름을 다르게.

@RequestMapping("/test/{id}")    

//{id}에 들어오는 값을 이름이 "id"로 설정된 @PathVariable가 지정된 name에 전달한다.

public String testMethod( @PathVariable("id") String name, Model model) {...

** id -> name

- 위와 같이 중괄호를 통해서 매핑경로의 일부를 변수로 지정할 수 있다. 또 그 매핑 경로를 한정할 수도 있다.

A. 정규표현식으로 표현 : 경로 일부를 {fieldId:정규표현식} 형태로 사용. fieldId란 키워드로 뒷부분을 정규표현식으로 인식.

B. Ant패턴 

- * : 0개 또는 그 이상의 글자.

- ? : 1개 글자.

- ** : 0개 또는 그 이상의 디렉토레 경로. ( ** -> .../chap1/chap2/chap3/... 를 의미.)



1.3 HTTP요청 파라미터 및 폼 데이터 처리.

- HttpServletRequest의 getParameter()를 사용.

- @RequestParam을 사용.

- 커맨드 객체를 사용.


HttpServletRequest 사용

: 매개변수로 HttpServletRequest를 추가하고 사용.

@RequestParam 사용

: 파라미터로 데이터를 넘길 매개변수 앞에 지정. 

예) ...( @RequestParam("id) long eventId, ...) -> "id"라는 파라미터의 값을 eventId변수에 전달.

: 문자대 숫자가 아니라면, 적절하게 자동 형 변환하여 전달된다. 문자대 숫자라면 400에러코드 발생

-사용 가능한 속성들.

- value : 다른 속성들과 함께 쓸 때 파라미터 이름을 지정.

- required : boolean타입의 값을 지정. 반드시 파라미터 존재여부를 검사 할지 말지 지정. 

(true -> 파라미터 값이 없으면 에러 발생, false -> 파라미터 값이 없으면 null을 전달.)

- defaultValue : 파라미터가 존재하지 않는다면 매개변수에 전달할 디폴트 값을 지정.

- 커맨드 객체를 사용.

- JSP에서 일종의 데이터 클래스와 같은 역할.

- 파라미터의 값들을 가지는 클래스를 매개변수로 지정. 예) public String test(MemberData md){...

- 자바 빈 규약에 맞게 set, get메서드를 등록했다면, 

전달된 파라미터와 같은 이름의 프로퍼티에 값이 저장되어 매개변수로 전달됨.

- 커맨드 객체로 사용하는 클래스 이름의 제일 첫글자를 소문자로 하는 이름이 모델이름으로 지정됨. 

자동으로 모델로 넘겨짐. JSP에서도 동일하게 모델이름을 커맨드 객체로 바로 사용할 수 있다. 

예) ${ memberData.name }님...    -> MemberData 클래스 이름이 memberData으로 지정됨.

- 가능한 자료형들 : 배열, Collection타입 사용가능. (List, Map 등...)

- POST, GET에서 동시에 사용가능 -> 하나의 JSP에서 동일한 커맨드 객체를 사용하여 두가지 방식의 결과를 이용할 수 있음.


- 커맨드 객체의 중첩사용. ( 클래스 내부에 다른 클래스 자료형이 있을때..)

아래와 같이 Address클래스를 내부 변수로 가지는 MemberData클래스가 있다.

class MemberData{

private int id;

private String name;

private Address address;

...

}

class Address{

private String city;

private String street;

...

}


이때 커맨드 객체로 MemberData클래스가 등록되었을 때, 

address프로퍼티 내부의 city, street프로퍼티는 어떻게 접근하는가?

JSP에서 form내부에서 파라미터 이름을 등록할 때 프로퍼티.프로퍼티 형태로 지정하면 된다.

예 )   MemberData의 id에 값 등록 : 

<input type="..." name="id"> memberData.setId() 로 값이 저장된다.

   MemberData의 address의 city에 값 등록 : 

<input type="..." name="address.city"> memberData.address.setCity() 로 값이 저장된다.



내부 프로퍼티가 일반 자료형이 아닌 배열이나 Collection인 경우?

class MemberData{

private int id;

private String name;

private List<Address> address;

...

}

사용 방법은 프로퍼티의 중첨사용과 기본적으로는 동일하다. 단, 프로퍼티를 배열취급한다.

예 ) MemberData의 address의 city에 값 등록 : 

<input type="..." name="address[0].city"

<input type="..." name="address[1].city"

...

<input type="..." name="address[i].city"

memberData.address.get(i).setCity() 로 값이 저장된다.

** 단, 번호들의 중간에 파라미터 값이 없다면 null값이 대신 들어간다.

커맨드 객체를 사용하기 위해서 중간에 null값을 처리하는 코드를 넣어야 한다.

1.4 @ModelAttribute 사용.

- 커맨드 객체의 이름을 지정할 수 있음. (매개변수에 지정시)

public String test( @ModelAttribut("memberInfo") MemberData member){...

MemberData는 자동으로 memberData로 지정된다. 

하지만 위에서는 @ModelAttribute을 사용하여 커맨드 객체를 memberInfo라는 이름으로 지정하였다.

JSP EL식에서 memberInfo라는 이름으로 커맨드 객체를 사용 할 수 있다.

- 공통 데이터로 사용. (클래스에 지정시)

- 클래스에 이름을 설정하여 사용 시, 해당 메서드가 반환하는 객체를 설정된 이름의 커맨드 객체로 사용.

- 클래스에 이름이 설정된 @ModelAttribute가 있을 때, 다른 메서드의 매개변수에 동일한 이름으로 설정된

@ModelAttribute가 있다면, 앞서 지정한 메서드가 반환하는 객체가 뒤에 지정한 매개변수로 전달된다.





**-간략히 애노태이션 정리.-**

@Controller - 클래스에 지정. 

└> @RequestMapping - 클래스 및 내부 메서드에 지정. (경로, 전송방법 등을 지정)

└> @PathVariable -매개변수 앞에 지정. 경로 일부를 전달  @RequestMapping의 경로중 일부 변수를 매개변수로 전달. 

@RequestParam - 매개변수 앞에 지정. 파라미터 전달. 기본값지정 등..

@ModelAttribute - 매개변수 앞에 지정시 커맨드 객체의 이름을 지정.  메서드에 지정 시 공통 모델 처리





 

 

Comments