※ 프레임워크
- 재사용되는 모듈
- 재사용되는 공통된 부분은 Framework로 구현되어 다른 사람이 그 내부를 가공 없이 이용하도록 제공됨
- 스프링은 애플리케이션 프레임워크라는 특징을 가짐
- ★ 애플리케이션 프레임워크는 특정 계층이나 , 기술, 업무 분야에 국한되지 않고
애플리케이션의 전 영역을 포괄하는 범용적인 프레임 워크를 말한다
※ 스프링프레임워크
- ★ 스프링은 가벼운 DI 및 AOP기반 컨테이너이자 프레임워크
- 스프링은 자바 객체를 담고 있는 컨테이너
ㄴ 톰캣은 서블릿 객체를 담고있고, 스프링은 자바 객체를 담고있다
- 따라서 더이상 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 하지않음.
- 스프링은 스프링에 특화된 인터페이스 구현이나 스프링에 특화된 클래스 확장을 거의 요구하지 않음
스프링설치
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 |