SlideShare a Scribd company logo
1 of 14
Download to read offline
스프링프레임워크 & 마이바티스
(Spring Framework, MyBatis)
3-8. @AspectJ Annotation을 이용한 AOP
 Spring AOP와 JDK 1.5 이상인 경우 어노테이션을 이용하여 어드바이스를 선언 할 수 있다.
 @AspectJ 방식은 AspectJ 5 버전에서 소개되었으며, Spring은 2.0 버전부터 AspectJ 5 어노테
이션을 지원한다
 타겟 메소드에 어드바이스를 적용할 때는 AspectJ의 위빙 메커니즘이 아니라 자체 프록시 메
커니즘을 이용한다.
 @AspectJ를 사용하기 위해서 XML설정 파일에 <aop:aspectj-autoproxy/> 태그를 설정에 추
가해야하며 클래스에@Aspect 어노테이션을 추가하여 Aspect를 생성해야 한다.
 @Pointcut으로 포인트컷을 정의하거나 @Before, @After등 충고를 정의할 때 AspectJ
Expression을 정의하여 포인트컷을 지정할 수 있다.
3-8-1. @AspectJ Annotation을 이용한 AOP – Aspect 선언
 자바설정을 이용하여 AspectJ를 사용하는 방법
@Configuration
@EnableAspectJAutoProxy
public class AppConfig { }
@Aspect
public class UserAspect {
// USerService+ : 인스턴스의 타입이 UserService 이거나 하위타입을 의미
@Before("execution(* x.y.z.UserService+.*(..))")
public void userAdvice(){
System.out.println("find my advice before your task.");
}
}
@Configuration
@EnableAspectJAutoProxy
public class AspectJAutoProxyConfig {
@Bean
public UserService userService(){
return new UserService();
}
@Bean
public UserAspect userAspect(){
return new UserAspect();
}
}
 XML설정을 이용하여 AspectJ를 사용하는 방법
<aop:aspectj-autoproxy/>
<aop:aspectj-autoproxy/>
<bean id="myAspect" class=“ojc.aop.OjcAspect“/>
package ojc.aop;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class OjcAspect { …… }
위 XML절정은 @Component를 이용하면 아래처럼 가능하다.
(XML에서 빈으로 정의하지 않을 경우 @Component, @Service, @Named와 같은 Annotation을
기술하면 된다.)
<aop:aspectj-autoproxy/>
package ojc.aop;
import org.aspectj.lang.annotation.Aspect;
@Aspect
@Component
public class OjcAspect { …… }
3-8-2. @AspectJ Annotation을 이용한 AOP – Advice 선언
Before advice : Before advice는 @Before 어노테이션을 사용한다.
After returning advice : After returing 충고는 정상적으로 메소드가 실행될 때 수행된다. After
returning 충고는 @AfterReturing 어노테이션을 사용한다.
After throwing advice : After throwing 충고는 메소드가 수행 중 예외사항을 반환하고 종료하는
경우 수행된다. After throwing 충고는 @AfterThrowing 어노테이션을 사용한다.
After (finally) advice : After (finally) 충고는 메소드 수행 후 무조건 수행된다. After (finally) 충고
는 @After 어노테이션을 사용한다.
Around advice : Around 충고는 메소드 수행 전후에 수행된다. Around 충고는 @Around 어노테
이션을 사용한다.
@Around 충고는 대상 메소드의 반환 값(return value)를 변경 가능하지만, After returning 충고
는 반환 값을 참조 가능하지만 변경할 수는 없다.
 사전충고(@Before)
