27.1 메이븐 설치하기 948p
27.2 메이븐 환경 변수 설정하기 951p
27.3 STS 설치하기 955p
27.4 메이븐 프로젝트의 구조 및 구성 요소 살펴보기 959p
27.5 스프링 프로젝트 만들기 963p
27.6 STS 프로젝트 실행하기 967p
27.7 STS 환경에서 마이바티스 실습하기 972p
27.8 log4j 알아보기 980p
27.9 타일즈 기능 살펴보기 986p
27.10 JSP 페이지에 타일즈 적용하기 989p
27.11 페이지 본문에 회원 목록창 나타내기 996p
27.12 로그인 기능 구현하기 998p
지금까지는 웹 애플리케이션 구현 시 이클립스에서 웹 프로젝트 생성 후 스프링 기능에 필요한 라이브러리를 직접 다운로드하여 사용했음 - 스프링 업데이트 때마다 관련 기능의 라이브러리를 일일이 수정해야 했음
=> 현재는 메이븐과 같은 도구를 사용해 자동으로 스프링의 라이브러리 기능을 관리함
27.1 메이븐 설치하기
948p
1. maven.apache.org에 접속 후 Download 클릭
2. apache-maven-3.5.4-bin.zip 파일을 다운로드함
3. 원하는 폴더에 apache-maven-3.5.4-bin.zip 파일의 압축을 해제함
4. apache-maven-3.5.4-bin 폴더 안에 있는 apache-maven-3.5.4 폴더를 복사
5. c:\spring 폴더에 붙여넣음
27.2 메이븐 환경 변수 설정하기
951p
1. 윈도우 탐색기에서 메이븐의 홈 디렉터리 경로를 복사함(c:\spring\apache-maven-3.5.4)
2. 환경 변수 설정창에서 시스템 변수-새로만들기 를 클릭
3. 변수 이름은 MAVEN_HOME 으로 설정, 변수 값에는 1번 과정에서 복사한 메이븐 홈 디렉터리 붙여넣음, 확인
4. 시스템 변수에 MAVEN_HOME 환경변수 등록된 것 확인
5. 시스템 변수-Path 를 클릭
6. 새로만들기 클릭
7. MAVEN_HOME 환경변수를 이용해 bin 디렉터리 경로를 설정(%MAVEN_HOME%bin), 확인
8. 다시 환경변수 창에서 확인 클릭
=> 정상 설치되었는지 확인하기 위해 명령 프롬프트에서 mvn 을 입력하고 엔터 눌렀을 때, Scanning for projects... BUILD FAILURE 등 메이븐 관련 메시지가 표시되면 제대로 설치된 것임
27.3 STS 설치하기
955p
STS(Spring Tool Suite) 는 이클립스를 기반으로 만들어진 스프링 기반 애플리케이션 개발용 도구임
STS 를 사용하는 방법은 이클립스에서 STS 플러그인을 설치하는 방법 / 스프링 홈페이지 htto://spring.io 에서 다운로드하는 방법 두 가지가 있음
책에서는 이클립스에서 STS 플러그인을 설치해보자
1. 이클립스 상단 메뉴 - Help > Eclipse Marketplace... 선택 후 검색창에 sts 입력 후 go 를 클릭
2. Spring Tool Suite 3 Add-On 3.9.6 RELEASE 항목의 install을 클릭
3. (required) 라고 표시된 항목 외에는 모두 체크를 해제 후 Confirm 클릭
4. 사용 저장권에 동의 체크 후 Finish 클릭
5. 설치 완료 후 이클립스 재시작
(몇 분~ 몇 십분 정도 소요될 수 있음)
27.4 메이븐 프로젝트의 구조 및 구성 요소 살펴보기
959p
메이븐 - 프로젝트 구조와 내용을 기술하는 선언적 접근 방식의 오픈 소스 빌드 툴
프로젝트 종속 라이브러리들과 그 라이브러리에 의존하는 Dependency 자원까지 관리할 수 있음
프로젝트 전반의 리소스 관리, 설정파일, 이와 관련된 표준 디렉터리 구조를 일관된 형태로 구성하여 관리함
*** 일반적인 애플리케이션은 단순히 코드를 컴파일했다고 동작하는 것이 아님. 사용한 오픈 소스 라이브러리들은 컴파일할때 합쳐져 하나의 기능을 이름. 그리고 컴파일 과정 외에 테스팅, 배포 등의 과정도 거치게 됨. 애플리케이션을 만들 때 컴파일을 포함하여 거치게 되는 많은 과정을 빌드라고 하고, 빌드 작업을 자동으로 수행해주는 툴을 빌드 툴이라 함. 빌드툴에는 Ant, Apache Ivu, Maven, Gradle 등이 있음
메이븐을 사용하게 되면 컴파일과 동시에 빌드를 수행할 수 있음 & 관련된 라이브러리도 일관성 있게 관리할 수 있음
라이브러리 간의 의존 관계도 자동으로 관리해줌(기존의 종속 라이브버리 모두 찾아서 추가해주던 작업 안해도 됨)
▼ pom.xml의 프로젝트 정보 설정 태그 구성 요소
속성 | 설명 |
groupId | 프로젝트 그룹 id를 나타냄. 일반적으로 도메인 이름을 사용함. |
artifactId | 프로젝트 아티팩트 id를 설정함. 대개 패키지 이름으로 설정함. |
version | 프로젝트의 버전을 설정함 |
packaging | 애플리케이션 배포 시 패키징 타입을 설정함. 여기서는 war 파일로 패키징 되도록 설정. |
▼ pom.xml의<dependencies> 태그 안에서 사용되는 정보 설정 태그
속성 | 설명 |
dependency | 해당 프로젝트에서 의존하는 다른 라이브러리 정보를 기술함 |
gruopId | 의존하는 프로젝트의 그룹 id |
artifactId | 의존하는 프로젝트의 artifact id |
version | 의존하는 프로젝트 버전 정보 |
pom.xml 에 대해서는 실습을 통해 구체적으로 알아보자
27.5 스프링 프로젝트 만들기
963p
메이븐 단독으로 프로젝트를 생성할 수도 있긴 하지만
개발환경이 편리한 STS에서 프로젝트를 만들어 메이븐을 사용하도록 하자
1. 메뉴 - New > project 선택, Spring 항목의 Spring Legacy Project를 선택 후 Next 클릭
2. 프로젝트 이름으로 pro27을 입력 후 Templates를 Spring MVC Project로 선택, Next 클릭
3. 다운로드 메시지 창(프로젝트의 추가 기능 다운로드 메시지창)이 나타나면 yes를 클릭
4. 패키지 이름으로 com.myspring.pro27(세번째 단계의 패키지 이름이 브라우저에서 요청하는 컨텍스트 이름임) 입력
=> 이클립스에서 프로젝트 생성된 것 확인,
프로젝트의 Maven Dependencies 폴더를 클릭하면 자동으로 다운로드된 스프링 관련 라이브러리들이 보임
라이브러리 옆에 표시된 경로를 통해 설치된 라이브러리 파일들을 볼 수 있음
27.6 STS 프로젝트 실행하기
967p
STS에서는 프로젝트 생성 시 미리 각 기능에 대한 폴더를 자동으로 만들어줌
1. XML 파일 설정하기
968p
프로젝트를 생성하면 다음과 같이 XML 설정 파일이 자동으로 생성됨
- pro27/src/main/webapp/WEB-INF/web.xml
- pro27/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml
[ web.xml ] pro27/src/main/webapp/WEB-INF/web.xml
다른 설정파일을 읽어들이는 부분과 DispatcherServlet을 매핑하는 부분이 자동으로 만들어짐
[ servlet-context.xml ] pro27/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml
- JSP의 위치를 나타내는 viewResolver (viewResolver 빈을 생성하며 응답할 JSP의 경로를 지정함)
<beans:bean class="~~~.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans>
- JSP에서 사용하는 자바스크립트 파일이나 이미지 파일 등의 리소스 경로
<resources mapping="/resources/**" location="/resources/" />
- 애너테이션 설정 등이 자동으로 만들어짐 (패키지와 애너테이션을 지정함)
<context:component-scan base-package="com.spring.pro27" />
2. 자바 클래스와 JSP 파일 만들기
970p
프로젝트를 생성하면 자동으로 자바 클래스와 JSP 파일이 생성됨
- pro27/src/main/java/com/myspring/pro27/HomeController.java
- pro27/src/main/webapp/WEB-INF/views/home.jsp
[ HomeController ] pro27/src/main/java/com/myspring/pro27/HomeController.java
모든 요청에 대해 home() 메서드를 호출하여 요청시각을 home.jsp로 포워딩함
- @Controller 애너테이션을 적용
- home() 메서드에 @RequestMapping(value="/", method=RequestMethod.GET) 을 설정
: 모든 요청(" / ")에 대해 home() 메서드를 호출(GET 방식으로)하도록 함
- home() : 매개변수로 설정된 model 객체에 요청시각(formattedDate)을 addAttribute()로 설정하여 JSP로 전달,
return "home" 을 통해 뷰리졸버로 JSP 이름을 반환함
[ home.jsp ]
컨트롤러에서 전달된 요청시각을 출력하도록 작성함
=> 톰캣에 pro27을 등록해서 실행 후 브라우저에서 ~~~/pro27로 요청하면 요청시각이 출력됨
27.7 STS 환경에서 마이바티스 실습하기
972p
먼저 pom.xml에 설정을 추가해서 마이바티스 관련 라이브러리를 설치해보자
1. pom.xml 이용해 마이바티스 라이브러리 설치하기
오라클은 오픈소스가 아니므로 드라이버를 직접 다운로드하여 설치해야함
따라서 src/main/webapp/WEB-INF에 lib 폴더를 생성한 후 오라클 드라이버(ojdbc6.jar)를 lib 폴더에 복붙
[ pom.xml ] pro27/pom.xml
- 데이터베이스 기능 관련 라이브러리를 설정 - commons-beanutils.jar, commons-dbcp.jar, cglib-nodep.jar
- 마이바티스 관련 라이브러리를 설정 - mybatis.jar, mybatis-spring.jar
- MySQL 또는 오라클 드라이버를 설정 - MySQL 드라이버는 오픈소스이므로 설정 후 자동으로 다운로드 가능, 오라클 드라이버는 오픈소스가 아니므로 드라이버를 직접 다운로드 후 lib 폴더에 복사하여 pom.xml에서 드라이버 경로를 설정해야 함
*** <systemPath> : 로컬에 설치한 위치를 지정함, ${basedir} : 프로젝트 루트 디렉터리
2. 마이바티스 관련 XML 파일 추가하기
957p
- src폴더/main/webapp/WEB-INF/config폴더/jdbc폴더 - jdbc.properties 복붙(26장에서 사용한 것 재사용)
- src폴더/main/webapp/WEB-INF/spring폴더 - action-mybatis.xml (26장 파일 재사용)
[ web.xml ] pro27/src/main/webapp/WEB-INF/web.xml
root-context.xml 대신 action-mybatis.xml을 읽어오도록 수정함(<listener> 태그 위의 <context-param> 태그 안)
[ action-mybatis.xml ] pro27/src/webapp/WEB-INF/spring/action-mybatis.xml
jdbc.properties 경로를 /WEB-INF/config/jdbc/jdbc.properties 로 수정함
매퍼파일을 추가하기 위해서 메이븐 프로젝트에서는 src/main/resources 패키지 하위에 mybatis 패키지를 생성함,
mybatis 패키지 하위에 다시 mappers 패키지와 model 패키지를 생성함
- pro27/src패키지/main/resources/mybatis/mappers - member.xml (26장 파일 복붙)
- pro27/src패키지/main/resources/mybatis/model - modelConfig.xml (26장 파일 복붙, 패키지 이름은 수정함)
3. 자바 클래스와 JSP 구현하기
977p
자바 클래스 파일과 JSP 파일은 26장의 것을 재사용하면 됨
- src/main/java 하위 com.myspring.pro27 패키지에 member 패키지 생성, 각각의 하위 패키지(controller, dao, service, vo 등)를 생성해 복붙
- WEB-INF/views 폴더 하위 - member 폴더 생성 후 26장의 파일 복붙(listMembers.jsp, memberForm.jsp, modMember.jsp)
[ MemberControllerImpl ] pro27/src/main/java/com/myspring/pro27/member/controller/MemberController.java
- getViewName() 메서드 - viewName.lastIndexOf("/",1) 로 수정하여 JSP가 저장된 폴더이름에 해당하는 첫번째 요청부터 가져오도록 바꿔줌 (/member/listMembers.do 로 요청 시 member/listMember 를 뷰 이름으로 반환해줌)
27.8 log4j 알아보기
980p
log4j : 애플리케이션에서 유지 관리를 위해 웹 사이트 접속자 정보, 메서드 호출 시각 등의 정보를 파일로 저장해서 관리하는데, 이를 위한 로그 관련 기능을 제공함. log4j 기능은 메이븐 등의 빌드 툴에서는 프로젝트 생성 시 자동으로 log4j 라이브러리가 설치되어 사용 가능함.
log4j 기능 관련 설정은 src/test/resources 패키지의 log4j.xml 파일에서 수행함
▼log4j.xml 을 이루는 태그
태그 | 설명 |
<Appender> | 로그의 출력 위치(파일, 콘솔, DB 등)를 결정함, log4j API 문서의 XXXAppender로 끝나는 클래스들의 이름을 보면 출력 위치를 알 수 있음 |
<Layout> | Appender 가 어디에 출력할 것인지 결정했으면, 어떤 형식으로 출력할지 출력 레이아웃을 결정함 |
<Logger> | 로깅 메시지를 Appender에 전달함. 개발자가 로그 레벨을 이용해 로그 출력 여부를 조정할 수 있음. logger는 로그 레벨을 가지고 있으며, 로그의 출력 여부는 로그문의 레벨과 로거의 레벨로 결정함 |
▼여러 가지 Appender 클래스 for 출력위치 지정
Appender 클래스 | 설명 |
ConsoleAppender | org.apache.log4j.ConsoleAppender 클래스, 콘솔에 로그 메시지를 출력 |
FileAppender | org.apache.log4j.FileAppender 클래스, 파일에 로그 메시지를 출력 |
RollingFileAppender | org.apache.log4j.rolling.RollingFileAppender 클래스, 파일 크기가 기준을 넘으면 기존 파일을 백업 파일로 바꾸고 처움부터 다시 기록함 |
DailyRollingAppender | org.apache.log4j.DailyRollingFileAppender 클래스, 설정한 기간 단위로 새 파일을 만들어 로그 메시지를 기록함 |
▼PatternLayout 클래스 - 출력형식 지정하는 속성들
속성 | 설명 |
%p | debug, info, error, fatal 등 로그 레벨 이름 출력 |
%m | 로그 메시지 출력 |
%d | 로깅 이벤트 발생 시각 출력 |
%F | 로깅이 발생한 프로그램 파일 이름 출력 |
%l | 로깅이 발생한 caller의 정보 출력 |
%L | 로깅이 발생한 caller의 라인 수 출력 |
%M | 로깅이 발생한 method 이름 출력 |
%c | 로깅 메시지 앞에 전체 패키지 이름이나 전체 파일 이름 출력 |
... | ... |
▼ log4j의 여러 가지 로그 레벨(6단계)
레벨 | 설명 |
FATAL | 시스템 차원에서 심각한 문제가 발생해 애플리케이션 작동이 불가능할 경우에 해당하는 레벨, 일반적으로 애플리케이션에서는 사용할 일이 없음 |
ERROR | 실행 중 문제가 발생한 상태를 나타냄 |
WARN | 향후 시스템 오류의 원인이 될 수 있는 경고 메시지를 나타냄 |
INFO | 로그인, 상태 변경과 같은 실제 애플리케이션 운영과 관련된 정보 메시지를 나타냄 |
DEBUG | 개발 시 디버깅 용도로 사용한 메시지를 나타냄 |
TRACE | DEBUG 레벨보다 상세한 로깅 정보를 출력하기 위해 도입된 레벨 |
낮은 레벨로 코드의 메시지를 설정했으면 그 레벨보다 높게 설정한 메시지들은 모두 출력됨
* log4j.xml 은 pro27/src/main/resources/log4j.xml 에서 확인할 수 있음
* log4j.xml - <rtoot> 태그의 <priority> 태그의 value 속성값을 debug로 변경하면 요청 시 실행되는 SQL문 관련 정보(마이바티스id, SQL문 등)를 로그로 출력할 수 있음
27.9 타일즈 기능 살펴보기
986p
일반적인 웹 애플리케이션 화면 구조는 상단/왼쪽메뉴/하단을 담당하는 페이지를 따로 만들어놓고 브라우저에서 웹 페이지를 요청하면 본문 화면만 추가해서 보여줌
이러한 화면 레이아웃 기능을 제공하는 것이 타일즈(tiles) 기능임
타일즈는 화면의 레이아웃을 쉽게 구현하기 위해 도입된 JSP 페이지 레이아웃을 위한 프레임워크
- 타일즈 이용 시 장점
페이지 레이아웃을 쉽고 단순하게 구현할 수 있음
공통된 레이아웃을 사용하므로 유지관리가 쉬움
pom.xml을 통해 쉽게 타일즈 관련 라이브러리를 설치할 수 있음
groupId - org.apache.tiles
artifactId - tiles-core, tiles-jsp, tiles-servlet...
[ servlet-context.xml ] pro27/src/main/webapp/WEB-INF/s[romg/appServlet/servlet-context.xml
타일즈 관련 XML 설정을 함
- 기존에 JSP를 표시하기 위해 사용했던 InternalResourceViewResolver는 더이상 사용하지 않으므로 주석처리,
- tilesConfigurer 빈 - TilesConfigurer 클래스를 이용함, classpath:tiles/*.xml 로 설정해서 tiles 패키지의 모든 설정 XML 파일을 읽어들임
- viewResolver 빈 - UrlBasedViewResolver 클래스, 타일즈 뷰리졸버를 사용해 화면을 표시함
- viewClass 빈 - TilesView 클래스를 이용함,
27.10 JSP 페이지에 타일즈 적용하기
989p
JSP에 타일즈 기능을 적용하는 과정
1. tile.xml 을 작성
2. 레이아웃용 JSP를 작성
3. 레이아웃에 표시할 JSP를 작성
4. 컨트롤러에서 tiles.xml 에 설정한 뷰이름을 반환함
1. tiles.xml 작성하기
990p
src/main/resources 패키지에 tiles 패키지를 만든 후 tiles_member.xml 파일을 생성함
[ tiles_member.xml ]
<definition> 태그를 이용해 전체 화면의 공통 레이아웃의 뷰 이름을 "baseLayout" 으로, JSP의 위치와 함께 지정함
- 속성 title, header, side, body, footer 를 추가하는데, header와 side, footer는 JSP의 위치도 함께 설정함
다른 <definition> 태그는 baseLayout 레이아웃을 상속받으면서 title과 body 속성만 변경해서 사용함, title에는 제목에 표시할 구문 "메인페이지" 를 설정하고, body 속성에는 JSP의 위치를 지정함
2. 레이아웃에 사용되는 JSP 작성하기
991p
src폴더/main/webapp/resources/image 폴더 생성 - duke_swing.gif, duke.png 추가
src폴더/main/webapp/WEB-INF/views/commom 폴더(tiles_member.xml에서 위치 지정했음)
- footer.jsp, header.jsp, layout.jsp, side.jsp 를 추가
[ layout.jsp ] pro27/src폴더/main/webapp/WEB-INF/views/commom/layout.jsp
- <@taglib uri="~~/tags-tiles" prefix="tiles" %> : 타일즈를 사용하기 위해 추가해줌
- <title><titles:insertAttribute name="title" /> </title> : tiles_member.xml 의 <definition> 하위태그 <put-attribute> 태그의 name 이 "title" 인 value를 표시함
- <div id="header"><tiles:insertAttribute name="header" /></div> : tiles_member.xml 의 하위태그 태그의 name 이 "header" 인 value를 표시함
- 마찬가지로 <div> 태그 안에 name이 side, body, footer 인 value를 표시하도록 함
[ header.jsp ] pro27/src폴더/main/webapp/WEB-INF/views/commom/header.jsp
... side.jsp, footer.jsp 도 작성성
3. 레이아웃에 표시되는 JSP 파일 작성하기
994p
[ main.jsp ] pro27/src폴더/main/webapp/WEB-INF/views/commom/main.jsp
레이아웃 본문에 표시할 JSP 파일.
4. 뷰 이름 요청 컨트롤러 만들기
995p
<definition> 태그 name 속성의 뷰 이름을 tiles viewResolver 로 반환할 컨트롤러를 작성하자
[ HomeController ] pro27/src/java/com/myspring/pro27/HomeController.java
home() 메서드 - /main.do 로 요청시 처리함, <definition> 태그에서 설정한 뷰 이름 "main"을 tiles viewResolver로 반환함
27.12 로그인 기능 구현하기
998p
[ tiles_member.xml]
로그인창을 나타내는 <definition> 태그 추가함, name="/member/loginForm" extends="baseLayout", name에는 뷰이름을 써줌
[ member.xml ] pro27/src/main/resources/mybatis/mappers 패키지/member.xml
로그인 창(loginForm.jsp)에서 입력창에 입력한 id와 비밀번호로 회원 정보를 조회하는 SQL문을 매퍼파일에 추가
[ MemberControllerImpl ]
lonin() - 두번째 인자에 RedirectAttributes rAttr을 설정, RedirectAttributes 클래스를 이용해서 로그인 실패시 다리 로그인창으로 리다이렉트해서 로그인 실패 메시지를 전달하도록 함
id와 비밀번호가 입력되었으면 session 객체 생성 후 member와 isLogon 이름으로 값 memberVO와 true를 설정함
mav에 뷰이름 redirect:/member/listMembers.do 를 설정해서 리다이렉트함
id와 비밀번호가 제대로 입력되지 않았으면 rAttr.addAttribute("result", "loginFailed") 로 실패메시지를 로그인창에 전달함,
다시 로그인 창으로 리다이렉트함
logout() - session 객체에서 "member" 와 "isLogOn" 을 삭제하고, /member/listMembers.do 로 리다이렉트함
form() - 로그인창을 요청할 때 매개변수 result가 전송되면 변수 result에 값을 저장함(@RequestParam), mav에 result를 설정, viewName을 설정함
[ MemberServiceImpl ]
login() - memberDAO.loginById(memberVO) 를 return함
[ MemberDAOImpl ]
loginById() - sqlSession.selectOne("mapper.member.loginById", memberVO) 를 호출, 결과를 MemberVO vo에 저장 후 return함
[ header.jsp ] pro27/src/main/webapp/EWB-INF/views/common/header.jsp
컨트롤러에서 설정한 세션의 속성인 isLogOn 값에 따라 회원이름과 로그아웃 링크이 표시되거나 로그인 링크가 표시되도록 함
[ loginForm.jsp ]
<head>에 <c:choose>를 통해 컨트롤러에서 로그인 실패 메시지가 전달되었는지 확인 후, 전달된 "result"에 "loginFailed" 가 저장되어 있으면 alert 창을 띄움
'(책) 자바 웹을 다루는 기술' 카테고리의 다른 글
Chap 26 스프링 애너테이션 기능 (0) | 2023.09.20 |
---|---|
Chap 25 스프링 트랜잭션 기능 사용하기 (0) | 2023.09.19 |
Chap 24 스프링과 마이바티스 연동하기 (0) | 2023.09.19 |
Chap 23 마이바티스 프레임워크 사용하기 (0) | 2023.09.19 |
Chap 22 스프링 JDBC 기능 (0) | 2023.09.17 |