본문 바로가기

Java/Spring

Spring AOP: AOP Concepts 2 이 글은 Spring Framework 5.2.8 버전 Core Technologies의 AOP 문서에 기반하여 작성되었습니다. Spring AOP 다음과 같은 Advice 타입들이 있습니다. Before advice Join point 앞에서 작동하지만 Join point로 흘러가는 흐름은 제어할 수는 없는 Advice입니다. (exception이 발생하는 경우는 제외) After returning advice Join point가 문제없이 정상적으로 종료되었을 때 작동하는 Advice입니다. (exception을 던지지 않고 정상적으로 return 된 경우 등) After throwing advice exception에 의해 method가 종료되는 경우 작동하는 Advice입니다. After (fin..
Spring AOP: AOP Concepts 1 이 글은 Spring Framework 5.2.8 버전 Core Technologies의 AOP 문서에 기반하여 작성되었습니다. AOP에서 중점적으로 사용되는 용어들에 대한 정의입니다. 이 용어들은 Spring에만 국한된 것은 아니며, 용어들의 어감이 직관적으로 느껴지지 않을 수 있습니다. 하지만 Spring을 위한 새로운 용어를 사용하는 것은 더 큰 혼란을 가져올 수 있을 것입니다. Aspect 앞서 언급된 Aspect는 여러 Class들을 관통하는 관심사를 모듈화한 것입니다. Java 어플리케이션에서의 Transaction 관리가 횡단 관심사의 좋은 예시입니다. Spring AOP에서 Aspect는 스키마 기반 접근, 혹은 애너테이션 기반한 접근법으로 사용이 가능하며, 특히 @AspectJ 스타일에 ..
Spring AOP: Aspect Oriented Programming with Spring 이 글은 Spring Framework 5.2.8 버전 Core Technologies의 AOP 문서에 기반하여 작성되었습니다. AOP는 프로그램 구조에 대한 다른 사고방식을 제공함으로써 OOP를 보완하는 역할을 보완합니다. 즉 AOP라고 하는 것은 OOP를 대체하는 개념이라기 보다는 OOP와 결합하여 보완적인 관계를 가질 수 있는 것입니다. OOP의 모듈 단위는 Class라는 형태로 표현할 수 있을 것이며, AOP의 모듈 단위는 Aspect로 말할 수 있습니다. Aspect는 여러 타입들과 객체를 가로지르는 관심을 모듈화한 것입니다. 예를 들면 Transaction의 관리 등이 있을 것입니다. 그리고 이러한 가로지르는 관심이라는 것을 문자 그대로 횡단 관심사라고 표현하기도 합니다. AOP는 Spring..
Custom Constraint javax 등에 내장된 validation 애너테이션만으로 유효성 검사를 수행할 수 없는 경우 사용자가 직접 정의한 유효성 검사 애너테이션을 생성할 수 있다. 이는 Spring MVC의 @Valid를 통해 유효성 체크가 되는 다른 Validation 애너테이션과 동일한 방식으로 사용될 수 있어 편리하다. 애너테이션 인터페이스와 ConstraintValidator 인터페이스를 구현한 Validator를 구현하여 사용한다. 예시로 문자열로 된 날짜 정보가 유효한지 검증하는 사용자 정의 유효성 검사 애너테이션을 구현하였다. StringDateFormat.java import java.lang.annotation.Documented; import java.lang.annotation.ElementType; im..
@Transactional Attribute 스프링에서 트랜잭션을 관리하는 방법은 크게 세 가지로 나누어진다. 애너테이션 @Transactional을 사용하는 방법, AOP를 이용하여 트랜잭션을 관리하는 방법, 프로그래밍으로 직접 제어하는 방법 등이다. 애너테이션 @Transactional의 경우 기본 동작을 재정의하는 데 사용할 수 있는 여러 애트리뷰트를 제공하고 있다. propagation 트랜잭션의 전파를 의미하는 propagation은 값으로 Propagation enum에 정의된 REQUIRED, SUPPORTS, MANDATORY, REQUIRES_NEW, NOT_SUPPORTED, NEVER, NESTED 등을 입력받을 수 있다. 이 값들이 의미하는 바는 다음과 같다. 전파유형 설명 REQUIRED 이미 존재하는 트랜잭션을 지원. 트랜..
Spring StopWatch StopWatch stopWatch = new StopWatch("id"); stopWatch.start("taskName1"); task1(); stopWatch.stop(); stopWatch.start("taskName2"); task2(); stopWatch.stop(); stopWatch.getTotalTimeMillis(); // 전체 작업시간 stopWatch.prettyPrint(); // StopWatch 'id': running time (millis) = 2000 // ----------------------------------------- // ms % Task name // ----------------------------------------- // 01000 050% tas..
Spring에서 Annotation으로 정의된 Validation 확인 Spring을 사용하면서 DTO를 정의하고 DTO의 필드에 validation을 추가한 경우에, 필요에 따라 validation을 직접 호출해야하는 경우가 발생할 수 있다. 예를 들어 카프카에서 사용하는 DTO의 필드 값이 유효한지 확인해야 하는 경우, 일반적인 Controller API의 경우를 따를 수 없었다. 이에 stack overflow에 해결책이 올라온 것을 확인하였고, 이를 적용하였다. 예를 들어 사용자 정보를 생성하는 Request에 대해 아래와 같이 DTO를 정의하였다. @Getter @AllArgsConstructor public class UserCreateRequestDTO { @NotEmpty(message = "name is mandatory value.") private Str..
Spring 프로젝트 생성시 maven CoreException issue Spring 프로젝트를 Eclipse를 이용하여 생성하는 경우 아래와 같은 메시지가 뜨면서 pom.xml에 빨간 줄이가고 error가 발생하는 경우가 있다. Description Resource Path Location Type CoreException: Could not get the value for parameter compilerId for plugin execution default-compile: PluginResolutionException: Plugin org.apache.maven.plugins:maven-compiler-plugin:3.7.0 or one of its dependencies could not be resolved: The following artifacts could n..