본문으로 바로가기

https://www.inflearn.com/course/spring-framework_core

 

스프링 프레임워크 핵심 기술 - 인프런 | 강의

이번 강좌는 스프링 부트를 사용하며 스프링 핵심 기술을 학습합니다 따라서 스프링 부트 기반의 프로젝트를 사용하고 있는 개발자 또는 학생에게 유용한 스프링 강좌입니다., 스프링 프레임워

www.inflearn.com

 

ㅁ SpEL (스프링 Expression Language)

- 스프링 3.0 부터 지원

- 스프링 프로젝트에서 전반적으로 지원 ( 스프링 시큐리티, 스프링 데이터 등등 - 스프링 코어 기능을 함)

- "#{ }" : 표현식  , 이걸 실행한다음에 결과값을 property에 넣어줌

-  "${}":  Properties의 변수를 가져옴

- 사용 예시 : @Value("#{${my.value} eq 100}")

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Component
public class AppRunner implements ApplicationRunner {

    @Value("#{1 + 1}")
    int value;

    @Value("#{'hello' + ' world'}")
    String greeting;

    @Value("#{1 eq 1}")
    boolean trueOrFalse;

    @Value("#{${my.value} eq 100}")
    boolean test;

    @Value("#{'spring'}")
    String spring;

    @Value("#{sample.data}")
    int sampleData;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("value = " + value);
        System.out.println("greeting = " + greeting);
        System.out.println("trueOrFalse = " + trueOrFalse);
        System.out.println("test = " + test);
        System.out.println("spring = " + spring);
        System.out.println("sampleData = " + sampleData);
    }
}

- 이 외 레퍼런스 참고

 

 

ㅁ 스프링 AOP

ㅇ 스프링 AOP : 개념소개

- Aspected-oriented Programing 은 OOP와 보완관계 (더 잘 쓸수있게 함)

- Aspect 는 모듈을 묶은것 (Concern들을 모듈화) 

 > 모듈은 Advice (해야할 일) 와 Pointcut (어디에 적용해야하는지) 포함

 > Target은 적용이 되어야하는 대상

 > Join Point : 끼어들 지점

- AOP 적용 방법 :

 - 컴파일 : 컴파일 (byte 코드를 만들때 ) 될때 Aspect를 넣음. (AspectJ)

 - 로드타임 : 컴파일은 정상적으로 함, 해당 클래스파일을 로딩하는 시점에 Aspect를 넣음 (로드타임 위빙)

             > 자바 에이전트 설정 필요  (AspectJ)

 - 런타임 : A라는  bean을 만들때(Runtime), A 타입의 Proxy bean을 만들어서 실제 A가 가진 foo가 호출되기전에 asepect를 넣음

              > 기본값이고, 로드타임 위버 설정 필요없고, 합리적인 선택 비용임 (스프링 AOP)

- 자바진형에서의 AOP 구현이지만,  AspectJ와 스프링 AOP는 다름

 

ㅇ 스프링 AOP: 프록시 기반 AOP

- 프록시 패턴  :   사용자 -> (interface) subject.   <-  프록시 -> real subject

   > 기존 코드 변경없이 접근제어 또는 부가기능 추가

- 동적으로 프록시를 만드는 방법 ( 스프링 AOP )

 > 이것을 스프링 IOC 랑 연동해서, 중복코드, 프록시 여러개 문제를 깔끔하게 해결함

 >  기존 bean을 대체하는 동적 프록시 bean을 만들어 등록 시켜준다.

 >  AbstractAutoProxyCreator implements BeanPostProcessor (라이프사이클)

 

ㅇ 스프링 AOP: @AOP

- Around는 메소드를 감싸는 형태 (다용도로 쓰임)

- @Retention(RetentionPolicy.CLASS) 는 어노테이션 정보가 어디까지 남게할것인지 (CLASS(기본), SOURCE(컴파일하고 사라짐), RUNTIME)

- 어노테이션을 통해, 어노테이션에 달린곳만 Aspect 적용

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class PerfAspect {

    @Around("@annotation(PerfLogging)")
    public Object logPerf(ProceedingJoinPoint pjp) throws Throwable{
        long begin = System.currentTimeMillis();
        Object retVal = pjp.proceed();
        System.out.println(begin-System.currentTimeMillis());
        return retVal;
    }

    @Before("bean(simpleEventService)")
    public void hello(){
        System.out.println("Hello");
    }
}

 

ㅁ Null-safety

- Spring 5 부터 적용

- IntelliJ의 경우, Preference Compiler에 annotation 추가 (nonnull, Nullabe)

@Service
public class hckService {

    @NonNull
    public  String createEvent(@NonNull String name){
        return "Hello "+name;
    }
}