Spring.07_Spring MVC

이혜민·2024년 9월 3일

spring

목록 보기
8/18

MVC Architecture

⭐컨트롤러(Controller) : 클라이언트의 모든 요청을 받아 URL 주소를 분석하여 필요한 요청 처리하고 클래스(Model)의 메소드를 호출해 클라이언트의 요청을 처리하고 JSP(View)로 스레드를 이동하여 응답 처리되도록 프로그램의 흐름을 제어하는 기능 제공 - Servlet으로 구현

1. DispatcherServlet(컨트롤러) : 컨트롤러 기능을 제공하기 위한 서블릿 클래스 → [web.xml] 파일에서 클래스를 서블릿으로 등록하고 클라이언트의 모든 요청을 받아 처리할 수 있도록 URL 패턴을 등록 처리

  • web.xml 파일에 등록

2. HandlerMapping : 클라이언트의 요청정보(Command)로 요청 처리 클래스(Model)의 객체를 제공하기 위한 클래스, 미리 만들어서 저장


➡️설명 : 마지막에 Map 객체에서 command(key)에 해당하는 값(value)을 반환

3. Controller 인터페이스 : 모든 요청 처리 클래스(Model)가 반드시 상속받아야 되는 인터페이스 → 모든 요청 처리 클래스의 메소드가 동일하게 작성되도록 인터페이스로 메소드 작성 규칙 제공

4. Member : DTO 클래스(@AllArgsConstructor : 생성자, @Data : Setter, Getter 메소드 어노테이션 사용)

⭐모델(Model) : 클라이언트의 요청을 처리하기 위한 기능의 클래스 - 요청 처리 클래스

5.ListController(Controller 인터페이스 상속) : 클라이언트가 [/list.itwill]의 URL 주소로 요청한 경우 컨트롤러에 의해 클래스의 요청 처리 메소드를 호출하여 클라이언트의 요청 처리 클래스

6. ViewController(Controller 인터페이스 상속) : 클라이언트가 [/view.itwill]의 URL 주소로 요청한 경우 컨트롤러에 의해 클래스의 요청 처리 메소드를 호출하여 클라이언트의 요청 처리 클래스

7. ViewResolver : 응답 처리를 위한 뷰정보를 제공하기 위한 클래스 → 매개변수로 전달받은 뷰이름으로 응답 처리할 JSP 문서의 컨텍스트 경로를 생성하여 반환하는 메소드 → 클라이언트는 JSP로 요청하면 안돼서 WEB-INF 폴더 밑에 생성해 은닉화 처리

8. member_list.jsp

9. member_view.jsp

➡️설명 : 컨트롤러에서 클라이언트의 요청 정보(Command)를 받아 HandlerMapping 객체를 만들어 Map 객체의 String(key)값에 대한 Controller(Value)값을 가져와 반환
➡️설명 : 컨트롤러에서 viewName을 반환받아 ViewResolver 객체를 만들어 메소드를 호출해 매개변수로 viewName 저장. 저장된 클라이언트 요청 정보를 포워드 방식으로 이동

➡️*.itwill 확장자로 클라이언트가 요청을 하면 와스에 의해 객체가 생성될 거고 컨트롤러의 service라는 메소드가 호출된다. 요청정보(URL 주소)를 반환받아 저장. 요청 처리 클래스를 객체로 만들어서 그 요청 처리 객체로 클라이언트에게 응답. 모델 역할을 하는 요청 처리 클래스(인터페이스 상속)를 생성. 요청 처리 클래스가 상속받아야하는 인터페이스를 무조건 생성.
⭐오버라이드에 의한 다형성

Spring MVC

< 수업 순서 - 2024.08.29 >

⭐요청처리 클래스와 JSP만 만들어주면 끝

1. web.xml 파일에 DispatcherServlet을 Front Controller 등록

  • DispatcherServlet : Spring Framework의 핵심 구성 요소 중 하나로, Spring MVC(Model-View-Controller) 아키텍처에서 웹 요청을 처리하고 응답을 생성하는 역할을 담당하는 프론트 컨트롤러(front controller)

