메이븐 다운받고 환경변수 설정
XML파일 설정하기
레거시 프로젝트의 pom.xml : 프로젝트 정보가 표시되고, 스프링에서 사용되는 여러 라이브러리를 설정해 다운로드
레거시 프로젝트를 생성하면 위와 같은 XML 파일들이 자동으로 생성된다.
web.xml
- 다른 설정 파일을 읽어들이는 부분과 디스패쳐서블릿을 매핑하는 부분이 자동으로 만들어짐
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 스프링 실행시 servlet-context.xml의 설정 정보를 읽어들임 -->
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
servlet-context.xml
- JSP의 위치를 지정하는 뷰리졸버와 JSP에서 사용하는 자바스크립트 파일 또는 이미지 같은 리소스 경로, 애너테이션 설등 등이 프로젝트 생성 시 자동으로 만들어진다.
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<!-- JSP에서 사용될 자바스크립트나 이미지 파일 경로를 저장 -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<!-- 뷰리졸버 빈을 생성하면서 응답할 JSP의 경로를 지정 -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<!-- 패키지와 애너테이션을 지정 -->
<context:component-scan base-package="com.myspring.pro27" />
</beans:beans>
STS 환경에서 마이바티스 사용
pom.xml 사용해서 마이바티스 라이브러리 설치
오라클은 MySql과는 다르게 오픈 소스가 아니기 때문에 드라이버를 직접 다운로드해서 설치해야 한다. 따라서 WEB-INF에 lib 폴더를 만들어 오라클 드라이버(ojdbc6.jar 같은거)를 붙여넣는다.
그리고 pom.xml의 <dependencies>태그 안에 아래의 내용을 넣어줌
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.29</version>
</dependency>
<dependency>
<groupId>jdbc.oracle</groupId>
<artifactId>OracleDriver</artifactId>
<version>12.1.0.2.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/ojdbc6.jar</systemPath>
</dependency>
<!-- 타일즈 관련 라이브러리 -->
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-core</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-servlet</artifactId>
<version>2.2.2</version>
</dependency>
<!-- AOP -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
데이터베이스 기능 관련 라이브러리, 마이바티스 관련 라이브러리, MySql과 오라클 드라이버 등을 설정
마이바티스 관련 XML 파일 추가
위와 같이 action-mybatis.xml 파일과 jdbc.properties 파일을 만들어준다. 내용은 이전에 사용했던걸 그대로 사용
그리고 web.xml에서 위와 같이 action-mybatis.xml 파일을 읽어들이도록 수정
action-mybatis.xml에서는 jdbc.properties의 경로 수정
그리고 위와 같이 매퍼 설정
modelConfig.xml에서는 위와 같이 설정
그리고 나머지 자바클래스와 JSP를 앞서 했던 파일들을 가져와서 실행하면 똑같은 결과를 얻을 수 있다.
컨트롤러의 getViewName()메서드만 위의 부분처럼 수정하면 된다.
log4j
실제 애플리케이션에서는 유지관리를 위해 접속한 사용자 정보나 각 클래스의 메서드 호출 시각 등 여러 정보들을 파일로 저장해서 관리한다. 이런 로그 관련 기능을 제공하는 것이 log4j이다.
log4j 기능은 독립적으로 라이브러리를 설치해서 사용할 수 있으며, 메이븐 같은 빌드 툴에서는 프로젝트 생성 시 자동으로 log4j 라이브러리가 설치된다.
log4j 기능 관련 설정은 log4j.xml 파일에서 수행한다.
log4j.xml을 이루는 태그들의 특징
태그 | 설명 |
<Appender> | - 로그의 출력 위치를 결정(파일, 콘솔, DB 등) - API 문서의 xxxAppender로 끝나는 클래스들의 이름을 보면 출력 위치를 알 수 있음 |
<Layout> | Appender를 어떤 형식으로 출력할지 출력 레이아웃을 결정 |
<Logger> | - 로깅 메세지를 Appender에 전달, 개발자가 로그 레벨을 이용해 로그 출력 여부 조정 - logger는 로그 레벨을 가지고 있으며, 로그의 출력 여부는 로그문의 레벨과 록의 레벨을 가지고 결정 |
로그레벨
낮은 레벨로 코드의 메시지를 설정했다면 그 레벨보다 높게 설정한 메시지들은 모두 출력된다.
log4j.xml 사용해서 로그 메시지 출력(마이바티스 SQL문도 로그로 출력)
log4j.xml에서 <root> 태그는 애플리케이션 전체에 적용되는 로그 레벨을 설정하며, 이 태그의 하위 <priority> 태그의 value 속성 값을 debug로 변경한 후 다시 회원 조회를 요청하면 요청 시 실행되는 SQL문 관련 정보를 로그로 출력할 수 있다.
@Controller("memberController")
public class MemberController {
//LoggerFactory 클래스를 이용해 Logger 클래스 객체를 가져옴
private static final Logger logger = LoggerFactory.getLogger(MemberController.class);
@Autowired
private MemberService memberService;
@Autowired
private MemberVO memberVO;
@RequestMapping(value = "/member/listMembers.do", method = RequestMethod.GET)
public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception{
String viewName = getViewName(request);
logger.info("info 레벨 : viewName = "+ viewName);//로그 레벨 info
logger.debug("debug 레벨 : viewName = "+ viewName);//로그 레벨 debug
List membersList = memberService.listMembers();
ModelAndView mav = new ModelAndView(viewName);
mav.addObject("membersList", membersList);
return mav;
}
...
}
먼저 위와 같이 로그를 출력하도록 정하고 실행하면 아래와 같은 결과가 출력된다.
DEBUG레벨보다 높은 INFO레벨의 로그만 출력된 것을 확인할 수 있다.
그리고 마이바티스 SQL문의 결과도 확인할 수 있다.
폴더도 자동으로 생성돼서 로그가 기록된다.
타일즈
일반적으로 JSP는 모든 화면 기능을 일일이 구현하는 것이 아니라 전체 화면 틀을 일정하게 만들어 놓고 본문 부분만 변경해서 사용한다.
일반적인 웹 애플리케이션 구조는 상단 부분이나 왼쪽 메뉴 그리고 하단 부분을 담당하는 페이지를 따로 만들어 놓고 브라우저에서 웹 페이지를 요청하면 본문 화면만 추가하여 보여준다.
이런 화면 레이아웃 기능을 제공하는 것이 타일즈다.
타일즈도 pom.xml을 통해서 설치해 사용할 수 있는데, 위에서 이미 설치했다.
<!-- 타일즈 실습 설정 -->
<!-- 스프링의 TilesConfigurer클래스를 이용해 tilesConfigurer빈을 생성 -->
<beans:bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<beans:property name="definitions">
<!-- 패키지 tiles의 모든 설정 XML파일을 읽어 들인다. -->
<beans:list>
<beans:value>classpath:tiles/*.xml</beans:value>
</beans:list>
</beans:property>
<beans:property name="preparerFactoryClass"
value="org.springframework.web.servlet.view.tiles2.SpringBeanPreparerFactory" />
</beans:bean>
<!-- 타일즈 뷰리졸버를 사용해 화면을 표시 -->
<beans:bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
</beans:bean>
servlet-context.xml 파일에 위와 같이 타일즈 관련 빈을 생성하고, 원래 있떤 JSP 뷰리졸버를 주석처리한다.
JSP에 타일즈 사용
- tile.xml 작성
- 레이아웃용 JSP 작성
- 레이아웃에 표시할 JSP 작성
- 컨트롤러에서 tiles.xml에 설정한 뷰 이름 반환
위의 순서대로 JSP에 타일즈 기능을 적용한다.
tiles_member.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
"http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
<!-- 공통 레이아웃의 뷰이름을 지정 --> <!-- 전체 레이아웃을 정하는 JSP의 위치를 지정 -->
<definition name="baseLayout" template="/WEB-INF/views/common/layout.jsp">
<put-attribute name="title" value="" />
<put-attribute name="header" value="/WEB-INF/views/common/header.jsp" /><!-- 헤더 위치 지정 -->
<put-attribute name="side" value="/WEB-INF/views/common/side.jsp" /><!-- 사이드 메뉴 위치 지정 -->
<put-attribute name="body" value="" />
<put-attribute name="footer" value="/WEB-INF/views/common/footer.jsp" /><!-- 푸터 위치 지정 -->
</definition>
<!-- 메인 화면의 뷰이름 지정 --> <!-- 기본적인 레이아웃은 baseLayout을 상속받음 -->
<definition name="main" extends="baseLayout">
<put-attribute name="title" value="메인페이지" /><!-- 레이아웃의 제목에 표시할 구문 지정 -->
<put-attribute name="body" value="/WEB-INF/views/main.jsp" /><!-- 레이아웃 본문에 표시할 JSP 지정 -->
</definition>
<!-- 컨트롤러에서 반환되는 뷰이름 지정 --> <!-- 기본 레이아웃 상속 -->
<definition name="/member/listMembers" extends="baseLayout">
<put-attribute name="title" value="회원목록창" />
<put-attribute name="body" value="/WEB-INF/views/member/listMembers.jsp" /><!-- 레이아웃 본문에 표시할 JSP 지정 -->
</definition>
<definition name="/member/loginForm" extends="baseLayout">
<put-attribute name="title" value="로그인창" />
<put-attribute name="body" value="/WEB-INF/views/member/loginForm.jsp" />
</definition>
</tiles-definitions>
레이아웃에 사용되는 JSP
layout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"
%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
#container {
width: 100%;
margin: 0px auto;
text-align:center;
border: 0px solid #bcbcbc;
}
#header {
padding: 5px;
margin-bottom: 5px;
border: 0px solid #bcbcbc;
background-color: lightgreen;
}
#sidebar-left {
width: 15%;
height:700px;
padding: 5px;
margin-right: 5px;
margin-bottom: 5px;
float: left;
background-color: yellow;
border: 0px solid #bcbcbc;
font-size:10px;
}
#content {
width: 75%;
padding: 5px;
margin-right: 5px;
float: left;
border: 0px solid #bcbcbc;
}
#footer {
clear: both;
padding: 5px;
border: 0px solid #bcbcbc;
background-color: lightblue;
}
</style>
<!-- tilies_member.xml의 <definition>의 하위 태그인 <put-attribute> 태그의 name이 title인 value을 표시 -->
<title><tiles:insertAttribute name="title" /></title>
</head>
<body>
<div id="container">
<div id="header">
<!-- tilies_member.xml의 <definition>의 하위 태그인 <put-attribute> 태그의 name이 header인 value을 표시 -->
<tiles:insertAttribute name="header"/>
</div>
<div id="sidebar-left">
<tiles:insertAttribute name="side"/>
</div>
<div id="content">
<tiles:insertAttribute name="body"/>
</div>
<div id="footer">
<tiles:insertAttribute name="footer"/>
</div>
</div>
</body>
</html>
header.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
isELIgnored="false" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>헤더</title>
</head>
<body>
<table border=0 width="100%">
<tr>
<td>
<a href="${contextPath}/main.do">
<img src="${contextPath}/resources/image/gorani3.jpg" width="150" height="150" />
</a>
</td>
<td>
<h1><font size=30>스프링실습 홈페이지!!</font></h1>
</td>
<td>
<!-- isLogOn값이 true이면 로그아웃이 표시되도록 -->
<c:choose>
<c:when test="${isLogOn == true && member!= null}">
<h3>환영합니다. ${member.name }님!</h3>
<a href="${contextPath}/member/logout.do"><h3>로그아웃</h3></a>
</c:when>
<c:otherwise>
<a href="${contextPath}/member/loginForm.do"><h3>로그인</h3></a>
</c:otherwise>
</c:choose>
</td>
</tr>
</table>
</body>
</html>
footer.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>하단 부분</title>
<style>
p {
font-size:20px;
text-align:center;
}
</style>
</head>
<body>
<p> e-mail:admin@test.com</p>
<p> 회사주소:서울시 강동구</p>
<p>찾아오는 길:<a href="#">약도</a></p>
</body>
</html>
side.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
isELIgnored="false" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<!DOCTYPE html>
<html>
<head>
<style>
.no-underline{
text-decoration:none;
}
</style>
<meta charset="UTF-8">
<title>사이드 메뉴</title>
</head>
<body>
<h1>사이드 메뉴</h1>
<h1>
<a href="#" class="no-underline">회원관리</a><br>
<a href="#" class="no-underline">게시판관리</a><br>
<a href="#" class="no-underline">상품관리</a><br>
</h1>
</body>
</html>
MemberController
@Controller("memberController")
public class MemberController {
//LoggerFactory 클래스를 이용해 Logger 클래스 객체를 가져옴
private static final Logger logger = LoggerFactory.getLogger(MemberController.class);
@Autowired
private MemberService memberService;
@Autowired
private MemberVO memberVO;
@RequestMapping(value = "/member/listMembers.do", method = RequestMethod.GET)
public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception{
String viewName = getViewName(request);
logger.info("info 레벨 : viewName = "+ viewName);//로그 레벨 info
logger.debug("debug 레벨 : viewName = "+ viewName);//로그 레벨 debug
List membersList = memberService.listMembers();
ModelAndView mav = new ModelAndView(viewName);
mav.addObject("membersList", membersList);
return mav;
}
//회원 가입창에서 전송된 회원 정보를 바로 MemberVO 객체에 설정하고, 이를 SQL문으로 전달해 회원 등록
@RequestMapping(value = "/member/addMember.do", method = RequestMethod.POST)
public ModelAndView addMember(@ModelAttribute("member") MemberVO memberVO, HttpServletRequest request, HttpServletResponse response) throws Exception{
request.setCharacterEncoding("utf-8");
memberService.addMember(memberVO);
ModelAndView mav = new ModelAndView("redirect:/member/listMembers.do");
return mav;
}
//전송된 id에 해당하는 회원 삭제
@RequestMapping(value = "/member/removeMember.do", method = RequestMethod.GET)
public ModelAndView removeMember(@RequestParam("id") String id, HttpServletRequest request, HttpServletResponse response) throws Exception{
request.setCharacterEncoding("utf-8");
memberService.removeMember(id);
ModelAndView mav = new ModelAndView("redirect:/member/listMembers.do");
return mav;
}
@RequestMapping(value = "member/login.do", method = RequestMethod.POST)
public ModelAndView login(@ModelAttribute("member") MemberVO memberVO,
RedirectAttributes rAttr,//로그인 실패시 다시 로그인창으로 리다이렉트하여 실패 메시지 전달
HttpServletRequest request, HttpServletResponse response) throws Exception{
ModelAndView mav = new ModelAndView();
memberVO = memberService.login(memberVO);
if (memberVO != null) {
HttpSession session = request.getSession();
session.setAttribute("member", memberVO);//세션에 회원정보 저장
session.setAttribute("isLogOn", true);//세션에 로그인 상태를 true로 설정
mav.setViewName("redirect:/member/listMembers.do");
} else {
rAttr.addAttribute("result", "loginFailed");//로그인 실패시 실패 메시지 로그인 창으로 전달
mav.setViewName("redirect:/member/loginForm.do");
}
return mav;
}
@RequestMapping(value = "member/logout.do", method = RequestMethod.GET)
public ModelAndView logout(HttpServletRequest request, HttpServletResponse response) throws Exception{
HttpSession session = request.getSession();
//로그아웃 시 세션에 저장된 로그인 정보와 회원 정보 삭제
session.removeAttribute("member");
session.removeAttribute("isLogOn");
ModelAndView mav = new ModelAndView();
mav.setViewName("redirect:/member/listMembers.do");
return mav;
}
//요청명이 Form.do로 끝나면 form() 메서드를 호출
@RequestMapping(value = "/member/*Form.do", method = RequestMethod.GET)
public ModelAndView form(@RequestParam(value = "result", required = false)String result,
HttpServletRequest request, HttpServletResponse response) throws Exception{
request.setCharacterEncoding("utf-8");
String viewName = getViewName(request);
ModelAndView mav = new ModelAndView();
mav.addObject("result", result);
mav.setViewName(viewName);
return mav;
}
private String getViewName(HttpServletRequest request) throws Exception {
String contextPath = request.getContextPath();
String uri = (String) request.getAttribute("javax.servlet.include.request_uri");
if (uri == null || uri.trim().equals("")) {
uri = request.getRequestURI();
}
int begin = 0;
if (!((contextPath == null) || ("".equals(contextPath)))) {
begin = contextPath.length();
}
int end;
if (uri.indexOf(";") != -1) {
end = uri.indexOf(";");
} else if (uri.indexOf("?") != -1) {
end = uri.indexOf("?");
} else {
end = uri.length();
}
String viewName = uri.substring(begin, end);
if (viewName.indexOf(".") != -1) {
viewName = viewName.substring(0, viewName.lastIndexOf("."));
}
if (viewName.lastIndexOf("/") != -1) {
// /member/listMembers.do로 요청하면 member/listMembers를 파일 이름으로 가져옴
viewName = viewName.substring(viewName.lastIndexOf("/",1), viewName.length());
}
return viewName;
}
}
컨트롤러에서 위와 같이 요청 처리
'자바 웹 > 스프링' 카테고리의 다른 글
썸네일 이미지 사용 (0) | 2022.07.04 |
---|---|
다중 파일 업로드 (0) | 2022.07.04 |
스프링 애너테이션 기능 (0) | 2022.07.01 |
스프링 트랜잭션 (0) | 2022.07.01 |
마이바티스 (0) | 2022.06.30 |