Spring

[Spring] 스프링 프레임워크

sian han 2022. 5. 24. 17:27

※ 프레임워크

 - 재사용되는 모듈

 - 재사용되는 공통된 부분은 Framework로 구현되어 다른 사람이 그 내부를 가공 없이 이용하도록 제공됨

 - 스프링은 애플리케이션 프레임워크라는 특징을 가짐

    - 애플리케이션 프레임워크는 특정 계층이나 , 기술, 업무 분야에 국한되지 않고

           애플리케이션의 전 영역을 포괄하는 범용적인 프레임 워크를 말한다

 

 

 

※ 스프링프레임워크

  - ★ 스프링은 가벼운 DIAOP기반 컨테이너이자 프레임워크

  -  스프링은 자바 객체를 담고 있는 컨테이너 

       ㄴ 톰캣은 서블릿 객체를 담고있고, 스프링은 자바 객체를 담고있다

            - 따라서 더이상 new 로 객체생성하지않을것이다. 왜냐면 스프링이 이미 자바 객체를 가지고있으니까

  - 자바 객체의 생성, 소멸과 같은 라이프 사이클 을 관리함

 

 

 

▶ 특징

  ▷ DI (Dependency Injection) 지원 (=의존성 주입, 종속객체 주입) = IOC (비슷)

       -  설정파일이나 어노테이션을 통해서 객체 간의 의존 관계를 설정할 수 있도록 함

       -  기존처럼 직접 new 로 객체생성을 하면 결합도가 높아짐

       -  NEW 로 객체생성하는것이 아니라 생성자 (or setter) 에서 의존하는 객체를 전달받음

             = 스프링이 객체를 넣어줌. (종속객체를 주입해줌)

ex ) DAO 가 변경되었을 경우, 모~두 변경해야한다 => 유지보수가 어려움

     => 따라서 DI 를 이용해서 종속객체를 주입함 종속객체는 종속객체가 필요한 객체에 주입 됨 ! 

ex ) Service 에서 DAO 가 필요하면 조립기가 인터페이스에서 넣어주기 때문에

      Service 는 인터페이스랑만 관계를 맺게 됨 => DAO가 변경되더라도 Service 에서 코드변경 불필요 

 

 

 

   AOP (Aspect Oriented Programming) 지원 (= 애스펙트 지향 프로그래밍 )

       -  트랜잭션이나 로깅 , 보안과 같이 여러 모듈에서 공통으로 필요로 하지만

            실제 모듈의 핵 심은 아닌 기능들을 분리해서 각 모듈에 적용할 수 있음

       -  애플리케이션 객체 간의 결합도를 줄여줌 (결합도가 낮을수록 좋음)

                : 스프링을 이용하여 유지보수가 쉬운 프로그램을 만들 수 있다. 

 

 

 

  ▷ 영속성(Persistence)

       -  JDBC를 비롯하여 iBatis/mybatis, 하이버네이트, JPA 등

             데이터베이스 처리를 위해 널리 사용되는 라이브러리와의 연동을 지원

 

  POJO

       -  누구도 extend 하지않고 implement 하지않음.

       -  스프링은 스프링에 특화된 인터페이스 구현이나 스프링에 특화된 클래스 확장을 거의 요구하지 않음

 

 

 

 


스프링설치

Spring | Home

PROJECT overview springframework learn 

최종 spring boot : project spring tools4 맨밑에거

Looking for Spring Tool Suite 3? 첫번째 파랑

 

https://github.com/spring-projects/toolsuite-distribution/wiki/Spring-Tool-Suite-3

 

 

 

 

 


※ DI 종속객체 주입

 = 설정화일로부터 BeanFactory 생성하기

 

기존 : Service 에서 DAO 객체를 직접 new 로 생성했다 => Service 와 DAO 가 강하게 결합됨

