• Home
  • About
    • 정윤수 (Jeong Yun Soo) photo

      정윤수 (Jeong Yun Soo)

      #Node.js #Server #BlockChain #Ethereum

    • Learn More
    • Email
    • Facebook
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

Spring 시작

08 Jan 2020

Reading time ~3 minutes

스프링 프레임워크 특징

  • 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량 프레임워크입니다.
  • DI(Dependency Injection)을 지원해 각각의 계층이나 서비스간의 의존성을 프레임워크가 연결시켜 줍니다.
  • IoC(Inversion of Contorl) 기술을 통해 애플리케이션의 느슨한 결합 유지해 줍니다.
  • AOP(Aspect-Oriented Programming) 관점지향 프로그래밍을 지원해 트랜잭션, 보안 등 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리할수 있습니다.

1. DI

program

위 소스의 InlineExamConsole(exam)와 GridExamConsole(exam)부분이 DI에 해당되는데 해당되는 객체를 새로이 생성하면서 exam 객체를 조립해주고 있는 부분입니다. 이를 스프링 프레임워크를 활용하여 생성할수 있습니다.

지시문을 이용한 DI


di_spring

스프링 프레임워크는 xml의 지시문을 이용해서 객체를 관리할수 있습니다.
여기서 id는 객체의 이름, class는 객체의 클래스가있는 경로를 의미하며 p:태그는 클래스의 속성에 값을 명명할수 있습니다.
또한 <property>를 이용하여 함수를 호출할수 있는데, 묵시적으로 setter는 set을제외하고 첫 이름을 소문자로 명명하여 지정합니다.

객체의 사용

di_program

이제 메인에서 ApplicationContext 활용해 IoC컨테이너를 만들수 있습니다.

Collection 객체의 생성

collection1 collection2 collection3

Collection 객체에 객체를 추가 즉 .add부분을 위 그림과같이 지시문에 생성자의 로 감싸 bean객체를 직접 만들어 넣을수 있고, 로 위에서 명명한 빈을 참조해서 생성할수 있습니다

collection6

util:list를 활용해 리스트 객체를 직접 생성하여 적용하는 방법도 있습니다..

Annotation

  • @Autowired autowired1 autowired2

이번에는 위 그림에서의 각각의 객체를 DI시키는 <property name="exam" ref="exam"></property> 부분을 편하게 코드에서 @Autowired에 관련한 내용입니다. 스프링은 DI 지원을위해 다양한 어노태이션을 지원해 주는데 @Autowired는 그중 하나입니다. 자동으로 태그가붙은 객체를 찾아 DI를 시켜줌으로서 사용자가 작성해야하는 코드의 수를 줄여줍니다.

autowired3 autowired4
autowired4
autowired4

Autowired은 클래스의 속성, setter, 생성자에 적용할수 있습니다. 또한 Autowired은 같은 인터페이스의 빈이 존재할시 에러가 발생하게 되는데, 이를 해결해기위해 @Qualifier 어노태이션을 활용해 인젝션할 빈 객체의 id를 직접 지정해 줄수도 있습니다. 오버라이드 된 생성자에 Qulifier를 사용할시, 오버라이드 된 생성자는 여러개의 인자를 가질수 있기 때문에 각각 인자에 Qulifier를 적용해 주어야 합니다.
Autowired는 속성으로 required를 사용해 생성된 객체의 초기값을 null값으로 줄수도 있습니다.

component

XML 파일에서 객체를 생성하는 것이아닌 애노테이션으로 객체를 형성할수 있습니다. 클래스위에 @component 애노태이션을 붙이면, 그 클래스를 객체로 만들어 줍니다. <context:component-scan base-package="spring.di.ui, spring.di.entity"></context:component-scan>
위의 코드를 xml파일에 추가하면 패키지를 참조해서 @Component가 붙은 클래스를 객체로 만들어 줍니다. 이렇게 형성한 객체는 @Value 태그를 통해 속성을 초기화해줄수 있습니다. 하지만 XML파일과 Java코드상으로 번갈아가며 작성하는것은 좋지않기때문에 둘중 하나로 작성하는것이 좋습니다.

JAVA Config

config1
config2

이번엔 XML상의 있는 설정 코드를 모두 애노테이션으로 바꾸어서 적용하는 방법입니다. spring config를 위한 class파일을 하나 만들어서 객체로 지정할 클래스와 Bean을 만들어준뒤, 위 그림처럼 설정 클래스를 참조해 스프링에게 명명할수 있습니다.

2. AOP(Aspect Oriented Programming)

사용자, 개발자, 운영자 관점에서 단위 프로그래밍하는것 Primary(Core) Concern : 주 업무 / ex) 사용자의 주문 코드 Cross-cutting Concern : 부 업무 / 로그, 보안, 트랙잭션처리 코드 부 업무에 관해서는 모듈처럼 주 업무 코드에 넣을수있고 뺄수도 있어야함
이를 프록시를 사용해 따로 보관하고 호출할수 있게 합니다.

AOP1
순수 자바로 구현한 AOP입니다.

순수 자바에선 Proxy를 사용해 주 업무 사이에 부 업무를 넣고 뺄수 있습니다. 이를 스프링에서 Proxy 클래스로 편리하게 사용할수 있습니다. 스프링은 보조업무를 4가지로 구분합니다

  • Before - 전
  • After returnning - 후
  • After throwing - 예외처리
  • Around - 전과 후

AroundAdvice

AOP2
XML 설정 파일로 구현한 AroundAdvice입니다.

프록시 객체를 org.springframework.aop.framework.ProxyFactoryBean 클래스를 참조해 생성하고 두개의 프로퍼티를 넣어줍니다.
첫째는 본 업무 빈 객체, 둘째는 interceptorNames 이름의 프로퍼티입니다. 두번째 프로퍼티는 부 업무 코드가 있는 클래스 객체를 list로 넣어줍니다.

AOP3
프록시 설정 파일입니다. 스프링에서의 프록시는 MethodInterceptor 인터페이스로 invocation.proceed(); 를 사용하면 스프링이 설정파일을 참조해 적용시켜줍니다.

BeforeAdvice

AOP4 BeforeAdvice는 MethodBeforeAdvice 인터페이스로 사용하면 됩니다.

AfterReturning / Throwing

AOP5 AOP6

AfterReturning는 AfterReturningAdvice 인터페이스로 사용하면 됩니다.
Throwing는 ThrowsAdvice 인터페이스로 사용하면 됩니다.

Point Cut(Weaving, Join Poing)

Point cut : 프록시와 주업무간의 메소드를 지정된 것만 연결시키는 것
AOP7
xml로 지정한다.

AOP8
Point Cut과 Adviser를 합쳐서 만들수있다.



springpractice Share Tweet +1