2. mvc-context1.xml

  • Controller 인터페이스를 상속받은 자식클래스(요청 처리 클래스)를 Spring Bean으로 등록

3. mvc-context2.xml

4. Product : DTO 클래스 - 필드 생성

5. ListController : 클라이언트가 [/list.do]의 URL 주소로 요청한 경우 컨트롤러에 의해 클래스의 요청 처리 메소드를 호출하여 클라이언트의 요청 처리

➡️설명 : ModelAndView 객체를 생성하여 처리결과(productList)와 뷰이름을 저장하여 반환

6. viewController : 클라이언트가 [/view.do] 요청시 요청 처리

7. product_list.jsp : 뷰 제공

8. product_view.jsp : 뷰 제공

  • list.do, view.do로 요청했을 시 출력되는 페이지

⭐어노테이션을 사용해 Spring Bean 등록⭐

➡️Spring MVC 처리 흐름 설명⭐
1. 클라이언트의 요청이 DispatcherServlet(Front Controller)에게 전달
2. Front Controller가 HandlerMapping을 이용해 어떤 컨트롤러가 요청을 처리해야하는지 결정(요청 URL 정보를 바탕으로 매핑 처리)
3. 매핑된 결과에 따라 해당 컨트롤러 호출. 컨트롤러는 요청을 처리하고 결과는 ModelAndView 객체로 반환
4. Front Controller는 컨트롤러로부터 ModelAndView를 받아 요청 처리 결과에 따라 어떤 뷰를 렌더링할지 결정
5. F·C는 ViewResolver를 사용하여 뷰 이름을 실제 뷰로 변환.
6. 최종적으로 F·C는 결정된 뷰를 렌더링하고 응답을 클라이언트에게 반환.

9. servlet-context.xml 수정

  • 스프링 프레임워크는 전부 어노테이션을 사용

➡️설명 : context:component-scan 엘리먼트에 controller 패키지를 등록하여 패키지 내에 @Controller 어노테이션을 작성한 모든 클래스를 Spring 컨테이너가 관리하는 Spring Bean으로 등록

10. HelloController 클래스 : 어노테이션을 사용해 Spring Bean 등록

  • @Controller : 요청 처리 클래스(Controller 클래스)를 Spring Bean으로 등록하기 위한 어노테이션

  • @RequestMapping : Controller 클래스의 메소드를 요청 처리 메소드로 설정하기 위한 어노테이션

    • value 속성 : 클라이언트의 요청정보(Command - URL 주소)로 설정하여 설정된 URL 주소로 요청한 경우 요청 처리 메소드를 호출하여 명령 실행

      → URL 주소 "/hello" 요청
      → 출력

  • ModelAndView 객체 : 요청에 대한 처리결과와 뷰이름을 저장하기 위한 객체

11. hello.jsp : /hello 요청시 실행되는 jsp

12. ResultController : 요청 처리 메소드의 명령으로 생성된 결과값을 뷰(JSP)에게 제공하는 방법

    1. ModelAndView 객체로 addObject() 메소드 호출하여 결과값을 속성값으로 저장하여 제공 - /resultMav 주소로 요청시 메소드 호출
    • ➡️설명 : ModelAndView 객체를 new 연산자를 이용해 만들지 않고 요청 처리 메소드의 매개변수로 작성, setViewName() 메소드로 요청 처리시 제공될 뷰이름(ViewName) 변경, addObject() 메소드로 전달값 추가하여 modelAndView 객체를 반환하는 요청 처리 메소드
    1. HttpServletRequest 객체로 setAttribute() 메소드를 호출해 결과값을 속성값으로 저장하여 제공 - /resultRequest 주소로 요청시 메소드 호출
    • ➡️설명 : HttpServletRequest 객체를 요청 처리 메소드의 매개변수로 작성하여 메소드의 실행결과를 속성값으로 저장(Request Scope), setAttribute() 메소드로 전달값 추가하고 뷰이름을 반환하는 메소드
    1. Model 객체로 addAttribute() 메소드를 호출해 결과값을 속성값으로 저장하여 제공 - /resultModel 주소로 요청시 메소드 호출
    • Model 객체 : 요청 처리 메소드의 처리 결과값을 뷰에게 제공하기 위한 객체
    • ➡️설명 : Model 객체를 요청 처리 메소드의 매개변수로 작성하여 addAttribute() 메소드를 호출하여 전달값을 속성값으로 저장하고 뷰이름을 반환하는 메소드