DI : 객체를 조율하는 제 3자에 의해 생성시점에 종속객체가 부여됨

 

 

 - 와이어링(wiring) - 애플리케이션 컴포넌트 간의 관계를 정하는 것

 - 스프링에서 컴포넌트를 와이어링하는 일반적인 방법은 XML을 이용

 

애플리케이션 컨텍스트 : 스프링 애플리케이션에서 애플리케이션 컨텍스트는 빈에 관한 정의들을 바탕으로 빈들을 엮어 줌, 객체의 생성과 와이어링을 책임짐 (보통 설정화일 하나당 애플리케이션 컨텍스트 한개가 생김)

 

 

▶ Bean

  - <bean>엘리먼트는 스프링에서 가장 기본적인 설정단위로, 

     스프링에게 객체를 만들어 달라는 의미

  - 스프링은 각 객체를 bean 으로 관리한다.

 

  ▷ <bean>태그

      - 속성 : name - 빈의 이름

                 class - 생성될 객체의 클래스 타입

  ▷ <constructor-arg> 태그

      - 빈 객체를 생성할 때 생 성자에 전달할 파라미터를 명시하기 위해 사용됨

 

 

[1] 인터페이스 implements 하고 오버라이드메서드 호출

public class ArticleServiceImpl1 implements ArticleService{
	private ArticleDAO articleDao;
    
    	@Override
	public void write(ArticleVO articleVo) {
		System.out.println("ArticleServiceImpl1 - write()메서드 호출!");
		articleDao.insert(articleVo);
	}
}

 

 

 

[2-1] 설정파일을 이용하여 의존관계 설정 - 생성자를 이용한 종속객체 주입

 

applicationContext.xml

   - 1. MySqlArticleDAO 를 articleDao 라는 이름으로 객체생성해줘 ! 

   - 2. ArticleSrviceImpl2 를 articleService 라는 이름으로 생성해준 후에

         생성자의 매개변수로 articleDao를 넣어줘 ! 

     = > 근데이제 articleDao = MySqlAtrticleDAO 이니까 실질적으로

            ArticleSrviceImpl2 생성자 매개변수에 MySqlArticleDAO 가 들어가게 되는 것이다.

 

public class ArticleServiceImpl2 implements ArticleService{
	private ArticleDAO articleDao;
	
	//DI 이용
	//생성자 방식 - 생성자를 이용한 종속객체 주입
	public ArticleServiceImpl2(ArticleDAO articleDao) {
		this.articleDao=articleDao;
	}
	
	@Override
	public void write(ArticleVO articleVo) {
		System.out.println("ArticleServiceImpl2 - write() 호출!!");
		articleDao.insert(articleVo);
	}

}

 

 

 

 

[2-2] 설정파일을 이용하여 의존관계 설정 - Setter를 이용한 종속객체 주입

 

applicationContext.xml

<bean name="articleService3"
		class="mysite.spring.di.ArticleServiceImpl3"
		p:articleDao-ref = "articleDAO" />

	<bean name="articleDAO" class="mysite.spring.di.OracleArticleDAO">
   	</bean>

.java setter

@Override
	public void write(ArticleVO articleVo) {
		System.out.println("ArticleServiceImpl3 - write() 호출 !!!");
		articleDao.insert(articleVo);
	}

 

 

 

 

 

 


 

※ AOP

(AOP: Aspect-Oriented Programming) - 관점지향 프로그래밍

기존 비즈니스 로직에 영향을 주지 않고 필요한 추가 처리를 곳곳에 넣을 수 있는 개발 기법

주로 인증이나 로깅 등을 적용할 때 많이 사용

핵심로직이 아닌 보조적인 로직 (인증 , 트랜젝션 관리, 보안로깅 등) 을

재사용할 수 있는 컴포넌트에 담을 수 있도록 해준다

 

