이전 포스팅을 통해 1:1, 1:N, N:M 관계에서 @OneToMany 와 @MappedBy 등을 활용해 연관관계 매핑을 수행하였다. 연관관계 주인이란 객체의 값을 변경시키면 테이블의 FK 값이 바뀌는 클래스를 말하며, 보통 FK 를 갖는 쪽으로 설정한다. 상속관계
@Aspect 를 사용하는 스프링의 AOP 를 활용하여 어노테이션을 추가하는 방식으로 부가기능을 적용해보았다. 스프링의 AOP 는 실제객체를 상속받는 프록시객체를 생성하고, 메서드를 오버라이딩하여 구현한다. 오버라이딩 메서드에서는 부가기능을 추가한 뒤 실제객체의 메서드
AspectJ 의 포인트컷 표현식의 여러 지시자에 대해 학습했다. 이를 통해 메서드명, 타입, 어노테이션 등 다양한 포인트컷 매칭방식 적용이 가능해졌고, 타겟 메서드의 파라미터로 Advice 로 넘겨줄 수 있게 되었다.이번 포스팅에서는 어노테이션 기반으로 스프링 AOP
@Aspect 를 통해서 스프링 AOP 를 적용해보았다. 또한 포인트컷을 시그니처로 분리하거나, 어드바이스의 순서를 설정하는 방식에 대해 알아보고 여러 어드바이스에 대해서도 확인하였다. 이 때 포인트컷 설정시 포인트컷 표현식을 사용하였는데, 이에대해 알아보자.Aspec
스프링 AOP 는 런타임에서 프록시 기반의 AOP 를 수행한다고 하였다. 프록시 자동 생성기가 있기에 Advisor 만 만들어 빈으로 등록하면 되는데, @Aspect 로 편리하게 Advisor 를 생성한다.이번 시간에는 @Aspect 를 활용하여 스프링 AOP 를 구현
@Aspect 는 스프링에서 어노테이션 방식으로 Advisor 를 생성할 때 사용한다.스프링 로딩 시점에 자동 프록시 생성기가 빈으로 등록된 @Aspect를 Advisor 로 변경하여 저장하며, Advisor 와 동일하게 사용한다.실무에선 대부분 @Aspect 로 Ad
스프링은 자동 프록시 생성기를 빈 후처리기로 자동 등록한다. 자동 프록시 생성기는 빈으로 등록된 Advisor 들을 확인해서 빈 객체를 프록시객체로 변경하여 등록한다. 자동 프록시 생성기의 존재로 개발자는 Advisor 만 스프링 빈으로 등록하면 된다. 이번 포스팅에서
프록시팩토리의 도입으로 실제객체의 인터페이스의 유무에 무관하게 프록시객체를 생성할 수 있게 되고, 어드바이저의 도입으로 포인트컷을 통해 적용할지 여부를 결정하고, 어드바이스로 어떤 로직인지만 정하면 된다. 하지만 프록시객체를 빈으로 등록해야 하므로 수동 빈 등록만 가능
클라이언트객체와 실제객체 변화없이 부가기능 추가를 위해 프록시를 사용하는 데코레이터 패턴을 도입했다. 그리고 일일이 프록시 클래스를 생성해야하는 문제를 보완하기 위해 동적프록시를 도입했다. 동적프록시 기술은 크게 두가지가 있다.JDK 동적프록시 \- 실제객체가 인터페이
[ 이전 포스팅 ] 요청객체와 실제객체 사이에 프록시객체의 도입으로 부가기능을 수행하게 하였다. 다형성을 활용하기에 프록시객체는 실제객체와 같은 인터페이스를 구현하거나, 실제객체의 자식클래스이다. 프록시객체의 도입으로 요청객체와 실제객체의 코드를 수정하지 않고 의존성
[ 이전 포스팅 ] 템플릿 메서드 패턴이나 템플릿 콜백 패턴의 도입으로 공통 부가기능을 템플릿 메서드로 별도 관리할 수 있게 되었다. 하지만 여전히 공통 부가기능을 추가하려면 원래 클래스를 수정해야한다. 100 개의 클래스에 부가기능을 추가하면 100 번의 수정이 필요하다는 뜻이다. 원본 코드를 수정하지 않으면서 공통 부가기능을 적용할 수는 없을까? 이는...
연관관계를 클래스에서는 필드에서 다른 객체를 갖도록 해 구현한다. 연관관계에서 매핑시 다중성, 단/양방향, 연관관계 주인을 고려해야 한다. 다중성은 @OneToMany 등으로 설정하며, 방향은 양쪽 클래스 모두에 서로의 객체 필드가 있는지 여부로 결정하고, 연관 관계
@Entity 로 클래스와 테이블의 매핑을 진행하였다. 유일하며 불변해야하는 기본키는 @GeneratedValue 로 자동 생성 방식을 사용하였다. 전략으로는 IDENTITY 나 SEQUECE 를 사용 주로 사용한다. 그러면 1:N 과 같은 연관 관계는 클래스에 어떻게
EntityManager 내부의 저장소인 영속성 컨텍스트에 대해 알아보았다. em.persist, em.find 수행시 영속성 컨텍스트의 1차 캐시에 보관되며. INSERT, UPDATE 쿼리는 쓰기 지연 저장소에 보관된다. 그리고 flush 호출시 영속성 컨텍스트의
설정파일로 EntityMangerFactory 를 생성하고, 거기서 EntiyManager 를 생성하여 멤버 메서드로 JPA의 DB 접근을 수행한다. em.persist, em.find, em.remove 등을 통해 CRUD 가 이루어지며, 수정은 객체를 변경하면 자동
하나의 스레드에서 메서드간에 TraceId 를 공유하기 위해 LogTrace 의 필드로 TraceId를 두었다. 그런데 LogTrace 는 싱글톤 빈으로 등록하여 사용하므로, 여러 스레드간 동시성 문제가 발생하여 필드를 스레드로컬로 변경해여 해결하였다. 이제 로그추적기
JPA는 자바 어플리케이션과 JDBC 사이에서 쿼리문을 생성해준다. 그래서 SQL 문을 작성하지 않고 객체<->테이블의 매핑을 가능케하여 생산성을 향상시키고 유지보수를 용이하게 해준다.이번 포스팅에선 직접 JPA를 사용해보자.메이븐에서 JPA 의 설정파일이다. r
인프런 김영한 강사님의 자바 ORM 표준 JPA 프로그래밍 - 기본편을 정리할 예정입니다. 해당 강의는 JPA 에 대한 소개와 원리에 대한 강의입니다.객체지향 프로그래밍은 다형성, 상속 등을 활용하여 매우 유연성 높은 프로그래밍을 가능케한다.관계형 데이터베이스는 데이터
메서드의 로그를 출력하는 로그추적기 객체를 생성했다. 메서드 시작부분에 로그추적기의 begin 메서드를, 메서드 종료부분에 로그추적기의 end 메서드, 메서드에서 예외가 발생하면 로그추적기의 exception 메서드를 출력하면 된다. 이때 요청마다 Id 와 level
인프런 김영한 강사님의 스프링 핵심 원리 - 고급편을 정리할 예정입니다. 해당 강의는 스레드-로컬과 스프링의 디자인 패턴, AOP의 원리 및 개념에 대한 강의입니다. 위와같이 동작하는 로그추적기를 생성하는 것이 목표이다.모든 클래스에서 로그추적기 객체를 주입받는다.모든