JPA로 애플리케이션을 개발할 때 성능상 가장 주의해야 하는 것이 N+1 문제이다. JPA를 사용하는 다양한 개발자분들이 이를 사용하다보면 한번 쯤은 꼭 겪게 되는 문제일 것이다. 간단한 예제를 통해서 쉽게 N+1 문제란 무엇인지 이해하고 JPA를 사용하는 과정에서 어떤 이슈가 있을지 파악해보고 이를 적용해보는 시간을 가지면 좋을 듯 하다. @Entity public class Member { @Id @GeneratedValue private Long id; @OneToMany(mappedBy = "member", fetch = FetchType.EAGER) private List orders = new ArrayList(); ... } @Entity @Table(name = "ORDERS") publi..
이전에 step2에서 포인트컷 표현식과 트랜잭션 속성을 이용해 트랜잭션을 일괄적으로 적용하는 방식은 복잡한 트랜잭션 속성이 요구되지 않는 한 대부분의 상황에 적용가능하지만 클래스나 메소드에 다라 제각각 속성이 다른, 세밀하게 튜닝된 트랜잭션 속성을 적용해야 하는 경우 일괄적으로 속성을 부여하는 것 대신에 직접 타깃에 트랜잭션 속성정보를 가진 애노테이션을 이용하는 방법이 있다. @Transactional을 정의한 코드는 직관적이라 이전에 설명한 속성을 모두 포함하고 있다. pacakage org.springframwork.transaction.annotation; ... @Target({ElementType.METHOD, ElementType.TYPE}) @Retension(RetentionPolicy.R..
이전에 step1에서 코드로 만든 어드바이스를 제외한 자동 프록시 생성기(DefaultAdvisorAutoproxyCreator), 포인트 컷(AspectJExpressionPointcut), 어드바이저(DefaultPointcutAdvisor)는 모두 스프링이 직접 제공하는 클래스를 빈으로 등록하고 프로퍼티를 설정해줬다. 이 세가지 클래스를 이용해 선언하는 빈은 AOP를 적용하면 반복적으로 등장하게 된다. 스프링에서는 AOP를 위해 기계적으로 적용하는 빈들을 간편한 방법으로 등록할 수 있다. AOP와 관련된 태그를 정의해둔 aop 스키마를 제공한다. 더보기 네임스페이스(Namespace)는 XML 문서에서 요소, 속성 등을 구분하기 위한 식별자(identifier)이다. XML 문서에서는 각 요소나 속..
이전 step4에서 고민한 자동 프록시 생성을 빈 후처리기를 이용한다. BeanPostProcessor 인터페이스를 구현해서 만든 빈 후처리기를 이용하면 스프링 빈 오브젝트로 만들어지고 난 후에 빈 오브젝트를 다시 가공할 수 있게 해준다. 빈 후처리기 중의 하나인 DefaultAdvisorAutoProxyCreator를 사용하여 문제를 해결한다. 빈 후처리기를 스프링에 적용하는 방법은 빈 후처리기 자체를 빈으로 등록하면 빈 오브젝트가 생설될 때마다 빈 후처리기에 보내서 후처리 작업을 요청한다. 이를 잘 이용한다면 타깃 빈 오브젝트의 일부를 프록시로 포장하고 프록시를 빈으로 대신 등록하는 작업이 가능하다. 이것이 자동 프록시 생성 빈 후처리기다. 1, 2. DefaultAdvisorAutoProxyCrea..
이전에 Transactio을 어떻게 로직을 분리하는지 메소드 분리부터, 프록시와 데코레이터패턴, 다이내믹 프록시, 프록시 팩토리 빈, 자동 프록시 생성 순서로 알아보았고 이것은 부가기능의 모듈화가 목적인 것을 파악했다. 결론적으로 AOP를 입문하게 되었다. https://sh970901.tistory.com/category/Spring/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98%EA%B3%BC%20AOP 'Spring/트랜잭션과 AOP' 카테고리의 글 목록 sh970901.tistory.com 토비의 스프링 3.1을 읽고 해석해서 풀어 쓴 글이다. 아직 이 책이 없다면 필자는 꼭 사서 두고두고 보는 것을 추천한다. AOP : 애스펙트 지향 프로그래밍 애스펙트란 그 자체로 애플리케이..
JDK 다이내믹 프록시 생성 예제와 스프링에서 제공하는 ProxyFactoryBean의 차이를 살펴보자. //JDK 다이내믹 프록시 생성 public void simpleProxyTest{ Hello proxiedHello = (Hello)Proxy.newProxyInstance( getClass().getClassLoader(), -> 동적으로 생성되는 다이내믹 프록시 클래스의 로딩에 사용될 클래스 로더 new Class[]{ Hello.class }, -> 구현할 인터페이스 new UppercaseHandler(new HelloTarget()) -> 부가 기능과 위임 코드를 담은 InvocationHandler); ... } //스프링의 ProxyFactoryBean 사용 public void pro..