13. result_display.jsp

  • 해당 요청 처리 메소드에 따라 출력페이지에서 전달값이 표기

14. ModelController

  • @ModelAttribute : 값(객체)를 뷰에게 제공하기 위한 어노테이션, 요청 처리 클래스의 메소드에 @ModelAttribute 어노테이션을 사용하면 메소드 반환값을 현재 Controller 클래스에 작성된 모든 요청 처리 메소드의 뷰에게 제공
    • ➡️설명 : getNow() 메소드에 @ModelAttribute 어노테이션이 사용되어 @Controller 어노테이션이 사용된 ModelController 클래스의 모든 요청 처리 메소드의 뷰에게 제공된다. 즉 model_display1, model_display2, model_display3 뷰(JSP)에 getNow() 메소드의 반환값 제공

15. model_display1.jsp : 전달된 이름과 시간(now) 출력

16. model_display2.jsp : 전달된 이름과 시간(now) 출력

17. model_display3.jsp : 전달된 이름과 시간(now) 출력

18. MethodController : 사용자로부터 값을 입력받고 출력할 수 있는 메소드 각각 1개씩 작성

  • 사용자로부터 값을 입력받기 위한 JSP 문서의 뷰이름을 반환하는 요청 처리 메소드
    • method 속성 : RequestMethod의 상수필드로 클라이언트의 요청방식을 제공(GET, POST 등)
    • ➡️설명 : 클라이언트가 /method URL을 GET 방식으로 요청했을 때 method_input2 뷰 반환
  • 전달값을 반환받아 Request Scope 속성값으로 저장하고 속성값을 제공받아 출력할 수 있는 JSP 문서의 뷰이름을 반환하는 메소드
    • ➡️설명 : request 객체에 전달값(입력 JSP에서 작성한 값)을 반환받아 Request Scope 속성값으로 저장하고 JSP 문서의 뷰이름을 반환하여 입력값 출력

    • /method URL GET방식으로 요청하면 입력페이지나오고 이름 입력하고 제출하면 출력페이지로 값 전달되어 출력됨

19. method_input1.jsp : 입력페이지

20. method_output.jsp : 출력페이지

21. method_input2.jsp : 입력페이지

22. ParamController

23. param_food.jsp

24. param_display.jsp

25. web.xml : Filter 엘리먼트 등록

  • filter : 클래스를 필터로 등록하여 클라이언트의 요청을 처리하기 전 또는 후에 특정 작업을 수행하는 기능 제공
    • CharacterEncodingFilter 클래스를 필터로 등록하고 클라이언트의 모든 요청에 대해 필터가 실행되도록 설정

< 수업 순서 - 2024.08.30 >

1. ParamController(수정)

  • @RequsetParam 어노테이션(권장) : 전달값을 제공받아 매개변수에 저장하기 위한 어노테이션 / 전달값의 이름과 매개변수의 이름이 같지 않으면 400 에러 발생
    • required 속성(false 또는 true - 기본값) : false 일 땐 전달값이 없을 때 400 에러 코드 미발생, true 일 땐 전달값이 없을 때 400 에러 코드 발생
    • value 속성 : 전달값의 이름을 속성값으로 설정 - 전달값의 이름과 매개변수의 이름을 다르게 하고 value 속성값을 전달값의 이름과 같게 설정하면 올바른 출력(굳이 쓸 필요없음)
    • defaultValue 속성(Paging 처리 시 사용) : 매개변수에 저장될 기본값을 속성값으로 설정 - 매개변수의 이름과 같은 이름으로 전달되는 값이 없거나 같은 이름으로 전달되는 값이 비어있는 경우 매개변수에 저장될 기본값 설정
    • 같은 이름으로 전달되는 값이 여러개인 경우 매개변수를 String 배열 또는 List 인터페이스(권장)로 작성해 차례대로 제공받아 매개변수에 저장하여 사용

