ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.