Spring에서 AOP를 구현하는 방법과 Transactional AOP에 관한 간략한 개념이 필요하다면 다른 글을 참조한다. 이 내용은 공식 문서를 참조하여 작성하였다. Spring Framework Document AOP 구현 방식 Spring에서 AOP는 두 가지 방법으로 구현되어 있다. Dynamic Proxy (Reflection) CGLIB (Byte Code Instrument) 인터페이스를 클래스로 구현하여 사용하는 경우 Dynamic proxy, 단일 클래스는 CGLIB를 사용한다. 1. 인터페이스에 선언되지 않은 메소드를 권고하는 경우 2. 메소드의 인자로 프록시된 객체를 구체적으로 전달해야 하는 경우 또한 비즈니스 로직을 구현할 때 클래스보다는 인터페이스로 유연하게 설계할 것을 권장하..
Spring
Spring boot 초기화 코드 작성하기 서버가 켜지자마자 상태를 지정해줘야 하는 일들이 더러 있을 것이다. 몇 가지만 알아두면 요긴하게 사용할 수 있다. EventListener와 Runner를 사용한 방법 Spring boot에서만 사용할 수 있다. 관련 이벤트와 Runner는 boot 패키지에 포함되어 있기 때문이다. public ConfigurableApplicationContext run(String... args) { // Do something... SpringApplicationRunListeners listeners = getRunListeners(args); listeners.starting(); try { // Do something... // spring context prepar..
Bean 생성 원리와 저장 위치 Spring에서 bean 생성 전략은 두 가지로 나뉜다. 일반적으로 singleton을 사용하지만 상황에 따라 prototype bean을 사용하기도 한다. 그렇기 때문에 Spring에서는 bean의 정의를 따로 저장해둔다. 지난 포스트에선 딱 여기까지 진행했었다. 이번엔 실제로 생성된 bean이 어디에 저장되는지를 탐구해보려고 한다. 소스 코드 작성 Spring framework의 코드만 보고 bean의 위치를 직접 찾아가기는 어렵다. 목적에 맞는 소스 코드를 작성한다. SomeBean @ToString public class SomeBean { private String name = "someBean"; } BeanConfiguration public class Bea..
Bean 생성 AnnotationConfigApplicationContext AnnotationConfigApplicationContext 클래스는 어노테이션을 읽어 bean을 등록하는 역할을 담당하고 있다. 그 중에서도 기본 생성자에 포함되어 반드시 호출하게 되어 있는 register라는 메소드를 살펴보았다. /** * Register one or more component classes to be processed. * Note that {@link #refresh()} must be called in order for the context * to fully process the new classes. * @param componentClasses one or more component classe..
Spring AOP Aspect-Oriented Programming는 OOP를 보완하는 수단이다. 로깅, 트랜잭션 등 서비스 로직 내에서 동일하게 사용되는 특별한 관심사(Aspect)를 모듈화하는 기법이다. 개요 트랜잭션을 활성화한 로직은 아래와 같은 공통 사항을 포함할 수 있다. 트랜잭션 활성화 서비스 로직 수행 Commit / Rollback 트랜잭션 종료 AOP가 없다면 트랜잭션이 필요한 로직을 아래처럼 수행할 수 있다. void doLogic() { transactionManager.enable(); boolean result = service.execute1(); if (result) { transactionManager.commit(); } else { transactionManager.ro..
Data binding 추상화 Spring에서 말하는 데이터 바인딩은 데이터 동적 변환이다. 입력한 값을 도메인 모델에 맞춰 자동으로 변환 후 할당하는 것을 말한다. 쉬운 예시를 들어보면, 사용자가 문자열 ”2020-01-16”을 넘겼는데 날짜 타입인 Date 로 변환하고 User 클래스를 생성하여 registerDate라는 이름을 가진 필드에 넣어주는 것이다. PropertyEditor PropertyEditor 는 Spring이 데이터 바인딩을 위해 지원하는 인터페이스 중 하나이다. 이 인터페이스의 구현체는 PropertyEditorSupport 가 있다. 이 구현체를 사용할 땐 아래의 단점에 주의하는 것이 좋다. Thread unsafe한 구조이다. String, Object로만 변환이 가능하다. ..
Validation 추상화 객체를 검증할 때 사용하는 인터페이스이다. 주로 Spring mvc에서 많이 활용되나 일반적인 인터페이스이기 때문에 모든 계층에서 사용할 수 있다. JSR-303 (Bean Validation), JSR-349 (Bean Validation 1.1)을 지원한다. 현재는 2.0 이상의 버전이 출시되어 있다. 직접 구현하기 현재는 더 쉽게 구현할 수 있는 방법이 있어 잘 쓰이지 않는 방법이다. 하지만 비즈니스 로직이 복잡하다면 직접 구현하는 것도 고려해볼 수 있다. Spring boot 프로젝트를 하나 만들고 검증할 객체와 Validator를 생성한다. 마지막으로 실행 결과를 볼 AppRunner 클래스까지 정의한다. User 검증 대상인 POJO public class User ..
Resource 추상화 Spring framework는 대부분의 기능이 추상화되어 있어 필요한 기능이 있으면 적절한 구현체를 선택하여 사용할 수 있다. Resource 또한 추상화되어 있어 사용자가 필요한 기능을 선택하여 구현할 수 있게 되어 있다. Resource 주요 메소드 exists() resource가 반드시 존재하리라는 보장이 없다. 존재 여부를 검사한다. getFile() resource의 file handle을 받아온다. getURI() resource의 URI handle을 받아온다. getURL() resource의 URL handle을 받아온다. 더 많은 정보는 Resource (Spring Framework 5.2.3.RELEASE API)를 참고하자. Resource 주요 구현체 ..