2. paramValue_form.jsp : 입력페이지(취미 체크박스, name 속성값이 hobby라는 이름으로 동일) - 0개 이상 다중 선택 가능

3. paramValue_display.jsp : 출력페이지 - forEach 태그 사용하여 hobbyList 출력(varStatus 속성 중요⭐)

4. JoinController : 전달값을 하나씩 가져오는 법, 통째로 가져오는 법(DTO 클래스, Map 객체)

  • @ModelAttribute : 값(객체)을 뷰에게 제공하기 위한 어노테이션 - 매개변수에 사용하면 매개변수에 저장된 전달값을 요청 처리 메소드의 뷰이름으로 생성된 뷰에게 제공

  • Command 객체(DTO 객체) : 전달값이 필드에 저장된 객체로 매개변수에 저장되고 매개변수에 저장된 객체를 뷰에서 사용할 수 있도록 제공하는 객체(한꺼번에 전달)

  • 전달값이 여러개인 경우 전달값을 DTO 객체로 전달 받아 @ModelAttribute 어노테이션에 의해 뷰(JSP)에 값 전달

  • 하나씩 전달값을 가져오기보다 DTO 객체로 한번에 제공받아 저장(전달값의 이름과 필드명이 동일시 적용 - value 속성 생략 가능)

  • Map 객체를 이용하면 DTO 클래스를 생성하지 않아도 되어 Map 객체를 생성하여 전달값을 제공받는 것을 권장 - @RequestParam 어노테이션 반드시 작성

  • ⭐입력페이지와 액션페이지의 요청 주소는 같게 하지만 보내는 방식은 GET 방식, POST 방식으로 작성

5. join_form.jsp : 입력페이지

6. join_display.jsp : 출력페이지

7. Member(DTO 클래스) : 전달값을 매개변수에 저장하기 위해 사용 가능 - 전달값의 이름과 같은 이름으로 필드 작성

8. LoginController : 회원정보를 전달받아 뷰에게 제공

  • Session Scope : 권한 관련 정보 저장(인증) - 바인딩된 session 객체가 저장된 HttpSession 객체 생성

9. login_form.jsp : 입력페이지

10. login_display.jsp : 출력페이지

11. logout_display.jsp : 출력페이지

12. SessionController

  • @SessionAttributes : 요청 처리 메소드에서 Model 객체를 사용해 저장된 속성값을 @SessionAttributes 어노테이션을 사용한 Controller 클래스의 모든 요청 처리 메소드와 뷰에게 제공하기 위한 어노테이션

13. Hewon 클래스 : @Data, @Builder 어노테이션 사용

14. hewon_view.jsp : 회원이라는 객체의 정보를 출력

15. hewon_update.jsp : 정보를 입력태그의 초기값으로 출력

16. hewon_result.jsp : 변경된 회원 정보를 출력

< 수업 순서 - 2024.09.02 >

