SlideShare a Scribd company logo
1 of 26
Download to read offline
Spring
II. Spring
Contents
1. 개요
2. Spring Bean Life Cycle
3. DI ( Dependency Injection ) – XML
4. DI ( Dependency Injection ) – annotation
5. DI ( Dependency Injection ) – JAVA Config
6. DI ( Dependency Injection ) – 의존성 주입
7. Filter, Interceptor, AOP
8. AOP
9. Sprig AOP
10. Sprig AOP – JoinPoint Interface
11. Sprig AOP – 예제
12. Filter
13. Interceptor
14. Spring MVC - @Controller
15. Spring MVC - @RestController
16. Spring MVC – 사용하는 Annotation
1. 결합도
2. 다양성
3. 디자인 패턴 ( Factory 패턴 )
I. 일반개념
Content
1. 결합도
2. 다양성
3. 디자인 패턴 ( Factory 패턴 )
I. 일반개념
1. 결합도
결합도란 하나의 클래스가 다른 클래스와 얼마나 많이 연결되어 있는지를 나타내는 표현으로 결합도가 높으면 유지 보수가 어렵다.
가입 유심 판매
단말 판매
기타 판매
판매는 일반 판매와 할부 판매가 있음
단말 판매
단말일반판매
단말할부판매
유심 판매
유심일반판매
유심할부판매
기타 판매
기타일반판매
기타할부판매
각 판매 Class에 일반 판매, 할부판매 Method 생성
public class ModelDevice {
// 일반 판매
public void modelSale() {
System.out.println("일반 판매");
}
// 할부 판매
public void modelInstallment() {
System.out.println("할부 판매");
}
}
public class UsimDevice {
// 일반 판매
public void usimSale() {
System.out.println("일반 판매");
}
// 할부 판매
public void usimInstallment() {
System.out.println("할부 판매");
}
}
public class AccessoriesDevice {
// 일반 판매
public void accessorieSale() {
System.out.println("일반 판매");
}
// 할부 판매
public void accessorieInstallment() {
System.out.println("할부 판매");
}
}
@SpringBootApplication
public class Exp01Application {
public static void main(String[] args) {
SpringApplication.run(Exp01Application.class, args);
ModelDevice modelDevice = new ModelDevice();
modelDevice.modelSale();
modelDevice.modelInstallment();
}
}
@SpringBootApplication
public class Exp01Application {
public static void main(String[] args) {
SpringApplication.run(Exp01Application.class, args);
UsimDevice usimDevice = new UsimDevice();
usimDevice.usimSale();
usimDevice.usimInstallment();
}
}
유심 판매로 변경시
• Method Signature가 틀려서 많은 부분이 수정됨
• 여러 Application과 같은 프로그램이 있다면 유지
보수 어려움
• 자바 다양성 이용
• 디자인 패턴 이용
Method를 강제 하려면
2. 다양성
결합도를 낮추기 위한 방법 중 하나로 객체지향 언어의 다양성을 이용 하여 상속과 메소드 재정의, 형변환을 이용 한다.
가입 유심 판매
단말 판매
기타 판매
판매는 일반 판매와 할부 판매가 있음
public class ModelDevice implements Device {
// 일반 판매
public void sale() {
System.out.println("일반 판매");
}
// 할부 판매
public void installment() {
System.out.println("할부 판매");
}
}
public class UsimDevice implements Device {
// 일반 판매
public void sale() {
System.out.println("일반 판매");
}
// 할부 판매
public void installment() {
System.out.println("할부 판매");
}
}
public class AccessoriesDevice implements Device {
// 일반 판매
public void sale() {
System.out.println("일반 판매");
}
// 할부 판매
public void installment() {
System.out.println("할부 판매");
}
}
@SpringBootApplication
public class Exp01Application {
public static void main(String[] args) {
SpringApplication.run(Exp01Application.class, args);
Device device = new ModelDevice();
device.sale();
device.installment();
}
}
유심 판매로 변경시
• 업무 로직에는 변경 없이 참조되는 객체만 변경
단말 판매
일반판매
할부판매
유심 판매
일반판매
할부판매
기타 판매
일반판매
할부판매
판매
<< Inteface >>
일반판매
할부판매
가입
public interface Device {
public void sale();
public void installment();
}
@SpringBootApplication
public class Exp01Application {
public static void main(String[] args) {
SpringApplication.run(Exp01Application.class, args);
Device device = new UsimDevice();
device.sale();
device.installment();
}
}
3. 디자인 패턴 ( Factory 패턴 )
클라이언트에서 사용할 객체 생성을 캡슐화 하여 느슨한 결합 상태로 만드는 것
가입 유심 판매
단말 판매
기타 판매
판매는 일반 판매와 할부 판매가 있음
public class ModelDevice implements Device {
// 일반 판매
public void sale() {
System.out.println("일반 판매");
}
// 할부 판매
public void installment() {
System.out.println("할부 판매");
}
}
public class UsimDevice implements Device {
// 일반 판매
public void sale() {
System.out.println("일반 판매");
}
// 할부 판매
public void installment() {
System.out.println("할부 판매");
}
}
public class AccessoriesDevice implements Device {
// 일반 판매
public void sale() {
System.out.println("일반 판매");
}
// 할부 판매
public void installment() {
System.out.println("할부 판매");
}
}
@SpringBootApplication
public class Exp01Application {
public static void main(String[] args) {
SpringApplication.run(Exp01Application.class, args);
// String saleType = "DEVICE";
SaleFactory salefactory = new SaleFactory();
if ( salefactory != null) {
Device device = (Device) salefactory.getBean(saleType);
device.sale();
device.installment();
}
}
}
유심 판매로 변경시
String saleType = " USIM“;
메소드 이면 호출 하는 클라이언트에서
파라메터 변경만 하면 됨
단말 판매
일반판매
할부판매
유심 판매
일반판매
할부판매
기타 판매
일반판매
할부판매
판매
<< Inteface >>
일반판매
할부판매
가입
public class SaleFactory {
public Object getBean(String saleType) {
if ( saleType.equals("DEVICE")) {
return new ModelDevice();
} else if (saleType.equals("USIM")) {
return new UsimDevice();
} else if (saleType.equals("ASSCESSORIES")) {
return new AccessoriesDevice();
}
return null
}
}
public interface Device {
public void sale();
public void installment();
}
판매 Factory
SaleFactory
Content
1. 개요
2. Spring Bean Life Cycle
3. DI ( Dependency Injection ) – XML
4. DI ( Dependency Injection ) – annotation
5. DI ( Dependency Injection ) – JAVA Config
6. DI ( Dependency Injection ) – 의존성 주입
7. Filter, Interceptor, AOP
8. AOP
9. Sprig AOP
10.Sprig AOP – JoinPoint Interface
11.Sprig AOP – 예제
12.Filter
13.Interceptor
14.Spring MVC - @Controller
15.Spring MVC - @RestController
16.Spring MVC – 사용하는 Annotation
I. Spring
1. 개요
- Spring Application Context라는 Container가 Application Component을 생
성하고 관리 한다.
- Dependency Injection(DI) 패턴을 기반으로 Bean의 상호 연결을 수행 한다.
: Application Component에 의존(사용)하는 다른 빈의 생성과 관리를 별도의
Container가 해주며, Component를 필요로 하는 Bean에 주입 한다.
- IoC (inversion of control)
: 프로그램의 실행 흐름이나 객체의 생명 주기를 개발자가 직접 제어 하는 것이 아니라
컨테이너로 제어권이 넘어가는 것
Spring Application Context
가입서비스
가입별상품서비
스
주입(연결)
다른 Application Component 도 Spring에 의해 관리됨
✓ @Controller // Presentation Layer에서 Controller명시
✓ @Service // Business Layer에서 Service 명시
✓ @Repository // Persistence Layer 에서 DAO 명시
✓ @Component // 기타 자동 등록 하고 싶은 것
✓ @Bean // 외부 라이브러리의 객체를 Bean으로 만들떄
Spring
Container
완전히 구성된 시스템
Fully configured system
Ready for Use
업무 Objects ( POJOs )
Configuration
Metadata
produces
• XML 기반
• 주석기반 : spring 2.5
• JAVA 기반 : spring 3.0
- Bean
: 컨테이너가 관리 하는 객체를 의미 하며 기본적으로 싱클턴
: 기본적으로 네가지 애너테이션을 사용하여 Class를 자동으로 Bean으로 등록
Non IoC
new
new
IoC
2. Spring Bean Life Cycle
- 인터페이스 구현
: Spring 에 종속적
- Bean 정의 시 메소드 지정
: Spring 에 종속적
- JSR-250 어노테이션 지정
XML 파일
자바설정클래스
어노데이션
빈 정의를 스캔
빈 인스턴스 생성
빈 프로퍼티에
의존성 주입
빈이 BeanNameAware
인터페이스를 구현시
setBeanName()호출
빈이
BeanClassLoaderAware
인터페이스 구현시
setBeanClassLoader()호출
빈이
ApplicatinContextAware
인터페이스 구현시
setApplicationContext()호
출
@PostConstruct
어노테이션
적용메소드 호출
빈이 InitializingBean
인터페이스를 구현 시
afterPropertiesSet()호출
빈이 Init-method
정의하면 (xml <bean>에
서 지정한 메서드 호출
@PreDestory 어노테이션
적용메소드 호출
빈이 DispoableBean
인터페이스를 구현 시
destory()호출
빈이 destroy-method
정의하면 (xml <bean>에
서 지정한 메서드 호출
Protype 스코프 빈에서는
호출 되지 않음
빈 인스턴스화 및 DI 스프링 인지 여부 검사 빈 생성 생명주기 콜백 빈 소멸 생명주기 콜백
public class BSimpleClass {
@PostConstruct
public void inPostConstructit(){
System.out.println("BEAN 생성 및 초기화 : init() 호출됨");
}
@PreDestroy
public void destroy(){
System.out.println("BEAN 생성 소멸 : destroy 호출됨");
}
}
•@PostConstruct 어노테이션을 지정한 메소드를 Bean생성과
properties의존성 주입 후 콜백으로 호출
•@PreDestroy 어노테이션을 지정한 메소드를 Bean 소멸 전
콜백으로 호출
3. DI ( Dependency Injection ) - XML
가입서비스
EntrService
가입별상품서비스
EntrBySvcService
주입(연결)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="entrServcice"
class="co.kr.abacus.spring.xml.entr.service.EntrServiceImpl" >
<constructor-arg ref="entrBySvcService" />
</bean>
<bean id="entrBySvcService"
class="co.kr.abacus.spring.xml.entrsvc.service.EntrBySvcServiceImpl" />
</beans>
#. 가입별상품서비스 bean을 가입서비스 bean에 연결
- Constructor Injection
: 생성자에서 받는 방식, final이라 불변(immutable)
- Setter Injection
: Setter Method를 통해서 주입 해주는 방식
public interface EntrService {
public void entrSvc();
}
public class EntrServiceImpl implements EntrService {
private EntrBySvcService entrBySvcServcie;
public EntrServiceImpl(EntrBySvcService entrBySvcServcie) {
this.entrBySvcServcie = entrBySvcServcie;
}
@Override
public void entrSvc() {
System.out.println("가입 서비스");
entrBySvcServcie.entrBySvc();
}
}
@SpringBootApplication
@ImportResource({"classpath*:applicationContext.xml"})
public class ExpXmlApplication {
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(ExpXmlApplication.class, args);
EntrService entrService = applicationContext.getBean(EntrService.class);
entrService.entrSvc();
}
}
public interface
EntrBySvcService {
public void entrBySvc();
}
public class EntrBySvcServiceImpl implements EntrBySvcService {
@Override
public void entrBySvc() {
System.out.println("상품 서비스");
}
}
4. DI ( Dependency Injection ) - annotation
가입서비스
EntrService
가입별상품서비스
EntrBySvcService
주입(연결)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan
base-package="co.kr.abacus.spring.annotation"></context:component-scan>
</beans>
#. 가입별상품서비스 bean을 가입서비스 bean에 연결
- 스프링 설정 파일에 Application에서 사용할 Bean을 등록 하지 않고 자동 설정
- <context:component-scan> element 정의
- Class에 @Component 설정
public interface EntrService {
public void entrSvc();
}
@Component("EntrService")
public class EntrServiceImpl implements EntrService {
private EntrBySvcService entrBySvcServcie;
public EntrServiceImpl(EntrBySvcService entrBySvcServcie) {
this.entrBySvcServcie = entrBySvcServcie;
}
@Override
public void entrSvc() {
System.out.println("가입 서비스");
entrBySvcServcie.entrBySvc();
}
}
@SpringBootApplication
@ImportResource({"classpath*:applicationContext.xml"})
public class ExpAnnotationApplication {
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(ExpAnnotationApplication.class, args);
EntrService entrService = (EntrService) applicationContext.getBean("EntrService");
entrService.entrServcie();
}
}
public interface EntrBySvcService
{
public void entrBySvc();
}
@Component("entrBySvcService")
public class EntrBySvcServiceImpl implements EntrBySvcService {
@Override
public void entrBySvc() {
System.out.println("상품 서비스");
}
}
5. DI ( Dependency Injection ) – JAVA Config
가입서비스
EntrService
가입별상품서비스
EntrBySvcService
주입(연결)
#. 가입별상품서비스 bean을 가입서비스 bean에 연결
- 스프링 설정 파일에 Application에서 사용할 Bean을 등록 하지 않고 자동 설정
- @Configuration 사용
public interface EntrService {
public void entrSvc();
}
public class EntrServiceImpl implements EntrService {
private EntrBySvcService entrBySvcServcie;
public EntrServiceImpl(EntrBySvcService entrBySvcServcie) {
this.entrBySvcServcie = entrBySvcServcie;
}
@Override
public void entrSvc() {
System.out.println("가입 서비스");
entrBySvcServcie.entrBySvc();
}
}
@SpringBootApplication
@ImportResource({"classpath*:applicationContext.xml"})
public class ExpAnnotationApplication {
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(ExpAnnotationApplication.class, args);
EntrService entrService = (EntrService) applicationContext.getBean("entrService");
entrService.entrServcie();
}
}
public interface EntrBySvcService
{
public void entrBySvc();
}
public class EntrBySvcServiceImpl implements EntrBySvcService {
@Override
public void entrBySvc() {
System.out.println("상품 서비스");
}
}
@Configuration
public class ServiceConfig {
@Bean
public EntrService entrService() {
return new EntrServiceImpl(entrBySvcService());
}
@Bean
public EntrBySvcService entrBySvcService() {
return new EntrBySvcServiceImpl();
} }
}
6. DI ( Dependency Injection ) – 의존성 주입
Spring에서 의존성 주입을 지원하는 어노테이션은 @Autowired, @Inject, @Qualifier, @Resource 있음, Spring에서는 @Autowired, @Qualifier
제공 함
- 생성자, 메소드, 멤버변수 위에 모두 사용 가능 하나 주로 멤버변수 위에 선언
Spring Container는 멤버변수의 타입을 체크 하여 해당 객체를 변수에 주입
- @Inject은 동일한 기능 임
- 의존성 대상이 되는 한 개 이상인 경우 지정
- 객체의 이름을 이용하여 의존성 주입
@Component("modelDevice")
public class ModelDevice implements Device {
// 일반 판매
public void sale() {
System.out.println("일반 판매");
}
// 할부 판매
public void installment() {
System.out.println("할부 판매");
}
}
@Component("usimDevice")
public class UsimDevice implements Device {
// 일반 판매
public void sale() {
System.out.println("일반 판매");
}
// 할부 판매
public void installment() {
System.out.println("할부 판매");
}
}
public interface Device {
public void sale();
public void installment();
}
public interface EntrService {
public void entrSvc();
}
@Component
public class EntrServiceImpl implements EntrService {
@Autowired
private EntrBySvcService entrBySvcServcie;
@Autowired
@Qualifier("modelDevice")
private Device modelDevice;
@Resource(name = "usimDevice")
private Device usimDevice;
@Override
public void entrServcie() {
entrBySvcServcie.entrBySvc();
modelDevice.sale();
usimDevice.sale();
}
}
public interface
EntrBySvcService {
public void entrBySvc();
}
@Component
public class EntrBySvcServiceImpl implements EntrBySvcService {
@Override
public void entrBySvc() {
System.out.println("상품 서비스");
}
}
@Component
public class ExpDiRunner
implements ApplicationRunner {
@Autowired
private EntrService entrServcie;
@Override
public void run(ApplicationArguments args)
throws Exception {
entrServcie.entrServcie();
}
}
@SpringBootApplication
public class ExpDiApplication {
public static void main(String[] args) {
SpringApplication.run(
ExpDiApplication.class, args);
}
}
- Component-scan 대상이 되는 객체 -> Spring에서 기능에 따라 추가 제공 - @Service
: 비즈니스 로직
- @Repository
: DB 연동
- @Controller
: 사용자 요청
7. Filter, Interceptor, AOP
- Interceptor와 Filter는 Servlet 단위에서 실행된다.
<> 반면 AOP는 메소드 앞에 Proxy패턴의 형태로
실행 됨
- 요청이 들어오면 Filter → Interceptor → AOP →
Interceptor → Filter 순으로 거치게 된다
- Filter
: 요청과 응답 사이에서 Data 정체 역할
: 스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대
해 동작 - 예) 인코딩, XSS 방어 등
: Fliter 실행 메소드
- init() - 필터 인스턴스 초기화
- doFilter() - 전/후 처리
- destroy() - 필터 인스턴스 종료
- Interceptor
: 인터셉터는 스프링의 DistpatcherServlet이 컨트롤러를 호출
하기 전, 후로 끼어들기 때문에 스프링 컨텍스트(Context, 영역)
내부에서 Controller(Handler)에 관한 요청과 응답에 대해 처리
: 스프링의 모든 빈 객체에 접근
: HttpServletRequest, HttpServletResponse를 파라미터로 사
용
: 인터셉터는 여러 개를 사용할 수 있고 로그인 체크, 권한체크,
프로그램 실행시간 계산작업 로그확인 등의 업무처리
: 인터셉터의 실행 메서드
- preHandler() - 컨트롤러 메서드가 실행되기 전
- postHanler() - 컨트롤러 메서드 실행직 후 view페이지 렌더
링 되기 전
- afterCompletion() - view페이지가 렌더링 되고 난 후
- AOP
: 메소드 전후의 지점에 자유롭게 설정
: Advice의 경우 JoinPoint나 ProceedingJoinPoint 등을 활용
: AOP의 포인트컷
- @Before: 대상 메서드의 수행 전
- @After: 대상 메서드의 수행 후
- @After-returning: 대상 메서드의 정상적인 수행 후
- @After-throwing: 예외발생 후
- @Around: 대상 메서드의 수행 전/후
Client
Dispatcher
Servlet
@Controller
@Service
@Respository
<Interface>
ServletRequest
Listener
<Interface>
Handler Interceptor
@Controller
Advice
Spring AOP (AspectJ)
<Interface>
Filter
- javax.servlet.Filter.ServletRequestListener
: 요청 시작과 요청 종료시의 타이밍에서 어떤 작업을 수행
- javax.servlet.Filter
: Servlet, JSP, 정적 콘텐츠 등의 Web 리소스에 대한 액세스 전후에 공통 작업을 수행
- HandlerInterceptor
: Spring MVC의 Handler의 호출 전후에 일반적인 작업을 수행
- @ControllerAdvice
: Controller 전용의 특수한 메소드 (@InitBainder메소드,@ModelAttribute메소드,@ExceptionHandler메소드)를 복수의
Controller에서 공유
- Spring AOP (AspectJ)
: Spring의 DI 컨테이너에서 관리되는 Bean의 public 메소드 호출 전후에 일반적인 작업을 수행
①
②
③ ④
⑤ ⑤
Interceptor
AOP
@Around
preHandler
Filter
dofilter
postHandler
dofilter
⑤
@Before
@AfterReturning
@AfterThrowing
@After
After Completion
8. AOP
DI(Dependency Inject)가 결합도를 낮추는 것이라면 AOP은 응집도와 관련된 기능으로 횡단 관심 분리임.
- 메소드 마다 공통인 로깅, 예외, 트랜잭션과 같은 횡단 관심과 실제 수행 되는 업
무 로직을 핵심 관심이라 함
업무 로직
업무 Method
로그
업무 로직
예외
트랜잭션
로그
업무 Method
로그
업무 로직
예외
트랜잭션
로그
업무 Method
로그
업무 로직
예외
트랜잭션
로그
횡
단
관
심
::
A
O
P
핵심관심
- Advice : Aspect가 해야 할 작업으로 언제 무엇을 해야 하는지 정의
before(이전) : advice 대상 Method가 호출 되기 전
after(이후) : 결과에 상관없이 advice 대상 Method사 완료 된 후
after-returning(반환 이후) : advice 대상 Method가 성공적으로 완료 된 후
after-throwing(예외 발생 이후) : advice 대상 Method가 예외를 던진 후
around(주위) : advice가 advice 대상 메소드를 감싸서 advice 대상 Method 호출 전과 호출 후
몇가지 기능 제공
- Join point : Advice를 적용 할 수 있는 곳으로 Application 실행에 Aspect를 끼
워 넣을 수 있는 지점, 모든 업무 메소드
- Pointcut : Aspect가 Advice할 Join point의 영역을 좁히는 일을 함, 즉 어디서
할지를 정의 함
각 pojntcut은 Advice가 weaving되어야 하나 이상의 Join point를 정의함
- Aspect : Advice와 Pointcut를 합친 것으로 무엇을 언제 어디서 할지 모든 정보
를 정의함
- Introduction : 기존 Class에 코드 변경 없이도 새 Method, Member Variable
을 추가 하는 기능
- Weaving : 타깃 객체에 Aspect를 적용해서 새로운 프록시 객체를 생성하는 절
차
compile time : 컴파일 시점에 weaving. 별도의 컴파일러 필요, Aspect 5의 Weaving Compile
classload time : JVM에 로드 될 떄 weaving. AspectJ 5의 Load-Time Weaving 기능 사용
runtime : 실행 중에 weaving. Spring AOP Aspect
- Classic Spring Proxy 기반 AOP
- Pure-POJO Aspect
- @AspectJ Annotation 기반 Aspect
- AspectJ Aspect에 bean 주입
Advice
Pointcut
Join Point
Program 실행
9. Sprig AOP
Spring Aspect는 Target 객체를 감싸는 프록시 형태로 구현되며, 이 프록시는 먼저 호출을 가로챈 후 추가적인 Aspect 로직을 수행 하고 나서야
Target Method를 호출 한다.
호출자
Proxy
Target
실행 시간에 생성 -> Aspect가 Spring 관리 Bean weaving
동적 프록시를 기반으로 AOP를 구현 하므로 메소드 Join Point만 지원함
- execution : 메소드 실행 Join Point와 일치 시키는데 사용
- within : 특정 타입에 속하는 Join Point 정의
- bean : bean 이름으로 pointcut
package co.kr.abacus
public interface SvcByEntrService {
public void saveService
}
Execution ( * co.kr.abacus.SvcByEntrService.saveService(…) )
① ②
③ ④ ⑤ ⑥
① 메소드 실행 시작 ② 메소드 명세
③ 리턴 타입 지정
- * : 모든 리턴 타입 허용
- void : 리턴 타입이 void인 메소드
- !void : 리턴 타입이 void가 아닌 메소드
④ 메소드가 속하는 타입
- 패키지 + 클래스
- 패키지 지정
- co.kr.abacus : 해당 패키지만
- co.kr.abacus.. : 지정된 패키지로 시작하는 모든 패키지
- 클래스
- FullName (SvcByEntrService ) : 헤당 클래스만
- *Service : 이름이 Service로 끝나는 클래스
- Service+: 클래스 이름 뒤에 '+'가 붙으면 해당 클래스로부터 파생된
모든 자식 클래스 선택, 인터페이스 이름 뒤에 '+'가 붙으면 해당
인터페이스를 구현한 모든 클래스
⑤ 메소드
- * : 모든 메소드 선택
- save* : save로 시작 하는 모든 메소드
⑥ 인자
- (..) : 모든 매개변수
- (*) : 반드시 1개의 매개변수를 가지는 메소드만 선택
- (Fullpackage) : 매개변수로 작성된 Class가 가지고 있는 메소드
- (!Fullpackage) : 매개변수로 작성된 Class를 가지지 않는 메소드
- (Integer, ..) : 한 개 이상의 매개변수를 가지되, 첫 번째 매개변수
의 타입이 Integer인 메소드만
- (Integer, *) : 반드시 두 개의 매개변수를 가지되, 첫 번째 매개변수
의 타입이 Integer인 메소드만 -
#. 범위 제한
Execution ( * co.kr.abacus.SvcByEntrService.saveService(…))
&& within(co.kr.abacus.* )
⑦ ⑧
⑦ 조합 및 연산자
- && : and 연산자
- || : or 연산자
- ! : 부정
10. Sprig AOP – JoinPoint Interface
Advice 메소드를 의미 있게 구현하려면 클라이언트가 호출한 비즈니스 메소드의 정보가 필요하다. 예를 들면 예외가 터졌는데, 예외발생한
메소드의 이름 등을 기록할 필요가 있을 수 있다. 이럴때 JoinPoint 인터페이스가 제공하는 유용한 API들이 있다
Signature getSignature() : 클라이언트가 호출한 메소드의 시그니처(리턴타입, 이름, 매개변수) 정보가 저장된 Signature 객체 리턴
Object getTarget() : 클라이언트가 호출한 비즈니스 메소드를 포함하는 비즈니스 객체 리턴
Object[] getArgs() : 클라이언트가 메소드를 호출할 때 넘겨준 인자 목록을 Object 배열 로 리턴
String getName() : 클라이언트가 호출한 메소드 이름 리턴
String toLongString() : 클라이언트가 호출한 메소드의 리턴타입, 이름, 매개변수(시그니처)를 패키지 경로까지 포함 하여 리턴
String toShortString() : 클라이언트가 호출한 메소드 시그니처를 축약한 문자열로 리턴
@Around("entrBySvc()")
public void watchEntrBySvc(ProceedingJoinPoint pjp) {
logger.info("start - " + pjp.getSignature().getDeclaringTypeName() + " / " + pjp.getSignature().getName());
try {
pjp.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
logger.info("finished - " + pjp.getSignature().getDeclaringTypeName() + " / " + pjp.getSignature().getName());
}
}
11. Sprig AOP – 예제
@EnableAspectJAutoProxy
@SpringBootApplication
public class ExpAopApplication {
public static void main(String[] args) {
SpringApplication.run(ExpAopApplication.class, args);
}
}
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
#. pom.xml
#. Application Start
@Component
public class ExpAopRunner implements ApplicationRunner {
@Autowired
private EntrBySvcService entrBySvcService;
@Autowired
private EntrService entrService;
@Override
public void run(ApplicationArguments args)
throws Exception {
System.out.println("*** Spring Autowired *************");
entrService.entrServcie();
entrBySvcService.entrBySvc();
}
}
@Aspect
public class EntrServiceAspect {
Logger logger = LoggerFactory.getLogger(EntrServiceAspect.class);
….
}
@Configuration
public class EntrBySvcConfig {
@Bean
public EntrServiceAspect entrBySvcBeanAspect() {
return new EntrServiceAspect();
}
}
Bean
주입
@Aspect
@Component
public class EntrBySvcAspect {
Logger logger = LoggerFactory.getLogger(EntrBySvcAspect.class);
// Pointcut 정의
@Pointcut("execution(* co.kr.abacus.spring.aop.entrsvc.service.EntrBySvcService.entrBySvc(..))")
public void entrBySvc() {};
//@Before("execution(* co.kr.abacus.spring.aop.entrsvc.service.EntrBySvcService.entrBySvc(..))")
@Before("entrBySvc()")
public void beforeService() { logger.info("*** 실행 이전 "); }
@AfterReturning("entrBySvc()")
public void afterReturningService() { logger.info("*** 실행 성공 "); }
@AfterThrowing("entrBySvc()")
public void AfterThrowingService() { logger.info("*** 실행 실패 "); }
@Around("entrBySvc()")
public void watchEntrBySvc(ProceedingJoinPoint pjp) {
logger.info("start - " + pjp.getSignature().getDeclaringTypeName() + " / " + pjp.getSignature().getName());
try {
pjp.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
logger.info("finished - " + pjp.getSignature().getDeclaringTypeName() + " / " + pjp.getSignature().getName());
}
}
DI 의존성 주입
- javax.servlet-api나 tomcat-embed-core를 사용하면 제공되는
servlet filter interface
12. Filter
@Order(1)
@Component
public class ServletFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(request, response);
}
}
@Order(3)
public class GenericFilterBeanFlter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO 전처리
chain.doFilter(request, response);
}
}
@Configuration
public class GenericFilterBeanFilterConfig {
@Bean
public GenericFilterBeanFlter GenericFilterBeanFlte() {
return new GenericFilterBeanFlter();
}
}
@Order(0)
@Component
public class SomeFilter extends OncePerRequestFilter{
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
chain.doFilter(request, response);
}
}
13. Interceptor
@Component
public class SomeInterceptor extends HandlerInterceptorAdapter {
Logger logger = LoggerFactory.getLogger(SomeInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
logger.info("===== before(interceptor) =====");
return true;
}
@Override
public void postHandle(
HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception {
logger.info("===== after(interceptor) =====");
}
@Override
public void afterCompletion(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
logger.info("===== afterCompletion =====");
}
}
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private SomeInterceptor someInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(someInterceptor)
.addPathPatterns("/some/**")
.excludePathPatterns("/etc/**");
}
}
http://localhost:8080/some
http://localhost:8080/etc
14. Spring MVC - @Controller
Client
( IE, Chrome,..)
VIEW
DispatcherServlet
HandlerMapping Controller Service DAO or Repository
DB
1. URL을 통해서 접근
하여 정보요청
ViewResolver
2. 정보
요청
3. 해당 요청을 매핑한
Controller가 존재 하는지 체크
4. 처리 요청 ( Bean ) 5. 처리 요청 ( DTO )
6. 처리 요청
(DTO or Entity )
7. 처리 요청
( DTO or Entity )
8. 응답
( DTO or Entity )
9. 응답
(DTO or Entity )
10. 응답
(DTO)
11. Client의 요청을 처리하고 결과를
출력할 View or Json 리턴
12. Controller에서 보내온 View이름을
토대로 처리 View 검색
13. 처리 결과를 View에 송신
14. 처리결
과가 포함
된 View응
Dispatche
rServlet 에
송신
15. 최종결과출력
• xxx.xml에 포함
(Servlet 설정 파일)
• Springframework 제공
• @Requestmappiing() 제공
• web.xml 제공
• Springframework 제공
• web.xml 포함
• Springframework 제공
• p:prefix=“/WEB-INF/jsp”
p:”suffix=“jsp”
• @Controller
• @RequestMapping()
• @GetMapping, @PostMapping …
• @ResponseBody
• @Service
• @Component
• @Mapper
• @Respository
Spring MVC 구조
15. Spring MVC - @RestController
Client
( IE, Chrome,..)
DispatcherServlet
HandlerMapping Controller Service DAO or Repository
DB
2. 해당 요청을 매핑한
Controller가 존재 하는지 체크
3. 처리 요청 ( Bean ) 4. 처리 요청 ( DTO )
5. 처리 요청
(DTO or Entity )
6. 처리 요청
( DTO or Entity )
7. 응답
( DTO or Entity )
8. 응답
(DTO or Entity )
9. 응답
(DTO)
10. Client의 요청을 처리하고 결과를
출력할 Json 리턴
1. 서비스 요청
• xxx.xml에 포함
(Servlet 설정 파일)
• Springframework 제공
• @Requestmappiing() 제공
• web.xml 제공
• Springframework 제공
• @RestController
• @RequestMapping()
• @GetMapping, @PostMapping …
• @Service
• @Component
• @Mapper
• @Respository
Spring MVC 구조 : @RestController = @Controller + @ResponseBody
16. Spring MVC – 사용하는 Annotation
- @RequestBody
: Http요청의 Body내용을 자바 객체로 매핑
- @ResponseBody
: 자바 객체를 Http 응답의 Body내용으로 매핑 ( Json )
@RestController
Public class ServiceController {
// Http 요청의 내용을 RequestDTO 객체에 매핑하기 위해서 @RequestBody 사용
// @ResponseBody를 사용 하지 않는 이유 : @RestController 사용 하였기 때문
// @Controller를 사용 하는 경우 : @ResponseBody를 사용 해야 함
@RequestMapping(value=“/uri/process”, method = RequestMethod.POST)
public ResponseDTO process(@RequestBody RequestDTO requestDTO) {
ResponseDTO responseDTO = service.process(requestDTO);
return responseDTO;
}
}
- Uri을 Controller에 매핑 해 주는 기능
: Method 수준
-
: Class 수준
@RestController
Public class ServiceController {
@RequestMapping(value=“/uri/process”, method = RequestMethod.POST)
public ResponseDTO process(@RequestBody RequestDTO requestDTO) { … }
// 복수 설정
@RequestMapping(value={“/uri/process”, “/ uri/process01”},
method = RequestMethod.POST)
public ResponseDTO process(@RequestBody RequestDTO requestDTO) { … }
}
@RestController
@RequestMapping(value=“/uri/process”)
Public class ServiceController {
// Uri : /uri/process -> Http Request Method만 사용
// RequestMethod.POST, GET, PUT, PATCH, DELETE, TRACE, OPTIONS
@RequestMapping(method = RequestMethod.POST)
public ResponseDTO process(@RequestBody RequestDTO requestDTO) { … }
// Uri : /uri/process/processA
@RequestMapping(value=“/processA”,
method = RequestMethod.POST)
public ResponseDTO process(@RequestBody RequestDTO requestDTO) { … }
// 복수 설정
@RequestMapping(value={“/processA”, “/processB”},
method = RequestMethod.POST)
public ResponseDTO process(@RequestBody RequestDTO requestDTO) { … }
}
- GET
: 요청 받은 URI의 정보를 검색
- POST
: 요청된 자원을 생성
- PUT
: 요청된 자원을 수정 , 요청된 자원 전체 갱신
- PATCH
: 요청된 자원을 수정, 일부만 갱신
- DELETE
: 요청된 자원 삭제
- OPTIONS
: 지원 되는 메소드의 종류 확인
#별첨 1. Spring Boot
- Spring Framework애 기반을 으로 확장해 자동 구성을 가능하게 한다.
- 단순히 실행하고 독립형 제품 수준의 스프링 기반 Application을 쉽게 만듦
- JMS, JDBC, JPA등과 같은 하부 구조를 자동으로 구성
- Main 함수가 있는 Class로 시작점
- @SpringBootApplication
: @Configuration(스프링 자바 구성 클래스), @ComponenrScan(컴
포넌트 탐색), @EnableAutoConfiguration(자동 구성)을 포함
@SpringBootApplication
public class ExpFilterInApplication {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(ExpFilterInApplication.class, args);
System.out.println("# Beans : " + ctx.getBeanDefinitionCount());
String[] names = ctx.getBeanDefinitionNames();
Arrays.sort(names);
Arrays.asList(names).forEach(System.out::println);
}
}
@Component
public class ExpDiRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("*** **** *************");
}
}
#별첨 2. Spring Boot 시작
- Application이 시작되고 일부 코드를 수행 하고자 할 때 사용
@SpringBootApplication
public class ExpRunApplication {
public static void main(String[] args) {
SpringApplication.run(ExpRunApplication.class, args);
}
@Bean
public ApplicationRunner StringSVC(ServiceSVC serviceSVC) {
return args -> {
System.out.println(serviceSVC.StringSVC("Hello"));
};
}
}
public interface ServiceSVC {
public String StringSVC(String str);
}
public interface ServiceSVC {
public String StringSVC(String str);
}
www.iabacus.co.kr
Tel. 82-2-2109-5400
Fax. 82-2-6442-5409
THANKS

