https://www.inflearn.com/course/spring-framework_core
ㅁ 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;
}
}
'Spring' 카테고리의 다른 글
[Spring] 스프링 부트 개념과 활용 - 4 (0) | 2021.07.19 |
---|---|
[Spring] 스프링 부트 개념과 활용 - 3 (0) | 2021.07.19 |
[Spring] 스프링 부트 개념과 활용 - 2 (0) | 2021.07.10 |
[Spring] 스프링 부트 개념과 활용 - 1 (0) | 2021.07.10 |
[Spring] 스프링 프레임워크 핵심 기술 정리 - 1 (0) | 2021.07.04 |