1. RedirectController

  • 웹프로그램에서 페이지를 이동시키는 방법

    1. 포워드 이동 : 클라이언트 요청에 의해 실행된 웹프로그램(View - JSP)으로 스레드를 이동하여 응답 처리(서버에서 스레드 이동)
    • ➡️설명 : 클라이언트의 forward_move 요청에 의해 모델 객체에 name이라는 이름으로 "홍길동"이라는 속성값을 저장하고 URL 주소를 문자열로 반환하여 JSP(display_forward)로 스레드를 포워드 이동하여 응답처리
    1. 리다이렉트 이동 : 클라이언트에게 URL 주소를 전달하여 새로운 페이지를 요청해 실행결과를 응답받아 처리
    • 스레드가 이동돼서 실행되는 것이 아니라 Request Scope 속성값을 요청 페이지의 요청 처리 메소드 및 뷰에서 사용 불가능 - 해결 : RedirectAttributes 객체 사용

    • RedirectAttributes 객체 : 리다이렉트 이동되는 페이지의 요청 처리 메소드와 뷰에게 Request Scope 속성값을 제공하기 위한 객체

    • RedirectAttributes 객체의 addFlashAttribute() 메소드를 이용하여 실행결과를 Request Scope 속성값으로 저장해 리다이렉트 이동되는 페이지의 요청 처리 메소드와 뷰에게 제공(Model 객체의 한계 해결)

    • ➡️설명 : 클라이언트가 redirect라고 요청하면 RedirectAttributes 객체에 저장된 Request Scope 속성값이 실행결과로 리다이렉트 이동되는 페이지의 요청 처리 메소드와 뷰에게 제공되어 display_redirect 뷰 반환

2. display_forward.jsp : 포워드 방식으로 요청하여 출력하는 페이지

3. display_redirect.jsp : 리다이렉트 방식으로 요청하여 출력하는 페이지

4. ResourceController

5. resource_display.jsp(이해 안됨)

  • 리소스 파일(Resource File) : 클라이언트에서 HTML 문서를 해석하여 실행하기 위해 필요한 정보를 제공하기 위해 서버에 저장된 파일(웹자원) - CSS 파일, JavaScript 파일, 멀티미디어 파일(그림, 소리, 동영상 파일) 등

  • 웹자원의 경로는 반드시 절대경로로 표현하여 요청

      1. EL 표현식에 pageContext 내장객체를 사용해 컨텍스트 폴더의 경로를 제공받아 URL 주소 작성
      1. core 태그 라이브러리의 url 태그를 사용해 웹자원의 URL 주소를 제공받아 사용

      1. spring 태그 라이브러리의 url 태그를 사용해 웹자원의 URL 주소를 제공받아 사용

6. servlet-context.xml

  • ➡️설명 : web.xml 파일에 모든 웹자원을 요청했을 때 Front Controller가 요청 처리 메소드를 호출하여 뷰로 응답 처리하도록 설정되어 있음. 리소스파일 역시 Front Controller가 처리. 리소스 파일의 URL 주소에 대한 요청 처리 메소드가 없어서 404 에러 발생. 해결 : 직접 응답 처리되도록 servlet-context 파일에 resources 엘리먼트를 사용해 환경 설정

  • resources 엘리먼트 : 클라이언트 요청시 Front Controller가 요청 처리 메소드를 호출하여 뷰로 응답하지 않고 직접 응답 처리되도록 설정하는 엘리먼트 - 클라이언트가 리소스 파일을 요청한 경우 응답 처리하기 위해 사용

    • mapping 속성 : 클라이언트 요청에 의해 직접 응답하기 위한 URL 패턴
    • location 속성 : 웹자원의 파일을 검색하기 위한 폴더

⭐TilesView - ViewResolver⭐

  • 머릿부, 몸체부, 꼬릿부를 나눠서 작성한 뒤 몸체부만 바꿔서 프로그램 작성 방식

7. TilesController

  • TilesView 클래스 : 요청 처리 메소드의 반환값(뷰이름)을 제공받아 다수의 JSP 문서가 결합된 뷰(View)로 응답하기 위한 기능을 제공하는 ViewResolver 클래스

    1. TilesView 관련 라이브러리(tiles-extras 라이브러리)를 프로젝트에 빌드 처리 - 메이븐 이용

  • 원래는 다 등록해줘야 하는데 tiles-extras 하나만 빌드 처리하면 자동으로 다 등록된다.

  • spring/pom.xml에 빌드 처리

  • 빌드 처리 완료

    1. 요청 처리 메소드의 반환값을 제공받아 응답할 JSP 문서 설정하기 위해 TilesView 클래스가 제공받아 사용하기 위한 환경설정파일 작성 - tiles.xml

