본문 바로가기

Spring&SpringBoot/<토비의 스프링 3.1 Vol1.1>, 이일민29

Step2&3. 다이나믹 프록시와 팩토리빈 프록시와 프록시를 사용하는 디자인 패턴 프록시는 클라이언트의 요청을 받아주는 대리인과 같은 역할을 하는 오브젝트이다. 이때 프록시는 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장한다. 그리고 프록시를 통해 최종적으로 요청을 위임받아 처리하는 실제 오브젝트를 타깃이라고 한다. 프록시를 사용하는 디자인 패턴은 프록시의 사용 목적에 따라 두 가지로 나뉜다. 데코레이터 패턴 : 타깃에 부가적인 기능을 부여 프록시 패턴 : 타깃의 접근 방법 제어 데코레이터 패턴과 디자인 패턴 둘다 프록시를 사용하기 때문에 구현에 DI를 사용한다는 점에서 유사하다. 하지만 데코레이터 패턴은 인터페이스를 통해서만 위임하는 방식이기 때문에 여러개의 부가기능을 체인처럼 연결하고, 각 데코레이터는 자신이 위임하는 인터페이스가 또다.. 2023. 4. 11.
Step1. 데코레이터 패턴을 적용하는 트랜잭션 코드 분리와 고립된 단위 테스트 트랜잭션 코드 분리 요구사항 비즈니스 로직을 담는 UserService에 여전히 트랜잭션 처리 코드가 남아있다. 이 트랜잭션 처리를 분리하는 작업을 해보자. 단, 클라이언트가 비즈니스 로직만 남도록 개선하더라도 UserService의 클라이언트는 트랜잭션이 적용된 기능을 사용할 수 있어야 한다. UserService에 트랜잭션을 적용한 upgradeLevels 코드를 살펴보면 크게 트랜잭션 관리(시작, 종료)와 비즈니스 로직(레벨 업그레이드) 부분으로 구분할 수 있다. 관심사도 다르고 주고받는 데이터도 없으므로 완전히 분리가 가능하다. 비즈니스 로직을 우선 메소드로 추출해보자. public void upgradeLevels() { // 트랜잭션 생성과 시작 TransactionStatus status =.. 2023. 4. 11.
6장 AOP part1 6장은 양이 많아서 이번 주는 1절부터 4절까지 읽었다. 이번주는 이해가 잘 안 됐던 주이기도 하다. 리플렉션에 대해서 들어보기는 했는데 이렇게 써보는게 처음이라 낯설기도 했고, 무엇보다 다이나믹 프록시가 자바 코드로 보이는 것이 아니니 생소했다. 그리고 양이 너무.. 많다.. 나의 언어로 바꾸느라 애를 먹었던 주이기도 하다. 6장은 서비스 코드에서 트랜잭션의 완전한 분리를 위해 개선해나가는 과정이다. 여기서 다이나믹 프록시도 사용되고 리플렉션도 나오고 전략 패턴이나 템플릿 콜백도 나온다. 아무튼 지금까지 배운 것의 총집합이었다. 이 포스팅에서는 part1의 큰 도약에 대해서만 요약한다. 6장 이해에 어려움을 겪으시는 분들께 도움이 되기를 🙏 목표 서비스의 트랜잭션 코드 분리. 확장 가능한 설계를 고려하.. 2023. 4. 11.
테스트에 서비스 추상화 적용하기 (feat. 테스트 대역, 테스트 스텁, 목 오브젝트) 사용자 레벨이 업그레이드되는 경우, 해당 사용자에게 이메일을 보내 알려주는 기능을 추가하기로 했다. 이메일 전송 메소드는 UserService의 upgradeLevels에서 호출된다. 메일 서비스 추상화의 목적 메일 서비스에 추상화 계층을 추가하면 테스트하기 어려운 JavaMail을 테스트하기 편리하게 만들어준다. 메일 서비스 테스트의 관심사 자바 프로그램에서 메일 보내기 기능을 구현하려면 JavaMail API를 사용해서 실제 메일 서버에 전송할 메일을 전달한다. 운영 환경에서는 직접 메일을 전송해야하지만, UserService의 upgradeLevels을 테스트하는 테스트 환경에서는 메일 전송 테스트가 레벨 업그레이드라는 관심사를 벗어날 뿐만 아니라 메일 서버에 부담을 줄 수 있다. JavaMail은.. 2023. 4. 4.
트랜잭션 개선 과정 분석 (feat. 서비스 추상화, 책임 주도 접근법) 목차 트랜잭션 적용 확인을 위한 테스트 트랜잭션 적용을 위한 두번의 도약 트랜잭션 동기화 : JDBC를 사용하는 서비스 코드에서 Connection 객체의 전파 막기 트랜잭션 서비스 추상화 : 트랜잭션 처리 방법에 따른 차이를 추상화하는 PlatformTransactionManager 🌱 데이터 중심 접근법과 책임 중심 접근법에 따라 트랜잭션 개선 과정 분석하기 🌱 서비스 추상화와 단일 책임 원칙 트랜잭션 적용 확인을 위한 테스트 현재 UserService에는 트랜잭션이 적용되지 않은 상태이다. 따라서 upgradeLevels와 같이 여러 sql문을 실행하는 메소드를 실행하던 중에 예외나 오류가 발생해 실행이 중단되면, 어떤 user에는 업그레이드가 반영되고 어떤 user에는 업그레이드가 반영되지 않을 .. 2023. 4. 4.
(미완) 데이터 액세스 기술 추상화하기 개요 (이 내용은 추후 로드 존슨의 Expert One-On-One J2EE Design and Development 9장을 읽어본 후에 다루려고 합니다.) 저번 포스팅에 이어 DataAccessException이 어떻게 데이터 액세스 기술 종류의 차이를 추상화하는지 알아보자. DataAccessException이 데이터 액세스 기술마다 다르게 던지는 예외 클래스를 추상화하여 동일한 상황에 일관된 런타임 예외를 던지는지 알아본다. 토비의 스프링 4장 2절의 목표는 DataAccessException이 어떻게 기술마다 다른 예외 클래스를 발생 맥락으로 묶어 맥락에 대응하는 추상적인 예외를 던지는지 이해하는 것이다. 이 과정에서 사용되는 런타임 예외 중심의 낙관적인 예외 처리 전략도 확인할 수 있다. ===.. 2023. 3. 26.