스프링 프레임워크 5에 추가된 Null 관련 애노테이션 org.springframework.lang.* @NonNull @Nullable @NonNullApi (패키지 레벨 설정) @NonNullField (패키지 레벨 설정) 목적 (툴의 지원을 받아) 컴파일 시점에 최대한 NPE(NullPointerException)을 방지하는 것 null 체크를 하지 않아서 생기는 NPE 방지 @NonNull org.springframework.lang.NonNull 사용 메소드 파라미터에 붙이는 경우 -> null 값이 들어오지 못하도록 방지 @Service public class EventService { @NonNull // (1) public String createEvent(@NonNull String na..
애노테이션 기반의 스프링 @AOP 의존성 추가 org.sringframework.boot spring-boot-starter-aop Aspect 정의 @Aspect 빈으로 등록해야 하니까 (컴포넌트 스캔을 사용한다면) @Component도 추가 포인트컷 정의 @PointCut(표현식) 주요 표현식 execution @Service public class SimpleEventService implements EventService{ @Override public void createEvent() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("create an Eve..
스프링 AOP 특징 프록시 기반의 AOP 구현체 스프링 빈에만 AOP를 적용할 수 있다. 모든 AOP 기능을 제공하는 것이 목적이 아니라, 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제(중복코드, 프록시 클래스를 만드는 비용과 수고, 객체들 간 관계 복잡 등등)에 대한 해결책을 제공하는 것이 목적. 프록시 패턴 (기존 코드 변경 없이) 접근 제어 또는 부가 기능 추가 프록시 패턴을 이용하여 기존 코드를 건드리지 않고 성능을 측정해보겠다. @Component public class AppRunner implements ApplicationRunner { @Autowired EventService eventService; //interface가 있다면 interface타입으로 받는게 ..
Aspect-oriented Programming (AOP)은 OOP를 보완하는 수단으로, 흩어진 Aspect를 모듈화 할 수 있는 프로그래밍 기법. 흩어진 관심사 (Crosscutting *Concerns) *Concerns : 비슷한 코드, 비슷한 호출 등등. AOP를 적용 하면? Aspect로 흩어진 것들을 한곳으로 모은다. AOP 주요 개념 Aspect 와 Target Advice Join point 과 Pointcut Aspect : 흩어진 관심사를 한곳으로 모듈화 한 것. Advice : 어떤 일을 해야 하는지에 대한 정보. Join point : 생성자 호출하기 직전, 생성자를 호출했을때, 필드에서 값을 가져갔을때...등등 여러가지 합류점. Pointcut: A라는 클래스에 b라는 메소드를 ..
스프링 EL이란? 스프링 프로젝트 전반에 걸쳐 필요로 하다보니까, Unified EL 에 메소드 호출 기능과, 문자열 템플릿 기능을 추가하여 스프링이 SpEL을 개발하게 된것이다. 객체 그래프를 조회하고 조작하는 기능을 제공한다. Unified EL과 비슷하지만, 메소드 호출을 지원하며, 문자열 템플릿 기능도 제공한다. OGNL, MVEL, JBOss EL 등 자바에서 사용할 수 있는 여러 EL이 있지만, SpEL은 모든 스프링 프로젝트 전반에 걸쳐 사용할 EL로 만들었다. 스프링 3.0 부터 지원. SpEL 구성 ExpressionParser expressionParser = new SpelExpressionParser(); Expression expression = expressionParser...
Converter S 타입을 T 타입으로 변환할 수 있는 매우 일반적인 변환기 상태 정보 없음 == Stateless = 쓰레드세이프 public class EventConverter { public static class StringToEventConverter implements Converter{ @Override public Event convert(String source) { return new Event(Integer.parseInt(source)); }//String에서 Event로 Event/Constructor에 source를 넘긴다. } public static class EventToString implements Converter{ @Override public String con..