시스템 서비스를 모듈화해서 컴포넌트에 선언적으로 적용할 수 있게해줌

  - 선언적 : 설정화일에서 '핵심로직을 실행하기 전에 or 후에 적용해' 라고 써놓는다는 것

   => 핵심로직안에서는 부가적인 로직을 포함하지 않고, 설정화일에서 이를 실행할 수 있도록 지정해놓는다. 그럼 자동으로 처리가 되는것 => 핵심로직에 집중하는 컴포넌트를 만들수있다. => 유지보수 시 핵심로직은 건들필요가없음

 

<bean id="loggingAsp" class="mysite.spring.di.LoggingAspect" />

<aop:config>
    <aop:pointcut id="servicePointcut"
    expression="execution(* *..*Service.*(..))" />
        <aop:aspect id="loggingAspect" ref="loggingAsp">
      	  <aop:around pointcut-ref="servicePointcut" method="logging" />
        </aop:aspect>
    </aop:config>
</beans>

  = loggingAspect의 logging()메서드를 이름이 Service로 끝나는 인터페이스를 구현 한 모든 클래스의 모든 메서드 앞, 뒤로 실행 하라

 

 

<bean name="loggingDaoAsp" class="com.di.aop.LoggingDAOAspect"></bean>

<aop:config>
    <aop:pointcut expression="execution(* *..*DAO*.*(..))" 
    id="daoPointCut"/>
        <aop:aspect id="logDaoAspect" ref="loggingDaoAsp">
            <aop:before method="before" pointcut-ref="daoPointCut"/>
                <aop:after-returning method="afterReturing" 
                pointcut-ref="daoPointCut"/>
        <aop:after-throwing method="afterError" pointcut-ref="daoPointCut"/>
    </aop:aspect>
</aop:config>

<aop:before> : 메서드 실행 전에 적용되는 Advice 를 정의한다

<aop:after> 메서드가 실행되는지 / 예외발생되는지 여부에 상관없이 적용되는 advice를 정의

<aop:after-returning> : 메서드가 정상적으로 실행된 후에 적용되는 Advice 를 정의한다

<aop:around> : 메서드 호출 이전, 이후, 예외 발생 등 모든 시점에 적용 가능한 Advice를 정의

 

<aop:pointcut expression> : Pointcut 표현식

  - Advice를 적용할 메서드를 명시할 때 사용

execution(수식어패턴? 리턴타입패턴 클래스이름패턴?이름패턴(파라미터패턴)

수식어패턴 - 생략 가능한 부분, public, protected 등

리턴타입패턴 - 리턴 타입을 명시

클래스이름패턴, 이름패턴 - 클래스 이름 및 메서드 이름을 패턴으로 명시

파라미터패턴 - 매칭될 파라미터에 대해서 명시함

 - 각 패턴은 '*' 을 이용하여 모든 값을 표현할 수 있다.

 - '..' 을 이용하여 0개 이상이라는 의미를 표현할 수 있다

 

 

 

 

▶ AOP 용어

Advice - 언제 보조로직을 핵심 로직에 적용할 지를 정의하고 있다.

Joinpoint - Advice를 적용 가능한 시점을 의미함 ex ) 메서드호출, 필드값변경

Pointcut - Joinpoint 의 부분집합으로서 실제로 Advice가 적용되는 Joinpoint 를 나타냄 (실제적용시점)

Weaving - Advice를 핵심 로직 코드에 적용하는 것 공통 코드를 핵심 로직코드에 삽입하는 것이 weaving

Aspect - 여러 객체에 공통으로 적용되는 공통 관심 사항 ,트랜잭션이나 보안 등이 Aspect의 예

 

 

 

 

'Spring' 카테고리의 다른 글

[Spring] mybatis  (0) 2022.05.30
[Spring] 스프링 MVC를 이용한 웹 요청 처리  (0) 2022.05.26
[jsp]JSTL  (0) 2022.05.24
[jsp] 표현언어  (0) 2022.05.22
[jsp] 모델2 기반의 MVC 패턴 게시판의 흐름  (0) 2022.05.22