들어가기 전 이 글은 인프런 영한님의 강의를 복습하며 작성한 글입니다. 스프링 트랜잭션 전파 이 글에서는 다음 목표를 가진다. 스프링에서 트랜잭션이 두 개 이상 존재할 때, 어떻게 동작하는지 확인. 스프링이 제공하는 트랜잭션 전파 개념 숙지 스프링 트랜잭션 전파1 - 커밋, 롤백 코드는 이곳(https://github.com/chickenchickenlove/springdb2/blob/chapter-9-spring-transaction-propagation-basic/src/test/java/hello/springtx/propagation/BasicTxTest.java)에서 확인할 수 있음. 먼저 1개의 트랜잭션만 있을 때, 트랜잭션을 각각 커밋하고 롤백하면 어떤 결과가 나오는지를 확인해보고자 한다. 아..
들어가기 전 이 글은 인프런 김영한님의 강의를 복습하며 작성한 글입니다. 스프링 데이터 JPA와 트레이드 오프 중간에서 JpaItemRepositoryV2가 ItemService와 JpaItemRepository의 어댑터 역할을 해준 덕분에 ItemService가 사용하는 ItemRepository 인터페이스를 그대로 유지할 수 있고, 클라이언트인 ItemService의 코드를 변경하지 않아도 되는 장점이 있다. 그런데 이 때 한 가지 고민이 생긴다. Adapator를 사용해서 Service 계층과 논리적으로도 완벽히 계층 분리를 할 수 있었지만, Adapter가 하나 더 추가되면서 전체 구조가 너무 복잡해진다는 것이다. 고민 구조를 맞추기 위해서 중간에 어댑터(JpaItemRepositoryV2 - S..
들어가기 전 이 글은 인프런 김영한님의 강의를 복습하며 작성한 글입니다. Query DSL의 필요성 JPA의 문제점은 다음과 같다. 우리가 작성하는 쿼리는 문자열이다. 따라서 타입 체크가 불가능하고, 잘못된 문법도 실행 전까지는 알 수 없다. 에러는 크게 컴파일 에러, 런타임 에러가 있는 것으로 볼 수 있다. 쿼리를 실행해서 알게 되는 것은 런타임 에러다. 런타임 에러는 나쁜 사용자 경험을 줄 수 있는 에러다. SQL을 작성하기 위해서는 도메인의 필드를 모두 암기해야한다. 이것은 한계가 있다. 만약 SQL이 클래스처럼 타입이 있고 자바 코드로 작성할 수 있다면 어떨까? 그리고 타입 체크까지 해준다면 어떨까? 이런 형태로 작성할 수 있게 된다면 컴파일 시 에러 체크가 가능해진다. Query DSL이 이런 ..
이 포스팅은 인프런 영한님의 강의를 복습하며 작성한 글입니다. 스프링 AOP : 프록시 기술과 한계 JDK 동적 프록시, CGLIB 동적 프록시를 이용하는 방법은 각각 장단점이 있다. JDK 동적 프록시는 인터페이스가 필수이고, 인터페이스를 기반으로 프록시를 구현한다. CGLIB는 구체를 기반으로 프록시를 구현한다. 그렇다면 JDK 동적 프록시, CGLIB 동적 프록시의 각각의 한계는 어떤 것이 있을까? JDK 동적 프록시의 한계 → 타입 캐스팅 한계 JDK 동적 프록시는 인터페이스를 기반으로 프록시 객체를 만든다. 따라서 프록시 객체는 Target 객체의 구현체 클래스에 대해서 전혀 알지 못한다. 따라서 JDK 동적 프록시 객체는 Target 객체의 구현체 클래스로 타입 캐스팅이 불가능하다. JDK 동..
이 포스팅은 인프런 영한님의 강의를 복습하며 작성한 글입니다. AOP 프록시 내부 참조 문제 public class AspectV1 { @Around("execution(* hello.aop.order..*.*(..))") public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable { // 프록시 객체 로직 log.info("[LOG] {}", joinPoint.getSignature().toShortString()); // Target 객체 호출 return joinPoint.proceed(); } } 스프링은 프록시 방식의 AOP를 사용한다. 따라서 AOP를 적용하려면 항상 프록시를 통해 Target 객체를 호출해야한다. 이것은 앞에서 만..