스프링 코어 강의 2부 - Java 구성을 활용한 스프링 코어 사용

  • 1,743 views
Uploaded on

사내에서 진행 된 스프링 웹 애플리케이션 개발 과정 중 스프링 코어 부분의 두번째 발표 자료입니다.

사내에서 진행 된 스프링 웹 애플리케이션 개발 과정 중 스프링 코어 부분의 두번째 발표 자료입니다.

More in: Software
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,743
On Slideshare
0
From Embeds
0
Number of Embeds
5

Actions

Shares
Downloads
66
Comments
0
Likes
50

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 스프링 프레임워크 코어 Java 구성을 활용한 스프링 코어 사용 박성철
  • 2. 목차 기본 빈(Bean) 정의 오토 와이어 / 컴포넌트 자동 탐색 AOP 설정
  • 3. 기본 빈(Bean) 정의
  • 4. 빈 정의 방법 XML 구성 가장 오래된 빈 설정 방법 메타 정보의 완벽한 분리 자바 구성 어노테이션 방식과 의미론적 일관성 언어 지원 타입 안전성 IDE 그루비 빈 구성 아직 초기 단계 자바 구성보다 가독성 개선(그루비 “우리의 선택”
  • 5. @Configuration @Configuration
  • 6.    public
  • 7.   class
  • 8.   AppConfig
  • 9.   {
  • 10.    
  • 11.   
  • 12.   
  • 13.   …⋯
  • 14.    } “이 클래스는 빈을 정의하는 객체도 스프링 빈
  • 15. 빈 생성: @Bean @Configuration
  • 16.    public
  • 17.   class
  • 18.   AppConfig
  • 19.   {
  • 20.    
  • 21.   
  • 22.   
  • 23.   @Bean
  • 24.    
  • 25.   
  • 26.   
  • 27.   public
  • 28.   AcmeBean
  • 29.   acmeBean()
  • 30.   {
  • 31.    
  • 32.   
  • 33.   
  • 34.   
  • 35.   
  • 36.   
  • 37.   return
  • 38.   new
  • 39.   AcmeBean();
  • 40.    
  • 41.   
  • 42.   
  • 43.   }
  • 44.    } “이 메서드는 @Bean(name=“acmeBean”)
  • 45.    @Bean(name={“acmeBean”,
  • 46.   “superBean”}) 명시적인 빈 이름 지정 빈 별명 지정
  • 47. 스프링 IoC 컨테이너 BeanFactory: 기본 빈 컨테이너 ApplicationContext 하부 타입 AOP, 국제화, 이벤트 발생 기업용 애플리케이션에 필요한 기능 추가
  • 48. ApplicationContext 종류 AnnotationConfigApplicationContext AnnotationConfigWebApplicationContext ClassPathXmlApplicationContext FileSystemXmlApplicationContext GenericApplicationContext GenericGroovyApplicationContext GenericWebApplicationContext GenericXmlApplicationContext ResourceAdapterApplicationContext XmlPortletApplicationContext XmlWebApplicationContext 우리가 사용할 컨테이너 구현체
  • 49. ApplicationContext 시작 ctx
  • 50.   =
  • 51.   new
  • 52.   AnnotationConfigApplicationContext(AppConfig ! 또는 ! ctx
  • 53.   =
  • 54.   new
  • 55.   AnnotationConfigApplicationContext( ctx.register(AppConfig.class,
  • 56.   AnotherAppConfig.class); ctx.register(YetAnotherAppConfig
  • 57. 의존 관계 주입
 매개변수 전달 @Bean
  • 58.    public
  • 59.   Teller
  • 60.   teller(ContentProvider
  • 61.   provider 
  • 62.    return
  • 63.   new
  • 64.   StdOutTeller(provider }
  • 65.    ! @Bean
  • 66.    public
  • 67.   ContentProvider
  • 68.   contentProvider()
  • 69.   {
  • 70.    
  • 71.    return
  • 72.   new
  • 73.   HelloWorldProvider();
  • 74.    }
  • 75. 의존 관계 주입 메서드 호출 @Bean
  • 76.    public
  • 77.   Teller
  • 78.   teller()
  • 79.   {
  • 80.    
  • 81.    return
  • 82.   new
  • 83.   StdOutTeller(contentProvider() }
  • 84.    ! @Bean
  • 85.    public
  • 86.   ContentProvider
  • 87.   contentProvider()
  • 88.   {
  • 89.    
  • 90.    return
  • 91.   new
  • 92.   HelloWorldProvider();
  • 93.    }
  • 94. 구성 결합: @Import @Configuration
  • 95.    @Import(SubAppConfig.class)
  • 96.    public
  • 97.   class
  • 98.   MainAppConfig
  • 99.   {
  • 100.    
  • 101.   
  • 102.   
  • 103.   …⋯
  • 104.    }
  • 105.    ! @Configuration
  • 106.    public
  • 107.   class
  • 108.   SubAppConfig
  • 109.   {
  • 110.    
  • 111.   
  • 112.   
  • 113.   …⋯
  • 114.    }
  • 115. 빈 범위: @Scope ConfigurableBeanFactory SCOPE_SINGLETON “singleton” SCOPE_PROTOTYPE “prototype” WebApplicationContext SCOPE_REQUEST “request” SCOPE_SESSION “session” SCOPE_GLOBAL_SESSION “globalSession” SCOPE_APPLICATION “application" @Bean @Scope(“prototype”) public
  • 116.   ContentProvider
  • 117.   contentProvider()
  • 118.   {
  • 119.    
  • 120.    return
  • 121.   new
  • 122.   HelloWorldProvider();
  • 123.    }
  • 124. 빈 범위의 종류 ApplicationContext singleton prototype request session getBean() 항상동일한빈반환 매번새로운빈반환 웹요청안에동일한빈반환 웹세션안에동일한빈반환 표준 범위 웹 확장 범위
  • 125. @Bean(iniMethod=“init”,
  • 126.   destoryMethod=“dispose”)
  • 127.    public
  • 128.   AcmeBean
  • 129.   acmeBean()
  • 130.   {
  • 131.    
  • 132.   
  • 133.   
  • 134.   
  • 135.   
  • 136.   
  • 137.   return
  • 138.   new
  • 139.   AcmeBean();
  • 140.    } @Bean ! initMethod destoryMethod 빈을 생성한 후에 init() 메서드를 호출하고 소멸 전에 dispose() 빈 초기화/정리
 @Bean의 속성 사용
  • 141. 빈 초기화/정리
 JSR-250 사용 @PostConstruct
  • 142.    public
  • 143.   void
  • 144.   init()
  • 145.   {
  • 146.    
  • 147.   
  • 148.   
  • 149.   …⋯
  • 150.    }
  • 151.    ! @PreDestory
  • 152.    public
  • 153.   void
  • 154.   dispose()
  • 155.   {
  • 156.    
  • 157.   
  • 158.   
  • 159.   …⋯
  • 160.    } 빈의 초기화와 정리 메서드에 직접 ! @PostConstruct @PreDestory 빈을 생성한 후에 init() 메서드를 호출하고 소멸 전에 dispose()
  • 161. 자동 구성
  • 162. 자동 와이어링 스프링 고유 @Autowired:
  • 163.    @Qualifier:
  • 164.    JSR-330 Dependency Injection for Java @Inject:
  • 165.    @Named:
  • 166.    @Qualifier:
  • 167.    JSR @Resource:
  • 168.   
  • 169. JSR-330 <dependency>
  • 170.    
  • 171.    
  • 172.    
  • 173.   
  • 174.   <groupId>javax.inject</groupId>
  • 175.    
  • 176.    
  • 177.    
  • 178.   
  • 179.   <artifactId>javax.inject</artifactId>
  • 180.    
  • 181.    
  • 182.    
  • 183.   
  • 184.   <version>1</version>
  • 185.    </dependency>
  • 186. @Autowired vs @Inject spring JSR-330 비고 @Autowired @Inject @Inject에는 required 속성이 없음 @Component @Named @Scope @Singleton JSR-330 표준에선 prototype이 기본이지만 스프링에서는 singleton을 기본으로 적용 @Qualifier @Named 빈 이름 지정 @Qualifier @Qualifier 자작 한정 어노테이션 제작 @Value N/A @Required N/A @Lazy N/A
  • 187. 자동 와이어링 public
  • 188.   class
  • 189.   Foo
  • 190.   {
  • 191.    
  • 192.   
  • 193.   @Inject
  • 194.    
  • 195.   
  • 196.   private
  • 197.   Bar
  • 198.   bar;
  • 199.    
  • 200.   
  • 201.   …⋯
  • 202.    } @Bean
  • 203.    public
  • 204.   Foo
  • 205.   foo()
  • 206.   {
  • 207.    
  • 208.    return
  • 209.   new
  • 210.   Foo();
  • 211.    }
  • 212.    ! @Bean
  • 213.    public
  • 214.   Bar
  • 215.   bar()
  • 216.   {
  • 217.    
  • 218.    return
  • 219.   new
  • 220.   Bar();
  • 221.    } 빈 생성/등록 스프링 IoC 컨테이너 주 입 빈 생성
  • 222. 자동 와이어링 이름 지정 public
  • 223.   class
  • 224.   Foo
  • 225.   {
  • 226.    
  • 227.   
  • 228.   @Inject
  • 229.    
  • 230.   
  • 231.   @Named(“baar”)
  • 232.    
  • 233.   
  • 234.   private
  • 235.   Bar
  • 236.   bar;
  • 237.    
  • 238.   } public
  • 239.   class
  • 240.   Bar{
  • 241.    
  • 242.   
  • 243.   
  • 244.   …⋯
  • 245.    } public
  • 246.   class
  • 247.   Baar
  • 248.   extends
  • 249.   Bar{
  • 250.    
  • 251.   
  • 252.   
  • 253.   …⋯
  • 254.    } public
  • 255.   class
  • 256.   Barr
  • 257.   extends
  • 258.   Bar{
  • 259.    
  • 260.   
  • 261.   
  • 262.   …⋯
  • 263.    }
  • 264. 자동 빈 탐색 @ComponentScan @Configuration
  • 265.    @ComponentScan(basePackages=“com.fupfin.acmebomb.domain”)
  • 266.    public
  • 267.   class
  • 268.   AppConfig
  • 269.   {
  • 270.    
  • 271.   
  • 272.   
  • 273.   …⋯
  • 274.    } 지정한 패키지 밑의 모든 빈을 자동으로 찾아서 애플리케이션 컨텍스트에 등록 자동?
  • 275. 빈 지정 @Component, @Named @Component
  • 276.    public
  • 277.   class
  • 278.   ThisIsBean
  • 279.   {
  • 280.    
  • 281.   
  • 282.   
  • 283.   …⋯
  • 284.    } “이 객체는 스프링 빈입니다.” @Component JSR-330
  • 285. 빈 표시 어노테이션 @Component @Service @Controller @Repository 비즈니스 로직을 처리하는 컴포넌트 애플리케이션 아키텍처 참 데이터를 읽고 쓰는 컴포넌트 DataAccessException 애플리케이션 아키텍처 참 MVC 상속 상속 상속 @Configuration
  • 286. @ComponentScan 속성 • basePackageClasses
  • 287.    • basePackages
  • 288.   =
  • 289.   value
  • 290.    • includeFilters,
  • 291.   excludeFilters
  • 292.    • FilterType • nameGenerator
  • 293.    • resourcePattern
  • 294.    • useDefaultFilters @ComponentScan(basePackageClasses
  • 295.   =
  • 296.   BeansPackageMarker.class, 
  • 297.   
  • 298.   
  • 299.   
  • 300.   
  • 301.   
  • 302.   
  • 303.   
  • 304.   
  • 305. 지연 생성: @Lazy 의존 빈 지정: @DependsOn @Service
  • 306.    @Lazy
  • 307.    @DependsOn({“AnotherService”,
  • 308.   “YetAnotherService”})
  • 309.    public
  • 310.   class
  • 311.   MyServiceImpl
  • 312.   implements
  • 313.   MyService
  • 314.   {
  • 315.    
  • 316.   
  • 317.   
  • 318.   …⋯
  • 319.    } “정말 필요할 때까지는 빈을 생성하지 않아요.” “이 빈들을 먼저 생성해야 해요.”
  • 320. 관점 중심 프로그래밍 (AOP)
  • 321. AOP OOP 횡단 관심사의 모듈화 DI 스프링은 동적 프록시 기반의 JDK @AspectJ
  • 322. AspectJ 방식 AOP 활성화 @EnableAspectJAutoProxy @Configuration
  • 323.    @ComponentScan(basePackages="com.fupfin.aop")
  • 324.    @EnableAspectJAutoProxy
  • 325.    public
  • 326.   class
  • 327.   AppConfig
  • 328.   {
  • 329.    
  • 330.   
  • 331.   
  • 332.   …⋯
  • 333.    } <dependency>
  • 334.    
  • 335.   
  • 336.   <groupId>org.aspectj</groupId>
  • 337.    
  • 338.   
  • 339.   <artifactId>aspectjweaver</artifactId>
  • 340.    
  • 341.   
  • 342.   <version>1.5.4</version>
  • 343.    </dependency>
  • 344. AOP 모듈 정의: @Aspect 해당 클래스가 일반 자바 코드를 @Aspect
  • 345.    @Component public
  • 346.   class
  • 347.   AcmeAspect
  • 348.   {
  • 349.    
  • 350.   
  • 351.   
  • 352.   …⋯
  • 353.    } 자동 등록되도록 하려고 추가함
  • 354. 어드바이스 정의: @Advice 대상 @Aspect
  • 355.    public
  • 356.   class
  • 357.   AcmeAspect
  • 358.   { 
  • 359.   
  • 360.   
  • 361.   @ 
  • 362.   
  • 363.   
  • 364.   public
  • 365.   void
  • 366.   doSomeBefore()
  • 367.   {
  • 368.    
  • 369.   
  • 370.   
  • 371.   
  • 372.   
  • 373.   
  • 374.   System.out.println(System.currentTimeMillis 
  • 375.   
  • 376.   
  • 377.   }
  • 378.    } 적용 시점 기능 대상 (포인트컷)
  • 379. @Advice 시점 종류 @Before @After @AfterReturning @AfterThrowing @Around
  • 380. @Before & @After 조인 포인트 속성 외에 특별한 속성 없음 메서드 매개변수에 JoinPoint 조인포인트 정보 전달 @Before(“execution(*
  • 381.   set*(..)) public
  • 382.   void
  • 383.   doSomeBefore()
  • 384.   {
  • 385.    
  • 386.   
  • 387.   
  • 388.   …⋯
  • 389.    }
  • 390.    ! @After(“execution(*
  • 391.   set*(..)) public
  • 392.   void
  • 393.   doSomeAfter 
  • 394.   
  • 395.   
  • 396.   …⋯
  • 397.    } 조인포인트 정보
  • 398. @AfterReturning @AfterThrowing @AfterReturning의 returning 속성에 반환값을 받는 매개변수 지정 가능 @AfterThrowing의 throwing 가능 @AfterReturning(pointcut=“execution(*
  • 399.   set*(..)) public
  • 400.   void
  • 401.   doSomeAfter(Object
  • 402.   retVal)
  • 403.   {
  • 404.    
  • 405.   
  • 406.   
  • 407.   …⋯
  • 408.    }
  • 409.    ! @AfterThrowing(pointcut=“execution(*
  • 410.   set*(..)) public
  • 411.   void
  • 412.   doSomeAfter(Exception
  • 413.   ex)
  • 414.   {
  • 415.    
  • 416.   
  • 417.   
  • 418.   …⋯
  • 419.    } 반환 값 예외
  • 420. @Around ProceedingJoinPoint 타입의 매개변수에 ProceedingJoinPoint 실행할 수 있도록 함 @Around(pointcut=“execution(*
  • 421.   set*(..)) public
  • 422.   Object
  • 423.   doSomethingAround(ProceedingJoinPoint
  • 424.   thisJoinPoint) 
  • 425.   
  • 426.   
  • 427.   //
  • 428.   do
  • 429.   something
  • 430.   before
  • 431.   call
  • 432.   target
  • 433.   method
  • 434.    
  • 435.   
  • 436.   
  • 437.   Object
  • 438.   retval
  • 439.   =
  • 440.   thisJoinPoint.proceed();
  • 441.    
  • 442.   
  • 443.   
  • 444.   //
  • 445.   do
  • 446.   something
  • 447.   after
  • 448.   calling
  • 449.   target
  • 450.   method
  • 451.    
  • 452.   
  • 453.   
  • 454.   …⋯
  • 455.    
  • 456.   
  • 457.   
  • 458.   return
  • 459.   retval;
  • 460.    } 대상 메서드를 실행하고반환 값을 받음 반환 값 반환
  • 461. 대상 메서드 지정 분리: @Pointcut @Pointcut(“execution(*
  • 462.   *(..))”)
  • 463.    public
  • 464.   void
  • 465.   ifService()
  • 466.   {}
  • 467.    ! @Before(pointcut=“ifService()”)
  • 468.    public
  • 469.   void
  • 470.   doSomeBefore()
  • 471.   {
  • 472.    
  • 473.   
  • 474.   
  • 475.   …⋯
  • 476.    }
  • 477. 포인트컷 표현 execution within this target args @target @args @within @annotation
  • 478. execution execution( [throws
  • 479.    public, private 반환값 패키지와 클래스 이름 매서드 이름 매개변수 예외 execution(public
  • 480.   *
  • 481.   *(..)) execution(*
  • 482.   set*(..)) execution(*
  • 483.   com.xyz.service..*
  • 484. 기타
  • 485. @Enable* @EnableTransactionManagement @EnableCaching @EnableWebMvc @EnableScheduling @EnableAsync @EnableAspectJAutoProxy @EnableLoadTimeWeaving @EnableSpringConfigured
  • 486. @PropertySource @Configuration
  • 487.    @PropertySource(value
  • 488.   =
  • 489.   "classpath:META-INF/config.xml")
  • 490.    public
  • 491.   class
  • 492.   PropertySourcesConfiguration
  • 493.   {
  • 494.    }
  • 495.    ! ! @Configuration
  • 496.    @PropertySource(value
  • 497.   =
  • 498.   "classpath:META-INF/config.properties")
  • 499.    public
  • 500.   class
  • 501.   PropertySourcesConfiguration
  • 502.   {
  • 503.    } “XML 파일로 “Properties 파일로
  • 504. @Profile @Configuration class
  • 505.   DataAccessConfig
  • 506.   {
  • 507.    ! 
  • 508.   
  • 509.   @Configuration
  • 510.    
  • 511.   
  • 512.   @Profile({"JPA"})
  • 513.    
  • 514.   
  • 515.   public
  • 516.   static
  • 517.   class
  • 518.   JPAConfig
  • 519.   {
  • 520.   …⋯
  • 521.   }
  • 522.    ! 
  • 523.   
  • 524.   @Bean
  • 525.    
  • 526.   
  • 527.   @Profile("TEST 
  • 528.   
  • 529.   public
  • 530.   DataSource
  • 531.   embeddedDatabase ! } “JPA
  • 532. @Profile AnnotationConfigApplicationContext
  • 533.   applicationContext
  • 534.   =
  • 535.   new
  • 536.   A…⋯Context();
  • 537.    applicationContext.register(DataAccessConfig.class);
  • 538.    ! ConfigurableEnvironment
  • 539.   environment
  • 540.   =
  • 541.   applicationContext.getEnvironment();
  • 542.    environment.setActiveProfiles(Profiles.JPA,
  • 543.   Profiles.TEST “JPA, TEST