본문 바로가기
개발자/백엔드 웹 개발자 과정(국비)

[Spring]AOP, 메이븐

by 초응 2023. 2. 22.

[복습]

-DI (Dependency Injection)은 스프링의 핵심 개념으로 내가 사용해야하는 객체를 외부에서 주입받아 사용할 수 있는 기능이다. 

ㄴ 클래스와 클래스의 의존관계를 떨어뜨릴 수 있어 유지보수 및 확장에 용이한 프로그램을 만들 수 있다.

-주입에 대한 행위를 자바코드에서 직접하는 것이 아닌 spring이라는 프레임 워크를 이용한다.

 

[AOP (Aspct Oriented Programming)]

- 관점지향 프로그램의 약자로 객체지향 프로그래밍(OOP)에서 객체의 지향 내부에 기능을 관점적으로 분류시켜서 코드를 작성하는 개발 방법론이다.

- 핵심 기능과 공통관심사항(반복해서 사용해야하는)으로 구분한다.

 

-클래스

ㄴ정보클래스 : Exception등 정보를 담고 있다. 접미어 dto

ㄴ기능클래스:  Scanner등 행위를 담당. 접미어 dao

 

스프링 = AOP 프레임 워크라고도 불린다.

AOP는 사용자의 요청사항의 흐름을 훔치는 것. 공통관심사와 응답에 대한 요청도 AOP프레임 워크가 훔쳐간다.

핵심사항에서 공통관심사항을 실행할 수 있는것.

(사용자의 요청과 응답을 가로채는 행위 = AOP 다른곳에서는 인터셉터라고도 불린다.)

 

[AOP 용어] : 관점 분리를 시도하며 공통관심사항을 몰라도 개발이 가능하게 한다. 

-Aspect : 여러 객체에 공통으로 적용되는 기능( 공통기능)

ㄴ 어드바이스+포인트컷을 모듈화하여 애플리케이션에 포함되는 횡단기능

-JoinPoint : 실제 공통사항이 호출되는 시점.

-Advice :  조인포인트에서 수행되는 코드를 의미하며 공통관심사항에 해당

ㄴ Aspect를 언제 핵심 코드에 적용할지를 정의.

-PointCut : JoinPoint 중 어드바이스가 적용될 위치를 선별하는 기능

-Advisor : PointCut과 Advice를 합친것. 하나의 어드바이스와 하나의 포인트 컷으로 구성.

-Target : 핵심 기능을 담고 있는 모듈로 공통관심사를 부여할 대상.

-Weaving : Advice를 핵심 코드에 적용하는 것.

 

더보기

 #YongTimerAOP.java

package yong.aop;

import org.aspectj.lang.ProceedingJoinPoint;

public class YongTimerAOP {

		public Object yongTimerCheck(ProceedingJoinPoint jp) {
			System.out.println("[YongTimer 구동됨!]");
			System.out.println("핵심 기능 처리시간 체크 시작!");
			long start = System.currentTimeMillis();
			Object result = null;
			try {
				result = jp.proceed();
			} catch (Throwable e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			long end = System.currentTimeMillis();
			System.out.println("[핵심 기능 수행시간:"+(end-start)+"m/s]");
			System.out.println("[핵심 기능 처리시간 체크 종료.]");
			System.out.println("[YongTimerAOP 종료!!");
			
			return result;
		}
}

 

 

#applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans.xsd 
	http://www.springframework.org/schema/aop 
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">


	<bean id="yongTimerAop" class="yong.aop.YongTimerAOP"></bean>
	
	<aop:config>
		<aop:aspect id="timerAOP" ref="yongTimerAOP">
			<aop:pointcut expression="execution(* yong.hello.*.say*(..))" id="yongPoint"/>
		</aop:aspect>
	</aop:config>
	
	<bean id="messageBean" class="yong.hello.MessageBeanImple">
		<constructor-arg>
			<value>AOP</value>
		</constructor-arg>
		<property name="greeting" value="Hello"></property>
	</bean>
</beans>

 #MessageBeanImple.java

package yong.hello;

public class MessageBeanImple implements MessageBean {
	
	private String name;
	private String greeting;
	
	

	public MessageBeanImple(String name) {
		super();
		this.name = name;
	}



	public String getGreeting() {
		return greeting;
	}



	public void setGreeting(String greeting) {
		this.greeting = greeting;
	}



	@Override
	public void sayHello() {
		
		//핵심 시작
		try {
			Thread.sleep(2500);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		String msg = greeting + ","+name +"!";
		System.out.println(msg);
		//핵심 끝
	}

}

#HelloApp.java

package yong.hello;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class HelloApp {

	public static void main(String[] args) {
		String location[] = {"applicationContext.xml"};
		ApplicationContext factory = new ClassPathXmlApplicationContext(location);
		
		MessageBean bean = (MessageBean)factory.getBean("messageBean");
		bean.sayHello();
		
	}

}

 

[ApplicationContext 인터페이스]

1)org.springframework.context 패키지에 존재한다.

2)BeanFactory 인터페이스의 서브인터페이스다.

