728x90

DI 어노테이션을 사용한 방법

  • @Component

Spring Bean Configuration File을 통해 만든 xml의 context:component-scan 태그

- Namespaces에서 context를 체크한다.

<context:component-scan base-package="패키지이름"/>

xml의 context:component-scan 태그 base-package 속성에 패키지 이름을 적어 넣으면

해당 패키지 안에 있는 클래스를 로드하여 @Component 어노테이션에 있는 클래스를 Bean에 등록한다.

@Component 어노테이션의 경우 클래스에 필드가 없는 경우 사용한다.

 

  • @Configuration

자바 클래스를 설정으로 이용할 수 있다. 클래스 상단에 어노테이션을 적용한다.

클래스 안의 메서드를 @Bean 어노테이션으로 Bean으로 등록하고 메서드명은 xml 설정의  id와 같다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationContext {

	@Bean
	public A methodA() {
		A a = new A();
		a.setName("이병건");
		a.setValue("나이: 41");
		return a;
	}
	@Bean
	public B methodB() {
		B b = new B();
		b.setName("BBB");
		b.setA(methodA()); // setter 주입
		return b;
	}
}

AOP (Aspect Oriented Programming 관점지향)

트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능을 해당 기능을 분리하여 관리할 수 있다.

Spring Bean Configuration File의 Namespaces에서 aop를 체크한다.

용어

  • Aspect : 공통의 관심사들로 이루어진 모듈
  • ex) 로그에 관련된 모듈을 모아둔 클래스/ 메서드 하나가 모듈 하나로 생각하면 된다.
  • Target : 공통 모듈(Aspect)이 적용될 곳 (클래스 또는 메서드)
  • Advice : 실제 적용될 공통 모듈 하나를 의미
  • Joinpoint : advice가 적용되어야 하는 시점
  • Pointcut : target이 상세화 된 것
<context:component-scan base-package="aopEx01"/>
	<bean id="LoggerAOP01" class="aopEx01.Aspect01"/>
	<aop:config>
		<aop:aspect id="Logger01" ref="LoggerAOP01"> <!-- 참조할 Bean -->
        	<!-- expression으로 적용될 곳을 지정 (aopEx01 패키지의 A 클래스) -->
			<aop:pointcut expression="within(aopEx01.A)" id="pointcutA"/>
			<aop:pointcut expression="within(aopEx01.B)" id="PointcutB"/>
			<aop:pointcut expression="within(aopEx01.C)" id="PointcutC"/>
            
            <!-- 상단에 pointcutA로 지정한 aopEx01 패키지 A 클래스의 
            	loggerAop01 메서드를 around로 지정 -->
			<aop:around method="loggerAop01" pointcut-ref="pointcutA"/>
			<aop:before method="loggerAop02" pointcut-ref="PointcutB"/>
			<!-- 오류가 나더라도 무조건 호출되는 모듈 aop:after -->
			<aop:after method="loggerAop03" pointcut-ref="PointcutC"/> 
			<!-- 핵심 로직이 정상 종료 되었을 때 호출되는 공통 모듈 -->
			<aop:after-returning method="loggerAop03" pointcut-ref="PointcutC"/>
			<!-- 핵심 로직이 오류가 발생하여 종료가 되었을 때 호출되는 공통모듈 -->
			<aop:after-throwing method="loggerAop03" pointcut-ref="PointcutC"/>
		</aop:aspect>
	</aop:config>

ProceedingJoinPoint 클래스

  • .getSignature() 호출되는 메서드에 대한 정보를 구한다.
  • .getTarget() 대상 객체를 구한다.
  • .getName 메서드의 이름을 구한다.
  • .toShortString 메서드의 이름을 반환한다.
  • .toLongString 메서드의 리턴타입, 파라미터 타입을 모두 포함해 반환한다.
  • .Proceed 다음 advice 또는 target의 메서드를 진행한다.

 

 

728x90
728x90

POJO (Plain Old Java Object)

특정 자바 모델이나 기능 프레임워크 등을 따르지 않은 자바 오브젝트를 지칭하는 말로 사용되었다.

자바 언어 사양 외에 어떠한 제한에도 묶이지 않은 자바 오브젝트로 다음과 같은 행동을 해서는 안된다.

- 미리 정의된 클래스의 확장

- 미리 정의된 인터페이스의 구현

- 미리 정의된 애너테이션을 포함

그러나 기술적 어려움이나 기타 이유로 많은 프레임워크들이 미리 정의된 애너테이션의 사용을 요구한다.


DI (Dependency Injection 의존성 주입) 

각각의 계층이나 서비스들 강에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.

객체를 직접 생성하는게 아니라 외부에서 생성한 후 주입시켜주기 때문에

모듈 간의 결합도가 낮아지고 유연성이 높아진다.

DI의 종류 

- Setter Injection 

B b = new B();
A a = new A();
a.setB(b); // setter injection

- Construction Injection 생성자 주입

B b = new B();
A a = new A(b); // injection

spring의 DI

- 어노테이션을 활용한 DI

-> 어노테이션이란 @를 붙여 사용하는 특별한 의미가 있는 주석

-> 컴파일러가 특정 오류를 억제하도록 지시하는 것과 같이 프로그램 코드의 일부가 아닌

프로그램에 관한 데이터를 제공, 코드에 정보를 추가하는 정형화된 방법

-. xml을 활용한 DI

-> xml에서 bean으로 class를 등록해서 의존관계를 연결해주는 방식

 


IoC (Inversion of Control 제어 역행)

- 메소드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라 외부에서 결정되는 것을 의미한다.

- 개발자는 프레임워크에 필요한 부품을 개발하고 조립하는 방식의 개발을 하게 되며 조립된 코드의 최종 호출은

개발자에 의해서 제어되는 것이 아니라 프레임워크의 내부에서 결정된 대로 이루어지게 되는데 이러한 현상을 제어의 역전이라고 표현한다.

- 의존적인 객체를 직접생성하거나 제어하는 것이 아니라 특정 객체에 필요한 객체를 외부에서 결정해서 연결해주므로

모듈 간의 결합도가 낮아지고 유연성이 높아진다.

728x90

+ Recent posts