본문 바로가기

728x90
반응형

Spring 정리

(88)
스프링 AOP (3) - 실무 주의사항 프록시 내부호출 문제 스프링은 프록시 방식의 AOP를 사용합니다. 따라서 AOP를 적용하려면 항상 프록시를 통해서 대상객체(Target)을 호출해야 합니다. 그래야 어드바이를 통해서 정상적으로 호출되며 직접 호출하면 어드바이스가 적용되지 않습니다. 하지만, 대상 객체(Target) 내부에서 메서드 호출이 발생하면 프록시를 거치지 않아 직접 호출을 하고 제대로 AOP가 적용되지 않습니다. @Aspect public class CallLogAspect { @Before("execution(* hello.aop.internalcall..*.*(..))") public void doLog(JoinPoint joinPoint) { log.info("aop={}", joinPoint.getSignature()); ..
스프링 AOP (2) - AOP 구현 및 예제 개요 스프링 AOP (1) 편에서는 JDK 동적 프록시, CGLIB와 스프링 프록시, 빈 후기처리를 통해 프록시의 생성과정 및 작동 방법에 대해 배웠습니다. 이번에는 스프링에서 AOP의 개념 및 사용법에 대해서 알아보겠습니다. AOP(Aspect Of Programming)이란? AOP의 Aspect는 '관점'이라는 뜻으로 AOP는 이름 그대로 애플리케이션에서 기능 하나하나를 횡단 관심사의 관점으로 보는 것입니다. AOP는 OOP 지향 프로그래밍에서 횡단 관심사를 깔끔하게 처리하기 위해 등장했습니다. 핵심 기능과 분리하여 공통의 부가 기능들을 AOP에 정의합니다. 이를 Aspect라 하며 스프링에서 제공하는 advisor는 advice(부가 기능 정의)와 pointcut(어디에 적용 할 것인가)을 가지고..
트랜잭션 전파 전략 7개 트랜잭션 전파 전략 7개 트랜잭션 전파 전략은 총 7가지가 있습니다. REQUIRED, REQUIRES_NEW, NESTED, MANDATORY, NEVER, SUPPORTS, NOT SUPPORTED를 하나씩 알아보겠습니다. REQUIRED 종속 된 트랜잭션은 현재의 트랜잭션을 따라갑니다. 만약에 현재 트랜잭션이 없다면 새로운 트랜잭션을 만듭니다. 트랜잭션 어노테이션의 기본 설정이기도 합니다. 트랜잭션 기본 설정입니다. 기존 트랜잭션 있음 : 기존 트랜잭션에 참여합니다 기존 트랜잭션 없음 : 트랜잭션 없이 진행합니다 REQUIRES_NEW 종속된 트랜잭션은 언제나 새로운 트랜잭션을 만들고 만약에 트랜잭션이 존재한다면 현재 트랜잭션을 잠시 지연시킵니다. 실제 트랜잭션 지연이 모든 트랜잭션 매니저에서 발생..
스프링 트랜잭션 이해 개요 스프링 트랜잭션의 적용 위치, 옵션 AOP 주의 사항을 학습합니다. @Transactional 동작 확인하기 @Transactional으로 프록시 방식의 AOP를 이용한 트랜잭션 작동은 아래와 같습니다. 트랜잭션 시작 시 트랜잭션 매니저는 데이터 소스에서 커넥션을 만들고 트랜잭션 동기화 매니저에 커넥션을 보관합니다. 트랜잭션 로직을 처리할 때 트랜잭션 동기화 매니저에 보관된 커넥션을 사용하고, 트랜잭션을 모두 종료시키고 커넥션을 반납합니다. 스프링에서 선언적 트랜잭션인 @Transactional를 예시 코드로 설명하겠습니다. @Slf4j @SpringBootTest public class TxBasicTest { ... @Test void txTest() { basicService.tx(); bas..
스프링 트랜잭션 추상화, 동기화 개요 스프링 트랜잭션의 추상화, 동기화를 이해할 수 있다. 트랜잭션 추상화 JDBC를 사용하다가 JPA로 기술을 변경하면 어떻게 될까요? JDBC 종속적인 수많은 코드들을 JPA로 변경해야 합니다. 그러다가 JPA가 또 다른 기술로 변경되면 어떻게 될까요? 해당 기술에 맞춰서 수많은 변경을 해야 합니다. 아래는 트랜잭션을 사용하는 JDBC 코드와 JPA 코드 비교입니다. 라이브러리가 완전히 바뀝니다. //JDBC public void accountTransfer(String fromId, String toId, int money) throws SQLException { Connection con = dataSource.getConnection(); try { con.setAutoCommit(false);..
스프링 트랜잭션 전파 기본개념 개요 데이터베이스의 트랜잭션 고립 수준에 대해 공부하다가 스프링에서 트랜잭션이 부모와 자식 사이에 전파가 된다는 사실을 알았습니다. 여러 가지 전파 수준이 있는데, 수준에 따라서 어떻게 결과가 달라지는지 궁금해서 테스트를 통해 알아보도록 하겠습니다. 트랜잭션 커밋과 롤백 트랜잭션 시작 시 Hikari에서 커넥션(Connection)을 가져오고 커밋을 하면 Hikari에 커넥션을 반납합니다. 또한, 롤백도 마찬가지로 반영된 내용을 모두 롤백하고 Hikari에 커넥션을 반납합니다. 만약에 아래 코드처럼 첫번째 트랜잭션이 커밋되고, 두번째 트랜잭션이 롤백된다면 트랜잭션 사용은 어떻게 될까요? @Test void double_commit() { log.info("트랜잭션1 시작"); TransactionStat..
OSIV 개요 JPA는 구현체를 Hibernate로 가지고 있습니다. QueryDsl 등을 통해서 쿼리문을 만드는 등 여러 추상화 기술을 이용하고 있기 때문에, 성능 상 조심해야 하는 점들이 있습니다. 그 중에 오늘은 OSIV에 대해 알아보겠습니다. 평소에 별로 고려하지 않았던 부분인데 실시간 서비스에서는 성능 상 이슈는 낼 수 있다는 것을 알고 공부하게 됐습니다. OSIV란? OSIV는 Open Session In View 의 약자로, 직역하면 View에서도 계속 Session이 Open 되어 있다는 뜻입니다. 즉, 사용자에게 보여지는 화면에서도 세션이 계속 유지됩니다. 비록 트랜잭션이 끝나도 말입니다. 트랜잭션에 관해서는 아래에서 설명하겠습니다. OSIV을 잘 이해하기 위해서 요청이 들어온 상황을 가정해보겠습..
트랜잭션의 역사 개요 스프링에서 당연하게 사용해오는 기술인 @Transactional의 역사를 알아보겠습니다. 스프링에서 트랜잭션의 사용 방법 및 스프링의 추상화 전략을 살펴보면서 개발자가 핵심 개발에만 집중 할 수 있게 된 배경을 알아보겠습니다.. 본 글은 김영한 님의 강의를 바탕으로 작성했습니다 데이터베이스 세션 데이터베이스에서 커넥션을 얻기 위해서 데이터베이스 서버는 내부에서 세션을 이용합니다. 세션은 트랜잭션을 시작하고 커밋 또는 롤백을 통해서 트랜잭션을 종료합니다. 즉, 개발자가 SQL을 전달하면, 커넥션에 연결되어 있는 세션이 SQL을 실행합니다. 트랜잭션이 없는 롤백 롤백은 취소, 복구와도 같은 의미로 롤백이 발생하는 원인은 다양하며, 보통 예외가 발생했을 때 롤백 처리를 합니다. 비지니스 로직을 짜면서 데..

728x90
반응형