Spring Framework Basic

mdjoo0810·2020년 6월 20일
0

Spring Framwork

목록 보기
1/1

IoC - Inversion of Control

  • 제어의 역전
  • 주로 의존성에 해당됨

대체적으로 의존성을 자기 자신이 관리하던 것을 이외의 누구가 밖에서 넣어주는 것
누군가가 알아서 주겠지라는 가정으로 작성 (제어권의 역전)

Ioc Container

  • Application Context - Bean들을 만들고 엮어준다

Bean - 자기가 컨테이너 내부에 만든 객체
Bean 들의 의존성을 관리해줌 (엮어줌) 오로지 Bean만

Bean

  • Spring IoC Container가 관리하는 객체

Bean이 될려면

  • Conponent Scanning (@ComponentScan)
    Application Class에 @SpringBootApplication 애노테이션
    안에 @ComponentScan이라는 애노테이션이 작동해서 @Componet가
    있는 클래스를(@RestController, @Service 등) Bean으로 등록

    @Bean 애노테이션을 사용할때는 @Configration이 있는 클래스에 정의해야함

    Bean을 꺼내쓰는 방법은 무엇일까?
    @AutoWired를 사용

  • 또는 직접 일일히 XML이나 자바 설정 파일에 등록

Dependency Injection (의존성 주입)

  • @AutoWired or @Inject를 사용 (Spring 5 이전)

    어떤 Bean이 되는 클래스에 생성자가 하나가 있고 생성자의 매개변수 타입이 Bean으로 등록되어 있으면
    @AutoWired가 없어도 의존성을 주입해준다

    기본적으로 @AutoWired or @Inject를 어디에 붙히냐? 생성자 -> Setter가 있으면 Setter
    -> 필드

AOP - Aspect Oriented Programming

  • AOP 소개 - 흩어진 코드를 한 곳으로 모아라!
    프록시 패턴를 사용하는 방법

  • AOP 활용

    // [LogExecutionTime] - 애노테이션
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
	public @interface LogExecutiontime {
    }
    
    // [TestController] - 클래스
    @LogExecutionTime
    @GetMapping("/find")
    public String findForm(Map<String, Object> model) {
    	model.put("owner", new Owner());
        return "owners/find";
    }
    
    // [LogExecutionTime] - 애노테이션의 기능을 담당할 Aspect
    @Component
    @Aspect
	public class LogAspect {
    
    	Logger logger = LoggerFactory.getLogger(LogAspect.class)
    	
    	@Around("@annotation(LogExecutiontime)") // Around로 딥하게 설정가능
        public Object logExecutionTime(ProceedingJoinPoint joinPoint) {
        	StopWatch stopWatch = new StopWatch();
            stopWatch.start();
            
            Object ret = jointPoint.proceed();
            
            stopWatch.stop();
            logger.info(stopWatch.prettyPrint());
            
            return ret;
        }
    }

PSA - Portable Service Abstration

  • PSA 소개 - 이식 가능한 서비스 추상화 (잘 만든 인터페이스)
    테스트 하기도 좋고 바꿔끼기도 좋은 코드
    기술을 바꿔도 나의 코드는 바뀌지 않는 것 (Mybatis -> JPA 같은)

    Spring 에는 Resources, i18n, Validation, Transactions, DAO, JDBC, ORM, MVC,
    Servlet, etc.. 등이 있음 - 핵심은 다 똑같은 추상화된 인터페이스

  • Spring 트랜잭션 - PlatformTransactionManager
    @Transactional을 사용할 때 Transaction Aspect가 따로 있기에 PlatformTransactionManager가
    JpaTransactionManage -> DatasourceTransactionManager로 바뀌어도 (추상화) 내 코드는 바뀌지
    않는다

  • 캐시 - CasheManager
    transactional 과 비슷

  • 웹 MVC - @Controller and @RequestMapping
    Servler or Reactive를 사용할 수 있음 무엇을 사용하는지는 의존성을 확인해야함
    위의 애노테이션을 사용하지만 우리는 무엇을 썻는지 몰은다 이것이 추상화
    하지만 Servlet에서 Reactive로 바뀌어도 코드를 바꾸지 않아도 된다..
    왜냐 추상화 되어있으므로 이것이 가장 큰 장점이라고 본다

profile
개발자

관심 있을 만한 포스트

0개의 댓글