SlideShare a Scribd company logo
1 of 26
스프링 @MVC
URL 매핑
• 기존 2.x 버전에서는 Controller 인터페이스와 메소드를 연결하
는 방식에서는 대개 URL이 하나의 메소드와 연결했었다.
- 매 URL 마다 Controller 인터페이스를 계속 만들어줘야 하는
부담이 있음
• 3.x 버전 이상 @MVC에서는 메소드 단위 별로 URL을 매핑할 수
있다.
URL 매핑
@RequestMapping("/member")
static class MemberController {
@RequestMapping("/edit") public String edit() { return "edit.jsp"; }
@RequestMapping("/delete") public String delete() { return "delete.jsp"; }
@RequestMapping("/add", method=RequestMethod.GET) public String get() { return "get.jsp"; }
@RequestMapping("/add", method=RequestMethod.POST) public String post() { return "post.jsp"; }
}
사용 예 : url = /member/edit, /member/delete, /member/add (method : get) , /member/add (method : post)
※ 주의
슈퍼클래스를 구현하는 서브클래스에서 RequestMapping를 설정할 때는 주의해야 한다.
하위 타입에서의 RequestMapping 정보는 항상 상위 타입의 정보를 대체하게 되는데, 오버라이드한 경우에는
@RequestMapping 애노테이션만 붙였을 때 상위 타입의 정보가 그대로 상속이 된다는 점이다.
이는 특수한 경우이고 추후 어떻게 변할지 모르기 때문에 추천하지 않는다고 한다.
URL 매핑 – 추상클래스 적용
<추상클래스>
public abstract class GenericController<T, K, S>{
S service;
@RequestMapping("/add") public void add(T entity){}
@RequestMapping("/update") public void update(T entity){}
@RequestMapping("/view") public T view(K id){}
@RequestMapping("/delete") public void delete(K id){}
@RequestMapping("/list") public List<T> list(){}
}
<개별 컨트롤러>
@RequestMapping("/user")
public class UserController extends GenericController<User, Integer, UserService>{
public void add(User user){
// 상위 메소드 오버라이드 : 개별 메소드 로직이 들어간다.
// 별도의 설정이 없는 경우 추상클래스에서 정의된 RequestMapping 정보가 상속된다.
}
@RequestMapping("/login") // 추가된 메소드
public String login(String userId, String userPassword){
// 상위 메소드에서 규정되지 않은 메소드는 자유롭게 추가해서 쓸 수 있다.
// 당연히 별도의 RequestMapping 이 필요하다.
}
}
실제 개발에 들어가면 URL 매핑 작업은
대게 정해진 네이밍룰에 따라 진행됨
메소드 파라미터
종류 (기존 2.x 버전에서 사용하던 파라미터 지원)
HttpServletRequest, HttpServletResponse, HttpSession, Locale,
InputStream, Reader, OutpitStream, Writer
@MVC 메소드 파라미터
• @PathVariable : 다중패스 변수를 사용할 수 있다.
• @RequestParam : HTTP의 Request 파라미터를 메소드 파라미터에 넘겨준다.
(주의 : 설정된 @RequestParam는 필수 정보이므로, 반드시 HTTP 요청으로 넘어와야 한다. 만약 생략 가능한 파라미터라면
required=false로 설정해야한다)
• @CookieValue : 쿠키 값을 메소드 파라미터에 넘겨 준다. 쿠키값이 생략 가능할 때는 required=false로 설정해야한다
• Map, Model, ModepMap : 콜렉션 오브젝트를 넘겨 준다.
• @ModelAttribute : HTTP 요청을 통해 넘어 온 값들을 자동으로 모델에 추가해 View에 넘길 때 쓴다.
개별 파라미터를 각각 정의해야 하는 @RequestParam에 비해 매우 유용하고 강력하다.
• Errors, BindingResult : 파라미터 검증 오류 시 전달받을 리턴값. @ModelAttribute를 쓸 때 반드시 함께 사용해야 한다.
• @RequestBody : XML이나 JSON 기반의 메시지를 사용하는 경우 Body의 값을 그대로 전달.
메소드 파라미터
@PathVariable
다중패스변수
@RequestMapping("/member/{membercode}/order/{orderid}") // /member/kunner/order/1/ 과 같은 URL이 매핑될 것이다.
public String lookup(@PathVariable("membercode") String code, @PathVariable("orderid") int orderid){
}
@RequestParam
HTTP 파라미터 전달
public String view(@RequestParam("id") int id, @RequestParam("name") String name) {}
public String view(@RequestParam(value="id", required=false, defaultValue=-1) int id) {}
public String view(@RequestParam Map<String, String> params) {}
@CookieValue
쿠키 정보 전달
public String check(@CookieValue("auth") String auth) {}
public String check(@CookieValue(value="auth",required=false, defaultValue="NONE") String auth) {}
메소드 파라미터
@ModelAttribute
HTTP 요청 파라미터를 자동으로 모델로 생성해 전달
public class User{ //add에서 연결될 모델
int id;
String name;
int level;
String email;
// 수정자, 접근자 생략
}
@RequestMapping("/user/add", mothod=RequestMethod.POST)
public String add(@ModelAttribute User user){
//폼으로 넘어 온 정보를 자동으로 모델과 매핑한다.
userService.add(user);
//만약 user 말고 다른 이름으로 모델을 만들고 싶다면 @ModelAttribute("원하는이름") 으로 설정하면 된다.
}
리턴 타입
@Controller의 리턴타입은 일부 예외가 있지만 결국 ModelAndView 라고 봐도 무방하다.
• @ModelAttribute 로 넘어 온 메소드 파라미터의 모델
• Map, Model, ModelMap 파라미터
• @ModelAttribute 메소드 : 모델에만 붙이는 게 아니라 메소드에도 붙일 수 있다. 어떤 메소드가 실행될 때 같이 실행되어야 하는 메소드
가 있는 경우 해당 메소드에 @ModelAttribute 애노테이션을 부여하면 함께 실행되어 모델로 추가된다.
회원가입 화면에서 주소 지역 필드를 DB에서 조회해 폼에 출력해야 할 때, 유용하게 사용할 수 있다.
• BindingResult : 검증 결과를 모델로 담아 리턴한다. org.springframework.validation.BindingResult.모델이름 으로 리턴된다.
• ModelAndView : 전통적인 스프링 MVC에서처럼 ModelAndView를 리턴한다.
하지만 @Controller에서는 ModelAndView를 직접 리턴하는 방법을 잘 쓰지 않는다.
• String : 모델은 파라미터로 맵을 가져와 넣고, 리턴값은 뷰 이름을 스트링으로 선언하는 방식이다. @Controller에서 가장 흔하게 사용되
는 방법이다.
• void : RequestToViewNameResolver 전략을 통해 메소드 이름이 곧 리턴할 view의 이름이 된다. 메소드 이름과 view의 이름을 통일할 수
있는 경우 string을 리턴할 것도 없이 바로 void를 써도 된다.
• 모델 오브젝트 : 위의 void에서처럼 뷰 이름은 메소드 이름과 같고, 모델에 추가해야 할 오브젝트가 하나 뿐이라면(즉, 전달할 파라미터가
한개라면) 바로 모델 자체를 리턴할 수 있다. 모델을 리턴하는 경우에도 실제로는 메소드 이름과 같은 뷰가 리턴된다.
• Map/Model/ModelMap : 각 콜렉션을 모델로 만들어서 리턴하는 경우에도 모델 오브젝트를 리턴하는 것과 같은 효과를 낸다.
• View : XML 뷰어와 같이 별도의 뷰 오브젝트로 넘기고 싶을 때 리턴타입을 View로 설정한다.
• @ResponseBody : 메소드의 실행 결과가 바로 HTTP Response로 출력된다.
리턴 타입
String
@RequestMapping("/user/search")
public String hello(@RequestParam String name, Model model){
model.addAttribute("name",name); // 모델에 추가
return "hello"; // View 이름 리턴
}
모델 오브젝트
@RequestMapping("/view")
public User hello(@RequestParam int id){
return userService.getUser(id); // 모델에 연결되는 파라미터 값이 하나일 때
}
Map 오브젝트 리턴의 잘못된 사용 (Map으로 리턴하는 경우 그 자체를 모델 맵으로 인식)
@RequestMapping("/view")
public Map hello(@RequestParam int id){
Map userMap = userService.getUserMap(id);
return userMap; // 이렇게 맵을 리턴하면 맵을 다시 모델로 감싸서 리턴하기 때문에 안 된다.
}
Map 오브젝트 리턴의 올바른 사용
@RequestMapping("/view")
public void hello(@RequestParam int id, Model model){
model.addAttribute("userMap", userService.getUserMap(id)); // 아예 모델로 싸서 리턴하면 된다.
}
리턴 타입
ResponseBody
@RequestMapping("/view")
@ResponseBody
public String hello(){
// 원래 String 리턴타입은 뷰 이름을 말하지만,
@ResponseBody 애노테이션 때문에 바디에 출력되는 스트림으로 인식된다.
return "<html>블라블라블라</html>";
}
세션을 이용한 상태 저장
세션을 이용한 상태 저장
웹은 비동기 프로그램이라, 상태를 저장하지 않는다.
- 클라이언트가 서버에 정보를 요청하면, 서버는 해당 요청에 따른 작업결과를 클라이언트에게 전달하고 연결이 끊킴
@Controller
@SessionAttributes("user") // 메소드에서 다룰 세션 정보를 지정한다. 복수로 지정될 수 있다.
static class UserController {
@RequestMapping(value="/user/edit", method=RequestMethod.GET)
public User form(@RequestParam int id) {
return new User(1, "Spring", "mail@spring.com"); // 특별한 지시가 없어도 리턴된 모델은 세션으로 저장된다.
}
@RequestMapping(value="/user/edit", method=RequestMethod.POST)
public void submit(@ModelAttribute User user, SessionStatus sessionStatus) {
sessionStatus.setComplete(); // 이 메소드에서 사용된 세션 정보를 비운다.
}
}
세션을 이용한 상태 저장
@ModelAttribute 선언 후 자동으로 진행되는 작업들
• 첫째, 파라미터로 넘겨 준 타입의 오브젝트를 자동으로 생성한다. 예를
들어 @ModelAttribute User user 라고 인수를 넘기면 User 타입의
user 오브젝트를 자동으로 생성한다.
• 둘째, 생성된 오브젝트에 HTTP로 넘어 온 값들을 자동으로 바인딩한다.
HTTP 파라미터는 문자열이기 때문에 오브젝트에 맞는 형 변환이 필요
하다. 이때 스프링의 기본 프로퍼티 에디터를 사용한다. 변환 중 오류가
생겨도 작업은 중단되지 않는다.
(@RequestParam, @PathVariable)
• 셋째, 오브젝트로 넘어 온 값을 검증한다. 사용자가 자체적으로 검증기
를 등록해 Validation 체크를 진행할 수 있다.
Custom 형 변환
• 스프링에서 바인딩이 일어날 때 값에 적절한 형 변환이 일어나도록 하는 방법에는 PropertyEditor
를 이용하는 방식과 Converter를 이용하는 방식 두 가지가 있다.
- PropertyEditor
스프링이 기본적으로 제공하는 바인딩용 타입(형) 변환
애초에 GUI 개발도구에서 사용자가 입력한 값을 적절한 형태로 형 변환하기 위해 제공되 는 도구로
시작
자바에서 기본으로 지원하는 타입들은 자동 형 변환이 일어난다.
Integer와 같은 기본적인 오브젝트는 물론,
책에서 예로 든 Charset 와 같은 타입도 자동으로 형 변환된다.
그런데 개발자가 필요에 따라 만든 타입이라면 자동으로 형 변환이 일어나지 않을 것이다.
이런 경우 커스텀 프로퍼티 에디터 사용
Custom 형 변환 – PropertyEditor 사용
PropertyEditorSupport 클래스를 상속해서
필요한 메소드(getAsText, setAsText)만
오버라이드해서 구성하면 된다
Custom 형 변환 – PropertyEditor 사용
@InitBinder 메소드
@InitBinder
public void initBinder(WebDataBinder dataBinder){
dataBinder.registerCustomEditor(Level.class, new LevelPropertyEditor());
//dataBinder에 커스텀에디터를 등록한다. Level 오브젝트를 만나면 LevelPropertyEditor와 연결된다.
}
값이 프로퍼티에 바인딩되기전에 WebDataBinder 호출한다.
WebDataBinder 수정하지는 못 하지만 WebDataBinder 초기화 메소드를 사용할 수 있다.
@InitBinder 애노테이션을 선언해주면 Level 타입을 만나면 무조건 LevelPropertyEditor와 연결된다.
Custom 형 변환 – PropertyEditor 사용
프로토타입 프로퍼티 에디터 (동적으로 처리)
Custom 형 변환 – Converter 사용
• PropertyEditor는 필요할 때 마다 새로 생성해줘야 하는 단점이있다.
• 이런 단점을 극복하기 위해 3.0부터 Converter 도입.
• Converter는 단방향으로만 지원 S->T, T->S 두가지를 함께 등록해야한다.
Converter의 인터페이스
public interface Converter<S,T>{
T convert(S source);
}
LevelToStringConverter.java
public class LevelToStringConverter implements Converter<Level, String>{
public String convert(Level level){
return String.valueOf(level.intValue()); //level.intValue 와 같은 메소드는 앞서 생성한 Level.class에 있다.
}
}
StringToLevelConverter.java
public class StringToLevelConverter implements Converter<String, Level>{
public Level convert(String text){
return Level.valueOf(Integer.parseInt(text));
}
}
Custom 형 변환 – Converter 사용
ConverstionServiceFactoryBean에 빈 등록
<bean class="org.springframework.context.support.ConversionServiceFactoryBean" >
<property name="converters">
<set>
<bean class="LevelToStringConverter">
<bean class="StringToLevelConverter">
</set>
</property>
</bean>
컨트롤러에서 컨버터 등록
@Controller public static class SearchController{
@Autowired ConversionService conversionService; //컨버전서비스를 주입받는다.
@InitBinder
public void initBinder(WebBinder dataBinder){
dataBinder.setConversionService(this.conversionService);
}
}
Formatter
통화표현의 예
class product{
@NumberFormat("$###,##0.00") // 아래 선언된 price를 이와 같은 통화 표현으로 포맷팅한다.
BigDecimal price;
}
$1,000,23 <-> 1000.23
날짜 표현의 예
system.out.println(org.joda.time.format.DatetimeFormat.patternForStyle("SS",Locale.KOREA)); // yy. M. d a h:mm
// 앞의 인수는 날짜 표현 방식인데, S(Short), M(Medium), L(Long), F(Full) 네개의 문자를 날짜+시간 표현으로 정의한다.
@DateTimeFormat(style="F-") // 시간은 생력하고 날짜만 풀 포맷으로 나온다
Calendar birthday
@DateTimeFormat(pattern="yyyy/MM/dd") //아예 날짜 표현 방식을 직접 정의할 수도 있다.
Date orderDate;
JSP EL
일반적인 JSP 페이지에서 name을 출력하기 위한 코드
<%
User user = new User();
user = user.getUser(userid);
out.println(user.name)
%>
EL 표현식 사용
${user.name}
JSTL
<c:if>, <c:when>, <c:choose>
스프링 Sp EL
Sp EL
JSP EL에 비해 자유도가 높아 메소드 호출이나 연산, 오브젝트 생성 가능
메소드에 특정 변수 포맷터를 지정한 경우 Sp EL로 출력하면 포맷팅이 자동으로 따라 온다
Sp EL을 사용하기 위햐 태그 라이브러리 추가
<% taglib prefix="spring" uri="http://www.springframework.org/tags" %>
사용예
name 프로퍼티에 바인딩된 value 출력
<spring:eval expression="user.name” />
메소드 출력
<spring:eval expression= ser.toString()" />
오브젝트 생성 및 메소드 출력
<spring:eval expression=‘new iava.text.DecimalFormat(“###,##0.00”).format(user.point)’ />
지역화 메시지 출력
서로다른 메시지를 뿌려줌. (다국어 사용시 유용)
messages.properties (Default)
messages_en.properties, messages_ko.properties, messages_jp.properties (파일 생성)
컨텍스트에 빈 설정
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>com.kunner.common.messages.default_msg</value>
// messages.properties 라는 기본 이름을 쓰지 않고 별도로 지정해 줄 수도 있다.
// 이 경우 메시지 파일은 WEB-INF/classes/com/kunner/common/messages/default_msg.properties 가 될 것이다.
</list>
</property>
</bean>
지역화 메시지 출력
messages.properties
greeting=Hello, {0}! Have a nice {1}!
뷰 페이지
<spring:message code="greeting" arguments="${user.name},${dayOrNight}" text="Hello, there!" />
출력
Hello, Kunner! Have a nice day!
※ 만약 인수로 메시지를 찾을 수 없을 경우 text에 지정된 값 출력
폼 태그 라이브러리 <form: />
장점
서브밋 하다 오류 발생시 입력한 정보를 그대로 유지시키기 위함
입력 오류가 난 항목에 별도의 오류 메시지를 출력 하기 위함
태그 라이브러리 추가
<% taglib prefix="form" uri="http://springframework.org/tags/form" %>
<form:form id="userform" commandName="user" action="/user/add" method=post>
<form:label path="name" cssClass="inputText" cssErrorClass="inputTextError">이름: </form:label>
<form:input path="name" cssClass="inputForm" cssErrorClass="inputFormError" />
<form:errors path="name" cssClass="inputTextError" />
//path를 지정해 놓으면 해당 입력값에 입력 오류나 바인딩 오류가 있을 때 에러를 표시할 수 있다.
//일반적인 상황에서는 cssClass에 선언된 css가 적용되고, 오류상황에서는 cssErrorClass의 css가 적용된다.
//<form:errors>는 오류상황에서만 출력되므로 cssClass가 다른 개체의 cssErrorClass와 같은 기능을 한다.
<form:label path="point" cssClass="inputText" cssErrorClass="inputTextError">포인트: </form:label>
<form:input path="point" cssClass="inputForm" cssErrorClass="inputFormError" />
<form:errors path="point" cssClass="inputTextError" />
//모델에 포맷터를 적용한 경우 해당 포맷팅이 자동으로 처리된다!!!
<input type="submit" value=" ok "> // HTML 태그를 혼용해도 상관 없다.
</form:form>
얏호~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
모두 수고하셧습니다~!!

More Related Content

What's hot

(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
07.실행환경 교육교재(표준프레임워크 세부 적용기준)
07.실행환경 교육교재(표준프레임워크 세부 적용기준)07.실행환경 교육교재(표준프레임워크 세부 적용기준)
07.실행환경 교육교재(표준프레임워크 세부 적용기준)Hankyo
 
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
HeadFisrt Servlet&JSP Chapter 3
HeadFisrt Servlet&JSP Chapter 3HeadFisrt Servlet&JSP Chapter 3
HeadFisrt Servlet&JSP Chapter 3J B
 
03.실행환경 실습교재(배치처리)
03.실행환경 실습교재(배치처리)03.실행환경 실습교재(배치처리)
03.실행환경 실습교재(배치처리)Hankyo
 
[웹기반시스템 3조] mvc
[웹기반시스템 3조] mvc[웹기반시스템 3조] mvc
[웹기반시스템 3조] mvc구 봉
 
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
ReactJS | 서버와 클라이어트에서 동시에 사용하는
ReactJS | 서버와 클라이어트에서 동시에 사용하는ReactJS | 서버와 클라이어트에서 동시에 사용하는
ReactJS | 서버와 클라이어트에서 동시에 사용하는Taegon Kim
 
HeadFisrt Servlet&JSP Chapter 2
HeadFisrt Servlet&JSP Chapter 2HeadFisrt Servlet&JSP Chapter 2
HeadFisrt Servlet&JSP Chapter 2J B
 
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 

What's hot (13)

스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
 
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
 
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
 
07.실행환경 교육교재(표준프레임워크 세부 적용기준)
07.실행환경 교육교재(표준프레임워크 세부 적용기준)07.실행환경 교육교재(표준프레임워크 세부 적용기준)
07.실행환경 교육교재(표준프레임워크 세부 적용기준)
 
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
 
HeadFisrt Servlet&JSP Chapter 3
HeadFisrt Servlet&JSP Chapter 3HeadFisrt Servlet&JSP Chapter 3
HeadFisrt Servlet&JSP Chapter 3
 
03.실행환경 실습교재(배치처리)
03.실행환경 실습교재(배치처리)03.실행환경 실습교재(배치처리)
03.실행환경 실습교재(배치처리)
 
[웹기반시스템 3조] mvc
[웹기반시스템 3조] mvc[웹기반시스템 3조] mvc
[웹기반시스템 3조] mvc
 
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
ReactJS | 서버와 클라이어트에서 동시에 사용하는
ReactJS | 서버와 클라이어트에서 동시에 사용하는ReactJS | 서버와 클라이어트에서 동시에 사용하는
ReactJS | 서버와 클라이어트에서 동시에 사용하는
 
HeadFisrt Servlet&JSP Chapter 2
HeadFisrt Servlet&JSP Chapter 2HeadFisrt Servlet&JSP Chapter 2
HeadFisrt Servlet&JSP Chapter 2
 
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
 
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 

Similar to [스프링 스터디 3일차] @MVC

[오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC [오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC Ji-Woong Choi
 
스프링 3.0 RESTful & restTemplate
스프링 3.0  RESTful & restTemplate스프링 3.0  RESTful & restTemplate
스프링 3.0 RESTful & restTemplateisyoon
 
Spring MVC
Spring MVCSpring MVC
Spring MVCymtech
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 Yong Joon Moon
 
[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화AnselmKim
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿AnselmKim
 
Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Sungjoon Yoon
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Choonghyun Yang
 
Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까? Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까? Kim Hunmin
 
2.Connect Sunshine to the Cloud - 시온고 안드로이드 스터디
2.Connect Sunshine to the Cloud - 시온고 안드로이드 스터디2.Connect Sunshine to the Cloud - 시온고 안드로이드 스터디
2.Connect Sunshine to the Cloud - 시온고 안드로이드 스터디Youngbin Han
 
Mvc 패턴
Mvc 패턴Mvc 패턴
Mvc 패턴Seokju Hong
 
[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우NAVER D2
 
Isomorphicspring Isomorphic - spring web seminar 2015
Isomorphicspring Isomorphic - spring web seminar 2015Isomorphicspring Isomorphic - spring web seminar 2015
Isomorphicspring Isomorphic - spring web seminar 2015sung yong jung
 
Spring mvc
Spring mvcSpring mvc
Spring mvcksain
 

Similar to [스프링 스터디 3일차] @MVC (20)

스프링 3.0 & RESTful
스프링 3.0 & RESTful스프링 3.0 & RESTful
스프링 3.0 & RESTful
 
[오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC [오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC
 
스프링 3.0 RESTful & restTemplate
스프링 3.0  RESTful & restTemplate스프링 3.0  RESTful & restTemplate
스프링 3.0 RESTful & restTemplate
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기
 
[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화[스프링 스터디 2일차] 서비스 추상화
[스프링 스터디 2일차] 서비스 추상화
 
Spring boot actuator
Spring boot   actuatorSpring boot   actuator
Spring boot actuator
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿
 
Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)Ksug 세미나 (윤성준) (20121208)
Ksug 세미나 (윤성준) (20121208)
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)
 
Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까? Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까?
 
HTTP web server 구현
HTTP web server 구현HTTP web server 구현
HTTP web server 구현
 
One-day-codelab
One-day-codelabOne-day-codelab
One-day-codelab
 
2.Connect Sunshine to the Cloud - 시온고 안드로이드 스터디
2.Connect Sunshine to the Cloud - 시온고 안드로이드 스터디2.Connect Sunshine to the Cloud - 시온고 안드로이드 스터디
2.Connect Sunshine to the Cloud - 시온고 안드로이드 스터디
 
Mvc 패턴
Mvc 패턴Mvc 패턴
Mvc 패턴
 
[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우
 
Xe hack
Xe hackXe hack
Xe hack
 
Isomorphicspring Isomorphic - spring web seminar 2015
Isomorphicspring Isomorphic - spring web seminar 2015Isomorphicspring Isomorphic - spring web seminar 2015
Isomorphicspring Isomorphic - spring web seminar 2015
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
4-3. jquery
4-3. jquery4-3. jquery
4-3. jquery
 

More from AnselmKim

[스프링 스터디 2일차] 스프링 핵심 기술의 응용
[스프링 스터디 2일차] 스프링 핵심 기술의 응용[스프링 스터디 2일차] 스프링 핵심 기술의 응용
[스프링 스터디 2일차] 스프링 핵심 기술의 응용AnselmKim
 
[스프링 스터디 2일차] AOP
[스프링 스터디 2일차] AOP[스프링 스터디 2일차] AOP
[스프링 스터디 2일차] AOPAnselmKim
 
[스프링 스터디 3일차] AOP와 LTW
[스프링 스터디 3일차] AOP와 LTW[스프링 스터디 3일차] AOP와 LTW
[스프링 스터디 3일차] AOP와 LTWAnselmKim
 
[스프링 스터디 3일차] 스프링 웹 기술 응용과 MVC
[스프링 스터디 3일차] 스프링 웹 기술 응용과 MVC[스프링 스터디 3일차] 스프링 웹 기술 응용과 MVC
[스프링 스터디 3일차] 스프링 웹 기술 응용과 MVCAnselmKim
 
[스프링 스터디 3일차] 데이터엑세스기술
[스프링 스터디 3일차] 데이터엑세스기술[스프링 스터디 3일차] 데이터엑세스기술
[스프링 스터디 3일차] 데이터엑세스기술AnselmKim
 
[스프링 스터디 2일차] IoC 컨테이너와 DI
[스프링 스터디 2일차] IoC 컨테이너와 DI[스프링 스터디 2일차] IoC 컨테이너와 DI
[스프링 스터디 2일차] IoC 컨테이너와 DIAnselmKim
 
[스프링 스터디 1일차] Test
[스프링 스터디 1일차] Test[스프링 스터디 1일차] Test
[스프링 스터디 1일차] TestAnselmKim
 
[스프링 스터디 1일차] 예외 처리
[스프링 스터디 1일차] 예외 처리[스프링 스터디 1일차] 예외 처리
[스프링 스터디 1일차] 예외 처리AnselmKim
 
[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계AnselmKim
 

More from AnselmKim (9)

[스프링 스터디 2일차] 스프링 핵심 기술의 응용
[스프링 스터디 2일차] 스프링 핵심 기술의 응용[스프링 스터디 2일차] 스프링 핵심 기술의 응용
[스프링 스터디 2일차] 스프링 핵심 기술의 응용
 
[스프링 스터디 2일차] AOP
[스프링 스터디 2일차] AOP[스프링 스터디 2일차] AOP
[스프링 스터디 2일차] AOP
 
[스프링 스터디 3일차] AOP와 LTW
[스프링 스터디 3일차] AOP와 LTW[스프링 스터디 3일차] AOP와 LTW
[스프링 스터디 3일차] AOP와 LTW
 
[스프링 스터디 3일차] 스프링 웹 기술 응용과 MVC
[스프링 스터디 3일차] 스프링 웹 기술 응용과 MVC[스프링 스터디 3일차] 스프링 웹 기술 응용과 MVC
[스프링 스터디 3일차] 스프링 웹 기술 응용과 MVC
 
[스프링 스터디 3일차] 데이터엑세스기술
[스프링 스터디 3일차] 데이터엑세스기술[스프링 스터디 3일차] 데이터엑세스기술
[스프링 스터디 3일차] 데이터엑세스기술
 
[스프링 스터디 2일차] IoC 컨테이너와 DI
[스프링 스터디 2일차] IoC 컨테이너와 DI[스프링 스터디 2일차] IoC 컨테이너와 DI
[스프링 스터디 2일차] IoC 컨테이너와 DI
 
[스프링 스터디 1일차] Test
[스프링 스터디 1일차] Test[스프링 스터디 1일차] Test
[스프링 스터디 1일차] Test
 
[스프링 스터디 1일차] 예외 처리
[스프링 스터디 1일차] 예외 처리[스프링 스터디 1일차] 예외 처리
[스프링 스터디 1일차] 예외 처리
 
[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계
 

[스프링 스터디 3일차] @MVC

  • 2. URL 매핑 • 기존 2.x 버전에서는 Controller 인터페이스와 메소드를 연결하 는 방식에서는 대개 URL이 하나의 메소드와 연결했었다. - 매 URL 마다 Controller 인터페이스를 계속 만들어줘야 하는 부담이 있음 • 3.x 버전 이상 @MVC에서는 메소드 단위 별로 URL을 매핑할 수 있다.
  • 3. URL 매핑 @RequestMapping("/member") static class MemberController { @RequestMapping("/edit") public String edit() { return "edit.jsp"; } @RequestMapping("/delete") public String delete() { return "delete.jsp"; } @RequestMapping("/add", method=RequestMethod.GET) public String get() { return "get.jsp"; } @RequestMapping("/add", method=RequestMethod.POST) public String post() { return "post.jsp"; } } 사용 예 : url = /member/edit, /member/delete, /member/add (method : get) , /member/add (method : post) ※ 주의 슈퍼클래스를 구현하는 서브클래스에서 RequestMapping를 설정할 때는 주의해야 한다. 하위 타입에서의 RequestMapping 정보는 항상 상위 타입의 정보를 대체하게 되는데, 오버라이드한 경우에는 @RequestMapping 애노테이션만 붙였을 때 상위 타입의 정보가 그대로 상속이 된다는 점이다. 이는 특수한 경우이고 추후 어떻게 변할지 모르기 때문에 추천하지 않는다고 한다.
  • 4. URL 매핑 – 추상클래스 적용 <추상클래스> public abstract class GenericController<T, K, S>{ S service; @RequestMapping("/add") public void add(T entity){} @RequestMapping("/update") public void update(T entity){} @RequestMapping("/view") public T view(K id){} @RequestMapping("/delete") public void delete(K id){} @RequestMapping("/list") public List<T> list(){} } <개별 컨트롤러> @RequestMapping("/user") public class UserController extends GenericController<User, Integer, UserService>{ public void add(User user){ // 상위 메소드 오버라이드 : 개별 메소드 로직이 들어간다. // 별도의 설정이 없는 경우 추상클래스에서 정의된 RequestMapping 정보가 상속된다. } @RequestMapping("/login") // 추가된 메소드 public String login(String userId, String userPassword){ // 상위 메소드에서 규정되지 않은 메소드는 자유롭게 추가해서 쓸 수 있다. // 당연히 별도의 RequestMapping 이 필요하다. } } 실제 개발에 들어가면 URL 매핑 작업은 대게 정해진 네이밍룰에 따라 진행됨
  • 5. 메소드 파라미터 종류 (기존 2.x 버전에서 사용하던 파라미터 지원) HttpServletRequest, HttpServletResponse, HttpSession, Locale, InputStream, Reader, OutpitStream, Writer @MVC 메소드 파라미터 • @PathVariable : 다중패스 변수를 사용할 수 있다. • @RequestParam : HTTP의 Request 파라미터를 메소드 파라미터에 넘겨준다. (주의 : 설정된 @RequestParam는 필수 정보이므로, 반드시 HTTP 요청으로 넘어와야 한다. 만약 생략 가능한 파라미터라면 required=false로 설정해야한다) • @CookieValue : 쿠키 값을 메소드 파라미터에 넘겨 준다. 쿠키값이 생략 가능할 때는 required=false로 설정해야한다 • Map, Model, ModepMap : 콜렉션 오브젝트를 넘겨 준다. • @ModelAttribute : HTTP 요청을 통해 넘어 온 값들을 자동으로 모델에 추가해 View에 넘길 때 쓴다. 개별 파라미터를 각각 정의해야 하는 @RequestParam에 비해 매우 유용하고 강력하다. • Errors, BindingResult : 파라미터 검증 오류 시 전달받을 리턴값. @ModelAttribute를 쓸 때 반드시 함께 사용해야 한다. • @RequestBody : XML이나 JSON 기반의 메시지를 사용하는 경우 Body의 값을 그대로 전달.
  • 6. 메소드 파라미터 @PathVariable 다중패스변수 @RequestMapping("/member/{membercode}/order/{orderid}") // /member/kunner/order/1/ 과 같은 URL이 매핑될 것이다. public String lookup(@PathVariable("membercode") String code, @PathVariable("orderid") int orderid){ } @RequestParam HTTP 파라미터 전달 public String view(@RequestParam("id") int id, @RequestParam("name") String name) {} public String view(@RequestParam(value="id", required=false, defaultValue=-1) int id) {} public String view(@RequestParam Map<String, String> params) {} @CookieValue 쿠키 정보 전달 public String check(@CookieValue("auth") String auth) {} public String check(@CookieValue(value="auth",required=false, defaultValue="NONE") String auth) {}
  • 7. 메소드 파라미터 @ModelAttribute HTTP 요청 파라미터를 자동으로 모델로 생성해 전달 public class User{ //add에서 연결될 모델 int id; String name; int level; String email; // 수정자, 접근자 생략 } @RequestMapping("/user/add", mothod=RequestMethod.POST) public String add(@ModelAttribute User user){ //폼으로 넘어 온 정보를 자동으로 모델과 매핑한다. userService.add(user); //만약 user 말고 다른 이름으로 모델을 만들고 싶다면 @ModelAttribute("원하는이름") 으로 설정하면 된다. }
  • 8. 리턴 타입 @Controller의 리턴타입은 일부 예외가 있지만 결국 ModelAndView 라고 봐도 무방하다. • @ModelAttribute 로 넘어 온 메소드 파라미터의 모델 • Map, Model, ModelMap 파라미터 • @ModelAttribute 메소드 : 모델에만 붙이는 게 아니라 메소드에도 붙일 수 있다. 어떤 메소드가 실행될 때 같이 실행되어야 하는 메소드 가 있는 경우 해당 메소드에 @ModelAttribute 애노테이션을 부여하면 함께 실행되어 모델로 추가된다. 회원가입 화면에서 주소 지역 필드를 DB에서 조회해 폼에 출력해야 할 때, 유용하게 사용할 수 있다. • BindingResult : 검증 결과를 모델로 담아 리턴한다. org.springframework.validation.BindingResult.모델이름 으로 리턴된다. • ModelAndView : 전통적인 스프링 MVC에서처럼 ModelAndView를 리턴한다. 하지만 @Controller에서는 ModelAndView를 직접 리턴하는 방법을 잘 쓰지 않는다. • String : 모델은 파라미터로 맵을 가져와 넣고, 리턴값은 뷰 이름을 스트링으로 선언하는 방식이다. @Controller에서 가장 흔하게 사용되 는 방법이다. • void : RequestToViewNameResolver 전략을 통해 메소드 이름이 곧 리턴할 view의 이름이 된다. 메소드 이름과 view의 이름을 통일할 수 있는 경우 string을 리턴할 것도 없이 바로 void를 써도 된다. • 모델 오브젝트 : 위의 void에서처럼 뷰 이름은 메소드 이름과 같고, 모델에 추가해야 할 오브젝트가 하나 뿐이라면(즉, 전달할 파라미터가 한개라면) 바로 모델 자체를 리턴할 수 있다. 모델을 리턴하는 경우에도 실제로는 메소드 이름과 같은 뷰가 리턴된다. • Map/Model/ModelMap : 각 콜렉션을 모델로 만들어서 리턴하는 경우에도 모델 오브젝트를 리턴하는 것과 같은 효과를 낸다. • View : XML 뷰어와 같이 별도의 뷰 오브젝트로 넘기고 싶을 때 리턴타입을 View로 설정한다. • @ResponseBody : 메소드의 실행 결과가 바로 HTTP Response로 출력된다.
  • 9. 리턴 타입 String @RequestMapping("/user/search") public String hello(@RequestParam String name, Model model){ model.addAttribute("name",name); // 모델에 추가 return "hello"; // View 이름 리턴 } 모델 오브젝트 @RequestMapping("/view") public User hello(@RequestParam int id){ return userService.getUser(id); // 모델에 연결되는 파라미터 값이 하나일 때 } Map 오브젝트 리턴의 잘못된 사용 (Map으로 리턴하는 경우 그 자체를 모델 맵으로 인식) @RequestMapping("/view") public Map hello(@RequestParam int id){ Map userMap = userService.getUserMap(id); return userMap; // 이렇게 맵을 리턴하면 맵을 다시 모델로 감싸서 리턴하기 때문에 안 된다. } Map 오브젝트 리턴의 올바른 사용 @RequestMapping("/view") public void hello(@RequestParam int id, Model model){ model.addAttribute("userMap", userService.getUserMap(id)); // 아예 모델로 싸서 리턴하면 된다. }
  • 10. 리턴 타입 ResponseBody @RequestMapping("/view") @ResponseBody public String hello(){ // 원래 String 리턴타입은 뷰 이름을 말하지만, @ResponseBody 애노테이션 때문에 바디에 출력되는 스트림으로 인식된다. return "<html>블라블라블라</html>"; }
  • 11. 세션을 이용한 상태 저장 세션을 이용한 상태 저장 웹은 비동기 프로그램이라, 상태를 저장하지 않는다. - 클라이언트가 서버에 정보를 요청하면, 서버는 해당 요청에 따른 작업결과를 클라이언트에게 전달하고 연결이 끊킴 @Controller @SessionAttributes("user") // 메소드에서 다룰 세션 정보를 지정한다. 복수로 지정될 수 있다. static class UserController { @RequestMapping(value="/user/edit", method=RequestMethod.GET) public User form(@RequestParam int id) { return new User(1, "Spring", "mail@spring.com"); // 특별한 지시가 없어도 리턴된 모델은 세션으로 저장된다. } @RequestMapping(value="/user/edit", method=RequestMethod.POST) public void submit(@ModelAttribute User user, SessionStatus sessionStatus) { sessionStatus.setComplete(); // 이 메소드에서 사용된 세션 정보를 비운다. } }
  • 13. @ModelAttribute 선언 후 자동으로 진행되는 작업들 • 첫째, 파라미터로 넘겨 준 타입의 오브젝트를 자동으로 생성한다. 예를 들어 @ModelAttribute User user 라고 인수를 넘기면 User 타입의 user 오브젝트를 자동으로 생성한다. • 둘째, 생성된 오브젝트에 HTTP로 넘어 온 값들을 자동으로 바인딩한다. HTTP 파라미터는 문자열이기 때문에 오브젝트에 맞는 형 변환이 필요 하다. 이때 스프링의 기본 프로퍼티 에디터를 사용한다. 변환 중 오류가 생겨도 작업은 중단되지 않는다. (@RequestParam, @PathVariable) • 셋째, 오브젝트로 넘어 온 값을 검증한다. 사용자가 자체적으로 검증기 를 등록해 Validation 체크를 진행할 수 있다.
  • 14. Custom 형 변환 • 스프링에서 바인딩이 일어날 때 값에 적절한 형 변환이 일어나도록 하는 방법에는 PropertyEditor 를 이용하는 방식과 Converter를 이용하는 방식 두 가지가 있다. - PropertyEditor 스프링이 기본적으로 제공하는 바인딩용 타입(형) 변환 애초에 GUI 개발도구에서 사용자가 입력한 값을 적절한 형태로 형 변환하기 위해 제공되 는 도구로 시작 자바에서 기본으로 지원하는 타입들은 자동 형 변환이 일어난다. Integer와 같은 기본적인 오브젝트는 물론, 책에서 예로 든 Charset 와 같은 타입도 자동으로 형 변환된다. 그런데 개발자가 필요에 따라 만든 타입이라면 자동으로 형 변환이 일어나지 않을 것이다. 이런 경우 커스텀 프로퍼티 에디터 사용
  • 15. Custom 형 변환 – PropertyEditor 사용 PropertyEditorSupport 클래스를 상속해서 필요한 메소드(getAsText, setAsText)만 오버라이드해서 구성하면 된다
  • 16. Custom 형 변환 – PropertyEditor 사용 @InitBinder 메소드 @InitBinder public void initBinder(WebDataBinder dataBinder){ dataBinder.registerCustomEditor(Level.class, new LevelPropertyEditor()); //dataBinder에 커스텀에디터를 등록한다. Level 오브젝트를 만나면 LevelPropertyEditor와 연결된다. } 값이 프로퍼티에 바인딩되기전에 WebDataBinder 호출한다. WebDataBinder 수정하지는 못 하지만 WebDataBinder 초기화 메소드를 사용할 수 있다. @InitBinder 애노테이션을 선언해주면 Level 타입을 만나면 무조건 LevelPropertyEditor와 연결된다.
  • 17. Custom 형 변환 – PropertyEditor 사용 프로토타입 프로퍼티 에디터 (동적으로 처리)
  • 18. Custom 형 변환 – Converter 사용 • PropertyEditor는 필요할 때 마다 새로 생성해줘야 하는 단점이있다. • 이런 단점을 극복하기 위해 3.0부터 Converter 도입. • Converter는 단방향으로만 지원 S->T, T->S 두가지를 함께 등록해야한다. Converter의 인터페이스 public interface Converter<S,T>{ T convert(S source); } LevelToStringConverter.java public class LevelToStringConverter implements Converter<Level, String>{ public String convert(Level level){ return String.valueOf(level.intValue()); //level.intValue 와 같은 메소드는 앞서 생성한 Level.class에 있다. } } StringToLevelConverter.java public class StringToLevelConverter implements Converter<String, Level>{ public Level convert(String text){ return Level.valueOf(Integer.parseInt(text)); } }
  • 19. Custom 형 변환 – Converter 사용 ConverstionServiceFactoryBean에 빈 등록 <bean class="org.springframework.context.support.ConversionServiceFactoryBean" > <property name="converters"> <set> <bean class="LevelToStringConverter"> <bean class="StringToLevelConverter"> </set> </property> </bean> 컨트롤러에서 컨버터 등록 @Controller public static class SearchController{ @Autowired ConversionService conversionService; //컨버전서비스를 주입받는다. @InitBinder public void initBinder(WebBinder dataBinder){ dataBinder.setConversionService(this.conversionService); } }
  • 20. Formatter 통화표현의 예 class product{ @NumberFormat("$###,##0.00") // 아래 선언된 price를 이와 같은 통화 표현으로 포맷팅한다. BigDecimal price; } $1,000,23 <-> 1000.23 날짜 표현의 예 system.out.println(org.joda.time.format.DatetimeFormat.patternForStyle("SS",Locale.KOREA)); // yy. M. d a h:mm // 앞의 인수는 날짜 표현 방식인데, S(Short), M(Medium), L(Long), F(Full) 네개의 문자를 날짜+시간 표현으로 정의한다. @DateTimeFormat(style="F-") // 시간은 생력하고 날짜만 풀 포맷으로 나온다 Calendar birthday @DateTimeFormat(pattern="yyyy/MM/dd") //아예 날짜 표현 방식을 직접 정의할 수도 있다. Date orderDate;
  • 21. JSP EL 일반적인 JSP 페이지에서 name을 출력하기 위한 코드 <% User user = new User(); user = user.getUser(userid); out.println(user.name) %> EL 표현식 사용 ${user.name} JSTL <c:if>, <c:when>, <c:choose>
  • 22. 스프링 Sp EL Sp EL JSP EL에 비해 자유도가 높아 메소드 호출이나 연산, 오브젝트 생성 가능 메소드에 특정 변수 포맷터를 지정한 경우 Sp EL로 출력하면 포맷팅이 자동으로 따라 온다 Sp EL을 사용하기 위햐 태그 라이브러리 추가 <% taglib prefix="spring" uri="http://www.springframework.org/tags" %> 사용예 name 프로퍼티에 바인딩된 value 출력 <spring:eval expression="user.name” /> 메소드 출력 <spring:eval expression= ser.toString()" /> 오브젝트 생성 및 메소드 출력 <spring:eval expression=‘new iava.text.DecimalFormat(“###,##0.00”).format(user.point)’ />
  • 23. 지역화 메시지 출력 서로다른 메시지를 뿌려줌. (다국어 사용시 유용) messages.properties (Default) messages_en.properties, messages_ko.properties, messages_jp.properties (파일 생성) 컨텍스트에 빈 설정 <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <list> <value>com.kunner.common.messages.default_msg</value> // messages.properties 라는 기본 이름을 쓰지 않고 별도로 지정해 줄 수도 있다. // 이 경우 메시지 파일은 WEB-INF/classes/com/kunner/common/messages/default_msg.properties 가 될 것이다. </list> </property> </bean>
  • 24. 지역화 메시지 출력 messages.properties greeting=Hello, {0}! Have a nice {1}! 뷰 페이지 <spring:message code="greeting" arguments="${user.name},${dayOrNight}" text="Hello, there!" /> 출력 Hello, Kunner! Have a nice day! ※ 만약 인수로 메시지를 찾을 수 없을 경우 text에 지정된 값 출력
  • 25. 폼 태그 라이브러리 <form: /> 장점 서브밋 하다 오류 발생시 입력한 정보를 그대로 유지시키기 위함 입력 오류가 난 항목에 별도의 오류 메시지를 출력 하기 위함 태그 라이브러리 추가 <% taglib prefix="form" uri="http://springframework.org/tags/form" %> <form:form id="userform" commandName="user" action="/user/add" method=post> <form:label path="name" cssClass="inputText" cssErrorClass="inputTextError">이름: </form:label> <form:input path="name" cssClass="inputForm" cssErrorClass="inputFormError" /> <form:errors path="name" cssClass="inputTextError" /> //path를 지정해 놓으면 해당 입력값에 입력 오류나 바인딩 오류가 있을 때 에러를 표시할 수 있다. //일반적인 상황에서는 cssClass에 선언된 css가 적용되고, 오류상황에서는 cssErrorClass의 css가 적용된다. //<form:errors>는 오류상황에서만 출력되므로 cssClass가 다른 개체의 cssErrorClass와 같은 기능을 한다. <form:label path="point" cssClass="inputText" cssErrorClass="inputTextError">포인트: </form:label> <form:input path="point" cssClass="inputForm" cssErrorClass="inputFormError" /> <form:errors path="point" cssClass="inputTextError" /> //모델에 포맷터를 적용한 경우 해당 포맷팅이 자동으로 처리된다!!! <input type="submit" value=" ok "> // HTML 태그를 혼용해도 상관 없다. </form:form>