ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 210702_1(Spring)
    Spring 2021. 7. 2. 18:20

    AOP적용하기

    --aop를 구현하는 또다른 방법

    joinpoint : 모든 결합점 (가능성포함)

    pointcut : 적용 결합점 (실제적용지점)

    aspect = advisor = pointcut + advice (횡단코드,공통코드)

     

     

    UserLoggingPointcut.java

    package net.javajigi.advice;
    
    import java.lang.reflect.Method;
    import org.springframework.aop.ClassFilter;
    import org.springframework.aop.support.StaticMethodMatcherPointcut;
    
    import net.javajigi.user.dao.MySQLUserDAO;
    import net.javajigi.user.service.UserServiceImpl;
    
    public class UserLoggingPointcut extends StaticMethodMatcherPointcut{
    	public boolean matches(Method method, Class cls) {
    		
    		/*
    		 * if("addUser".equals(method.getName())) { return true; }
    		 * 
    		 * return false;
    		 */
    		System.out.println("2222222222222메소드대조");
    		return true;
    	}
    	
    	public ClassFilter getClassFilter() {
    		return new ClassFilter() {
    			public boolean matches(Class cls) {
    				System.out.println("1111111111111 클래스대조");
    				return(cls==UserServiceImpl.class)||(cls==MySQLUserDAO.class);
    			}
    		};
    	}
    
    }
    

    UserLoggingAdvice.java

    package net.javajigi.advice;
    
    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    
    public class UserLoggingAdvice implements MethodInterceptor {
    	
    	protected final Log logger = LogFactory.getLog(getClass());
    	
    	public Object invoke(MethodInvocation invocation)throws Throwable{
    		String className = invocation.getThis().getClass().getName();
    		
    		if(logger.isDebugEnabled()) {
    			System.out.println("3333333333333333333메소드실행전");
    			logger.debug(className+"."+invocation.getMethod().getName()+"()"+" 시작!!");
    		
    		Object[] args = invocation.getArguments();
    		if((args != null) && (args.length>0)) {
    			for(int i = 0; i< args.length; i++ ) {
    				logger.debug("Argument["+i+"] :" + args[i]);
    			}
    		}
    		}
    		//Tatget 클래스의 메서드를 실행한다.
    		Object retVal = invocation.proceed();
    		
    		if(logger.isDebugEnabled()) {
    			logger.debug(className+"."+invocation.getMethod().getName()+"()"+"종료!!");
    		}
    		System.out.println("44444444444444444 메소드실행후");
    		return retVal;
    	}
    
    
    }
    

    applicationContext.xml

    	<bean id="userDAOTarget" class="net.javajigi.user.dao.MySQLUserDAO">
    		<property name="dataSource">
    			<ref local="dataSource"/>
    		</property>
    	</bean>
    
    <!-- 	<bean id="userDAO" class="net.javajigi.user.dao.MySQLUserDAO">
    		<property name="dataSource">
    			<ref local="dataSource" />
    		</property>
    	</bean> -->
    	<bean id="userDAO" class="org.springframework.aop.framework.ProxyFactoryBean">
    		<property name="target">
    			<ref local="userDAOTarget"/>
    		</property>
    		<property name="interceptorNames">
    			<list>
    				<value>userLoggingadvisor</value><!-- 참조 어드바이저 -->
    			</list>
    		</property>
    	</bean>
    	<bean id="userServiceTarget" class="net.javajigi.user.service.UserServiceImpl">
    		<property name="userDAO">
    			<ref local="userDAO"/>
    		</property>
    	</bean>
    
    
    <!-- 	<bean id="userService"
    		class="net.javajigi.user.service.UserServiceImpl">
    		<property name="userDAO">
    			<ref local="userDAO" />
    		</property>
    	</bean> -->
    	<bean id="userService" class="org.springframework.aop.framework.ProxyFactoryBean">
    		<property name="target">
    			<ref local="userServiceTarget"/>
    		</property>
    		<property name="interceptorNames">
    			<list>
    				<value>userLoggingadvisor</value><!-- 참조어드바이저 -->
    				<!-- 
    				<value>emailNotificatinAdvisor</value>
    				 -->
    			</list>
    		</property>
    	</bean>
    	
    	<!-- 어드바이져 설정(advisor = advice + pointcut) -->
    	<bean id="userLoggingadvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
    		<property name="advisor">
    			<ref local="userLoggingAdvisor"/>
    		</property>
    		<property name="pointcut">
    			<bean class="net.javajigi.advice.UserLoggingPointcut"/>
    		</property>
    	</bean>
    	
    	<bean id="userLoggingAdvice" class="net.javajigi.advice.UserLoggingAdvice"></bean>

    dispatcherServlet --프론트 컨트롤러

    클라이언트와 디스패쳐서블릿 매핑 -- Web.xmlHandlerMapping / VierResolver  --스프링xml 매핑Controller -- 액션클래스

     

     

     

     

    <load-on-startup>1</load-on-startup> ===>서플릿을 매핑할때 서블릿이 여러개있는경우 우선순위를 결정하는 것

                                                              숫자가 작을수록 우선순위가 높다. 보통 1,2,3 식이나 10,20,30 처럼부여

     

    스프링mvc환경파일의 이름을 서블릿명-servlet.xml로 만들면 자동매핑된다

    example-servlet.xml ==>스프링mvc환경파일

     

    뷰리졸버 

       InternalResourceViewResolver : 특징) 뷰문서가 /WEB-INF/view/xxx.jsp 같은 문서도 해석하고 출력이 가능하다.

     

    web.xml

    	<!-- DispatServlet의 이름이 "example"인데 이 경우 사용되는
    		Spring 설정파일은 WEB-INF/example-servlet.xml이 된다.
    	 -->
    	 <servlet>
    	 	<servlet-name>example</servlet-name>
    	 	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    	 	<load-on-startup>1</load-on-startup>
    	 </servlet>
    	 
    	 <servlet-mapping>
    	 	<servlet-name>example</servlet-name>
    	 	<url-pattern>*.do</url-pattern>
    	 </servlet-mapping>
    	

    example-servlet.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="beanNameUrlMapping"
    		class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
    
    	<!-- 요청 URL이 http://domainname/hello.do 요청은 HelloController가 처리한다 -->
    
    	<bean name="/hello.do" class="test.spring.mvc.HelloController" />
    	<bean name="/simple.do" class="test.spring.mvc.SimpleController" />
    
    	<!-- 뷰 리졸버 InternalResourceViewResolver는 다음과 같이 두개의 프로퍼티를 입력받는다. prefix 
    		- controller가 리턴한 뷰 이름 앞에 붙을 접두어 suffix - controller가 리턴한 뷰 이름 뒤에 붙을 확장자 
    		예를 들어, HelloController가 처리 결과를 보여줄 뷰의 이름으로 "hello"를 리턴했다고 하자. 이 경우 InternalResourceViewResolver에 
    		의해 사용되는 뷰는 "/view/hello.jsp"가된다. 따라서, /view/hello.jsp가 생성한 응답 결과 화면이 클라이언트에 
    		전달된다. -->
    	<bean id="viewResolver"
    		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    		<property name="prefix" value="/view/" />
    		<property name="suffix" value=".jsp" />
    	</bean>
    
    </beans>

    HelloController.java

    package test.spring.mvc;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.AbstractController;
    
    public class HelloController extends AbstractController{
    	/* 
    	 * AbstractController 클래스의 handleRequest() 메소드는
    	 * 내부적으로 필요한 작업을 수행한 뒤, handleRequestInternal()메소드를 호출한다.
    	 * 따라서 AbstractController 클래스를 상속받는 경우에는
    	 * handleRequest() 메소드가 아닌 handleRequestInternal()메소드를 구현해주어야 한다.
    	 */
    	
    	@Override
    	protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)throws Exception{
    		ModelAndView view = new ModelAndView("hello");
    		view.addObject("greeting", "안녕하세요");
    		
    		return view;
    	}
    
    }
    

    SimpleController.java

    package test.spring.mvc;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    
    public class SimpleController implements Controller {
    	
    	/* Controller를 구현하는 가장 단순한 방법은 Controller인터페이스를 구현한뒤,
    	 * handleRequest()메소드를 알맞게 구현하는 것이다
    	 * 아래코드는 구현 예이다.
    	 */
    	
    	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)throws Exception{
    		//request를 사용하여 클라이언트 요청 분석 후
    		//클라이언트 요청에 따른 알맞은 처리
    		
    		ModelAndView mav = new ModelAndView("simple"); //이동할 뷰 이름
    		mav.addObject("simplehi", "심플하게 안녕하세요");
    		//뷰 페이지에서 ${greering}로 호출하여 사용함
    		return mav;
    	}
    
    }
    

    hello.jsp

    <%@ page language="java" contentType="text/html; charset=EUC-KR"
        pageEncoding="EUC-KR"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="EUC-KR">
    <title>Insert title here</title>
    </head>
    <body>
    
    <strong>${greeting}</strong>
    </body>
    </html>

    simple.jsp

    <%@ page language="java" contentType="text/html; charset=EUC-KR"
        pageEncoding="EUC-KR"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="EUC-KR">
    <title>Insert title here</title>
    </head>
    <body>
    <strong>${simplehi}</strong>
    </body>
    </html>

    chapter1에 SpringMVC적용하기

    1. 백업해두기~

     

    2.web.xml : mvc 서블릿 설정

     

    3. 경로매핑계획 

    인덱스 로그인 유저리스트 유저모디파이 유저뷰 유저라이트 .do 매핑

    xxxx.user --> 패키지.컨트롤러클래스 

     

    3-1) userServlet-servlet.xml HM,VR 설정

     

    4. Controller클래스 구현

     방법 - xxx_action.jsp 의 내용이 ---> controller로 옮겨가야한다. 

              xxx_action.jsp는 컨트롤이 실행된 결과페이지이다.

     

    주의) return mav가 아니라 return null; 하게되면 오류없이 화면이 하얗게 나온다 ㅋ

    참조) 스프링 환경문서들 내부의 id로 설정된 인스턴스들은 모든 환경파일에서 공유가된다.

     

    했던걸 기억할수있을까... 주말에 수련 ㄱ

     

    'Spring' 카테고리의 다른 글

    210706_1(iBatis)  (0) 2021.07.06
    210705_2(iBatis)  (0) 2021.07.05
    210701_1(Spring_DI적용하기)  (0) 2021.07.01
    210630_1(Spring)  (0) 2021.06.30
    210629_1(Spring)  (0) 2021.06.29
Designed by Tistory.