IT 썸네일형 리스트형 JPA N+1 문제 1분 이해하기 JPA로 애플리케이션을 개발할 때 성능상 가장 주의해야 하는 것이 N+1 문제이다.JPA를 사용하는 다양한 개발자분들이 이를 사용하다보면 한번 쯤은 꼭 겪게 되는 문제일 것이다. 간단한 예제를 통해서 쉽게 N+1 문제란 무엇인지 이해하고 JPA를 사용하는 과정에서 어떤 이슈가 있을지 파악해보고 이를 적용해보는 시간을 가지면 좋을 듯 하다. @Entitypublic class Member { @Id @GeneratedValue private Long id; @OneToMany(mappedBy = "member", fetch = FetchType.EAGER) private List orders = new ArrayList(); ...}@Entity@Table(name = ".. 더보기 스프링 AOP(Aspect Oriented Programming) step3 : @Transactional 이전에 step2에서 포인트컷 표현식과 트랜잭션 속성을 이용해 트랜잭션을 일괄적으로 적용하는 방식은 복잡한 트랜잭션 속성이 요구되지 않는 한 대부분의 상황에 적용가능하지만 클래스나 메소드에 다라 제각각 속성이 다른, 세밀하게 튜닝된 트랜잭션 속성을 적용해야 하는 경우 일괄적으로 속성을 부여하는 것 대신에 직접 타깃에 트랜잭션 속성정보를 가진 애노테이션을 이용하는 방법이 있다. @Transactional을 정의한 코드는 직관적이라 이전에 설명한 속성을 모두 포함하고 있다.pacakage org.springframwork.transaction.annotation;...@Target({ElementType.METHOD, ElementType.TYPE})@Retension(RetentionPolicy.RUNTI.. 더보기 스프링 AOP(Aspect Oriented Programming) step2 : 네임스페이스 이전에 step1에서 코드로 만든 어드바이스를 제외한 자동 프록시 생성기(DefaultAdvisorAutoproxyCreator), 포인트 컷(AspectJExpressionPointcut), 어드바이저(DefaultPointcutAdvisor)는 모두 스프링이 직접 제공하는 클래스를 빈으로 등록하고 프로퍼티를 설정해줬다. 이 세가지 클래스를 이용해 선언하는 빈은 AOP를 적용하면 반복적으로 등장하게 된다. 스프링에서는 AOP를 위해 기계적으로 적용하는 빈들을 간편한 방법으로 등록할 수 있다. AOP와 관련된 태그를 정의해둔 aop 스키마를 제공한다.더보기더보기네임스페이스(Namespace)는 XML 문서에서 요소, 속성 등을 구분하기 위한 식별자(identifier)이다. XML 문서에서는 각 요소나 .. 더보기 스프링 트랜잭션 (Spring Transaction) step5 : 빈 후처리기 DefaultAdvisorAutoProxyCreator 이전 step4에서 고민한 자동 프록시 생성을 빈 후처리기를 이용한다.BeanPostProcessor 인터페이스를 구현해서 만든 빈 후처리기를 이용하면 스프링 빈 오브젝트로 만들어지고 난 후에 빈 오브젝트를 다시 가공할 수 있게 해준다. 빈 후처리기 중의 하나인 DefaultAdvisorAutoProxyCreator를 사용하여 문제를 해결한다. 빈 후처리기를 스프링에 적용하는 방법은 빈 후처리기 자체를 빈으로 등록하면 빈 오브젝트가 생설될 때마다 빈 후처리기에 보내서 후처리 작업을 요청한다. 이를 잘 이용한다면 타깃 빈 오브젝트의 일부를 프록시로 포장하고 프록시를 빈으로 대신 등록하는 작업이 가능하다. 이것이 자동 프록시 생성 빈 후처리기다. 1, 2. DefaultAdvisorAutoProxyCrea.. 더보기 스프링 AOP(Aspect Oriented Programming) step1 이전에 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 : 애스펙트 지향 프로그래밍애스펙트란 그 자체로 애플리케이션의.. 더보기 스프링 트랜잭션 (Spring Transaction) step4 : Spring ProxyFactoryBean 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.. 더보기 메이븐 라이프사이클(Maven LifeCycle) Maven은 빌드 프로세스를 실행하기 위해 여러개의 LifeCycle을 제공한다.각 LifeCycle은 특정한 빌드 단계(build phase)를 정의하며 빌드 프로세스는 이 라이프사이클을 따라서 실행된다.There are three built-in build lifecycles: default, clean and site. The default lifecycle handles your project deployment, the clean lifecycle handles project cleaning, while the site lifecycle handles the creation of your project's web site.maven은 LifeCycle은 clean, default, site 세 .. 더보기 스프링 트랜잭션 (Spring Transaction) step3 : 다이내믹 프록시 이전 step2 에서 비즈니스 로직과 트랜잭션 로직을 분리하기 위해 UserService(인터페이스) -> UserServiceTx(트랜잭션 로직) -> UserServiceImpl(비즈니스 로직)을 구현했다.이 구성에는 번거러운 코드 작성과 중복 코드 작성 등의 문제가 있었다. 이를 자바의 리플렉션 API 기능을 이용해 다이내믹 프록시를 만들어 해결할 수 있다. 리플렉션이란 런타임 시점에 객체의 클래스 타입, 필드, 메서드 등의 정보를 동적으로 가져올 수 있는 기능이다. 예를 들어 String name = "LEE_SEUNGHUN" 일 때 이 문자열의 길이를 알고 싶다면 length()라는 메소드를 호출할 것이다. 자바의 모든 클래스는 그 클래스 자체의 구성정보를 담은 Class 타입으 오브젝트를 하.. 더보기 이전 1 ··· 3 4 5 6 7 8 9 ··· 19 다음