8. tiles.xml

    1. 환경설정파일 작성 - tiles.xml
    • DOCTYPE 생성(dtd파일 제공받아 작성)
    • tiles-definitions 엘리먼트에 definition 엘리먼트 작성 : 요청 처리 메소드의 반환값(ViewName)으로 응답 처리될 템플릿 기능의 JSP 문서를 제공하기 위한 엘리먼트
      • name 속성 : 요청 처리 메소드의 반환값과 같은 name 속성값의 definition 엘리먼트로 응답 처리
      • template 속성 : definition 엘리먼트로 응답할 템플릿 기능의 JSP 문서 경로 작성
  • put-attribute 엘리먼트 :

9. template.jsp

  • insertAttribute 태그 : TilesView 기능을 제공하는 환경설정파일에서 put-attribute

10. header.jsp

11. main.jsp

12. footer.jsp

13. servlet-context.xml : Spring bean(UrlBasedViewResolver 클래스, TilesConfigurer 클래스) 등록

  • UrlBasedViewResolver 객체 : 요청 처리 메소드의 반환값을 Spring 프레임워크에서 제공하는 ViewResolver 객체를 사용하지 않고 ViewResolver 기능의 클래스를 사용해 응답 처리하는 기능을 제공하기 위한 ViewResolver 객체 - 인터널 어쩌꾸보다 우선순위가 높아야함

  • property 엘리먼트를 사용해 name 속성에 식별자를 작성하여 value 값을 객체처럼 사용

  • TilesConfigurer 객체 : 요청 처리 메소드의 반환값(ViewName)으로 응답 처리하기 위한 정보가 저장된 환경설정파일을 제공하기 위한 객체me)으로 응답 처리하기 위한 정보가 저장된 환경설정파일을 제공하기 위한 객체

< 수업 순서 - 2024.09.03 >

⭐Spring Validation : Server 측에서 검증해주는 기능⭐

  • form태그를 다르게 작성해야함. Spring form 태그 사용
  • html form 태그와의 차이점 : modelAttribute 속성을 반드시 작성

1. ValidController : 서버측에서 전달값을 검증하게 하는 Controller 작성

  • Command에 저장된 필드값을 받아서 백엔드에서도 검증해주는것을 권장 BUT if문이 너무 길어져서 좋은 코드가 아님

  • 그래서 사용하는 것이 Spring Data Validation 기능 사용

  • @RequestMapping 어노테이션을 클래스에 작성하면 Controller 클래스의 모든 요청 처리 메소드에 매핑된 요청 URL 주소 앞부분에 공통에 공통적으로 사용될 URL 주소 제공

  • ➡️설명 : 클래스에 @RequestMapping 어노테이션을 사용하면 메소드 안에 각각의 @RequestMapping 어노테이션 value 속성값에 공통된 URL을 빼도 된다. → 유지보수의 효율성 증가

⬇️ Spring Validation 기능을 사용해 요청 처리 메소드의 매개변수에 저장된 Command 객체의 필드값(전달값) 검증하는 방법

    1. validation-api 라이브러리와 hibernate-validator 라이브러리를 프로젝트에 빌드 처리
    • validation-api 라이브러리

    • 자카르타 버전은 jdk-17버전용

    • hibernate-validator 라이브러리 - 검증할 수 있는 어노테이션이 더 많음(검증 데이터 확장)

    • pom.xml 에 빌드 처리

    • @Valid 어노테이션은 모든 필드를 검증(전체 검증)

    • @Validated 어노테이션은 내가 원하는 필드만 검증(선택 검증)

    1. HTML 태그 대신 Spring 태그를 사용해 JSP 문서 작성 - 에러메세지를 전달받아 출력 처리(spring_form.jsp)
    1. 요청 처리 메소드에서 Command 객체가 저장된 매개변수에 @Valid 어노테이션을 사용해 Command 객체의 필드에 저장된 전달값을 검증 처리되도록 설정
    • @Valid 어노테이션 : Command 객체의 모든 필드값을 검증하는 어노테이션
    • Arrays.asList(Object ... args) : 매개변수로 전달받은 값(객체)가 요소값으로 저장된 List 객체를 생성하여 반환하는 정적메소드
    • Errors 객체 : 전달값에 대한 검증 실패시 발생되는 모든 에러 관련 정보를 저장한 객체
    • ➡️설명 : 클라이언트가 /valid/spring URL GET방식으로 요청하면 valid/spring_form으로 이동하고 JSP에서 정보를 입력한 뒤 등록하면 Commad(employee) 객체에 저장된 전달값을 검증. 에러가 발생한다면 spring_form으로 이동. 아니라면 result로 이동. @ModelAttribute 어노테이션을 이용해 genderList 메소드의 반환값을 모든 뷰에게 제공