@Before 어노테이션을 사용하며 포인트컷 메소드가 실행되기 전에 충고가 적용된다.
@Aspect
public class BeforeExample {
@Before(“x.y.MyClass.dataAccessOperation()")
public void doAccessCheck1() {
// ...
}
@Before("execution(* x.y.MyClass.*(..))")
public void doAccessCheck2() {
// ...
}
}
 사후충고(@AfterReturning)
@AfterReturning 어노테이션을 사용하며 포인트컷 메소드가 리턴(정상종료)된 후 충고가 적용된
다.
@Aspect
public class AfterReturningExample {
@AfterReturning(“x.y.MyClass.dataAccessOperation()")
public void doAccessCheck1() {
// ...
}
// 리턴값을 retVal로 받음, returning 속성의 값은 어드바이스 메소드의 파라미터와 이름이
// 같아야 한다.
@AfterReturning(
pointcut=“x.y.MyClass.dataAccessOperation()",
returning="retVal")
public void doAccessCheck2(Object retVal) {
// ...
}
}
 예외충고(@AfterThrowing)
@AfterThrowing 어노테이션을 사용하며 포인트컷 메소드에서 예외가 발생할 때 충고가 적용된
다.
@Aspect
public class AfterThrowingExample {
@AfterThrowing(“x.y.MyClass.dataAccessOperation()")
public void doRecoveryActions1() {
// ...
}
// 리턴값을 retVal로 받음, throwing 속성의 값은 어드바이스 메소드의 파라미터와 이름이
// 같아야 하며 예외가 그 변수로 넘어온다.
@AfterThrowing(
pointcut=“x.y.MyClass.dataAccessOperation()",
throwing="ex")
public void doRecoveryActions2(DataAccessException ex) {
// ...
}
}
 사후충고(@After)
@After 어노테이션을 사용한다. 포인트컷 메소드가 실행된 후(정상종료 여부와 관계없이) 충고가
적용된다.
@Aspect
public class AfterExample {
@After(“x.y.MyClass.dataAccessOperation()")
public void doReleaseLock() {
// ...
}
}
 주변충고(@Around)
@Around 어노테이션을 사용하며 포인트컷 메소드가 실행 되기 전, 리턴 된 후에 충고가 적용된
다.
어드바이스 메소드의 첫번째 파라미터는 ProceedingJoiinPoint가 되어야 한다. proceed() 메소드를
통해 타겟 클래스의 원래 메소드를 호출하고, proceed() 메소드를 호출하면서 Object[] 형태로 파
라미터를 전달할 수도 있다. proceed() 메소드는 기술 안할수도 있고, 한번, 여러 번 호출할 수도
있으므로 원래 메소드에 대한 여러 형태의 제어가 가능하다. 물롞 원래 메소드의 리턴 값을 바꿔
치기 하는 것도 가능하다.
@Aspect
public class AroundExample {
@Around(“x.y.MyClass.businessService()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
// start stopwatch
Object retVal = pjp.proceed();
// stop stopwatch
return retVal;
}
}
[참고] StopWatch 사용법
1.System 클래스의 currentTimeMillis() 메소드 이용
1970년 1월 1일 자정부터 현재까지 카운트된 시간을 ms(milliseconds) 단위로 표시한다.
long startTime = System.currentTimeMillis();
// 특정 로직이나 메소드 호출
long elapsedTime = System.currentTimeMillis() - startTime;
System.out.println(elapsedTime + " ms");
2. System 클래스의 nanoTime() 메소드 이용
nanoTime 메서드는 현재 Java 가상머싞의 high-resolution 시간값을 ns(nano sec.) 단위로 반환한
다.
long startTime = System.nanoTime();
// 특정 로직이나 메소드 호출
long endtime = System.nanoTime();
long elapsedTime = startTime - endtime;
System.out.println(elapsedTime + " ns");
3. Common-lang의 StopWatch 클래스 start(), stop() 메소드 이용
import org.apache.commons.lang.time.StopWatch;
stopWatch.start();
doSomeTask(5000);
stopWatch.stop();
System.out.println("Time: " + stopWatch.getTime()); // Time: 5000
4. 스프링 프레임워크의 StopWatch 클래스의 start(), stop() 이용
import org.springframework.util.StopWatch;
stopWatch.start();
List<Tuple> emps = empService.getEnameDnameTop5(deptno);
stopWatch.stop();
log.info(">>>>> getEnameDnameTop5(Time) : " + stopWatch.getTotalTimeSeconds());
3-8-3. @AspectJ Annotation을 이용한 AOP – Pointcut 선언
 @Pointcut 어노테이션을 사용한다.
@Pointcut("execution(* onj.aop.*.*(..))") // pointcut expression
private void mypointcut() { } // pointcut signature
@Before("mypointcut ()")
public void myBeforeAdvice(JoinPointjoinPoint, int intValue) { ... }
 포인트컷 지정자(Pointcut Designators)
execution: 메소드 실행 결합점(join points)과 일치시키는데 사용된다.
within: 특정 타입에 속하는 결합점을 정의한다.
this: 빈 참조가 주어짂 타입의 인스턴스를 갖는 결합점을 정의한다.
target: 대상 객체가 주어짂 타입을 갖는 결합점을 정의한다.
args: 인자가 주어짂 타입의 인스턴스인 결합점을 정의한다.
@target: 타겟 클래스가 주어짂 타입의 어노테이션을 갖는 결합점을 정의한다.
@args: 전달된 인자의 런타임 타입이 주어짂 타입의 어노테이션을 갖는 결합점을 정의한다.
@within: 주어짂 어노테이션을 갖는 타입 내 결합점을 정의한다.
@annotation: 실행 메소드가 인자로 주어짂 어노테이션을 갖는 결합점을 정의한다.
//메소드가 어떤 패키지에 있던지 public 메소드라면 충고적용
@Pointcut("execution(public * *(..))")
private void anyPublicOperation() {}
//메소드가 onj 패키지 또는 부 패키지안의 타입이라면 충고적용
@Pointcut("within(onj..*)")
private void inTrading() {}
//위 두포인트컷의 AND 조건을 만족하는 경우 충고가 적용
@Pointcut("anyPublicOperation() && inTrading()")
private void tradingOperation() {}
//메소드가 onj.dao 패키지 또는 부 패키지안의 타입이라면 충고적용
@Pointcut("within(onj.dao..*)")
public void inDataAccessLayer() {}
[Aspect 클래스 작성 예]
@Aspect //애스팩트 클래스임을 표시
public class MyAdvice {
@Pointcut("execution(* onj.edu.aop11..hello*(int)) && args(intValue)")
public void helloExec(int intValue) {}
@Pointcut("bean(myDependency*)")
public void inMyDependency() {}
//@AspectJ 는 &&, aop 네임스페이스는 and
@Before("helloExec(intValue) && inMyDependency()")
public void myBeforeAdvice(JoinPointjoinPoint, int intValue) { ... }
//Around Advice
@Around("helloExec(intValue)")
public myAroundAdvice(ProceedingJoinPoint joinPoint, int intValue) throws Throwable { ... }
//......
}
3-8-4. @AspectJ Annotation을 이용한 AOP – aspectj expression
execution(public * *(..)) : public 메소드가 포인트 컷
execution(* onj.spring.aop.*.*(..)) : onj.spring.aop 패키지의 모든 메소드가 포인트 컷
execution(* onj.spring.aop..*.*(..)) : onj.spring.aop 패키지와 하위 패키지의 모든 메소드가 포인
트 컷
execution(public void insert*(..)) : public에 리턴값, 패키지명 없고 메서드 이름은 insert로 시작,
인자 값은 0개 이상인 메서드가 포인트 컷
execution(* onj.spring.aop.*.*()) : 리턴형 관계없고 onj.spring.aop 패키지의 모든 클래스, 인자
값이 없는 모든 메서드가 포인트 컷
execution(* onj.spring.aop..*.*(..)) : 리턴형 관계없고 onj.spring.aop 패키지 및 하위 패키지에 있
는 모든 클래스, 인자값이 0개 이상인 메서드가 포인트 컷
execution(* delete*(*)) : 메서드 이름이 delete으로 시작하는 인자 값이 1개인 메서드가 포인트
컷
execution(* delete*(*,*)) : 메서드 이름이 delete로 시작하는 인자 값이 2개인 메서드가 포인트
컷
execution(* onj*(Integer, ..)) : 메서드 이름이 onj로 시작하고 첫번째 인자 값의 타입이 Integer, 1
개 이상의 매개변수를 갖는 메서드가 포인트 컷
within(onj.spring.aop.*) : onj.spring.aop 패키지 내의 모든 메소드가 포인트 컷
within(onj.spring.aop..*) : onj.spring.aop패키지 및 하위 패키지의 모든 메소드가 포인트 컷
bean(oraclejava*) : 이름이 oraclejava로 시작되는 모든 빈의 메소드가 포인트 컷
bean(*dataSource) || bean(*DataSource) : 빈 이름이 “dataSource” 나 “DataSource” 으로 끝나는
모든 빈의 메소드가 포인트 컷
!bean(onjoraclejava) : onjoraclejava빈을 제외한 모든 빈의 메소드가 포인트
this(onj.aop.SmallMartInterface) : 현재 실행중인 인스턴스가 SmallMartInterface 이름의 빈과
타입이 같은 경우 포인트컷, SmallMart인터페이스를 구현했다면 모든 메소드가 포인트컷
target(onj.aop.SmallMartInterface) : 타겟 오브젝트가 SmallMartInterface를 구현했다면 모든 메
소드가 포인트컷
args(java.io.Serializable) : 메소드가 매개변수가 하나이고 Serializable인터페이스를 타입이라면
포인트컷
@target(org.springframework.transaction.annotation.Transactional) : 타겟 오브젝트가
org.springframework.transaction.annotation.Transactional 어노테이션(@Transactional)을 가짂다면
포인트컷
@within(org.springframework.transaction.annotation.Transactional) : 타겟 오브젝트의 선언된
타입이 @Trtansactional 어노테이션을 가짂다면 포인트컷
@annotation(org.springframework.transaction.annotation.Transactional) : 실행 메소드가
@Transactional 어노테이션을 가짂다면 포인트컷
@args(x.y.AnnotationRequired) : 파라미터를 하나 가지며 넘어오는 아규먼트의 런타임 타입이
@AnnotationRequired 타입이라면 포인트컷
3-8-5. @AspectJ Annotation을 이용한 AOP – 예제
 이전에 작성한 AOP NameSpace를 이용한 SmallMart 예제를 @AspectJ Annotation을 이용하
여 변경해 보자.
STS에서
1. File -> New -> Spring Starter Project
Name : demo-smallmart3
Type : MAVEN
Package : onj.hello.aop3
다음화면에서 Core -> AOP 체크
2. @Inject를 사용하기 위해 의존성 추가
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
[SmallMartInterface.java]
package onj.hello.aop3;
public interface SmallMartInterface {
public String getProducts(String productName) throws Exception;
}
[SmallMart.java]
package onj.hello.aop3;
@Component
public class SmallMart implements SmallMartInterface {
public String getProducts(String productName) throws Exception {
return "[Target Method]getProduct()..." + productName;
//throw new Exception("error...");
}
}
[SmallMartAspect.java]
package onj.hello.aop3;
@Component
@Aspect
public class SmallMartAspect {
@Pointcut("execution(* onj.hello.aop3.SmallMartInterface.getProducts(..))")
public void getProduct1() { }
@Pointcut("args(String)")
public void getProduct2() { }
// 사전충고 : 타겟클래스의 메소드 실행 전 충고실행
@Before("getProduct1() && getProduct2()")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Before Advice --> logBefore()...");
joinPoint.getSignature().getName();
}
// 사후충고(after) : 타겟클래스의 메소드 실행후 충고 실행, 오류가 발생해도 실행
@After("getProduct1()")
public void logAfter(JoinPoint joinPoint) {
System.out.println("After Advice --> logAfter()...");
joinPoint.getSignature().getName();
}
// 사후충고(after returning) : 타겟클래스의 메소드 정상 리턴된 후 실행
// returning 속성으로 리턴값을 받을 수 있다.
@AfterReturning(pointcut = "getProduct1()", returning = "result")
public void logAfterReturning(JoinPoint joinPoint, Object result) {
System.out.println("AfterReturning Advice --> logAfterReturning()...");
joinPoint.getSignature().getName();
System.out.println("return value is " + result);
}
// 주변충고 : 타겟클래스의 메소드 실행 전후에 충고 실행
@Around("getProduct1()")
public String logAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Around Advice[전] --> logAround()...");
joinPoint.getSignature().getName();
Arrays.toString(joinPoint.getArgs());
// 타겟 객체의 원래 메소드 실행
String s = (String) joinPoint.proceed();
System.out.println("Around Advice[후] --> logAround()...");
// 원래 타겟클래스의 메소드 리턴값을 대체시킴
return "이문장으로원래 타겟메소드(getProducts) 리턴이 대체됨!!";
}
// 예외충고 : 예외가 발생될때 충고 실행
@AfterThrowing(pointcut = " getProduct1()", throwing = "error")
// error는 실행되는 메소드에서 던지는 예외객체
public void logAfterThrowing(JoinPoint joinPoint, Throwable error) {
System.out.println("예외충고 --> logAfterThrowing()...");
joinPoint.getSignature().getName(); System.out.println("Exception " + error);
}
}
[DemoSmallMart3Application.java]
package onj.hello.aop3;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;import
org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@SpringBootApplication
public class DemoSmallmart3Application implements CommandLineRunner {
public static void main(String[] args) throws Exception {
SpringApplication.run(DemoSmallmart3Application.class, args);
}
@Inject
private SmallMartInterface smallMart;
public void run(String... args) throws Exception {
this.smallMart.getProducts("과자");
}
}
3-9. 스프링 선언적 AOP에 대한 고려사항(@AspectJ vs XML)
 스프링 애플리케이션이 XML 기반이라면 aop 네임스페이스를 이용 하는것이 적절하다. 이렇
게 하면 DI, AOP 설정 방식을 일관되게 유지할 수 있기 때문이다.
 애플리케이션이 어노테이션 기반이라면 @AspectJ 어노테이션을 사용 한다. @AspectJ 어노
테이션을 사용하는 경우 모듈 안에 어스펙트 관련 정보를 캡슐화 할 수 있기 때문에 유지보
수가 용이하다.
 aop 네임스페이스와 @AspectJ 어노테이션의 차이
 포인트컷 구문이 조금 다르다. (aop 네임스페이스는 “and”, @AspectJ 어노테이션에서는
“&&”)
 aop 네임스페이스에서는 „싱글톤‟ 방식의 애스펙트 인스턴스화 모델만 지원
 @AspectJ 어노테이션 방식에서는 두 개의 포인트컷 정의 (helloExec(intValue) &&
inMyDependency()) 를 사전충고, 주변 충고에서 조합할 수 있지만 aop 네임스페이스에
서는 조건을 조합한 포인트 컷을 새로 생성해야 한다.
 @AspectJ or XML for Spring AOP?
 AspectJ Annotation 방식
@Pointcut(execution(* get*()))
public void a() {}
@Pointcut(execution(org.xyz.Account+ *(..))
public void b() {}
@Pointcut(a() && b())
public void complex() {}
 aop NameSpace를 이용한 XML 방식()
위에서 정의한 complext Pointcut은 정의가 불가능 하다.
<aop:pointcut id=“a" expression="execution(* get*())"/>
<aop:pointcut id=“b" expression="execution(org.xyz.Account+ *(..))"/>

More Related Content

What's hot

What's hot (20)

(Spring Data JPA)식별자(@Id, Primary Key) 자동 생성, @GeneratedValue의 strategy 속성,Ge...
(Spring Data JPA)식별자(@Id, Primary Key) 자동 생성, @GeneratedValue의 strategy 속성,Ge...(Spring Data JPA)식별자(@Id, Primary Key) 자동 생성, @GeneratedValue의 strategy 속성,Ge...
(Spring Data JPA)식별자(@Id, Primary Key) 자동 생성, @GeneratedValue의 strategy 속성,Ge...
 
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
 
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
 
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
 
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#21.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
(스프링JDBC와 Spring Data JPA비교)Spring JDBC와 JPA를 간단한 CRUD 예제로 만들면서 비교해보자.
(스프링JDBC와 Spring Data JPA비교)Spring JDBC와 JPA를 간단한 CRUD 예제로  만들면서 비교해보자.(스프링JDBC와 Spring Data JPA비교)Spring JDBC와 JPA를 간단한 CRUD 예제로  만들면서 비교해보자.
(스프링JDBC와 Spring Data JPA비교)Spring JDBC와 JPA를 간단한 CRUD 예제로 만들면서 비교해보자.
 
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
 
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
 
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
(C#,닷넷구조체강좌)구조체 개요 및 간단한 예제_닷넷,C#, WPF, 자마린실무교육
(C#,닷넷구조체강좌)구조체 개요 및 간단한 예제_닷넷,C#, WPF, 자마린실무교육(C#,닷넷구조체강좌)구조체 개요 및 간단한 예제_닷넷,C#, WPF, 자마린실무교육
(C#,닷넷구조체강좌)구조체 개요 및 간단한 예제_닷넷,C#, WPF, 자마린실무교육
 
자바모델 클래스에 날개를달자_롬복(Lombok)
자바모델 클래스에 날개를달자_롬복(Lombok)자바모델 클래스에 날개를달자_롬복(Lombok)
자바모델 클래스에 날개를달자_롬복(Lombok)
 
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
 
(Spring Data JPA)게시판 리스트보기_오라클, 스프링부트,페이지나누기
(Spring Data JPA)게시판 리스트보기_오라클, 스프링부트,페이지나누기(Spring Data JPA)게시판 리스트보기_오라클, 스프링부트,페이지나누기
(Spring Data JPA)게시판 리스트보기_오라클, 스프링부트,페이지나누기
 
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
#32.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#32.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#32.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#32.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
 
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
 
#27.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#27.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#27.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#27.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
 
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
 
5.Spring IoC&DI(DI와 관련된 어노테이션)
5.Spring IoC&DI(DI와 관련된 어노테이션)5.Spring IoC&DI(DI와 관련된 어노테이션)
5.Spring IoC&DI(DI와 관련된 어노테이션)
 

Viewers also liked

Viewers also liked (7)

#18.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#18.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#18.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#18.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
#30.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#30.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#30.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#30.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
 
#36.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_재직자환급교육,실업자교육,국비지원교육, 자바교육,구...
#36.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_재직자환급교육,실업자교육,국비지원교육, 자바교육,구...#36.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_재직자환급교육,실업자교육,국비지원교육, 자바교육,구...
#36.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_재직자환급교육,실업자교육,국비지원교육, 자바교육,구...
 
#29.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#29.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#29.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#29.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
 
#31.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#31.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#31.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#31.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
 
#11.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원학원,재직자/실업자교육학원,스프링교육,마이바...
#11.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원학원,재직자/실업자교육학원,스프링교육,마이바...#11.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원학원,재직자/실업자교육학원,스프링교육,마이바...
#11.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원학원,재직자/실업자교육학원,스프링교육,마이바...
 
#34.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자교육,국...
#34.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자교육,국...#34.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자교육,국...
#34.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자교육,국...
 

Similar to (국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)

[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
NAVER Engineering
 
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Implementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4UImplementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4U
sys4u
 

Similar to (국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis) (20)

Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 /구로오라클학원/ 구로자바학원/ 구로디지털단지역
Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 /구로오라클학원/ 구로자바학원/ 구로디지털단지역Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 /구로오라클학원/ 구로자바학원/ 구로디지털단지역
Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 /구로오라클학원/ 구로자바학원/ 구로디지털단지역
 
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
 
E government framework
E government frameworkE government framework
E government framework
 
[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumer
 
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
 
Xe hack
Xe hackXe hack
Xe hack
 
Implementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4UImplementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4U
 
One-day-codelab
One-day-codelabOne-day-codelab
One-day-codelab
 
PHP 7의 새로운 특징과 기능 요약
PHP 7의 새로운 특징과 기능 요약PHP 7의 새로운 특징과 기능 요약
PHP 7의 새로운 특징과 기능 요약
 
12.AOP 충고(advice)
12.AOP 충고(advice)12.AOP 충고(advice)
12.AOP 충고(advice)
 
React 실무활용 이야기
React 실무활용 이야기React 실무활용 이야기
React 실무활용 이야기
 
Sonarqube 20160509
Sonarqube 20160509Sonarqube 20160509
Sonarqube 20160509
 
8.Spring DI_3
8.Spring DI_38.Spring DI_3
8.Spring DI_3
 
Java(3/4)
Java(3/4)Java(3/4)
Java(3/4)
 

More from 탑크리에듀(구로디지털단지역3번출구 2분거리)

(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)
[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)
[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정
[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정
[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정
[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정
[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios 3.3.5 추가적인 사항
[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios  3.3.5 추가적인 사항[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios  3.3.5 추가적인 사항
[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios 3.3.5 추가적인 사항
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...
3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...
3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)
5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)
5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
탑크리에듀(구로디지털단지역3번출구 2분거리)
 

More from 탑크리에듀(구로디지털단지역3번출구 2분거리) (20)

자마린.안드로이드 기본 내장레이아웃(Built-In List Item Layouts)
자마린.안드로이드 기본 내장레이아웃(Built-In List Item Layouts)자마린.안드로이드 기본 내장레이아웃(Built-In List Item Layouts)
자마린.안드로이드 기본 내장레이아웃(Built-In List Item Layouts)
 
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
 
자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러
자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러
자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러
 
[IT교육/IT학원]Develope를 위한 IT실무교육
[IT교육/IT학원]Develope를 위한 IT실무교육[IT교육/IT학원]Develope를 위한 IT실무교육
[IT교육/IT학원]Develope를 위한 IT실무교육
 
[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)
[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)
[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)
 
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
 
[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정
[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정
[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정
 
[정보처리기사자격증학원]정보처리기사 취득 양성과정(국비무료 자격증과정)
[정보처리기사자격증학원]정보처리기사 취득 양성과정(국비무료 자격증과정)[정보처리기사자격증학원]정보처리기사 취득 양성과정(국비무료 자격증과정)
[정보처리기사자격증학원]정보처리기사 취득 양성과정(국비무료 자격증과정)
 
[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정
[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정
[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정
 
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
 
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
 
[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios 3.3.5 추가적인 사항
[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios  3.3.5 추가적인 사항[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios  3.3.5 추가적인 사항
[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios 3.3.5 추가적인 사항
 
3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...
3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...
3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...
 
5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)
5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)
5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)
 
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...
 
(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌
(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌
(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌
 
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...
 
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
 
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...
 
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
 

(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)

  • 1. 스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis) 3-8. @AspectJ Annotation을 이용한 AOP  Spring AOP와 JDK 1.5 이상인 경우 어노테이션을 이용하여 어드바이스를 선언 할 수 있다.  @AspectJ 방식은 AspectJ 5 버전에서 소개되었으며, Spring은 2.0 버전부터 AspectJ 5 어노테 이션을 지원한다  타겟 메소드에 어드바이스를 적용할 때는 AspectJ의 위빙 메커니즘이 아니라 자체 프록시 메 커니즘을 이용한다.  @AspectJ를 사용하기 위해서 XML설정 파일에 <aop:aspectj-autoproxy/> 태그를 설정에 추 가해야하며 클래스에@Aspect 어노테이션을 추가하여 Aspect를 생성해야 한다.  @Pointcut으로 포인트컷을 정의하거나 @Before, @After등 충고를 정의할 때 AspectJ Expression을 정의하여 포인트컷을 지정할 수 있다. 3-8-1. @AspectJ Annotation을 이용한 AOP – Aspect 선언  자바설정을 이용하여 AspectJ를 사용하는 방법 @Configuration @EnableAspectJAutoProxy public class AppConfig { } @Aspect public class UserAspect { // USerService+ : 인스턴스의 타입이 UserService 이거나 하위타입을 의미 @Before("execution(* x.y.z.UserService+.*(..))") public void userAdvice(){ System.out.println("find my advice before your task."); } } @Configuration
  • 2. @EnableAspectJAutoProxy public class AspectJAutoProxyConfig { @Bean public UserService userService(){ return new UserService(); } @Bean public UserAspect userAspect(){ return new UserAspect(); } }  XML설정을 이용하여 AspectJ를 사용하는 방법 <aop:aspectj-autoproxy/> <aop:aspectj-autoproxy/> <bean id="myAspect" class=“ojc.aop.OjcAspect“/> package ojc.aop; import org.aspectj.lang.annotation.Aspect; @Aspect public class OjcAspect { …… } 위 XML절정은 @Component를 이용하면 아래처럼 가능하다. (XML에서 빈으로 정의하지 않을 경우 @Component, @Service, @Named와 같은 Annotation을 기술하면 된다.) <aop:aspectj-autoproxy/> package ojc.aop; import org.aspectj.lang.annotation.Aspect; @Aspect @Component public class OjcAspect { …… } 3-8-2. @AspectJ Annotation을 이용한 AOP – Advice 선언
  • 3. Before advice : Before advice는 @Before 어노테이션을 사용한다. After returning advice : After returing 충고는 정상적으로 메소드가 실행될 때 수행된다. After returning 충고는 @AfterReturing 어노테이션을 사용한다. After throwing advice : After throwing 충고는 메소드가 수행 중 예외사항을 반환하고 종료하는 경우 수행된다. After throwing 충고는 @AfterThrowing 어노테이션을 사용한다. After (finally) advice : After (finally) 충고는 메소드 수행 후 무조건 수행된다. After (finally) 충고 는 @After 어노테이션을 사용한다. Around advice : Around 충고는 메소드 수행 전후에 수행된다. Around 충고는 @Around 어노테 이션을 사용한다. @Around 충고는 대상 메소드의 반환 값(return value)를 변경 가능하지만, After returning 충고 는 반환 값을 참조 가능하지만 변경할 수는 없다.  사전충고(@Before) @Before 어노테이션을 사용하며 포인트컷 메소드가 실행되기 전에 충고가 적용된다. @Aspect public class BeforeExample { @Before(“x.y.MyClass.dataAccessOperation()") public void doAccessCheck1() { // ... } @Before("execution(* x.y.MyClass.*(..))") public void doAccessCheck2() { // ... } }  사후충고(@AfterReturning) @AfterReturning 어노테이션을 사용하며 포인트컷 메소드가 리턴(정상종료)된 후 충고가 적용된 다.
  • 4. @Aspect public class AfterReturningExample { @AfterReturning(“x.y.MyClass.dataAccessOperation()") public void doAccessCheck1() { // ... } // 리턴값을 retVal로 받음, returning 속성의 값은 어드바이스 메소드의 파라미터와 이름이 // 같아야 한다. @AfterReturning( pointcut=“x.y.MyClass.dataAccessOperation()", returning="retVal") public void doAccessCheck2(Object retVal) { // ... } }  예외충고(@AfterThrowing) @AfterThrowing 어노테이션을 사용하며 포인트컷 메소드에서 예외가 발생할 때 충고가 적용된 다. @Aspect public class AfterThrowingExample { @AfterThrowing(“x.y.MyClass.dataAccessOperation()") public void doRecoveryActions1() { // ... } // 리턴값을 retVal로 받음, throwing 속성의 값은 어드바이스 메소드의 파라미터와 이름이 // 같아야 하며 예외가 그 변수로 넘어온다. @AfterThrowing( pointcut=“x.y.MyClass.dataAccessOperation()", throwing="ex") public void doRecoveryActions2(DataAccessException ex) { // ... } }
  • 5.  사후충고(@After) @After 어노테이션을 사용한다. 포인트컷 메소드가 실행된 후(정상종료 여부와 관계없이) 충고가 적용된다. @Aspect public class AfterExample { @After(“x.y.MyClass.dataAccessOperation()") public void doReleaseLock() { // ... } }  주변충고(@Around) @Around 어노테이션을 사용하며 포인트컷 메소드가 실행 되기 전, 리턴 된 후에 충고가 적용된 다. 어드바이스 메소드의 첫번째 파라미터는 ProceedingJoiinPoint가 되어야 한다. proceed() 메소드를 통해 타겟 클래스의 원래 메소드를 호출하고, proceed() 메소드를 호출하면서 Object[] 형태로 파 라미터를 전달할 수도 있다. proceed() 메소드는 기술 안할수도 있고, 한번, 여러 번 호출할 수도 있으므로 원래 메소드에 대한 여러 형태의 제어가 가능하다. 물롞 원래 메소드의 리턴 값을 바꿔 치기 하는 것도 가능하다. @Aspect public class AroundExample { @Around(“x.y.MyClass.businessService()") public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { // start stopwatch Object retVal = pjp.proceed(); // stop stopwatch return retVal; } } [참고] StopWatch 사용법 1.System 클래스의 currentTimeMillis() 메소드 이용 1970년 1월 1일 자정부터 현재까지 카운트된 시간을 ms(milliseconds) 단위로 표시한다.
  • 6. long startTime = System.currentTimeMillis(); // 특정 로직이나 메소드 호출 long elapsedTime = System.currentTimeMillis() - startTime; System.out.println(elapsedTime + " ms"); 2. System 클래스의 nanoTime() 메소드 이용 nanoTime 메서드는 현재 Java 가상머싞의 high-resolution 시간값을 ns(nano sec.) 단위로 반환한 다. long startTime = System.nanoTime(); // 특정 로직이나 메소드 호출 long endtime = System.nanoTime(); long elapsedTime = startTime - endtime; System.out.println(elapsedTime + " ns"); 3. Common-lang의 StopWatch 클래스 start(), stop() 메소드 이용 import org.apache.commons.lang.time.StopWatch; stopWatch.start(); doSomeTask(5000); stopWatch.stop(); System.out.println("Time: " + stopWatch.getTime()); // Time: 5000 4. 스프링 프레임워크의 StopWatch 클래스의 start(), stop() 이용 import org.springframework.util.StopWatch; stopWatch.start(); List<Tuple> emps = empService.getEnameDnameTop5(deptno); stopWatch.stop(); log.info(">>>>> getEnameDnameTop5(Time) : " + stopWatch.getTotalTimeSeconds()); 3-8-3. @AspectJ Annotation을 이용한 AOP – Pointcut 선언
  • 7.  @Pointcut 어노테이션을 사용한다. @Pointcut("execution(* onj.aop.*.*(..))") // pointcut expression private void mypointcut() { } // pointcut signature @Before("mypointcut ()") public void myBeforeAdvice(JoinPointjoinPoint, int intValue) { ... }  포인트컷 지정자(Pointcut Designators) execution: 메소드 실행 결합점(join points)과 일치시키는데 사용된다. within: 특정 타입에 속하는 결합점을 정의한다. this: 빈 참조가 주어짂 타입의 인스턴스를 갖는 결합점을 정의한다. target: 대상 객체가 주어짂 타입을 갖는 결합점을 정의한다. args: 인자가 주어짂 타입의 인스턴스인 결합점을 정의한다. @target: 타겟 클래스가 주어짂 타입의 어노테이션을 갖는 결합점을 정의한다. @args: 전달된 인자의 런타임 타입이 주어짂 타입의 어노테이션을 갖는 결합점을 정의한다. @within: 주어짂 어노테이션을 갖는 타입 내 결합점을 정의한다. @annotation: 실행 메소드가 인자로 주어짂 어노테이션을 갖는 결합점을 정의한다. //메소드가 어떤 패키지에 있던지 public 메소드라면 충고적용 @Pointcut("execution(public * *(..))") private void anyPublicOperation() {} //메소드가 onj 패키지 또는 부 패키지안의 타입이라면 충고적용 @Pointcut("within(onj..*)") private void inTrading() {} //위 두포인트컷의 AND 조건을 만족하는 경우 충고가 적용 @Pointcut("anyPublicOperation() && inTrading()") private void tradingOperation() {} //메소드가 onj.dao 패키지 또는 부 패키지안의 타입이라면 충고적용 @Pointcut("within(onj.dao..*)") public void inDataAccessLayer() {} [Aspect 클래스 작성 예] @Aspect //애스팩트 클래스임을 표시 public class MyAdvice {
  • 8. @Pointcut("execution(* onj.edu.aop11..hello*(int)) && args(intValue)") public void helloExec(int intValue) {} @Pointcut("bean(myDependency*)") public void inMyDependency() {} //@AspectJ 는 &&, aop 네임스페이스는 and @Before("helloExec(intValue) && inMyDependency()") public void myBeforeAdvice(JoinPointjoinPoint, int intValue) { ... } //Around Advice @Around("helloExec(intValue)") public myAroundAdvice(ProceedingJoinPoint joinPoint, int intValue) throws Throwable { ... } //...... } 3-8-4. @AspectJ Annotation을 이용한 AOP – aspectj expression execution(public * *(..)) : public 메소드가 포인트 컷 execution(* onj.spring.aop.*.*(..)) : onj.spring.aop 패키지의 모든 메소드가 포인트 컷 execution(* onj.spring.aop..*.*(..)) : onj.spring.aop 패키지와 하위 패키지의 모든 메소드가 포인 트 컷 execution(public void insert*(..)) : public에 리턴값, 패키지명 없고 메서드 이름은 insert로 시작, 인자 값은 0개 이상인 메서드가 포인트 컷 execution(* onj.spring.aop.*.*()) : 리턴형 관계없고 onj.spring.aop 패키지의 모든 클래스, 인자 값이 없는 모든 메서드가 포인트 컷 execution(* onj.spring.aop..*.*(..)) : 리턴형 관계없고 onj.spring.aop 패키지 및 하위 패키지에 있 는 모든 클래스, 인자값이 0개 이상인 메서드가 포인트 컷 execution(* delete*(*)) : 메서드 이름이 delete으로 시작하는 인자 값이 1개인 메서드가 포인트 컷
  • 9. execution(* delete*(*,*)) : 메서드 이름이 delete로 시작하는 인자 값이 2개인 메서드가 포인트 컷 execution(* onj*(Integer, ..)) : 메서드 이름이 onj로 시작하고 첫번째 인자 값의 타입이 Integer, 1 개 이상의 매개변수를 갖는 메서드가 포인트 컷 within(onj.spring.aop.*) : onj.spring.aop 패키지 내의 모든 메소드가 포인트 컷 within(onj.spring.aop..*) : onj.spring.aop패키지 및 하위 패키지의 모든 메소드가 포인트 컷 bean(oraclejava*) : 이름이 oraclejava로 시작되는 모든 빈의 메소드가 포인트 컷 bean(*dataSource) || bean(*DataSource) : 빈 이름이 “dataSource” 나 “DataSource” 으로 끝나는 모든 빈의 메소드가 포인트 컷 !bean(onjoraclejava) : onjoraclejava빈을 제외한 모든 빈의 메소드가 포인트 this(onj.aop.SmallMartInterface) : 현재 실행중인 인스턴스가 SmallMartInterface 이름의 빈과 타입이 같은 경우 포인트컷, SmallMart인터페이스를 구현했다면 모든 메소드가 포인트컷 target(onj.aop.SmallMartInterface) : 타겟 오브젝트가 SmallMartInterface를 구현했다면 모든 메 소드가 포인트컷 args(java.io.Serializable) : 메소드가 매개변수가 하나이고 Serializable인터페이스를 타입이라면 포인트컷 @target(org.springframework.transaction.annotation.Transactional) : 타겟 오브젝트가 org.springframework.transaction.annotation.Transactional 어노테이션(@Transactional)을 가짂다면 포인트컷 @within(org.springframework.transaction.annotation.Transactional) : 타겟 오브젝트의 선언된 타입이 @Trtansactional 어노테이션을 가짂다면 포인트컷 @annotation(org.springframework.transaction.annotation.Transactional) : 실행 메소드가 @Transactional 어노테이션을 가짂다면 포인트컷 @args(x.y.AnnotationRequired) : 파라미터를 하나 가지며 넘어오는 아규먼트의 런타임 타입이 @AnnotationRequired 타입이라면 포인트컷
  • 10. 3-8-5. @AspectJ Annotation을 이용한 AOP – 예제  이전에 작성한 AOP NameSpace를 이용한 SmallMart 예제를 @AspectJ Annotation을 이용하 여 변경해 보자. STS에서 1. File -> New -> Spring Starter Project Name : demo-smallmart3 Type : MAVEN Package : onj.hello.aop3 다음화면에서 Core -> AOP 체크 2. @Inject를 사용하기 위해 의존성 추가 <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> [SmallMartInterface.java] package onj.hello.aop3; public interface SmallMartInterface { public String getProducts(String productName) throws Exception; } [SmallMart.java] package onj.hello.aop3; @Component public class SmallMart implements SmallMartInterface { public String getProducts(String productName) throws Exception { return "[Target Method]getProduct()..." + productName; //throw new Exception("error...");
  • 11. } } [SmallMartAspect.java] package onj.hello.aop3; @Component @Aspect public class SmallMartAspect { @Pointcut("execution(* onj.hello.aop3.SmallMartInterface.getProducts(..))") public void getProduct1() { } @Pointcut("args(String)") public void getProduct2() { } // 사전충고 : 타겟클래스의 메소드 실행 전 충고실행 @Before("getProduct1() && getProduct2()") public void logBefore(JoinPoint joinPoint) { System.out.println("Before Advice --> logBefore()..."); joinPoint.getSignature().getName(); } // 사후충고(after) : 타겟클래스의 메소드 실행후 충고 실행, 오류가 발생해도 실행 @After("getProduct1()") public void logAfter(JoinPoint joinPoint) { System.out.println("After Advice --> logAfter()..."); joinPoint.getSignature().getName(); } // 사후충고(after returning) : 타겟클래스의 메소드 정상 리턴된 후 실행 // returning 속성으로 리턴값을 받을 수 있다. @AfterReturning(pointcut = "getProduct1()", returning = "result") public void logAfterReturning(JoinPoint joinPoint, Object result) { System.out.println("AfterReturning Advice --> logAfterReturning()..."); joinPoint.getSignature().getName(); System.out.println("return value is " + result); } // 주변충고 : 타겟클래스의 메소드 실행 전후에 충고 실행
  • 12. @Around("getProduct1()") public String logAround(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("Around Advice[전] --> logAround()..."); joinPoint.getSignature().getName(); Arrays.toString(joinPoint.getArgs()); // 타겟 객체의 원래 메소드 실행 String s = (String) joinPoint.proceed(); System.out.println("Around Advice[후] --> logAround()..."); // 원래 타겟클래스의 메소드 리턴값을 대체시킴 return "이문장으로원래 타겟메소드(getProducts) 리턴이 대체됨!!"; } // 예외충고 : 예외가 발생될때 충고 실행 @AfterThrowing(pointcut = " getProduct1()", throwing = "error") // error는 실행되는 메소드에서 던지는 예외객체 public void logAfterThrowing(JoinPoint joinPoint, Throwable error) { System.out.println("예외충고 --> logAfterThrowing()..."); joinPoint.getSignature().getName(); System.out.println("Exception " + error); } } [DemoSmallMart3Application.java] package onj.hello.aop3; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.EnableAspectJAutoProxy; @SpringBootApplication public class DemoSmallmart3Application implements CommandLineRunner { public static void main(String[] args) throws Exception { SpringApplication.run(DemoSmallmart3Application.class, args); } @Inject
  • 13. private SmallMartInterface smallMart; public void run(String... args) throws Exception { this.smallMart.getProducts("과자"); } } 3-9. 스프링 선언적 AOP에 대한 고려사항(@AspectJ vs XML)  스프링 애플리케이션이 XML 기반이라면 aop 네임스페이스를 이용 하는것이 적절하다. 이렇 게 하면 DI, AOP 설정 방식을 일관되게 유지할 수 있기 때문이다.  애플리케이션이 어노테이션 기반이라면 @AspectJ 어노테이션을 사용 한다. @AspectJ 어노 테이션을 사용하는 경우 모듈 안에 어스펙트 관련 정보를 캡슐화 할 수 있기 때문에 유지보 수가 용이하다.  aop 네임스페이스와 @AspectJ 어노테이션의 차이  포인트컷 구문이 조금 다르다. (aop 네임스페이스는 “and”, @AspectJ 어노테이션에서는 “&&”)  aop 네임스페이스에서는 „싱글톤‟ 방식의 애스펙트 인스턴스화 모델만 지원  @AspectJ 어노테이션 방식에서는 두 개의 포인트컷 정의 (helloExec(intValue) && inMyDependency()) 를 사전충고, 주변 충고에서 조합할 수 있지만 aop 네임스페이스에 서는 조건을 조합한 포인트 컷을 새로 생성해야 한다.  @AspectJ or XML for Spring AOP?  AspectJ Annotation 방식 @Pointcut(execution(* get*())) public void a() {} @Pointcut(execution(org.xyz.Account+ *(..)) public void b() {} @Pointcut(a() && b()) public void complex() {}  aop NameSpace를 이용한 XML 방식() 위에서 정의한 complext Pointcut은 정의가 불가능 하다.
  • 14. <aop:pointcut id=“a" expression="execution(* get*())"/> <aop:pointcut id=“b" expression="execution(org.xyz.Account+ *(..))"/>