-
210701_1(Spring_DI적용하기)Spring 2021. 7. 1. 17:05
DI적용하기 전체적인흐름
웹어플과 스프링의 연결 --- web.mxl
스프링에서 인코딩 주로사용하는법
<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping><listner> 리스너 이용 -- 서버가 구동시 해당 인스턴스가 작동하도록 준비하고 대기시킴; 리스너 이용
<context-param> -- 리스너가 인스턴스를 준비할때 필요한 파라미터를 제공함
(스프링 환경을 xml문서 형태로 제공함)
스프링환경파일 기술 (중요)
1) DBPC 설정 -- bean
|
주입
| DataSource 변수와 setter준비
2) DAO 설정 -- bean con=ConnectionManager.getConnection();을
| con=dataSource.getConnection()으로바꾼다
주입
|
3) UserServiceImpl -- bean :주입받는 대상의 UserDAO 변수 와 setter 준비
Helper 클래스
jsp문서에는 주입이 안되서, Helper클래스 인스턴스를 사용할수 있도록한다
4) getBean으로 UserServiceImpl의 인스턴스를 꺼내옴
<-- 앞의 예제에서 ApplicationContext를 이용해서 사용하던것 기억
WebApplicationContext wac;
wac.getBean("userService");
JSP의 모든 컨트롤 기능 문서에서
NonUserService대신에 UserService를 이용한면된다.
log4j.xml
src에 작성하면 특별한 매핑을 하지 않아도 바로인식이된다.
만약에 /WEB-INF/log4j.xml 으로생성하면 반드시 매핑하여야한다.
개발이나 운영시 로그를 남기기위해 사용하는 라이브러리이다.
---------------기록레벨
FATAL : 아주 심각한 에러가 발생한 상태. 시스템적으로 심각한 문제가 발생해서 어플리케이션작동이 불가능할 경우가 해당하는데, 일반적으로는 어플리케이션에서는 사용할 일이 없음
ERROR : 요청을 처리하는 중 문제가 발생한 상태를 나타냄
WARN : 처리 가능한 문제이지만, 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지를 나타냄
INFO : 로그인, 상태변경과 같은 정보성 메시지를 나타냄
DEBUG : 개발시 디버그 용도로 사용한 메시지를 나타냄
TRACE : log4j1.2.12에서 신규 추가된 레벨로서, DEBUG 레벨이 너무 광범위한 것을 해결하기 위해서 좀 더 상세한 상태를 나타냄
FATAL > ERROR > WARN > INFO > DEBUG > TRACE
DEBUG 레벨로 했다면 INFO~FATAL까지 모두 logging이 되어집니다
출처) cofs.tistory.com/354
----------------출력포맷
%p debug, info, warn, error, fatal 등의 priority 출력
%m 로그내용 출력
%d 로깅 이벤트가 발생한 시간을 출력
ex)포맷은 %d{HH:mm:ss} 같은 형태의 SimpleDateFormat
%t 로그이벤트가 발생된 쓰레드의 이름 출력
%F 로깅이 발생한 프로그램 파일명 출력
%l 로깅이 발생한 caller의 정보 출력
%L 로깅이 발생한 caller의 라인수 출력
%M 로깅이 발생한 method 이름 출력
% % 표시 출력
%n 플랫폼 종속적인 개행문자 출력
%c 카테고리 출력
ex)카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c 출력
%C 클래스명 출력
ex)클래스구조가 org.apache.xyz.SomeClass 처럼 되어있다면 %C{2}는 xyz.SomeClass 출력
%r 어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds) 출력
%x 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context) 출력
%X 로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context) 출력
출처) cofs.tistory.com/354
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <description>Spring Framework Workbook Chapter1</description> <filter> <filter-name>Encoding Filter</filter-name> <filter-class>net.javajigi.filter.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>EUC-KR</param-value> </init-param> </filter> <filter-mapping> <filter-name>Encoding Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 스프링 연결을 기술하라--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <welcome-file-list> <welcome-file>user_list.jsp</welcome-file> </welcome-file-list> <error-page> <error-code>404</error-code> <location>/404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/error.jsp</location> </error-page> <resource-ref> <description>DB Connection</description> <res-ref-name>jdbc/SpringDS</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </web-app>MYSQLUserDAO.java
public class MySQLUserDAO implements UserDAO { protected final Log logger = LogFactory.getLog(getClass()); //의존성 주입을 받기 위해서는 아래처럼 변수/셋터가 있어야 한다 ///////////////파마리터에 대한 변수가 있다 private DataSource dataSource = null; ///////////////파라미터에 대한 변수의 setter 존재한다 public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public int insert(User user) throws DataAccessException { if( logger.isDebugEnabled() ) { logger.debug("insert() 시작"); logger.debug("User : " + user); } Connection con = null; PreparedStatement pstmt = null; try { StringBuffer insertQuery = new StringBuffer(); insertQuery.append("INSERT INTO USERINFO VALUES "); insertQuery.append("(?, ?, ?, ?, ?)"); ///주입받은 객체를 이용하여 con = ConnectionManager.getConnection(); -> con = dataSource.getConnection();로변경 con = dataSource.getConnection(); .. .. .. //////////////////////다른 비지니스 메소드들도 모두 동일하게 적용UserService.java
/** * 이 소스는 Spring 프레임워크 워크북에서 사용한 예제 소스입니다. * 이 소스는 모든 개발자들이 자유롭게 수정 및 배포할 수 있습니다. * 단, 이 소스를 기반으로 새로운 애플리케이션을 개발할 경우 출처를 명시해 주시면 됩니다. */ package net.javajigi.user.service; import java.util.List; import org.springframework.context.ApplicationContextAware; import net.javajigi.user.ExistedUserException; import net.javajigi.user.PasswordMismatchException; import net.javajigi.user.UserNotFoundException; import net.javajigi.user.dao.UserDAO; import net.javajigi.user.model.User; /** * 주석을 넣어 주세요. 배가 고파요. * @author 박재성(자바지기, javajigi@gmail.com) * @uml.dependency supplier="net.javajigi.user.dao.UserDAOFactory" stereotypes="Omondo::Access" */ public interface UserService extends ApplicationContextAware{ public void setUserDAO(UserDAO userDAO); public int addUser(User user) throws ExistedUserException; public int updateUser(User user); public int removeUser(String userId); public User findUser(String userId) throws UserNotFoundException; public List findUserList(); public boolean login(String userId, String password) throws PasswordMismatchException, UserNotFoundException; }UserServiceImpl.java
public class UserServiceImpl implements UserService,InitializingBean { protected final Log logger = LogFactory.getLog(getClass()); private UserDAO userDAO; private ApplicationContext context; //빈을 초기화 public void afterPropertiesSet() throws Exception{ if(userDAO == null) { throw new Exception(context.getMessage("instance.not.init", new Object[] {"UserDAO"}, null)); } } //////////////////세터 public void setUserDAO(UserDAO newUserDAO) { this.userDAO = newUserDAO; } public void setApplicationContext(ApplicationContext context)throws BeansException{ this.context= context; }UserServiceHelper.java
package net.javajigi.user.service; import javax.servlet.ServletContext; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; public class UserServiceHelper { private static final String USERSERVICE_BEANID = "userService"; public static UserService getUserService(ServletContext ctx) { WebApplicationContext wac= WebApplicationContextUtils.getRequiredWebApplicationContext(ctx); return (UserService) wac.getBean(USERSERVICE_BEANID); } }applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost:3306/jspdb?characterEncoding=euckr</value> </property> <property name="username"> <value>jspuser</value> </property> <property name="password"> <value>1234</value> </property> <property name="maxActive"> <value>20</value> </property> <property name="maxIdle"> <value>5</value> </property> <property name="maxWait"> <value>10000</value> </property> </bean> <bean id="userDAO" class="net.javajigi.user.dao.MySQLUserDAO"> <property name="dataSource"> <ref local="dataSource"/> </property> </bean> <bean id="userService" class="net.javajigi.user.service.UserServiceImpl"> <property name="userDAO"> <ref local="userDAO"/> </property> </bean> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <list> <value>Messages</value> </list> </property> </bean> <bean id="messageSourceAccessor" class="org.springframework.context.support.MessageSourceAccessor"> <constructor-arg> <ref local="messageSource"/> </constructor-arg> </bean> </beans>log4k.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%p - %C{1}.%M(%L) | %m%n"/> </layout> </appender> <logger name="org.apache"> <level value="WARN"/> </logger> <logger name="org.springframework"> <level value="DEBUG"/> </logger> <logger name="net.javajigi"> <level value="DEBUG"/> </logger> <root> <level value="WARN"/> <appender-ref ref="CONSOLE"/> </root> </log4j:configuration>
로그인하기
UserServiceImple.java 수정
관련메서드 : login, findUser(), 의존성
----MysqlDAOImpl
con = dataSource.getConnection();
@Override public User findUser(String userId) throws UserNotFoundException { if(logger.isDebugEnabled()) { logger.debug("findUser() 시작"); logger.debug("User ID :" + userId); } User user= null; try { user=userDAO.findUser(userId); }catch(DataAccessException e) {} if(user==null) { throw new UserNotFoundException(context.getMessage("user.notfound.exeption", new Object[] {userId},null)); } if(logger.isDebugEnabled()) { logger.debug(userId+"사용자정보:"+user); } if(logger.isDebugEnabled()) { logger.debug("findUser() 종로"); } return user; } .. .. @Override public boolean login(String userId, String password) throws PasswordMismatchException, UserNotFoundException { if(logger.isDebugEnabled()) { logger.debug("login() 시작"); logger.debug("User Id:" + userId); } User user= findUser(userId); if(!user.isMatchPassword(password)) { throw new PasswordMismatchException(context.getMessage("password.mismatch.exception", new Object[] {userId},null)); } if(logger.isDebugEnabled()) { logger.debug("login() 종료"); } return true; }loginAction.jsp 수정
<%@page contentType="text/html; charset=euc-kr" %> <%@page import="net.javajigi.user.model.User" %> <%@page import="net.javajigi.user.non.NonUserService" %> <%@page import="net.javajigi.user.service.UserService" %> <%@page import="net.javajigi.user.service.UserServiceHelper" %> <% try { String userId = request.getParameter("userId"); String password = request.getParameter("password"); //모델에 로그인 작업을 위임한다. //NonUserService service = NonUserService.getInstance(); //--> UserService service = UserServiceHelper.getUserService(application); service.login(userId, password); User user = service.findUser(userId); //정상적으로 로그인 되었을 경우 세션에 사용자 아이디 저장. session = request.getSession(); session.setAttribute("user", user); //모든 작업 완료후 이동할 페이지를 결정. if( user.isAdmin() ) { response.sendRedirect("user_list.jsp"); } else { response.sendRedirect("index.jsp"); } } catch (Exception e) { %> <!-- 에러가 발생할 경우 이전 페이지로 이동. --> <script language="javascript"> alert("<%= e.getMessage() %>"); history.back(); </script> <% } %>로그인하기 1
admin -->목록
javajigi --> 인덱스
회원가입하기
UserServiceImpl
관련메서드 : addUser();
public int addUser(User user) throws ExistedUserException { if(logger.isDebugEnabled()) { logger.debug("addUser() 시작"); logger.debug(("User : " + user); } if(userDAO.existedUser(user.getUserId())) { throw new ExistedUserException(context.getMessage("user.existed.exception", new Object[] {user.getUserId()} )); } int result=0; try { result = userDAO.insert(user); }catch(DataAccessException e) { } if(logger.isDebugEnabled()) { logger.debug("Added "+user.getUserId()+" in User System!!"); } if(logger.isDebugEnabled()) { logger.debug("addUser() 졸료"); } return result; }user_write_action.jsp -- 결과페이지
NonUserService --> UserService
<% //NonUserService service = NonUserService.getInstance(); //-->변경 UserService service = UserServiceHelper.getUserService(application); service.addUser(user); if( user.isAdmin() ) { response.sendRedirect("user_list.jsp"); } else { response.sendRedirect("index.jsp"); } %>
회원목록보기
-- UserServiceImpl
관련 메서드 : login, findUser(),
public List findUserList() { if(logger.isDebugEnabled()){ logger.debug("findUserList() 시작"); } List userList = null; try { userList = userDAO.findUserList(); }catch(DataAccessException e) { } if(logger.isDebugEnabled()) { if(userList != null) { logger.debug("User System 사용자 수 :"+userList.size()); }else { logger.debug("User System 사용자 수 : 0"); } } if(logger.isDebugEnabled()) { logger.debug("findUserList() 종료"); } return userList; }user_list.jsp --뷰
NonUserService --> UserService로
<% //모델을 이용하여 사용자 리스트를 가져온다. //NonUserService service = NonUserService.getInstance(); //-->변경 UserService service = UserServiceHelper.getUserService(application); List userList = service.findUserList(); %>
회원정보보기
user_view.jsp
<%@page contentType="text/html; charset=euc-kr" %> <%@page import="net.javajigi.user.model.User" %> <%-- <%@page import="net.javajigi.user.non.NonUserService" %> --%> <%@page import="net.javajigi.user.service.UserService" %> <%@page import="net.javajigi.user.service.UserServiceHelper" %> <%@ include file="loginCheck.jsp" %> <% String userId = request.getParameter("userId"); //NonUserService service = NonUserService.getInstance(); UserService service = UserServiceHelper.getUserService(application); User user = service.findUser(userId); %>user_modify.jsp
<%@page import="net.javajigi.user.service.UserServiceHelper"%> <%@page import="net.javajigi.user.service.UserService"%> <%@page contentType="text/html; charset=euc-kr" %> <%@page import="net.javajigi.user.model.User" %> <%-- <%@page import="net.javajigi.user.non.NonUserService" %> --%> <%@page import="net.javajigi.user.service.UserService" %> <%@page import="net.javajigi.user.service.UserServiceHelper" %> <%@ include file="loginCheck.jsp" %> <% String userId = request.getParameter("userId"); //NonUserService service = NonUserService.getInstance(); UserService service = UserServiceHelper.getUserService(application); User user = service.findUser(userId); %>UserServiceImpl.java
public int updateUser(User user) { if(logger.isDebugEnabled()) { logger.debug("updateUser() 시작"); logger.debug("User :" + user); } int result = 0; try { result = userDAO.update(user); }catch(DataAccessException e){} if(logger.isDebugEnabled()) { logger.debug("Update "+user.getUserId()+" in User System!!"); } if(logger.isDebugEnabled()) { logger.debug("updateUser() 졸료"); } return result; }user_modify_action.jsp
<%@page contentType="text/html; charset=euc-kr" %> <%@page import="net.javajigi.user.model.User" %> <%-- <%@page import="net.javajigi.user.non.NonUserService" %> --%> <%@page import="net.javajigi.user.service.UserService" %> <%@page import="net.javajigi.user.service.UserServiceHelper" %> <%@ include file="loginCheck.jsp" %> <% String userId = request.getParameter("userId"); String password = request.getParameter("password"); String name = request.getParameter("name"); String email = request.getParameter("email"); String admin = request.getParameter("admin"); User user = new User(); user.setUserId(userId); user.setPassword(password); user.setName(name); user.setEmail(email); if ( (admin!=null) && (admin.length()>0) ) { user.setAdmin(new Boolean(admin).booleanValue()); } //NonUserService service = NonUserService.getInstance(); UserService service = UserServiceHelper.getUserService(application); service.updateUser(user); response.sendRedirect("user_list.jsp"); %>
탈퇴하기
UserServiceImpl.java
public int removeUser(String userId) { if(logger.isDebugEnabled()) { logger.debug("remoceUser() 시작"); logger.debug("User ID:" +userId); } int result=0; try { result=userDAO.delete(userId); }catch(DataAccessException e) {} if(logger.isDebugEnabled()) { logger.debug("Removed" +userId+" in User System"); } if(logger.isDebugEnabled()) { logger.debug("remoceUser() 졸료"); } return result; }user_remoce_action.jsp
<%@page contentType="text/html; charset=euc-kr" %> <%-- <%@page import="net.javajigi.user.non.NonUserService" %> --%> <%@page import="net.javajigi.user.service.UserService" %> <%@page import="net.javajigi.user.service.UserServiceHelper" %> <%@ include file="loginCheck.jsp" %> <% String userId = request.getParameter("userId"); //NonUserService service = NonUserService.getInstance(); UserService service = UserServiceHelper.getUserService(application); service.removeUser(userId); response.sendRedirect("user_list.jsp"); %>'Spring' 카테고리의 다른 글
210706_1(iBatis) (0) 2021.07.06 210705_2(iBatis) (0) 2021.07.05 210702_1(Spring) (0) 2021.07.02 210630_1(Spring) (0) 2021.06.30 210629_1(Spring) (0) 2021.06.29