2. html.jsp : 클라이언트 측 입력값 검증 작성(JavaScript 라이브러리인 Jquery 이용) - HTML 태그 사용

  • 폼태그를 사용해 사용자로부터 값을 입력받아 전달
  • context root 폴더가 포함돼있는 url 주소로 변경하여 url이라는 속성명으로 저장하여 el을 사용하여 폼태그로 페이지 이동

3. Employee(DTO 클래스) : Command 객체, 필드에다 검증할 수 있는 여러가지 어노테이션 사용 가능 - 필드값 검증

  • @NotNull : 전달값이 [null]인 경우 에러를 발생하는 어노테이션
  • @NotBlank : 전달값이 [null]이거나 전달값에 공백이 있는 경우 에러를 발생하는 어노테이션
  • @NotEmpty : 전달값이 [null]이거나 비어있는(NullString) 경우 에러를 발생하는 어노테이션
    • message 속성 : 뷰에게 제공될 에러메세지(생략시 기본메세지 제공)
  • @Pattern : 전달값의 문자패턴을 비교해 에러를 발생하는 어노테이션
    • regexp 속성 : 전달값을 비교하기 위한 정규표현식
  • @Max, Min :

4. result.jsp : 전달받은 속성값 출력

5. spring_form.jsp : 에러메세지를 좀 더 손쉽게 전달할 수 있음

  • 태그 라이브러리 추가

  • Spring form 태그 : 페이지를 요청하여 입력값을 전달하는 태그

    • modelAttribute 속성(필수) : 요청 처리 메소드의 매개변수에 저장된 Command 객체의 속성명을 속성값으로 설정
    • 전달값에 대한 검증 실패시 전달값이 저장된 Command 객체를 속성값으로 제공받아 입력태그의 입력값 및 에러메세지 출력시 사용
    • ➡️설명 : 제출 시 action 속성에 값으로 입력되는 url 주소를 core 태그의 url을 등록한 뒤 el로 입력하여 유지보수의 효율성 증가
  • Spring input 태그 : 문자열을 입력받아 전달하기 위한 태그

    • path 속성 : 입력값을 전달하기 위한 이름
    • ➡️설명 : result.jsp에 입력값을 전달할 때 modelAttribute 속성의 Command 객체인 employee와 path 속성의 id가 결합되어 employee.id가 value 값이 되어 출력
  • Spring errors 태그 : 요청 처리 메소드로부터 제공받은 에러메세지를 출력하기 위한 태그

    • path 속성 : 에러메세지를 제공받아 출력하기 위한 식별자(전달값의 이름)
    • cssClass 속성 : CSS 스타일의 클래스 선택자
    • element 속성 : 에러메세지를 출력하기 위한 태그의 이름
    • delimiter 속성 : 다수의 에러메세지가 전달된 경우 에러메세지를 구분하기 위한 문자
    • ➡️설명 : span 태그로 에러메세지 출력. 에러메세지가 연달아 두 개 출력된다면 그 사이 문자인 delimiter 속성으로 구분
    • 에러메세지가 에러 객체로 전달되어 id 라는 필드에 의해 만들어진 에러메세지 출력
  • Spring password 태그 : 문자열을 입력받아 전달하기 위한 태그

  • Spring radiobutton 태그 : 나열될 목록 중 하나만 선택하여 값을 전달하기 위한 태그

  • Spring radiobuttons 태그 : 나열될 목록 중 하나만 선택하여 값을 전달하기 위한 태그, 요청 처리 메소드로 제공받은 List 객체의 요소값을 목록으로 사용해 값을 입력받기 위한 태그

  • items 속성 : 목록이 요소값으로 저장된 List 객체

  • ➡️설명 : @ModelAttribute 어노테이션을 사용해 genderList 메소드의 반환값이 모든 뷰에 제공되어 items에 genderList 객체를 속성값으로 설정하고 에러 검증, genderList에 요소값이 있으면 result로 이동. 없으면 spring_form으로 이동

  • ➡️설명 : GET 방식, POST 방식의 메소드가 똑같은 값을 뷰 페이지에 전달하기 때문에 @ModelAttribute 어노테이션을 메소드 위에 사용해 메소드의 반환값을 모든 요청 처리 메소드에 제공

