SpringMVC 실습(64 ~ 67일차)
** Spring MVC Project를 위한 데이터베이스 테이블 생성
1. Oracle에 작성
2. MySQL에 작성
** Spring MVC Project 설정
1. Spring MVC Project를 생성
2. 애플리케이션 실행
3. 포트번호를 생략
4. ContextPath를 제거
5. Java, Spring, JUnit, Servlet, JSP 버전을 변경
6. 기본 설정이 끝나면 재실행
7. 여러 명이 하는 프로젝트라면 여기까진 일반적으로 Project Manager가 결정
** 오라클의 데이터를 MyBatis(SQL Mapper : SQL과 프로그래밍 언어의 코드를 분리)를 이용해서 읽어오기
1. pom.xml 파일에 필요한 의존성을 설정
2. 필요한 클래스를 생성
3. 데이터베이스 프레임워크 설정(Oracle + MyBatis)
4. 웹 애플리케이션이 시작할 때 Item 테이블의 전체 데이터를 가져와서 출력하기
5. 상세보기 구현
6. MySQL로 변환
7. Mapper 인터페이스를 이용한 MyBatis 사용
8. Hibernate로 변환
** 프로젝트에서 MyBatis를 XML로 사용하는 형태로 변환 - 데이터베이스는 오라클
1. root-context.xml 파일에서 MySQL의 DataSource를 주석 처리하고 오라클의 DataSource를 주석 해제
2. ItemDAO 클래스에서 하이버네이트 사용하는 부분을 주석처리하고 MyBatis 사용하는 부분으로 변경
3. ItemServiceImpl 클래스에서 MyBatis를 Xxml로 호출하는 형태로 변환
** 다양한 View 출력
1. 파일 다운로드
2. Spring ViewResolver
3. 오늘 출력할 것
** 프로젝트 내의 img 디렉토리의 파일 다운로드 링크 만들기
1. home.jsp 파일에 파일 다운로드 링크 만들기
2. home.css 파일에 스타일 추가
3. ItemService 인터페이스에 img 디렉토리의 파일 목록을 보여주는 메소드를 선언
4. ItemServiceImpl 클래스에 파일 목록을 보여주는 메소드를 구현
5. HomeController 클래스에 클라이언트의 요청이 오면 ServiceImpl 메소드를 호출하는 메소드를 작성
6. views 디렉토리에 fileview.jsp 파일을 만들고 작성
7. 디렉토리에 있는 파일이 이미지 파일이라서 다운로드되지 않고 브라우저에 출력(브라우저가 처리할 수 있으면 다운로드하지 않고 직접 출력하려 함)
** 모든 파일이 다운로드 가능하도록 수정
1. fileview.jsp 파일에서 링크를 수정
2. HomeController 클래스에 download 요청을 처리할 메소드를 생성
3. 다운로드를 처리할 View 클래스 생성 : com.pk.mvc.view.DownloadView
4. servlet-context.xml 파일의 ViewResolver 수정
** Excel 출력
1. excel 출력을 위한 의존성 설정 - pom.xml
2. home.jsp 파일에 엑셀 출력을 위한 요청을 생성
3. HomeController 클래스에 item.xls 요청을 처리하는 메소드를 생성해서 작성
4. Excel로 출력할 수 있는 View 클래스를 생성
5. servlet-context.xml 파일에 Controller에서 리턴한 뷰 이름과 Excel View를 연결해주는 코드를 작성
** PDF 출력
1. 프로젝트 안에 한글을 출력할 수 있는 폰트를 복사
2. pom.xml 파일에 iText API 라이브러리 의존성 설정
3. home.jsp 파일에 pdf 요청을 위한 링크 생성
4. HomeController 클래스에 item.pdf 요청 처리할 메소드를 생성
5. PDF로 출력할 View 클래스를 생성 - AbstractPdfView 클래스로부터 상속
6. servlet-context.xml에 PDF 출력하는 코드 작성
** JSON 출력 - View 이용
1. pom.xml 파일에 jackson-databind 라이브러리 의존성을 설정
2. home.jsp 파일에 위의 요청을 호출하는 Link를 추가
** ajax를 이용한 json 출력
1. Controller에 요청을 처리해주는 메소드를 생성
2. home.jsp 파일에 위의 요청을 처리하는 코드를 작성
** ItemServiceImpl의 allitem 메소드의 결과를 XML로 출력
1. XML 출력을 위한 의존성을 pom.xml에 작성
2. home.jsp 파일에 XML 요청을 생성
3. DTO 클래스를 수정 - Item
4. DTO 클래스의 List를 속성으로 갖는 클래스를 생성
5. HomeController에 xml 요청을 처리하는 메소드를 생성
6. servlet-context.xml 파일에 Controller에서 리턴한 뷰 이름을 XML로 출력하도록 설정
** 예외를 발생시키기
1. home.jsp 파일에 링크 추가
2. HomeController에 exception 요청이 왔을 때 처리할 메소드를 생성
3. exception.jsp 파일을 만들고 작성
4. HomeController에 위의 페이지에서 전송을 눌렀을 때 처리할 메소드를 생성
5. 결과를 출력할 result.jsp 파일을 만들고 내용을 출력
6. 숫작 아닌 데이터나 두 번째 입력란에 0을 대입하면 예외가 발생한다.(이를 이용해 예외 페이지 확인)
** 에러페이지 출력 설정
1. views 디렉토리에 error라는 디렉토리를 생성하고 exception.jsp 파일을 생성한 후 작성
2. HomeController 클래스에 예외가 발생하면 error/exception.jsp 파일을 출력하도록 하는 설정을 추가
** Spring MVC View 설정
** Spring 메시지 출력
** 메시지 출력과 지역화
1. home.jsp 파일에 링크를 추가
2. 메시지를 저장할 파일을 src/main/resources 디렉토리에 message 디렉토리를 만들고 label.properties로 생성
3. 프로퍼티 파일을 사용하기 위한 설정을 servlet-context.xml 파일에 추가
4. HomeController에 validation 요청이 get 방식으로 오면 처리하는 메소드를 생성
5. 메시지를 출력할 validation.jsp 파일을 views 디렉토리에 생성 후 작성
6. 기존에 만든 프로퍼티 파일의 이름을 label_en.properties로 변경
7. label_ko.properties파일을 만들고 동일한 내용 입력
** Spring Form 관련 Custom tag
1. <form:form>
2. <form:input> : input 객체를 생성해 줌
3. <form:password> : password 객체를 생성해 줌
4. <form:hidden> : hidden 객체를 생성해 줌
5. <form:select>
6. <form:checkboxes>, <form:radiobuttons>
7. <form:textarea>
8. <form:errors path = "프로퍼티 이름"> : 프로퍼티 이름으로 만들어진 에러 메시지를 출력
** Spring Form 관련 태그 사용 실습
1. email, password, loginType을 String으로 갖는 DTO 클래스를 생성
2. HomeController에 loginType에 관련된 데이터를 만들어주는 메소드를 생성
3. validation 요청을 처리하는 메소드를 수정
4. validation.jsp 파일을 수정
** 파일 업로드 실습
1. pom.xml 파일에 파일 업로드 라이브러리 의존성을 설정
2. home.jsp 파일에 링크 추가
3. HomeController 클래스에 fileupload 요청이 GET 방식으로 전송됐을 때 처리하는 메소드 작성
4. fileupload.jsp 파일을 views 디렉토리에 생성하고 작성
5. web.xml 파일에 파라미터 인코딩 필터 설정을 확인하고 없으면 추가
6. servlet-context.xml 파일에 MultipartResolver 클래스의 bean을 작성
7. HomeController 클래스에 첫 번째 폼의 전송요청을 처리하는 메소드를 작성
8. HomeController 클래스에 두 번째 폼의 전송요청을 처리하는 메소드를 작성
9. Command 객체를 이용하여 파일 업로드 수행
** Spring MVC Project를 위한 데이터베이스 테이블 생성
- Oracle과 MyBatis 연동 -> Hibernate로 변경 -> MySQL로 변경
1. Oracle에 작성
- 오라클은 테이블 이름과 컬럼 이름을 모두 대문자를 사용 : DTO를 만들지 않고 Map을 이용하려면 중요하다.
2. MySQL에 작성
- MySQL은 테이블 이름이나 컬럼 이름을 소문자로 사용한다.
** Spring MVC Project 설정
1. Spring MVC Projcet를 생성
- 기본 패키지 이름을 3 level 이상으로 설정 - kr.co.pk
- 3번째 패키지 이름이 application의 ContextPath(URL 기본 경로)
2. 애플리케이션 실행
- url - http://localhost:9000/pk/
3. 포트번호를 생략
- server.xml에서 tomcat의 port를 80번으로 변경
4. ContextPath를 제거
- ContextPath를 /로 변경
1) Tomcat 설정을 수정
- [Servers] 탭에서 Tomcat을 더블 클릭
- Modules 탭에서 실행하고자 하는 프로젝트 선택하고 [Edit] 버튼을 누른 후 path를 /로 설정
2) 재실행
3) 다른 컴퓨터의 브라우저에서는 http://IP주소만 입력하면 접속이 된다.
5. Java, Spring, JUnit, Servlet, JSP 버전을 변경
- pom.xml 파일에서 수행
1) Java와 Spring 버전 변경은 properties 태그에서 수행
2) dependencies 태그 안에서 servlet과 jsp의 dependency를 수정
- scope 태그를 남겨두어야 한다.
- scope가 있으면 현재 프로젝트의 라이브러리를 가져가지 않고 실행되는 곳의 라이브러리를 사용
- servlet과 jsp는 java에 있는 것을 사용하는 것이 아니고 WAS의 것을 사용한다.
3) JUnit - dependencies 안에서 수정 : 4.12로 변경, Spring 5.0 이상은 4.12부터 테스트 가능
- scope를 남겨두는데 이 scope는 테스트를 할 때 사용이 되고 배포를 할 때는 삭제가 되는 라이브러리 설정이다.
4) servlet 버전을 변경한 경우 web.xml 파일의 DTD 수정
- 이 작업은 하지 않아도 실행에는 문제가 없지만 이 프로젝트를 다른 환경으로 가져가면 에러가 발생한다.
- 구글에 web.xml 서블릿 버전으로 검색하면 DTD가 검색된다.
6. 기본 설정이 끝나면 재실행
7. 여러 명이 하는 프로젝트라면 여기까지는 일반적으로 Project Manager가 결정
** 오라클의 데이터를 MyBatis(SQL Mapper : SQL과 프로그래밍 언어의 코드를 분리)를 이용해서 읽어오기
- CRUD(Create, Read, Update, Delete)를 위한 프로젝트 구조
- Controller <- Service <- Repository <- MyBatis Session(xml, interface)
- DTO
- Interceptor, AOP Class
- Error Page 설정
1. pom.xml 파일에 필요한 의존성 설정
- oracle, spring-jdbc, mybatis, spring-mybatis : 필수
- Test를 하고자 하면 spring-test : 거의 필수
- DTO 클래스를 편리하게 만들고자 하면 lombok : 최근에 많이 사용
- 데이터베이스 연돌을 할 때 로그를 출력하고자 하면 log4jdbc : 개발할 때만 사용
1) Oracle의 Repository 설정 : Oracle의 경우는 Maven 중앙저장소에 없어서 설정
2) dependencies에 나머지 의존성 설정
3) pom.xml을 수정한 후 저장하고 잠시 기다렸다가 재실행
- 실행이 안되면 라이브러리를 다운로드 받지 못한 것이나 설정 실패
2. 필요한 클래스를 생성
- MyBatis를 xml로 사용
1) DTO 클래스 생성 : com.pk.mvc.item.domain.item
- 자료형과 이름을 정확하게 기재
2) DAO 클래스 생성 : com.pk.mvc.item.dao.ItemDAO
- 사용할 데이터베이스 프레임워크 클래스의 의존성이 설정
3) Service 인터페이스 생성 : com.pk.mvc.item.service.ItemService
4) Service 인터페이스의 내용을 구현할 ServiceImpl 클래스를 생성 : com.pk.mvc.item.service.ItemServiceImpl
- DAO를 주입받는다.
5) Controller 클래스를 생성 : com.pk.mvc.item.controller.ItemController
- Service를 주입받는다.
3. 데이터베이스 프레임워크 설정(Oracle + MyBatis)
1) 데이터베이스 접속 정보를 저장
- root-context.xml 파일에 작성한다.
- 데이터베이스는 모든 서비스에 이용될 가능성이 높기 때문에 root-context.xml 파일에 작성한다.
2) Test 클래스를 만들어서 테스트
- src/test/java 디렉토리에 생성
3) XML을 이용해서 MyBatis를 연동할 때 사용할 매퍼 파일을 생성
- src/resources 디렉토리에 별도의 디렉토리(mappers)를 생성해서 만드는 것이 일반적이다.
- mappers/item.xml
4) root-context.xml 파일에 xml을 이용해서 MyBatis를 사용할 수 있도록 해주는 bean 생성코드를 작성
5) Test 클래스에 MyBatis 설정을 확인하기 위한 코드를 추가하고 실행
//MyBatis 사용 클래스를 주입
@Autowired
private SqlSession sqlSession;
//MyBatis 설정 정보를 테스트
@Test
public void mybatisTest() {
System.out.println(sqlSession);
}
- mapper 파일에 sql이 하나도 없어서 에러 발생 - sql을 작성하고 다시 테스트
4. 웹 애플리케이션이 시작할 때 Item 테이블의 전체 데이터를 가져와서 출력하기
1) sql 매퍼 파일에 필요한 SQL을 생성
2) ItemDAO 클래스에 전체 데이터를 가져오는 메소드를 생성
3) ItemService 인터페이스에 전체 데이터를 가져오는 메소드를 선언
4) ItemServiceImpl 클래스에 전체 데이터를 가져오는 메소드를 구현
5) ItemController 클래스에 시작 요청을 처리하는 메소드를 수정
- 단순한 웹 애플리케이션을 만들 때와 서버를 만들 때는 Controller를 조금씩 수정한다.
- 기존 HomeController의 내용은 삭제한다.
6) 기존의 home.jsp 파일을 삭제하고 새로 생성한 후 작성
7) webapp 디렉토리에 css 디렉토리를 만들고 home.css 파일을 만들고 작성
8) home.jsp 파일에 home.css를 적용하기 위한 코드를 작성
9) servlet-context.xml 파일에 추가
10) 다시 실행
5. 상세보기 구현
- 목록보기에서 하나를 골라서 그 하나를 자세히 보는 기능
- 목록보기에서 목록을 클릭하면 클릭한 목록을 자세히 보여주는 형태로 구현
- 클릭할 때 하나의 데이터를 찾아올 수 있도록 기본키 값을 어떻게 넘겨줄 것인지를 고려
- 웹에서는 url 뒤에 파라미터로 넘겨주던가 /값을 작성하는 형태를 이용
- 최근에는 파라미터로 넘기는 경우보다는 URL에 변수를 추가하는 형태로 많이 구현
1) home.jsp 파일에 제목을 출력하는 부분을 수정
2) item.xml 파일에 상세보기를 위한 SQL을 구현
3) mapper 테스트 : Test 클래스에 작성
4) ItemDAO에 상세보기를 위한 메소드를 작성
5) ItemService 인터페이스에 상세보기를 위한 메소드를 선언
6) ItemServiceImpl 클래스에 상세보기를 위한 메소드를 구현
7) ItemController 클래스에 상세보기를 위한 메소드를 구현
8) 이미지를 프로젝트 내에 복사
- webapp 디렉토리에 img 디렉토리에 이미지를 배치
9) detail.jsp 파일을 생성하고 작성
6. MySQL로 변환
1) pom.xml 파일에 mysql 의존성을 추가
2) root-context.xml 파일에서 DataSource를 MySQL로 변경
7. Mapper 인터페이스를 이용한 MyBatis 사용
- Mapper 인터페이스를 이용하면 xml 파일을 만들 필요없고 DAO도 만들 필요가 없다.
1) Mapper로 사용할 인터페이스를 생성하고 테이블의 전체 데이터를 가져오는 메소드와 itemid를 이용해서 1개를 찾아오는 메소드를 생성
- com.pk.mvc.item.dao.ItemMapper
2) root-context.xml 파일에 MapperFactoryBean을 생성
3) ServiceImpl 클래스에서 GoodMapper를 주입받아서 사용하면 됩니다.
4) 전자정부 프레임워크나 기업에서 만든 프레임워크 들은 샘플 프로젝트에서 xml을 이용하는 방식을 채택
8. hibernate로 변환
- DTO 클래스를 확인 : 자료형을 확인
1) pom.xml 파일에 hibernate 와 spring-orm 의 의존성을 설정
2) Item 클래스와 Item 테이블을 매핑하기 위한 하이버네이트 설정 파일을 작성
3) root-context.xml 파일에 hibernate bean을 추가
- 하이버네이트는 트랜잭션이 필수라서 tx 네임스페이스 추가
4) ItemDAO 클래스에 Hibernate 의 SessionFactory를 주입하고 메소드 코드를 수정
5) ItemServiceImpl의 메소드 위에 @Transactional을 추가
- 트랜잭션은 Service에 적용
** 프로젝트에서 MyBatis를 XML로 사용하는 형태로 변환 - 데이터베이스는 오라클
- 우리나라 공공기관이 대기업 SI에서는 아직까지 Oracle 에 XML을 이용하는 MyBatis 방식을 많이 사용하기 때문
1. root-context.xml 파일에서 MySQL의 DataSource를 주석 처리하고 오라클의 DataSource를 주석 해제
2. ItemDAO 클래스에서 하이버네이트 사용하는 부분을 주석처리하고 MyBatis 사용하는 부분으로 변경
3. ItemServiceImpl 클래스에서 MyBatis를 xml로 호출하는 형태로 변환
** 다양한 View 출력
1. 파일 다운로드
- 파일의 경로를 a 태그의 href에 설정하면 다운로드가 만들어진다.
- 링크에 설정된 파일이 브라우저가 사용가능한 파일이면 다운로드가 되지 않고 브라우저가 사용한다.
- 텍스트 파일이나 이미지 파일의 경우는 브라우저가 출력한다.
- 음악이나 동영상 파일은 재생한다.
- 강제로 다운로드하려면 파일 링크에서 마우스 오른쪽을 클릭해서 다른 이름으로 저장을 하면 된다.
- 무조건 다운로드가 되도록 만들려면 별도의 View를 만들어서 출력을 해야 한다.
2. Spring ViewResolver
- Spring Controller는 View에 의존적이지 않음 - Spring Controller는 View의 이름을 만들어주는 것이지 실제 보여지는 View를 결정하지 않는다.
- 실제 View를 결정하는 것은 ViewResolver가 한다.
1) ViewResolver 의 종류
- InternalResourceViewResolver : 기본적으로 제공되는 ViewResolver로 JSTLView로 출력
- BeanNameViewResolver : View의 이름을 가지고 직접 출력할 View를 지정
2) jsp 이외의 View로 출력하고자 하는 경우
- BeanNameViewResolver 클래스의 bean을 생성해야 한다.
- 그리고 난 후
<bean id="출력할 뷰 이름" class="출력할 뷰 클래스 이름" /> 로 설정하면 된다.
3) jsp 이용할 거라면 주의
- InternalResourceViewResolver에 order 프로퍼티를 추가해서 BeanNameViewResolver 의 order 값보다 높게 설정을 해서 BeanNameViewResolver가 처리하지 못하면 InternalResourceViewResolver가 처리하도록 해주어야 한다.
3. 오늘 출력할 것
- FileDownload View, CSV, Excel, PDF, JSON, XML 출력
- 공공기관 같은 곳에서 Open API 서버를 만드는 경우에는 모두 중요
- Open API 서버가 아니라 자신의 App 이나 기업을 위한 API를 만들 때는 JSON 과 XML이 중요
** 프로젝트 내의 img 디렉토리의 파일 다운로드 링크 만들기
1. home.jsp 파일에 파일 다운로드 링크 만들기
2. home.css 파일에 스타일 추가
3. ItemService 인터페이스에 img 디렉토리의 파일 목록을 보여주는 메소드를 선언
4. ItemServiceImpl 클래스에 파일 목록을 보여주는 메소드를 구현
5. HomeController 클래스에 클라이언트의 요청이 오면 ServiceImpl 메소드를 호출하는 메소드를 작성
- fileview를 GET 방식으로 요청하면 ItemServiceImpl 클래스의 fileview()를 호출
6. views 디렉토리에 fileview.jsp 파일을 만들고 작성
7. 디렉토리에 있는 파일이 이미지 파일이라서 다운로드되지 않고 브라우저에 출력(브라우저가 처리할 수 있으면 다운로드 안시키고 직접 출력하려 함)
- 파일들이 텍스트를 제외한 문서 파일이나 이미지 또는 사운드 및 비디오 파일이 아니라면 여기까지만 구현해도 다운로드 가능하다.
** 모든 파일이 다운로드 가능하도록 수정
1. fileview.jsp 파일에서 링크를 수정
<!--download 라는 요청에 filename 이라는 파라미터로 파일 이름을 넘겨주도록 요청을 생성 -->
<td><a href="download?filename=${item}">${item}</a></td>
2. HomeController 클래스에 download 요청을 처리할 메소드를 생성
3. 다운로드를 처리할 View 클래스 생성 : com.pk.mvc.view.DownloadView
- Controller에서 리턴하는 데이터를 읽어서 다운로드 받을 파일의 절대경로로 설정하는 부분만 수정해서 사용
4. servlet-context.xml 파일의 ViewResolver 수정
- jsp가 아닌 출력이 있으면 이 설정은 추가를 해주어야 한다.
- 기존 ViewResolver의 order를 1로 설정하고 BeanNameViewResolver 빈을 추가하고 order를 0으로 설정한다.
1) 기존 Viewresolver의 order를 추가
2) 새로운 ViewResolver 추가
3) Controller에서 download 뷰를 리턴하면 추가한 View 클래스로 출력하도록 설정을 추가
** Excel 출력
1. excel 출력을 위한 의존성 설정 - pom.xml
2. home.jsp 파일에 엑셀 출력을 위한 요청을 생성
3. HomeController 클래스에 item.xls 요청을 처리하는 메소드를 생성해서 작성
4. Excel로 출력할 수 있는 View 클래스를 생성
- AbstractXlsView로부터 상속받는 클래스 : com.pk.mvc.view.ExcelView
5. servlet-context.xml 파일에 Controller에서 리턴한 뷰 이름과 Excel View를 연결해주는 코드를 작성
<beans:bean id="excel" class="com.pk.mvc.vie.ExcelView"/>
** PDF 출력
1. 프로젝트 안에 한글을 출력할 수 있는 폰트를 복사
- webapp/font/malgum.ttf
2. pom.xml 파일에 iText API 라이브러리 의존성 설정
3. home.jsp 파일에 pdf 요청을 위한 링크 생성
4. HomeController 클래스에 item.pdf 요청 처리할 메소드를 생성
5. PDF로 출력할 View 클래스를 생성 - AbstractPdfView 클래스로부터 상속
- com.pk.mvc.view.PdfView
6. servlet-context.xml에 PDF 출력하는 코드 작성
** JSON 출력 - View 이용
1. pom.xml 파일에 jackson-databind 라이브러리의 의존성을 설정
2.home.jsp 파일에 위의 요청을 호출하는 LINK를 추가
** ajax를 이용한 json 출력
1. Controller에 요청을 처리해주는 메소드를 생성
2. home.jsp 파일에 위의 요청을 ajax로 처리하는 코드를 작성
- Map(List(Map)) : 객체(배열(객체))
1) ajax 요청을 위한 DOM을 생성
2) 스크립트 코드를 작성
** ItemServiceImpl의 allitem 메소드의 결과를 XML로 출력
1. XML 출력을 위한 의존성을 pom.xml에 작성
2. home.jsp 파일에 XML 요청을 생성
3. DTO 클래스를 수정 - Item
4. DTO 클래스의 List를 속성을 갖는 클래스를 생성
5. HomeController 에 xml 요청을 처리하는 메소드를 생성
6. servlet-context.xml 파일에 Controller에서 리턴한 뷰 이름을 XML로 출력하도록 설정
** 예외를 발생시키기
1. home.jsp 파일에 링크 추가
<li><a href="exception" class="menu">예외발생</a></li>
2. HomeController에 exception 요청이 왔을 때 처리할 메소드를 생성
3. exception.jsp 파일을 만들고 작성
4. HomeController에 위의 페이지에서 전송을 눌렀을 때 처리할 메소드를 생성
5. 결과를 출력할 result.jsp 파일을 만들고 내용을 출력
6. 숫자가 아닌 데이터나 두 번째 입력란에 0을 대입하면 예외가 발생한다.
- 실제 프로젝트라면 전송을 누를 때 유효성 검사를 수행해서 예외가 발생하지 않도록 해야 한다.
- 예외가 발생했을 때 WAS는 예외 메시지와 printStacktrace를 출력하는데 유저는 이 메시지를 볼 필요가 없다.
- 개발자는 이 메시지를 보고 예외를 수정하지만 사용자에게는 다른 형태의 예외 페이지를 출력해줘야 한다.
** 에러페이지 출력 설정
1. views 디렉토리에 error라는 디렉토리를 생성하고 exception.jsp 파일을 생성한 후 작성
2. HomeController 클래스에 예외가 발생하면 error/excepion.jsp 파일을 출력하도록 하는 설정을 추가
- 별도의 클래스를 만들어서 클래스 이름 상단에 @ControllerAdvice("패키지이름")을 추가하고 메소드를 만들면 패키지이름에서 발생한 예외를 처리하게 된다.
** Spring MVC View 설정
- 단순한 페이지 이동은 Controller에 처리하는 메소드를 만들지 않고 servlet-context.xml 파일에 아래 태그를 추가해도 된다.
<view-controller path="요청경로" view-name="뷰이름"/>
- Controller의 URL 패턴을 /*이나 /로 설정하게 되면 상대 경로로 만들어진 모든 요청을 Controller가 처리하려 하고 이 때 Controller가 처리하지 못하면404에러가 발생한다.
위의 경우 404에러를 방지하려면 servlet-context.xml 파일에 <default-servlet-handler/>를 추가해야 한다.
이 설정을 추가하면 Controller가 처리하지 못한 요청은 WAS가 처리하도록 요청한다.
** Spring 메시지 출력
- Spring에서 properties 파일의 내용을 출력하고 할 때는 아래설정을 추가한다.
<bean class="org.springframework.context.support.ResourceBundleMessageSource" id="messageSource">
<property name = "basenames">
<list>
<value>메시지 파일 경로</value>
...
</list>
</property>
</bean>
- 지역화(브라우저 언어 설정에 따라 다른 문자열 출력) 설정
메시지 파일이름_언어코드.properties로 만들면 된다.
- 프로퍼티 파일을 작성할 때는 key = value 형식으로 설정
- value는 반드시 인코딩이 되어야 한다.
IDE의 workspace 설정에서 text file encoding을 UTF-8로 설정했으면 자동으로 인코딩이 된다.
- jsp 파이에서 메시지 출력
<spring:message cod="key" ver="변수명"/>
- key의 값을 출력하고 변수에 저장 - var는 생략 가능
** 메세지 출력과 지역화
1. home.jsp 파일에 링크를 추가
2. 메시지를 저장할 파일을 src/main/resources 디렉토리에 message 디렉토리를 만들고 label.properties로 생성
3. 프로퍼티 파일을 사용하기 위한 설정을 servlet-contex.xml 파일에 추가
4. HomeController에 validation 요청이 get 방식으로 오면 처리하는 메소드를 생성
- 위 메소드 생성 대신 servlet-context.xml 파일에 아래 설정을 추가해도 된다.
<!-- validation 요청이 오면 view name을 validation으로 설정 -->
<view-controller path = "validation" view-name = "validation"/>
5. 메시지를 출력할 validation.jsp 파일을 views 디렉토리에 생성 후 작성
6. 기존에 만든 프로퍼티 파일의 이름을 label_en.properties로 변경
7. label_ko.properties 파일을 만들고 동일한 내용 입력
** Spring Form 관련 Custom tag
<%@ taglib prefix = "form" uri = "http://www.springframework.org/form" %>을 추가해서 사용
- 유효성 검사를 서버에서 한 경우 이전 입력 값을 출력하는 부분이나 메시지 출력이 쉬워진다.
1. <form:form>
- action을 설정하지 않으면 이 페이지에 오게 만든 요청
- method를 생략하면 post
- id는 입력 폼의 값을 저장하는 Command 객체의 이름이 할당
2. <form:input> : input 객체를 생성해 줌
3. <form:password> : password 객체를 생성해 줌
4. <form:hidden> : hidden 객체를 생성해 줌
- path 속성에 DTO의 프로퍼티 이름을 기재하면 name과 id를 프로퍼티 이름으로 설정해 준다.
- 데이터가 넘어왔다면 그 데이터를 value에 설정해 준다.
5. <form:select>
- items 속성에 List 타입의 속성을 대입하면 자동으로 option을 생성
6. <form:checkboxes>, <form:radiobuttons>
- items 속성에 List 타입의 속성을 대입하면 자동으로 생성
7. <form:textarea>
- path만 설정
8. <form:errors path="프로퍼티 이름"> : 프로퍼티 이름으로 만들어진 에러 메시지를 출력
** Spring Form 관련 태그 사용 실습
1. email, password, loginType을 String으로 갖는 DTO 클래스를 생성
- com.pk.mvc.item.domain.Member
2. HomeController에 loginType에 관련된 데이터를 만들어주는 메소드를 생성
3. validation 요청을 처리하는 메소드를 수정
4. validation.jsp 파일을 수정
** 파일 업로드 실습
1. pom.xml 파일에 파일 업로드 라이브러리 의존성을 설정
2. home.jsp 파일에 링크 추가
3. HomeController 클래스에 fileupload 요청이 GET 방식으로 전송됐을 때 처리하는 메소드 작성
4. fileupload.jsp 파일을 views 디렉토리에 생성하고 작성
5. web.xml 파일에 파라미터 인코딩 필터 설정을 확인하고 없으면 추가
6. servlet-context.xml 파일에 MultipartResolver 클래스의 bean을 작성
7. HomeController 클래스에 첫 번째 폼의 전송요청을 처리하는 메소드를 작성
- MultipartHttpServletRequest 클래스를 작성
8. HomeController 클래스에 두 번째 폼의 전송 요청을 처리하는 메소드를 작성
9. Command 객체를 이용하여 파일 업로드 수행
1) 파라미터를 저장할 DTO 클래스 생성
2) HomeController 클래스에 세 번째 폼 전송 요청을 처리하는 메소드를 작성