More Related Content

What's hot

소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙Hong Hyo Sang
 
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법Sungchul Park
 
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicknight1128
 
자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화Sungchul Park
 
자바9 특징 (Java9 Features)
자바9 특징 (Java9 Features)자바9 특징 (Java9 Features)
자바9 특징 (Java9 Features)Chang-Hwan Han
 
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...탑크리에듀(구로디지털단지역3번출구 2분거리)
 

What's hot (19)

소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙
 
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
 
자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법
 
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
 
(스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션
(스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션(스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션
(스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
 
자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화
 
Java(1/4)
Java(1/4)Java(1/4)
Java(1/4)
 
5.Spring IoC&DI(DI와 관련된 어노테이션)
5.Spring IoC&DI(DI와 관련된 어노테이션)5.Spring IoC&DI(DI와 관련된 어노테이션)
5.Spring IoC&DI(DI와 관련된 어노테이션)
 
Java(2/4)
Java(2/4)Java(2/4)
Java(2/4)
 
자바9 특징 (Java9 Features)
자바9 특징 (Java9 Features)자바9 특징 (Java9 Features)
자바9 특징 (Java9 Features)
 
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
 
(Spring Data JPA)게시판 리스트보기_오라클, 스프링부트,페이지나누기
(Spring Data JPA)게시판 리스트보기_오라클, 스프링부트,페이지나누기(Spring Data JPA)게시판 리스트보기_오라클, 스프링부트,페이지나누기
(Spring Data JPA)게시판 리스트보기_오라클, 스프링부트,페이지나누기
 
스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
 
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
 
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
 
자바모델 클래스에 날개를달자_롬복(Lombok)
자바모델 클래스에 날개를달자_롬복(Lombok)자바모델 클래스에 날개를달자_롬복(Lombok)
자바모델 클래스에 날개를달자_롬복(Lombok)
 
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
 

Similar to Spring 교육 자료

NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...
NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스  ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스  ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...
NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...
NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스  ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스  ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...
NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기NAVER Engineering
 
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Sonarqube 20160509
Sonarqube 20160509Sonarqube 20160509
Sonarqube 20160509영석 조
 
Spring-Boot (springcamp2014)
Spring-Boot (springcamp2014)Spring-Boot (springcamp2014)
Spring-Boot (springcamp2014)sung yong jung
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게Sungju Jin
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Choonghyun Yang
 
[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발NAVER D2
 
HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.Hojin Jun
 
Why use Dagger in Android
Why use Dagger in AndroidWhy use Dagger in Android
Why use Dagger in Androidkiyoung lee
 
Youtube를활용한app만들기
Youtube를활용한app만들기Youtube를활용한app만들기
Youtube를활용한app만들기DaeHee Jang
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계Chiwon Song
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.Ryan Park
 
HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2SeungHyun Hwang
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Ryan Park
 

Similar to Spring 교육 자료 (20)

NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...
NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스  ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스  ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...
NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...
 
NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...
NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스  ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스  ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...
NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...
 
Eclipse RCP 1/2
Eclipse RCP 1/2Eclipse RCP 1/2
Eclipse RCP 1/2
 
8.Spring DI_3
8.Spring DI_38.Spring DI_3
8.Spring DI_3
 
Spring boot DI
Spring boot DISpring boot DI
Spring boot DI
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
 
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
 
Sonarqube 20160509
Sonarqube 20160509Sonarqube 20160509
Sonarqube 20160509
 
3.Spring IoC&DI(spring ioc실습, XML기반)
3.Spring IoC&DI(spring ioc실습, XML기반)3.Spring IoC&DI(spring ioc실습, XML기반)
3.Spring IoC&DI(spring ioc실습, XML기반)
 
Spring-Boot (springcamp2014)
Spring-Boot (springcamp2014)Spring-Boot (springcamp2014)
Spring-Boot (springcamp2014)
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)
 
[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발
 
HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.
 
Why use Dagger in Android
Why use Dagger in AndroidWhy use Dagger in Android
Why use Dagger in Android
 
Youtube를활용한app만들기
Youtube를활용한app만들기Youtube를활용한app만들기
Youtube를활용한app만들기
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
 
HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
 

More from Hyosang Hong

More from Hyosang Hong (20)

MSA_기초자료.pdf
MSA_기초자료.pdfMSA_기초자료.pdf
MSA_기초자료.pdf
 
Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형
 
Java 연산자
Java 연산자Java 연산자
Java 연산자
 
Java lambda
Java lambdaJava lambda
Java lambda
 
Java inner class
Java inner classJava inner class
Java inner class
 
Java generic
Java genericJava generic
Java generic
 
Java extends
Java extendsJava extends
Java extends
 
Java 제어
Java 제어Java 제어
Java 제어
 
Java collection
Java collectionJava collection
Java collection
 
Java class
Java classJava class
Java class
 
Map struct
Map structMap struct
Map struct
 
Kafka 자료 v0.1
Kafka 자료 v0.1Kafka 자료 v0.1
Kafka 자료 v0.1
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료
 
Java 이해하기 쉬운 코드 20210405
Java 이해하기 쉬운 코드 20210405Java 이해하기 쉬운 코드 20210405
Java 이해하기 쉬운 코드 20210405
 
Java 유지보수 가능한 개발 원칙
Java 유지보수 가능한 개발 원칙Java 유지보수 가능한 개발 원칙
Java 유지보수 가능한 개발 원칙
 
Enum
EnumEnum
Enum
 
Java stream v0.1
Java stream v0.1Java stream v0.1
Java stream v0.1
 
Map struct
Map structMap struct
Map struct
 
Kafka 자료 v0.1
Kafka 자료 v0.1Kafka 자료 v0.1
Kafka 자료 v0.1
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료
 

Spring 교육 자료

  • 2. II. Spring Contents 1. 개요 2. Spring Bean Life Cycle 3. DI ( Dependency Injection ) – XML 4. DI ( Dependency Injection ) – annotation 5. DI ( Dependency Injection ) – JAVA Config 6. DI ( Dependency Injection ) – 의존성 주입 7. Filter, Interceptor, AOP 8. AOP 9. Sprig AOP 10. Sprig AOP – JoinPoint Interface 11. Sprig AOP – 예제 12. Filter 13. Interceptor 14. Spring MVC - @Controller 15. Spring MVC - @RestController 16. Spring MVC – 사용하는 Annotation 1. 결합도 2. 다양성 3. 디자인 패턴 ( Factory 패턴 ) I. 일반개념
  • 3. Content 1. 결합도 2. 다양성 3. 디자인 패턴 ( Factory 패턴 ) I. 일반개념
  • 4. 1. 결합도 결합도란 하나의 클래스가 다른 클래스와 얼마나 많이 연결되어 있는지를 나타내는 표현으로 결합도가 높으면 유지 보수가 어렵다. 가입 유심 판매 단말 판매 기타 판매 판매는 일반 판매와 할부 판매가 있음 단말 판매 단말일반판매 단말할부판매 유심 판매 유심일반판매 유심할부판매 기타 판매 기타일반판매 기타할부판매 각 판매 Class에 일반 판매, 할부판매 Method 생성 public class ModelDevice { // 일반 판매 public void modelSale() { System.out.println("일반 판매"); } // 할부 판매 public void modelInstallment() { System.out.println("할부 판매"); } } public class UsimDevice { // 일반 판매 public void usimSale() { System.out.println("일반 판매"); } // 할부 판매 public void usimInstallment() { System.out.println("할부 판매"); } } public class AccessoriesDevice { // 일반 판매 public void accessorieSale() { System.out.println("일반 판매"); } // 할부 판매 public void accessorieInstallment() { System.out.println("할부 판매"); } } @SpringBootApplication public class Exp01Application { public static void main(String[] args) { SpringApplication.run(Exp01Application.class, args); ModelDevice modelDevice = new ModelDevice(); modelDevice.modelSale(); modelDevice.modelInstallment(); } } @SpringBootApplication public class Exp01Application { public static void main(String[] args) { SpringApplication.run(Exp01Application.class, args); UsimDevice usimDevice = new UsimDevice(); usimDevice.usimSale(); usimDevice.usimInstallment(); } } 유심 판매로 변경시 • Method Signature가 틀려서 많은 부분이 수정됨 • 여러 Application과 같은 프로그램이 있다면 유지 보수 어려움 • 자바 다양성 이용 • 디자인 패턴 이용 Method를 강제 하려면
  • 5. 2. 다양성 결합도를 낮추기 위한 방법 중 하나로 객체지향 언어의 다양성을 이용 하여 상속과 메소드 재정의, 형변환을 이용 한다. 가입 유심 판매 단말 판매 기타 판매 판매는 일반 판매와 할부 판매가 있음 public class ModelDevice implements Device { // 일반 판매 public void sale() { System.out.println("일반 판매"); } // 할부 판매 public void installment() { System.out.println("할부 판매"); } } public class UsimDevice implements Device { // 일반 판매 public void sale() { System.out.println("일반 판매"); } // 할부 판매 public void installment() { System.out.println("할부 판매"); } } public class AccessoriesDevice implements Device { // 일반 판매 public void sale() { System.out.println("일반 판매"); } // 할부 판매 public void installment() { System.out.println("할부 판매"); } } @SpringBootApplication public class Exp01Application { public static void main(String[] args) { SpringApplication.run(Exp01Application.class, args); Device device = new ModelDevice(); device.sale(); device.installment(); } } 유심 판매로 변경시 • 업무 로직에는 변경 없이 참조되는 객체만 변경 단말 판매 일반판매 할부판매 유심 판매 일반판매 할부판매 기타 판매 일반판매 할부판매 판매 << Inteface >> 일반판매 할부판매 가입 public interface Device { public void sale(); public void installment(); } @SpringBootApplication public class Exp01Application { public static void main(String[] args) { SpringApplication.run(Exp01Application.class, args); Device device = new UsimDevice(); device.sale(); device.installment(); } }
  • 6. 3. 디자인 패턴 ( Factory 패턴 ) 클라이언트에서 사용할 객체 생성을 캡슐화 하여 느슨한 결합 상태로 만드는 것 가입 유심 판매 단말 판매 기타 판매 판매는 일반 판매와 할부 판매가 있음 public class ModelDevice implements Device { // 일반 판매 public void sale() { System.out.println("일반 판매"); } // 할부 판매 public void installment() { System.out.println("할부 판매"); } } public class UsimDevice implements Device { // 일반 판매 public void sale() { System.out.println("일반 판매"); } // 할부 판매 public void installment() { System.out.println("할부 판매"); } } public class AccessoriesDevice implements Device { // 일반 판매 public void sale() { System.out.println("일반 판매"); } // 할부 판매 public void installment() { System.out.println("할부 판매"); } } @SpringBootApplication public class Exp01Application { public static void main(String[] args) { SpringApplication.run(Exp01Application.class, args); // String saleType = "DEVICE"; SaleFactory salefactory = new SaleFactory(); if ( salefactory != null) { Device device = (Device) salefactory.getBean(saleType); device.sale(); device.installment(); } } } 유심 판매로 변경시 String saleType = " USIM“; 메소드 이면 호출 하는 클라이언트에서 파라메터 변경만 하면 됨 단말 판매 일반판매 할부판매 유심 판매 일반판매 할부판매 기타 판매 일반판매 할부판매 판매 << Inteface >> 일반판매 할부판매 가입 public class SaleFactory { public Object getBean(String saleType) { if ( saleType.equals("DEVICE")) { return new ModelDevice(); } else if (saleType.equals("USIM")) { return new UsimDevice(); } else if (saleType.equals("ASSCESSORIES")) { return new AccessoriesDevice(); } return null } } public interface Device { public void sale(); public void installment(); } 판매 Factory SaleFactory
  • 7. Content 1. 개요 2. Spring Bean Life Cycle 3. DI ( Dependency Injection ) – XML 4. DI ( Dependency Injection ) – annotation 5. DI ( Dependency Injection ) – JAVA Config 6. DI ( Dependency Injection ) – 의존성 주입 7. Filter, Interceptor, AOP 8. AOP 9. Sprig AOP 10.Sprig AOP – JoinPoint Interface 11.Sprig AOP – 예제 12.Filter 13.Interceptor 14.Spring MVC - @Controller 15.Spring MVC - @RestController 16.Spring MVC – 사용하는 Annotation I. Spring
  • 8. 1. 개요 - Spring Application Context라는 Container가 Application Component을 생 성하고 관리 한다. - Dependency Injection(DI) 패턴을 기반으로 Bean의 상호 연결을 수행 한다. : Application Component에 의존(사용)하는 다른 빈의 생성과 관리를 별도의 Container가 해주며, Component를 필요로 하는 Bean에 주입 한다. - IoC (inversion of control) : 프로그램의 실행 흐름이나 객체의 생명 주기를 개발자가 직접 제어 하는 것이 아니라 컨테이너로 제어권이 넘어가는 것 Spring Application Context 가입서비스 가입별상품서비 스 주입(연결) 다른 Application Component 도 Spring에 의해 관리됨 ✓ @Controller // Presentation Layer에서 Controller명시 ✓ @Service // Business Layer에서 Service 명시 ✓ @Repository // Persistence Layer 에서 DAO 명시 ✓ @Component // 기타 자동 등록 하고 싶은 것 ✓ @Bean // 외부 라이브러리의 객체를 Bean으로 만들떄 Spring Container 완전히 구성된 시스템 Fully configured system Ready for Use 업무 Objects ( POJOs ) Configuration Metadata produces • XML 기반 • 주석기반 : spring 2.5 • JAVA 기반 : spring 3.0 - Bean : 컨테이너가 관리 하는 객체를 의미 하며 기본적으로 싱클턴 : 기본적으로 네가지 애너테이션을 사용하여 Class를 자동으로 Bean으로 등록 Non IoC new new IoC
  • 9. 2. Spring Bean Life Cycle - 인터페이스 구현 : Spring 에 종속적 - Bean 정의 시 메소드 지정 : Spring 에 종속적 - JSR-250 어노테이션 지정 XML 파일 자바설정클래스 어노데이션 빈 정의를 스캔 빈 인스턴스 생성 빈 프로퍼티에 의존성 주입 빈이 BeanNameAware 인터페이스를 구현시 setBeanName()호출 빈이 BeanClassLoaderAware 인터페이스 구현시 setBeanClassLoader()호출 빈이 ApplicatinContextAware 인터페이스 구현시 setApplicationContext()호 출 @PostConstruct 어노테이션 적용메소드 호출 빈이 InitializingBean 인터페이스를 구현 시 afterPropertiesSet()호출 빈이 Init-method 정의하면 (xml <bean>에 서 지정한 메서드 호출 @PreDestory 어노테이션 적용메소드 호출 빈이 DispoableBean 인터페이스를 구현 시 destory()호출 빈이 destroy-method 정의하면 (xml <bean>에 서 지정한 메서드 호출 Protype 스코프 빈에서는 호출 되지 않음 빈 인스턴스화 및 DI 스프링 인지 여부 검사 빈 생성 생명주기 콜백 빈 소멸 생명주기 콜백 public class BSimpleClass { @PostConstruct public void inPostConstructit(){ System.out.println("BEAN 생성 및 초기화 : init() 호출됨"); } @PreDestroy public void destroy(){ System.out.println("BEAN 생성 소멸 : destroy 호출됨"); } } •@PostConstruct 어노테이션을 지정한 메소드를 Bean생성과 properties의존성 주입 후 콜백으로 호출 •@PreDestroy 어노테이션을 지정한 메소드를 Bean 소멸 전 콜백으로 호출
  • 10. 3. DI ( Dependency Injection ) - XML 가입서비스 EntrService 가입별상품서비스 EntrBySvcService 주입(연결) <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="entrServcice" class="co.kr.abacus.spring.xml.entr.service.EntrServiceImpl" > <constructor-arg ref="entrBySvcService" /> </bean> <bean id="entrBySvcService" class="co.kr.abacus.spring.xml.entrsvc.service.EntrBySvcServiceImpl" /> </beans> #. 가입별상품서비스 bean을 가입서비스 bean에 연결 - Constructor Injection : 생성자에서 받는 방식, final이라 불변(immutable) - Setter Injection : Setter Method를 통해서 주입 해주는 방식 public interface EntrService { public void entrSvc(); } public class EntrServiceImpl implements EntrService { private EntrBySvcService entrBySvcServcie; public EntrServiceImpl(EntrBySvcService entrBySvcServcie) { this.entrBySvcServcie = entrBySvcServcie; } @Override public void entrSvc() { System.out.println("가입 서비스"); entrBySvcServcie.entrBySvc(); } } @SpringBootApplication @ImportResource({"classpath*:applicationContext.xml"}) public class ExpXmlApplication { public static void main(String[] args) { ApplicationContext applicationContext = SpringApplication.run(ExpXmlApplication.class, args); EntrService entrService = applicationContext.getBean(EntrService.class); entrService.entrSvc(); } } public interface EntrBySvcService { public void entrBySvc(); } public class EntrBySvcServiceImpl implements EntrBySvcService { @Override public void entrBySvc() { System.out.println("상품 서비스"); } }
  • 11. 4. DI ( Dependency Injection ) - annotation 가입서비스 EntrService 가입별상품서비스 EntrBySvcService 주입(연결) <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="co.kr.abacus.spring.annotation"></context:component-scan> </beans> #. 가입별상품서비스 bean을 가입서비스 bean에 연결 - 스프링 설정 파일에 Application에서 사용할 Bean을 등록 하지 않고 자동 설정 - <context:component-scan> element 정의 - Class에 @Component 설정 public interface EntrService { public void entrSvc(); } @Component("EntrService") public class EntrServiceImpl implements EntrService { private EntrBySvcService entrBySvcServcie; public EntrServiceImpl(EntrBySvcService entrBySvcServcie) { this.entrBySvcServcie = entrBySvcServcie; } @Override public void entrSvc() { System.out.println("가입 서비스"); entrBySvcServcie.entrBySvc(); } } @SpringBootApplication @ImportResource({"classpath*:applicationContext.xml"}) public class ExpAnnotationApplication { public static void main(String[] args) { ApplicationContext applicationContext = SpringApplication.run(ExpAnnotationApplication.class, args); EntrService entrService = (EntrService) applicationContext.getBean("EntrService"); entrService.entrServcie(); } } public interface EntrBySvcService { public void entrBySvc(); } @Component("entrBySvcService") public class EntrBySvcServiceImpl implements EntrBySvcService { @Override public void entrBySvc() { System.out.println("상품 서비스"); } }
  • 12. 5. DI ( Dependency Injection ) – JAVA Config 가입서비스 EntrService 가입별상품서비스 EntrBySvcService 주입(연결) #. 가입별상품서비스 bean을 가입서비스 bean에 연결 - 스프링 설정 파일에 Application에서 사용할 Bean을 등록 하지 않고 자동 설정 - @Configuration 사용 public interface EntrService { public void entrSvc(); } public class EntrServiceImpl implements EntrService { private EntrBySvcService entrBySvcServcie; public EntrServiceImpl(EntrBySvcService entrBySvcServcie) { this.entrBySvcServcie = entrBySvcServcie; } @Override public void entrSvc() { System.out.println("가입 서비스"); entrBySvcServcie.entrBySvc(); } } @SpringBootApplication @ImportResource({"classpath*:applicationContext.xml"}) public class ExpAnnotationApplication { public static void main(String[] args) { ApplicationContext applicationContext = SpringApplication.run(ExpAnnotationApplication.class, args); EntrService entrService = (EntrService) applicationContext.getBean("entrService"); entrService.entrServcie(); } } public interface EntrBySvcService { public void entrBySvc(); } public class EntrBySvcServiceImpl implements EntrBySvcService { @Override public void entrBySvc() { System.out.println("상품 서비스"); } } @Configuration public class ServiceConfig { @Bean public EntrService entrService() { return new EntrServiceImpl(entrBySvcService()); } @Bean public EntrBySvcService entrBySvcService() { return new EntrBySvcServiceImpl(); } } }
  • 13. 6. DI ( Dependency Injection ) – 의존성 주입 Spring에서 의존성 주입을 지원하는 어노테이션은 @Autowired, @Inject, @Qualifier, @Resource 있음, Spring에서는 @Autowired, @Qualifier 제공 함 - 생성자, 메소드, 멤버변수 위에 모두 사용 가능 하나 주로 멤버변수 위에 선언 Spring Container는 멤버변수의 타입을 체크 하여 해당 객체를 변수에 주입 - @Inject은 동일한 기능 임 - 의존성 대상이 되는 한 개 이상인 경우 지정 - 객체의 이름을 이용하여 의존성 주입 @Component("modelDevice") public class ModelDevice implements Device { // 일반 판매 public void sale() { System.out.println("일반 판매"); } // 할부 판매 public void installment() { System.out.println("할부 판매"); } } @Component("usimDevice") public class UsimDevice implements Device { // 일반 판매 public void sale() { System.out.println("일반 판매"); } // 할부 판매 public void installment() { System.out.println("할부 판매"); } } public interface Device { public void sale(); public void installment(); } public interface EntrService { public void entrSvc(); } @Component public class EntrServiceImpl implements EntrService { @Autowired private EntrBySvcService entrBySvcServcie; @Autowired @Qualifier("modelDevice") private Device modelDevice; @Resource(name = "usimDevice") private Device usimDevice; @Override public void entrServcie() { entrBySvcServcie.entrBySvc(); modelDevice.sale(); usimDevice.sale(); } } public interface EntrBySvcService { public void entrBySvc(); } @Component public class EntrBySvcServiceImpl implements EntrBySvcService { @Override public void entrBySvc() { System.out.println("상품 서비스"); } } @Component public class ExpDiRunner implements ApplicationRunner { @Autowired private EntrService entrServcie; @Override public void run(ApplicationArguments args) throws Exception { entrServcie.entrServcie(); } } @SpringBootApplication public class ExpDiApplication { public static void main(String[] args) { SpringApplication.run( ExpDiApplication.class, args); } } - Component-scan 대상이 되는 객체 -> Spring에서 기능에 따라 추가 제공 - @Service : 비즈니스 로직 - @Repository : DB 연동 - @Controller : 사용자 요청
  • 14. 7. Filter, Interceptor, AOP - Interceptor와 Filter는 Servlet 단위에서 실행된다. <> 반면 AOP는 메소드 앞에 Proxy패턴의 형태로 실행 됨 - 요청이 들어오면 Filter → Interceptor → AOP → Interceptor → Filter 순으로 거치게 된다 - Filter : 요청과 응답 사이에서 Data 정체 역할 : 스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대 해 동작 - 예) 인코딩, XSS 방어 등 : Fliter 실행 메소드 - init() - 필터 인스턴스 초기화 - doFilter() - 전/후 처리 - destroy() - 필터 인스턴스 종료 - Interceptor : 인터셉터는 스프링의 DistpatcherServlet이 컨트롤러를 호출 하기 전, 후로 끼어들기 때문에 스프링 컨텍스트(Context, 영역) 내부에서 Controller(Handler)에 관한 요청과 응답에 대해 처리 : 스프링의 모든 빈 객체에 접근 : HttpServletRequest, HttpServletResponse를 파라미터로 사 용 : 인터셉터는 여러 개를 사용할 수 있고 로그인 체크, 권한체크, 프로그램 실행시간 계산작업 로그확인 등의 업무처리 : 인터셉터의 실행 메서드 - preHandler() - 컨트롤러 메서드가 실행되기 전 - postHanler() - 컨트롤러 메서드 실행직 후 view페이지 렌더 링 되기 전 - afterCompletion() - view페이지가 렌더링 되고 난 후 - AOP : 메소드 전후의 지점에 자유롭게 설정 : Advice의 경우 JoinPoint나 ProceedingJoinPoint 등을 활용 : AOP의 포인트컷 - @Before: 대상 메서드의 수행 전 - @After: 대상 메서드의 수행 후 - @After-returning: 대상 메서드의 정상적인 수행 후 - @After-throwing: 예외발생 후 - @Around: 대상 메서드의 수행 전/후 Client Dispatcher Servlet @Controller @Service @Respository <Interface> ServletRequest Listener <Interface> Handler Interceptor @Controller Advice Spring AOP (AspectJ) <Interface> Filter - javax.servlet.Filter.ServletRequestListener : 요청 시작과 요청 종료시의 타이밍에서 어떤 작업을 수행 - javax.servlet.Filter : Servlet, JSP, 정적 콘텐츠 등의 Web 리소스에 대한 액세스 전후에 공통 작업을 수행 - HandlerInterceptor : Spring MVC의 Handler의 호출 전후에 일반적인 작업을 수행 - @ControllerAdvice : Controller 전용의 특수한 메소드 (@InitBainder메소드,@ModelAttribute메소드,@ExceptionHandler메소드)를 복수의 Controller에서 공유 - Spring AOP (AspectJ) : Spring의 DI 컨테이너에서 관리되는 Bean의 public 메소드 호출 전후에 일반적인 작업을 수행 ① ② ③ ④ ⑤ ⑤ Interceptor AOP @Around preHandler Filter dofilter postHandler dofilter ⑤ @Before @AfterReturning @AfterThrowing @After After Completion
  • 15. 8. AOP DI(Dependency Inject)가 결합도를 낮추는 것이라면 AOP은 응집도와 관련된 기능으로 횡단 관심 분리임. - 메소드 마다 공통인 로깅, 예외, 트랜잭션과 같은 횡단 관심과 실제 수행 되는 업 무 로직을 핵심 관심이라 함 업무 로직 업무 Method 로그 업무 로직 예외 트랜잭션 로그 업무 Method 로그 업무 로직 예외 트랜잭션 로그 업무 Method 로그 업무 로직 예외 트랜잭션 로그 횡 단 관 심 :: A O P 핵심관심 - Advice : Aspect가 해야 할 작업으로 언제 무엇을 해야 하는지 정의 before(이전) : advice 대상 Method가 호출 되기 전 after(이후) : 결과에 상관없이 advice 대상 Method사 완료 된 후 after-returning(반환 이후) : advice 대상 Method가 성공적으로 완료 된 후 after-throwing(예외 발생 이후) : advice 대상 Method가 예외를 던진 후 around(주위) : advice가 advice 대상 메소드를 감싸서 advice 대상 Method 호출 전과 호출 후 몇가지 기능 제공 - Join point : Advice를 적용 할 수 있는 곳으로 Application 실행에 Aspect를 끼 워 넣을 수 있는 지점, 모든 업무 메소드 - Pointcut : Aspect가 Advice할 Join point의 영역을 좁히는 일을 함, 즉 어디서 할지를 정의 함 각 pojntcut은 Advice가 weaving되어야 하나 이상의 Join point를 정의함 - Aspect : Advice와 Pointcut를 합친 것으로 무엇을 언제 어디서 할지 모든 정보 를 정의함 - Introduction : 기존 Class에 코드 변경 없이도 새 Method, Member Variable 을 추가 하는 기능 - Weaving : 타깃 객체에 Aspect를 적용해서 새로운 프록시 객체를 생성하는 절 차 compile time : 컴파일 시점에 weaving. 별도의 컴파일러 필요, Aspect 5의 Weaving Compile classload time : JVM에 로드 될 떄 weaving. AspectJ 5의 Load-Time Weaving 기능 사용 runtime : 실행 중에 weaving. Spring AOP Aspect - Classic Spring Proxy 기반 AOP - Pure-POJO Aspect - @AspectJ Annotation 기반 Aspect - AspectJ Aspect에 bean 주입 Advice Pointcut Join Point Program 실행
  • 16. 9. Sprig AOP Spring Aspect는 Target 객체를 감싸는 프록시 형태로 구현되며, 이 프록시는 먼저 호출을 가로챈 후 추가적인 Aspect 로직을 수행 하고 나서야 Target Method를 호출 한다. 호출자 Proxy Target 실행 시간에 생성 -> Aspect가 Spring 관리 Bean weaving 동적 프록시를 기반으로 AOP를 구현 하므로 메소드 Join Point만 지원함 - execution : 메소드 실행 Join Point와 일치 시키는데 사용 - within : 특정 타입에 속하는 Join Point 정의 - bean : bean 이름으로 pointcut package co.kr.abacus public interface SvcByEntrService { public void saveService } Execution ( * co.kr.abacus.SvcByEntrService.saveService(…) ) ① ② ③ ④ ⑤ ⑥ ① 메소드 실행 시작 ② 메소드 명세 ③ 리턴 타입 지정 - * : 모든 리턴 타입 허용 - void : 리턴 타입이 void인 메소드 - !void : 리턴 타입이 void가 아닌 메소드 ④ 메소드가 속하는 타입 - 패키지 + 클래스 - 패키지 지정 - co.kr.abacus : 해당 패키지만 - co.kr.abacus.. : 지정된 패키지로 시작하는 모든 패키지 - 클래스 - FullName (SvcByEntrService ) : 헤당 클래스만 - *Service : 이름이 Service로 끝나는 클래스 - Service+: 클래스 이름 뒤에 '+'가 붙으면 해당 클래스로부터 파생된 모든 자식 클래스 선택, 인터페이스 이름 뒤에 '+'가 붙으면 해당 인터페이스를 구현한 모든 클래스 ⑤ 메소드 - * : 모든 메소드 선택 - save* : save로 시작 하는 모든 메소드 ⑥ 인자 - (..) : 모든 매개변수 - (*) : 반드시 1개의 매개변수를 가지는 메소드만 선택 - (Fullpackage) : 매개변수로 작성된 Class가 가지고 있는 메소드 - (!Fullpackage) : 매개변수로 작성된 Class를 가지지 않는 메소드 - (Integer, ..) : 한 개 이상의 매개변수를 가지되, 첫 번째 매개변수 의 타입이 Integer인 메소드만 - (Integer, *) : 반드시 두 개의 매개변수를 가지되, 첫 번째 매개변수 의 타입이 Integer인 메소드만 - #. 범위 제한 Execution ( * co.kr.abacus.SvcByEntrService.saveService(…)) && within(co.kr.abacus.* ) ⑦ ⑧ ⑦ 조합 및 연산자 - && : and 연산자 - || : or 연산자 - ! : 부정
  • 17. 10. Sprig AOP – JoinPoint Interface Advice 메소드를 의미 있게 구현하려면 클라이언트가 호출한 비즈니스 메소드의 정보가 필요하다. 예를 들면 예외가 터졌는데, 예외발생한 메소드의 이름 등을 기록할 필요가 있을 수 있다. 이럴때 JoinPoint 인터페이스가 제공하는 유용한 API들이 있다 Signature getSignature() : 클라이언트가 호출한 메소드의 시그니처(리턴타입, 이름, 매개변수) 정보가 저장된 Signature 객체 리턴 Object getTarget() : 클라이언트가 호출한 비즈니스 메소드를 포함하는 비즈니스 객체 리턴 Object[] getArgs() : 클라이언트가 메소드를 호출할 때 넘겨준 인자 목록을 Object 배열 로 리턴 String getName() : 클라이언트가 호출한 메소드 이름 리턴 String toLongString() : 클라이언트가 호출한 메소드의 리턴타입, 이름, 매개변수(시그니처)를 패키지 경로까지 포함 하여 리턴 String toShortString() : 클라이언트가 호출한 메소드 시그니처를 축약한 문자열로 리턴 @Around("entrBySvc()") public void watchEntrBySvc(ProceedingJoinPoint pjp) { logger.info("start - " + pjp.getSignature().getDeclaringTypeName() + " / " + pjp.getSignature().getName()); try { pjp.proceed(); } catch (Throwable e) { e.printStackTrace(); } logger.info("finished - " + pjp.getSignature().getDeclaringTypeName() + " / " + pjp.getSignature().getName()); } }
  • 18. 11. Sprig AOP – 예제 @EnableAspectJAutoProxy @SpringBootApplication public class ExpAopApplication { public static void main(String[] args) { SpringApplication.run(ExpAopApplication.class, args); } } <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> #. pom.xml #. Application Start @Component public class ExpAopRunner implements ApplicationRunner { @Autowired private EntrBySvcService entrBySvcService; @Autowired private EntrService entrService; @Override public void run(ApplicationArguments args) throws Exception { System.out.println("*** Spring Autowired *************"); entrService.entrServcie(); entrBySvcService.entrBySvc(); } } @Aspect public class EntrServiceAspect { Logger logger = LoggerFactory.getLogger(EntrServiceAspect.class); …. } @Configuration public class EntrBySvcConfig { @Bean public EntrServiceAspect entrBySvcBeanAspect() { return new EntrServiceAspect(); } } Bean 주입 @Aspect @Component public class EntrBySvcAspect { Logger logger = LoggerFactory.getLogger(EntrBySvcAspect.class); // Pointcut 정의 @Pointcut("execution(* co.kr.abacus.spring.aop.entrsvc.service.EntrBySvcService.entrBySvc(..))") public void entrBySvc() {}; //@Before("execution(* co.kr.abacus.spring.aop.entrsvc.service.EntrBySvcService.entrBySvc(..))") @Before("entrBySvc()") public void beforeService() { logger.info("*** 실행 이전 "); } @AfterReturning("entrBySvc()") public void afterReturningService() { logger.info("*** 실행 성공 "); } @AfterThrowing("entrBySvc()") public void AfterThrowingService() { logger.info("*** 실행 실패 "); } @Around("entrBySvc()") public void watchEntrBySvc(ProceedingJoinPoint pjp) { logger.info("start - " + pjp.getSignature().getDeclaringTypeName() + " / " + pjp.getSignature().getName()); try { pjp.proceed(); } catch (Throwable e) { e.printStackTrace(); } logger.info("finished - " + pjp.getSignature().getDeclaringTypeName() + " / " + pjp.getSignature().getName()); } } DI 의존성 주입
  • 19. - javax.servlet-api나 tomcat-embed-core를 사용하면 제공되는 servlet filter interface 12. Filter @Order(1) @Component public class ServletFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { chain.doFilter(request, response); } } @Order(3) public class GenericFilterBeanFlter extends GenericFilterBean { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO 전처리 chain.doFilter(request, response); } } @Configuration public class GenericFilterBeanFilterConfig { @Bean public GenericFilterBeanFlter GenericFilterBeanFlte() { return new GenericFilterBeanFlter(); } } @Order(0) @Component public class SomeFilter extends OncePerRequestFilter{ @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { chain.doFilter(request, response); } }
  • 20. 13. Interceptor @Component public class SomeInterceptor extends HandlerInterceptorAdapter { Logger logger = LoggerFactory.getLogger(SomeInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){ logger.info("===== before(interceptor) ====="); return true; } @Override public void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { logger.info("===== after(interceptor) ====="); } @Override public void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { logger.info("===== afterCompletion ====="); } } @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private SomeInterceptor someInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(someInterceptor) .addPathPatterns("/some/**") .excludePathPatterns("/etc/**"); } } http://localhost:8080/some http://localhost:8080/etc
  • 21. 14. Spring MVC - @Controller Client ( IE, Chrome,..) VIEW DispatcherServlet HandlerMapping Controller Service DAO or Repository DB 1. URL을 통해서 접근 하여 정보요청 ViewResolver 2. 정보 요청 3. 해당 요청을 매핑한 Controller가 존재 하는지 체크 4. 처리 요청 ( Bean ) 5. 처리 요청 ( DTO ) 6. 처리 요청 (DTO or Entity ) 7. 처리 요청 ( DTO or Entity ) 8. 응답 ( DTO or Entity ) 9. 응답 (DTO or Entity ) 10. 응답 (DTO) 11. Client의 요청을 처리하고 결과를 출력할 View or Json 리턴 12. Controller에서 보내온 View이름을 토대로 처리 View 검색 13. 처리 결과를 View에 송신 14. 처리결 과가 포함 된 View응 Dispatche rServlet 에 송신 15. 최종결과출력 • xxx.xml에 포함 (Servlet 설정 파일) • Springframework 제공 • @Requestmappiing() 제공 • web.xml 제공 • Springframework 제공 • web.xml 포함 • Springframework 제공 • p:prefix=“/WEB-INF/jsp” p:”suffix=“jsp” • @Controller • @RequestMapping() • @GetMapping, @PostMapping … • @ResponseBody • @Service • @Component • @Mapper • @Respository Spring MVC 구조
  • 22. 15. Spring MVC - @RestController Client ( IE, Chrome,..) DispatcherServlet HandlerMapping Controller Service DAO or Repository DB 2. 해당 요청을 매핑한 Controller가 존재 하는지 체크 3. 처리 요청 ( Bean ) 4. 처리 요청 ( DTO ) 5. 처리 요청 (DTO or Entity ) 6. 처리 요청 ( DTO or Entity ) 7. 응답 ( DTO or Entity ) 8. 응답 (DTO or Entity ) 9. 응답 (DTO) 10. Client의 요청을 처리하고 결과를 출력할 Json 리턴 1. 서비스 요청 • xxx.xml에 포함 (Servlet 설정 파일) • Springframework 제공 • @Requestmappiing() 제공 • web.xml 제공 • Springframework 제공 • @RestController • @RequestMapping() • @GetMapping, @PostMapping … • @Service • @Component • @Mapper • @Respository Spring MVC 구조 : @RestController = @Controller + @ResponseBody
  • 23. 16. Spring MVC – 사용하는 Annotation - @RequestBody : Http요청의 Body내용을 자바 객체로 매핑 - @ResponseBody : 자바 객체를 Http 응답의 Body내용으로 매핑 ( Json ) @RestController Public class ServiceController { // Http 요청의 내용을 RequestDTO 객체에 매핑하기 위해서 @RequestBody 사용 // @ResponseBody를 사용 하지 않는 이유 : @RestController 사용 하였기 때문 // @Controller를 사용 하는 경우 : @ResponseBody를 사용 해야 함 @RequestMapping(value=“/uri/process”, method = RequestMethod.POST) public ResponseDTO process(@RequestBody RequestDTO requestDTO) { ResponseDTO responseDTO = service.process(requestDTO); return responseDTO; } } - Uri을 Controller에 매핑 해 주는 기능 : Method 수준 - : Class 수준 @RestController Public class ServiceController { @RequestMapping(value=“/uri/process”, method = RequestMethod.POST) public ResponseDTO process(@RequestBody RequestDTO requestDTO) { … } // 복수 설정 @RequestMapping(value={“/uri/process”, “/ uri/process01”}, method = RequestMethod.POST) public ResponseDTO process(@RequestBody RequestDTO requestDTO) { … } } @RestController @RequestMapping(value=“/uri/process”) Public class ServiceController { // Uri : /uri/process -> Http Request Method만 사용 // RequestMethod.POST, GET, PUT, PATCH, DELETE, TRACE, OPTIONS @RequestMapping(method = RequestMethod.POST) public ResponseDTO process(@RequestBody RequestDTO requestDTO) { … } // Uri : /uri/process/processA @RequestMapping(value=“/processA”, method = RequestMethod.POST) public ResponseDTO process(@RequestBody RequestDTO requestDTO) { … } // 복수 설정 @RequestMapping(value={“/processA”, “/processB”}, method = RequestMethod.POST) public ResponseDTO process(@RequestBody RequestDTO requestDTO) { … } } - GET : 요청 받은 URI의 정보를 검색 - POST : 요청된 자원을 생성 - PUT : 요청된 자원을 수정 , 요청된 자원 전체 갱신 - PATCH : 요청된 자원을 수정, 일부만 갱신 - DELETE : 요청된 자원 삭제 - OPTIONS : 지원 되는 메소드의 종류 확인
  • 24. #별첨 1. Spring Boot - Spring Framework애 기반을 으로 확장해 자동 구성을 가능하게 한다. - 단순히 실행하고 독립형 제품 수준의 스프링 기반 Application을 쉽게 만듦 - JMS, JDBC, JPA등과 같은 하부 구조를 자동으로 구성 - Main 함수가 있는 Class로 시작점 - @SpringBootApplication : @Configuration(스프링 자바 구성 클래스), @ComponenrScan(컴 포넌트 탐색), @EnableAutoConfiguration(자동 구성)을 포함 @SpringBootApplication public class ExpFilterInApplication { public static void main(String[] args) { ApplicationContext ctx = SpringApplication.run(ExpFilterInApplication.class, args); System.out.println("# Beans : " + ctx.getBeanDefinitionCount()); String[] names = ctx.getBeanDefinitionNames(); Arrays.sort(names); Arrays.asList(names).forEach(System.out::println); } } @Component public class ExpDiRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { System.out.println("*** **** *************"); } }
  • 25. #별첨 2. Spring Boot 시작 - Application이 시작되고 일부 코드를 수행 하고자 할 때 사용 @SpringBootApplication public class ExpRunApplication { public static void main(String[] args) { SpringApplication.run(ExpRunApplication.class, args); } @Bean public ApplicationRunner StringSVC(ServiceSVC serviceSVC) { return args -> { System.out.println(serviceSVC.StringSVC("Hello")); }; } } public interface ServiceSVC { public String StringSVC(String str); } public interface ServiceSVC { public String StringSVC(String str); }