공부노트/스프링

    AOP 정리2

    AOP 설명 AOP 는 관점 지향 프로그래밍이다. 프로그램 내 여러 모듈에 작동되는 부가적인 로직을 핵심로직으로부터 분리하여 모듈화할 수 있다. 유지보수성이 향상된다. Spring AOP Spring AOP는 데코레이션 패턴을 구현한 프록시 기반으로 런타임에서만 AOP가 작동한다. 데코레이터 패턴이란 요청자와 제공자 사이에서 중간자 역할을 하는 프록시가 제공자에게 요청자의 메시지가 전달되기 전과 제공자의 응답 메시지가 요청자에게 전달될 때 특정 로직(명령)을 수행하도록 하는 패턴이다. 요청자 --(메시지)-> 제공자 요청자 프록시 제공자 이 프록시에서 메시지를 조작하거나, 로그를 찍거나, 트랜잭션을 관리하는 로직이 들어갈 수 있다. 이렇게 특정 시점을 기준으로 로직이 실행되도록 하는 것이 AOP 이다. ..

    [JPA] Collection, 고아, 트랜잭션, Facade, OSIV

    [JPA] Collection, 고아, 트랜잭션, Facade, OSIV

    Colleciton 엔티티 필드 중 컬렉션 타입도 프록시의 일종은 컬렉션 래퍼(PersistentBag)로 교체된다. final 키워드도 의미가 없다. 컬렉션 래퍼인 프록시로 교체되어야 하기 때문에 사용 안 하는 것이 좋다. 그리고 JPA 철학이 엔터티를 그대로 영속화한다는 개념이기 때문에. final로 선언된 필드가 테이블의 컬럼이라고 생각하면 final 은 더욱 어울리지 않는다. JPA에서 지원하는 컬렉션은 Collection, Set, List, Map이 있다. Collection: 최상위 컬렉션. 하이버네이트는 중복 허용, 순서 보장 x Set: 중복 X, 순서 X List: 중복 O, 순서 O Map: Key, Value 형태. Map은 복잡한 매핑에 비해 활용도가 떨어지고 다른 컬렉션을 사용해..

    [JPA] N+1 문제

    [JPA] N+1 문제

    준비 Team 이 부모이고, Student는 자식들의 부모관계로 설정하고 양방향 관계로 설정을 하였다. 축구팀에는 2명의 학생, 농구팀에도 2명의 학생을 배정하였다. Fetch Type을 Eager로 사전 로딩을 세팅해뒀다. 1차 캐시를 사용하지 않기 위해, setup() 마지막에 session.evit()을 호출하여 캐시를 삭제하고, 테스트 코드를 실행한다. @Entity @Getter public class Team { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; @JsonManagedReference @OneToMany(mappedBy = "team", fetch = FetchType..

    AOP / Spring AOP 요약

    AOP / Spring AOP 요약

    AOP 소개 AOP는 관점지향 프로그래밍 기법이다. 핵심 기능과 부가 기능을 분리하고 모듈화하기 위해서이다. AOP는 다양하게 적용될 수 있다. 우리가 흔히 사용하는 런타임 시점에 메소드 호출 시에 AOP를 적용할 수 있지만, 그 외에 컴파일 시, 클래스 로딩 시, 런타임에서도 필드 변경, 정적 변수 접근 등 다양하게 적용이 가능하다. 하지만 Spring AOP 에서는 런타임 시에 메서드 호출 시에만 사용 할 수 있다. 프록시를 사용하기 때문이다. AspectJ 를 사용하면 위에 나열한 다양한 상황에서 AOP를 적용할 수 있다. 예를 들면, 로깅 로직은 모든 기능 또는 도메인의 핵심로직 대부분에 들어가있다. 만약 로깅을 사용하는 소스코드가 수정이 발생하면, 모든 로직을 수정해야한다. 비지니스 로직을 핵심..

    Spring AOP 적용

    빈 후처리기를 사용한 프록시 적용 전역 Bean 후처리기를 Spring 에서 제공하고 있다. Bean 후처리기란 Spring Cotext가 객체 생성 후, Container 에 Bean 으로 등록하기 전 실행하는 로직이다. 빈 후처리 로직에 프록시 bean을 등록하게 하면 공통으로 같은 프록시가 적용될 수 있다. 이전 실습에서는 프록시 타겟마다 프록시 생성을 일일이 해준 것을 빈 후처리기를 통해 코드 재사용성을 높였다. 빈 후처리기 + 포인트 컷 빈 후처리기는 전역을 대상으로 실행되기 때문에, 프록시 적용이 필요한 bean 에만 적용되도록 필터링이 필요하다. 필터링 역할을 포인트 컷이 할 수 있다. Spring AOP 를 사용하면 AnnotationAwareAspectJAutoProxyCreator라는 ..

    스프링 AOP

    스프링 AOP

    유용성 1. ProxyFactory ProxyFactory를 통해 인터페이스가 있는 경우 JDK 동적 프록시 사용, 그렇지 않으면 CGLIB 사용하도록 하여 일관성 있고 편리하게 프록시를 사용할 수 있게 함 ProxyFactory 를 통해 프록시 기술을 선택할 수 있게 함 proxyTargetClass=true 로 설정하면, 인터페이스 여부와 상관 없이 구체 클래스 기반 프록시 CGLIB 를 사용함. 스프링부트 AOP에서는 기본적으로 proxyTargetClass=true로 설정되어 있음 2. Advice, Pointcut Advice를 통해 부가 기능을 구현하기 편함 기존에는 JDK 동적 프록시 InvocationHandler 와 CGLIB가 제공하는 MethodInterceptor를 중복으로 따로 만..

    프록시 패턴과 데코레이션 패턴

    프록시 패턴과 데코레이션 패턴

    시작하며 기존의 템플릿 메서드 패턴, 템플릿 콜백 패턴은 기존 코드를 수정할 수 밖에 없다. 그래서 코드를 건드리지 않는 프록시 패턴을 도입해보고자 한다. Strategy Pattern, Template Callback 패턴 템플릿 메서드 Template Method 패턴과 차이 Template Method 패턴에서는 자주 변경되는 점과 변경되지 않는 점을 부모와 자식 관계인 '상속 관계'로 해결했다. 하지만 단점으로 의존성이 높았다. Strategy mulmandu17.tistory.com 프록시 서버와 클라이언트 관계에서 실제 서버처럼 행동하는 대체자를 프록시라고 한다. 프록시를 도입하면 다음과 같은 이점을 얻을 수 있다. 1. 접근 제어 권한에 따른 접근 차단 캐싱 지연로딩 2. 부가 기능 추가 현..

    Strategy Pattern, Template Callback 패턴

    템플릿 메서드 Template Method 패턴과 차이 Template Method 패턴에서는 자주 변경되는 점과 변경되지 않는 점을 부모와 자식 관계인 '상속 관계'로 해결했다. 하지만 단점으로 의존성이 높았다. Strategy 전략 패턴 전략패턴에서는 상속 관계를 '위임 관계' 로 변경함으로써 의존성을 낮출 수 있다. 위임 관계는 관계 있는 것들을 조립하여 실행하는 방법이다. 조립에는 생성할 때 조립하는 방법이 있고 호출할 때 조립하는 방식이 있다. public class ContextV1 { private final Strategy strategy; public ContextV1(Strategy strategy) { this.strategy = strategy; } public void execut..

    Template Method 패턴

    Template Method 패턴 자주 변경되는 점과 변경되지 않는 지점을 분리하여 설계한 방법이다. 변경되지 않는 점은 Template 양식에 위치하고, 자주 변경되는 지점은 사용할 때마다 구현해서 사용하는 구현체로 남겨둔다. 단일 책임 원칙(SRP)을 지킬 수 있다. 모듈화를 함으로써 로깅과 비지니스 로직을 분리했다. 그리고 공통되는 로깅 로직을 따로 빼서 공통으로 코드를 관리하는 덕분에 변경이 일어날 시 한 곳만 수정을 하면 된다. GOF 디자인 패턴 책에서의 정의는 다음과 같다 템플릿 페머스 디자인 패턴의 목적은 다음과 같습니다. "작업에서 알고리즘의 골격을 정의하고 일부 단계를 하위 클래스로 연기합니다. 템플릿 메서드를 사용하면 하위 클래스가 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 단..

    스프링 프레임워크 - 기초

    스프링 프레임워크 - 기초

    * 이 포스팅은 김영한님의 스프링 기본원리 기본편 강의 내용을 정리한 것입니다. 1. 제어의 역전(Inversion of Control, IoC) 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전(IoC) 이다. 기존 프로그램은 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성하고, 연결하고, 실행. 즉, 클라이언트는 구현체를 직접 참조. 스프링 프레임워크는 Config를 통해서 프로그램의 흐름 제어를 할 수 있다. 예를 들면, 내부 또는 외부 저장소 사용 여부를 비지니스 로직 구현체 코드를 건드리지 않아도 Config 를 통해서 제어할 수 있다. 프레임워크와 라이브러리의 차이 프레임워크는 내가 작성한 코드를 제어하고, 대신 실행하면 프레임워크이다. 반면에 ..