3) 여러개의 편리한 기능이 추가되었다.

- 메시지의 국제화

- 리소스로의 엑세스 수단 간편화

-이벤트 처리

-복수 context 로드 등

4) 빈 팩토리의 생성 코드의 변화.

//기존예
Resource resource = new ClassPathResource("applicetionContext.xml");
XmlBeanFactory factory = new XmlBeanFactory(resource);

//바뀐예 1
ApplicationContext factory;
factory = new FileSystemXmlApplicationContext("applicationContext.xml");

//바뀐예 2
String[] configLocations = new String[] {"applicationContext.xml");
ApplicationContext factory = new ClassPathXmlApplicationContext(configLocations);

 

프레임워크 들어가면서부터 xml에서 주석은 최대한 피한다.

 

 

[AOP execution 명시자 pointcut 표현식]

execution 명시자는 Advice를 적용할 메서드를 명시할 때 사용된다.

 

기본형식 execution(수식어패턴 리턴타입패턴 클래스이름 메소드명 (매개변수))

- 수식어 패턴 : 생략가능 , public 또는 protected

- 각 패턴은 *을 이용하여 모든 값을 표현할 수 있다. 또한 .. 을 이용하여 0개 이상이라는 의미를 표현할 수 있다.

 


 

코드에 대한 버전관리뿐만 아니라 라이브러리 관리에 대한 버전관리도 필요하다.
모두 같은 버전의 라이브러리를 사용하게 제시하는 것이 좋은 방법이다.

실제 라이브러리에 대한 빌드를 도와주는 프로그램으로 엔트 등 다양한 프로그램이 있다.

그 중 정부에서 표준기술로 채택한것이 메이븐이다.

 

단점은 인터넷이 연결되어있어야하며(최초 설치시), 라이브러리가 쉽게 깨지는 편이다.


1. New > Other> Maven> Maven Project

2.  Java EE Tools > Generate Deployment Descriptor Stub

3. 자바 버전 변경 (Properties > Project Facets > Java 를 11로 변경

4. 라이브러리 찾기

https://mvnrepository.com/

 

맞는 라이브러리 내용 복사하여 porm.xml  

<dependencies> 안에 추가</dependencies>

5. web.xml에 서블릿 추가 (클래스는 외울것)

6. 설정파일은 WEB-INF에 만들어야한다. (new>Other>Spring>Sprnig Bean Configuration File)

파일명은 위 서블릿에서 지정한 이름-servlet으로 해야한다. (파일명을 마음대로 생성할 경우 dispatcher이 못찾음)


1. db스키마설계

2. 디자인설계

3. dto,dao설계

4.컨트롤러 설계 (1. 명령어선정  / 2.커맨드클래스 작성)

 

[스프링 MVC 구성요소와 흐름]

DispatcherServlet : 클라이언트의 요청을 전달 받는다. 컨트롤러에게 클라이언트의 요청을 전달 하고, 컨트롤러가 리턴한 결과값을 View에 전달하여 알맞은 응답을 생성하도록 한다. (기존에 만들었던 controller)

HandlerMapping : 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지를 결정한다.(스프링에서만 제공)

컨트롤러(Controller) : 클라이언트의 요청을 처리한 뒤, 그 결과를 DispatcherServlet에 알려준다. 스트럿츠의 Action과 동일한 역할을 수행한다. (기존에 만들었던 Action)

ModelAndView : 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담는다.(request의 대체품)

ViewResolver : 컨트롤러의 처리 결과를 생성할 뷰를 결정한다.(스프링에서만 제공) 

뷰(View) : 컨트롤러의 처리 결과 화면을 생성한다. JSP나 Velocity 템플릿 파일 등을 뷰로 사용한다.

 

스프링 MVC 흐름도

스프링의 장점 : POJO방식을 지원(일반 클래스로 컨트롤러를 만들 수 있다.)

 

@어노테이션이라고함.

@Controller  지정. @RequestMapping지정

 

 

viewResover은 최초에 등록을 해줘야한다.


 

*사용자의 직접적인 접근 방지하는 방법

-WEB-INF는 웹의 전반적인 정보를 담고 있다.

jsp를 개발할때도 바로 WEB-APP이 아닌 사용자가 접근하지 못하도록 WEB-INF에서 관리한다.

 

 

setViewName에서 반복해서 사용할 접두어와 접미어는 미리 등록해놓는다.

 

그러면