Spring MVC (Back End) ... Part 4
2020. 5. 1. 12:30ㆍToday I learned/Online Courses
강의: [edwith 부스트코스] 웹 프로그래밍 챕터 3, 웹 앱 개발: 예약서비스 1/4
학습일: 2020년 4월 30일
9. Spring MVC - BE
Spring MVC 실습 - 웹페이지 1 기능 구현
- 웹 브라우저는 http://localhost:8080/mvcexam/plusform URL로 요청을 보내고,
서버가 웹 브라우저에게 2개의 값을 입력받을 수 있는 입력창과 버튼이 있는 화면을 출력 - 웹 브라우저가 2개의 값을 입력하고 버튼을 클릭하면
http://localhost:8080/mvcexam/plus URL로 서버에게 2개의 입력값이 POST 방식으로 전달됨 - 서버는 2개의 값을 더하고 결과값을 JSP에게 request scope로 전달해 출력
Spring MVC 실습 - Spring MVC 설정
- MVC 설정 클래스 생성
- 설정 파일을 모아놓을 패키지 생성
- 패키지명: kr.or.connect.mvcexam.config
- WebMvcContextConfiguration 클래스 생성
- @EnableWebMvc와 연동시키기 위해 WebMvcConfigurerAdapter 상속
- 클래스 위 @Configuration, @EnableWebMvc, @ComponentScan 입력 (참고: Spring MVC (Back End) ... Part 3 Annotation의 종류별 역할)
- @ComponentScan 뒤 basePackages를 단수 또는 다수로 지정 (다수로 지정할 땐 중괄호 { } 사용)
- 클래스 Override
- addResourceHandlers
- URL 패턴을 '/'로 설정했으므로 요청 전부에 대해서 DispatcherServlet이 실행됨
- 컨트롤러의 URL이 Mapping된 요청뿐 아니라 CSS, img, JavaScript 요청도 함께 들어옴
- ※ 초창기의 처리 방식
- url-pattern을 **.do, **.x 등으로 설정해 실제 수행하고자 하는 작업을 처리
- 기타 HTML, img 요청은 다르게 처리
- 단점: 다소 촌스럽고 URL이 노출됨
- /js/**, /img/**, /css/**로 시작하는 요청의 경우 어플리케이션 루트 경로 내 폴더별로 분류해 처리
- ! 없을 경우 요청을 컨트롤러의 RequestMapping에서 탐색하면서 오류를 일으키게 됨
- URL 패턴을 '/'로 설정했으므로 요청 전부에 대해서 DispatcherServlet이 실행됨
- configureDefaultServletHandling
- 인자로 전달받은 DefaultServletHandlerConfigurer 객체에 enable( ) 메서드 호출
- DefaultServletHandler를 사용할 수 있게 해줌
- Spring의 DefaultServletHttpRequestHandler는 Mapping 정보가 없는 URL 요청을 처리
- WAS의 DefaultServlet에 작업을 넘기고, DefaultServlet은 static한 자원을 읽어서 보여줌
- addViewControllers
- 특정 URL에 대한 처리를 컨트롤러 클래스를 작성하지 않고 Mapping할 수 있도록 해줌
- 위 예시의 경우 '/' 요청이 들어오면 'main' 이름을 가진 View를 보여주게 됨
- View의 이름은 ViewResolver 객체를 활용해 찾음
- getInternalResourceViewResolver()
- InternalResourceViewResolver 객체인 resolver를 생성
- resolver에 prefix와 suffix를 지정
- View의 이름에 prefix와 suffix를 앞뒤로 붙인 이름을 가진 파일을 찾음
- 설정 파일을 모아놓을 패키지 생성
- DispatcherServlet을 FrontServlet으로 설정
- web.xml 수정
- src > main > webapp > WEB-INF
- Java Config 연동 코드 추가 (참고: Spring MVC (Back End) ... Part 3 DispatcherServlet 설정 방법)
- servlet-mapping 태그
- URL 패턴이 '/'인 요청, 즉 모든 요청에 대해 동작
- Servlet 이름이 mvc인 클래스를 servlet 태그에서 탐색
- servlet 태그
- Servlet 이름이 servlet-mapping의 servlet-name인 mvc와 같은 클래스 DispatcherServlet을 실행
- DispatcherServlet 실행 시 설정이 저장된 WebMvcContextConfiguration를 등록
- Bean 공장의 역할을 하는 ApplicationContext인 AnnotationConfigWebApplicationContext 등록
- web.xml 수정
- 설정 적용 여부 테스트하기
- View를 모아놓을 폴더 생성
- src > main > webapp > WEB-INF
- 폴더명: views
- InternalResourceViewResolver가 Prefix로 설정하는 디렉토리와 동일
- JSP 파일 생성
- src > main > webapp > WEB-INF > views
- 파일명: main.jsp
- addViewController에 입력된 View의 이름과 동일
- body 태그 내 테스트 문구 입력
- 프로젝트 실행
- 프로젝트 우클릭 > Run As > Run on Server
- 정상적으로 작동할 경우 body 태그 내 테스트 문구가 출력됨
- ! 기본적으로 생성되는 index.jsp가 남아있는 경우 삭제
- 웹 어플리케이션은 기본적으로 별도의 URL이 없을 경우 index로 시작되는 파일을 찾아 실행
- JSP 파일이 webapp 바로 밑에 노출이 되는 것 또한 바람직하지 않음
- View를 모아놓을 폴더 생성
Spring MVC 실습 - 웹페이지 1 작성
- JSP 파일 2개 생성
- 2개의 값을 입력받을 수 있는 입력창과 버튼이 있는 웹페이지, 2개의 값을 더해 출력하는 웹페이지
- 경로: src > main > webapp > WEB-INF > views
- 파일명: plusform.jsp, plusResult.jsp
- 컨트롤러 생성
- 컨트롤러 파일을 모아놓을 패키지 생성
- 패키지명: kr.or.connect.mvcexam.controller
- PlusController 클래스 생성
- 클래스 위 @Controller 입력
- 요청에 대응할 메서드 2개 생성
- plusform( ) 메서드
- GET 방식 plusform 요청에 대응
- View에 대한 정보를 반환
- String 타입의 View 이름 또는 ModelAndView 객체
- ※ InternalResourceViewResolver가 반환된 View 이름에 Prefix, Suffix를 붙여 파일을 찾아 보여줌
- plus( ) 메서드
- POST 방식 plus 요청에 대응
- 인자에 @RequestParam을 붙여 지정한 name을 가진 매개변수의 값을 변수로 저장할 수 있음
- Spring이 제공하는 ModelMap 객체를 활용
- addAttribute( ) 메서드로 데이터를 입력하면 Spring이 request scope에 mapping함
- ! HttpServletRequest를 선언한 뒤 setAttribute( ) 메서드로 직접 데이터를 넣을 수도 있으나,
웹에 종속되는 것을 피하기 위해 Spring이 제공하는 객체를 사용
- View에 대한 정보를 반환
- plusform( ) 메서드
- 컨트롤러 파일을 모아놓을 패키지 생성
- ※ Spring MVC가 지원하는 항목들
- Controller 메서드의 인수 타입
- javax.servlet.ServletRequest
- javax.servlet.http.HttpServletRequest
- org.springframework.web.multipart.MultipartRequest
- org.springframework.web.multipart.MultipartHttpServletRequest
- javax.servlet.ServletResponse
- javax.servlet.http.HttpServletResponse
- javax.servlet.http.HttpSession
- org.springframework.web.context.request.WebRequest
- org.springframework.web.context.request.NativeWebRequest
- java.util.Locale
- java.io.InputStream
- java.io.Reader
- java.io.OutputStream
- java.io.Writer
- javax.security.Principal
- java.util.Map
- org.springframework.ui.Model
- org.springframework.ui.ModelMap
- org.springframework.web.multipart.MultipartFile
- javax.servlet.http.Part
- org.springframework.web.servlet.mvc.support.RedirectAttributes
- org.springframework.validation.Errors
- org.springframework.validation.BindingResult
- org.springframework.web.bind.support.SessionStatus
- org.springframework.web.util.UriComponentsBuilder
- org.springframework.http.HttpEntity<?>
- Command 또는 Form 객체
- 컨트롤러 메서드에 해당 타입을 선언해주기만 하면 위 타입을 사용할 수 있음
- 메서드 인수 Annotation
- @RequestParam
- Mapping된 메서드의 인자에 붙일 수 있는 Annotation
- name은 HTTP 매개변수의 name과 mapping되고, required로 필수 여부를 결정
- @RequestHeader
- 요청 정보의 헤더 정보를 읽어들일 때 사용
- @RequestHeader(name="헤더명") String 변수명
- @RequestBody
- @RequestPart
- @ModelAttribute
- @PathVariable
- @RequestMapping의 path에 변수명을 입력받기 위한 placeholder가 필요
- name이 placeholder의 이름과 같으면 mapping되고, required 속성의 기본값은 true
- @CookieValue
- @RequestParam
- 메서드 반환 값
- org.springframework.web.servlet.ModelAndView
- org.springframework.ui.Model
- java.util.Map
- org.springframework.ui.ModelMap
- org.springframework.web.servlet.View
- java.lang.String
- java.lang.Void
- org.springframework.http.HttpEntity<?>
- org.springfrmaework.http.ResponseEntity<?>
- 기타 반환 타입
- Controller 메서드의 인수 타입
- 웹페이지 1 테스트하기
- 프로젝트 실행
- 프로젝트 우클릭 > Run As > Run on Server
- 입력창에 두 값을 넣고 '확인' 클릭
- 정상적으로 작동할 경우 두 값의 합계가 출력
- ! EL 표기법을 인식하지 못할 경우 web.xml 파일 수정
- <!DOCTYPE ...> 부분을 <!DOCTYPE html>로 수정
- Servers 탭 > mvcexam 우클릭 > remove
- 프로젝트 우클릭 > Maven > Update Project
- 프로젝트 실행
Spring MVC 실습 - 웹페이지 2 기능 구현
- 웹 브라우저는 http://localhost:8080/mvcexam/userform URL로 요청을 보내고,
서버가 웹 브라우저에게 이름, e-mail, 나이를 입력받을 수 있는 입력창과 버튼이 있는 화면을 출력 - 웹 브라우저가 3개의 값을 입력하고 버튼을 클릭하면
http://localhost:8080/mvcexam/regist URL로 서버에게 3개의 입력값이 POST 방식으로 전달됨 - 서버는 전달받은 3개의 값을 콘솔 화면에 출력
Spring MVC 실습 - 웹페이지 2 작성
- JSP 파일 2개 생성
- 3개의 값을 입력받을 수 있는 입력창과 버튼이 있는 웹페이지, 등록 결과를 알려주는 웹페이지
- 경로: src > main > webapp > WEB-INF > views
- 파일명: userform.jsp, regist.jsp
- 데이터 객체인 DTO를 모아놓을 패키지 생성
- 패키지명: kr.or.connect.mvcexam.dto
- User DTO 클래스 생성
- 데이터 변수들을 선언
- getter, setter 메서드 Override
- 조회 시 편의를 위해 toString( ) 메서드 Override
- 컨트롤러 생성
- PlusController 클래스 생성
- 클래스 위 @Controller 입력
- 요청에 대응할 메서드 2개 생성
- userform( ) 메서드
- GET 방식 userform 요청에 대응
- View에 대한 정보를 반환
- regist( ) 메서드
- POST 방식 regist 요청에 대응
- 메서드의 인자에 @ModelAttribute를 붙여 사용
- 일일이 @RequestParam을 붙일 필요 없이, DTO 하나만 선언해서 사용할 수 있음
- Spring이 path의 값 중 DTO에 선언된 name을 가진 값을 자동으로 인식하고 꺼내옴
- DTO 객체를 생성하고 꺼내온 값을 저장
- View에 대한 정보를 반환
- userform( ) 메서드
- PlusController 클래스 생성
- 웹페이지 2 테스트하기
- 프로젝트 실행
- 프로젝트 우클릭 > Run As > Run on Server
- 입력창에 세 값을 넣고 '확인' 클릭
- 정상적으로 작동할 경우 세 값이 콘솔에 출력되고, regist.jsp가 표시됨
- 프로젝트 실행
Spring MVC 실습 - 웹페이지 3 기능 구현
- 웹 브라우저는 http://localhost:8080/mvcexam/goods/{id} URL로 요청을 보냄
- 이렇게 넘겨지는 값을 PathVariable이라고 함
- 서버는 id와 사용자의 브라우저 정보를 콘솔에 출력
- 서버는 HttpServletRequest를 이용해 사용자가 요청한 PATH 정보를 콘솔에 출력
Spring MVC 실습 - 웹페이지 3 작성
- JSP 파일 생성
- URL의 id, 사용자의 브라우저, 사용자가 요청한 path를 알려주는 웹페이지
- 경로: src > main > webapp > WEB-INF > views
- 파일명: goodsById.jsp
- 컨트롤러 생성
- GoodsController 클래스 생성
- 클래스 위 @Controller 입력
- 요청에 대응할 메서드 생성
- getGoodsById( ) 메서드
- GET 방식 goods/{id} 요청에 대응
- 인자에 @PathVariable을 붙여 URL 요청의 뒤에 붙은 값을 변수로 지정할 수 있음
- 인자에 @RequestHeader를 붙여 헤더의 정보를 꺼내 변수로 지정할 수 있음
- View에 대한 정보를 반환
- getGoodsById( ) 메서드
- GoodsController 클래스 생성
- 웹페이지 3 테스트하기
- 프로젝트 실행
- 프로젝트 우클릭 > Run As > Run on Server
- 주소창에 goods/{id}를 넣고 이동
- 정상적으로 작동할 경우 goodsById.jsp에 id, 브라우저, path가 표시됨
- 프로젝트 실행
※ Spring MVC를 이용한 개발과 Servlet을 이용한 개발의 장단점
- Spring MVC 개발
- 장점
- 개발에 필요한 구조를 이미 코드로 만들어 놓아 필요한 부분만 조립하는 형태로 개발이 가능
- 회사는 일정한 품질을 얻을 수 있고 개발자는 개발 시간을 단축할 수 있음
- 단점
- 프레임워크의 각종 규칙을 익혀야 하므로 초기 학습 시간이 소요됨
- 참고자료: 스프링 프레임워크(Spring Framework)에 대한 간단한 소개
- 장점
- Servlet 개발
- 장점
- 개발이 쉽고 빠름
- 단점
- 유지보수나 협업에서 개발자 간 의견교환이 어려울 수 있음
- 장점
'Today I learned > Online Courses' 카테고리의 다른 글
Layered Architecture (Back End) ... 실습 전 준비 (0) | 2020.05.02 |
---|---|
Layered Architecture (Back End) ... 이론 (0) | 2020.05.01 |
Spring MVC (Back End) ... Part 3 (0) | 2020.04.30 |
Spring MVC (Back End) ... Part 2 (0) | 2020.04.22 |
Spring MVC (Back End) ... Part 1 (0) | 2020.04.22 |