⭐Spring Message - 메세지 관리⭐

6. MessageController

    1. 메세지가 저장된 Properties 파일 생성(label.properties) - [src/main/webapp] 폴더에 생성하는 것을 권장
    1. Spring Bean Configuration File(servlet-context)에 메세지 관리 기능을 제공하는 클래스를 Spring Bean으로 등록하고 메세지가 저장된 Properties 파일의 경로를 필드에 저장되도록 의존성 주입

7. register.jsp

  • core 태그, form 태그, spring 태그 모두 사용
  • message 태그 : MessageSource 객체에 의해 관리되는 메세지를 제공받아 출력하는 태그
    • code 속성 : Properties 파일에 저장된 메세지를 구분하기 위한 식별자
    • spring:message 태그를 이용해 Properties 파일에 저장된 메세지를 불러와 출력

8. Product(DTO 클래스) : 제품코드, 제품이름, 제품수량을 저장하기 위한 필드 작성, 필드에 어노테이션을 사용해 전달값에 대한 검증하도록 작성

9. success.jsp : 출력페이지

  • ➡️설명 : 입력페이지, 출력페이지에 공통적으로 작성되는 문자열을 Properties 파일에 저장하여 spring:message 태그를 이용해 출력해주면 Properties만 수정해주면 되어 유지보수의 효율성이 증가

10. label.properties

  • Product 클래스에 작성된 필드명을 문자열(제품코드, 제품이름, 제품수량)로 저장한 메세지 작성

11. servlet-context.xml

  • MessageSource 인터페이스를 상속받은 클래스(ReloadableResourceBundleMessageSource 클래스로 메세지 관리 기능 제공)를 Spring Bean으로 등록

  • basenames 필드에 List 객체를 생성하여 저장되도록 의존성 주입을 하고 beans:list 엘리먼트를 이용해 List 객체의 요소에 메세지가 저장된 Properties 파일의 경로가 요소값으로 저장되도록 값 주입

< 수업 순서 - 2024.09.04 >

1. label.properties 수정

  • 위와 같이 {정수값}, {정수값}으로 작성하면 success.jsp의 argument 속성에 입력된 값이 순서대로 정수값에 출력된다.

2. success.jsp 수정

  • argument 속성 : Properties 파일에 저장된 메세지에게 전달할 값, 다수의 값을 전달할 경우 [,] 기호 사용

3. error_ko.properties : Properties 파일을 이용해 error 메세지 사용 - Properties 파일이 마지막에 적용되기 때문에 Product 클래스에 @NotEmpty의 message 속성은 무시된다.

4. servlet-context.xml 수정

5. error_en.properties : 영어 사용 지역에서 쓰이는 에러메세지 저장

6. servlet-context.xml 수정

  • SessionLocaleResolver 객체 : Session Scope 속성값으로 Locale 객체를 저장해 해당 지역의 언어로 작성된 메세지를 제공하기 위한 객체 - 지역에 대한 정보를 Session에 저장
  • defaultLocale 필드에 Locale 객체에 저장될 지역이 저장되도록 값 주입

7. MessageController 수정

  • 임의로 요청 처리 메소드에서 지역을 변경해줌

  • 에러메세지 영어로 출력

0개의 댓글