본문 바로가기

분류 전체보기

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..
Observer Pattern 옵저버 패턴은 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 이를 알리고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의한다. 이때 상태가 바뀌는 주체를 주제(Subject), 주제의 상태 변경에 따라 갱신되는 주제를 관찰, 구독하는 객체를 옵저버(Observer)라고 한다. 옵저버 패턴은 주제의 상태변경을 알아야하는 객체들이 주제의 상태변경시 자동으로 상태가 변경이 되거나 특정한 행동을 하도록 하면서도 주제와 옵저버들간 느슨한 연관관계를 가짐으로서 유연한 설계가 가능하다는 장점이 있다. 좀더 구체적으로 특징을 살펴보면, 첫 번째로 옵저버 패턴은 주제에 대한 이벤트 발생을 옵저버가 구독하는 형태를 취하며, 주제는 구체적인 옵저버에 대한 정보를 알 수 없고, 옵..
Builder Pattern class에 선택적 인자가 다수 있는 경우 생성자를 어떻게 구현하는 것이 적합한가. 여러 방법이 존재하겠지만 처음 생각해볼 수 있는 방법은 점층적 생성자 패턴일 것이다. 필수인자를 받는 생성자를 정의하고, 선택적 인자를 점층적으로 추가하는 방식으로 생성자들을 구현하는 것이다. 하지만 점층적 생성자 패턴은 인자 수가 늘어나면 클라이언트 코드를 작성하기 어려워지고, 코드가 읽기 어려워진다는 문제가 있다. 또한 인자들이 서로 바뀌어 들어가게 되었을 때 발생하는 버그를 쉽게 잡아내기 어렵게 되는 등 문제가 발생하기 쉽다. 그래서 이에 대한 대안으로 자바빈 패턴을 이용할 수 있다. 자바빈 패턴은 인자없는 생성자를 호출하여 객체를 생성하고, setter method를 이용하여 필드 값들을 채워나가는 방식을 의미한다..
Electron + React 데스크탑 앱 개발 (2) 앞의 포스팅에서 언급되었듯이 Electron은 내장된 Chromium에 html, javascript, css로 구성된 화면을 렌더링 하는 방식으로 작동하기 때문에 일반적인 React.js 프로젝트를 생성하는 것과 크게 다르지 않습니다. 프로젝트에 React를 적용하는 방법은 크게 두 가지가 있습니다. 첫번째는 React boilerplate인 create-react-app을 이용하여 프로젝트를 생성한 뒤 이를 Electron에 올리는 방식입니다. 두번째로는 React, Babel, Webpack을 설치한 후, 작성된 React 프로그램을 Electron에 올리는 방식입니다. create-react-app을 이용하는 방식은 React를 비롯하여 필요한 라이브러리가 자동으로 설치되고, 설정파일도 사용자가 ..
@Transactional Attribute 스프링에서 트랜잭션을 관리하는 방법은 크게 세 가지로 나누어진다. 애너테이션 @Transactional을 사용하는 방법, AOP를 이용하여 트랜잭션을 관리하는 방법, 프로그래밍으로 직접 제어하는 방법 등이다. 애너테이션 @Transactional의 경우 기본 동작을 재정의하는 데 사용할 수 있는 여러 애트리뷰트를 제공하고 있다. propagation 트랜잭션의 전파를 의미하는 propagation은 값으로 Propagation enum에 정의된 REQUIRED, SUPPORTS, MANDATORY, REQUIRES_NEW, NOT_SUPPORTED, NEVER, NESTED 등을 입력받을 수 있다. 이 값들이 의미하는 바는 다음과 같다. 전파유형 설명 REQUIRED 이미 존재하는 트랜잭션을 지원. 트랜..
영속성 컨텍스트와 엔티티의 생명주기 영속성 컨텍스트는 JPA에서 엔티티를 보관하고 관리하는 공간, 환경에 해당한다고 할 수 있다. 영속성 컨텍스트는 엔티티 매니저를 생성할 때 생성되며, 엔티티 매니저를 통해 접근할 수 있고, 관리할 수 있다. 엔티티는 4가지의 상태로 존재한다. 첫번째는 비영속 상태로 엔티티 객체를 생성한 직후의 순수한 객체 상태이며, 영속성 컨텍스트나 데이터베이스와 관련이 없다. 두번째는 영속 상태로 엔티티 매니저를 통해 영속성 컨텍스트에 저장된 상태 혹은 조회 쿼리 등을 통해 조회된 엔티티를 의미한다. 영속 상태의 엔티티는 영속성 컨텍스트에 의해 관리된다. 세번째는 준영속 상태로 영속 상태의 엔티티가 영속성 컨텍스트에서 더이상 관리하지 않은 상태가 되는 것이다. 이는 엔티티 매니저에서 detach로 분리시키거나, clo..