본문 바로가기

Spring

(3)
어떻게 성격이 비슷한 여러 종류의 서비스를 추상화할까? (2/2) - 템플릿 메서드 패턴, 템플릿 콜백 패턴으로 리팩토링 저번 포스팅에서는 같은 성격의 서비스들을 일관되게 사용하는 방법에 대해 알아보았다. 같은 성격의 서비스들은 비슷한 로직이 있고 이를 효율적으로 재사용하는 방법에 대해 알아보려고한다. @Service public interface PaymentService { PaymentDto payForOrder(PaymentDto paymentDto, Long orderId); } PaymentService 는 payForOrder 라는 주문에 대한 결제를 완료하는 메서드를 정의하고 있고, PamentService 의 구현체인 현금, 카드, 모바일 결제서비스에서 이 메서드를 각자 구현하고 있는 형태이다. 위와 같은 구조에서 결제 정보들은 PaymentRepository 를 통해 하나의 테이블로 관리하고, 각 결제수단..
어떻게 성격이 비슷한 여러 종류의 서비스를 추상화할까? - 전략 패턴을 통한 추상화 스프링과 JPA를 통해 오픈마켓의 결제 서비스를 구현해보자. 결제방식에는 (무통장입금, 카드, 모바일) 3가지 결제방식이 있다고 가정하자. 총 결제금액, 결제상태, 결제시간에 대한 정보는 공통으로 가지고 있고, 각 결제방식에 따라 다른 정보들을 포함하고있다. 첫 번째 포스팅에서는 일관된 방법으로 여러 종류의 서비스를 사용하는 방법을 고민해보려고한다. 가장 쉽게 생각할 수 있는 방법은 결제방식 마다 각각의 컨트롤러, 서비스, 레포지토리 를 두는 구조이다. 이 방법의 문제점을 생각해보면, 공통로직이 변경되었을 때 각 결제방법마다 해당하는 로직을 모두 변경해주어야 한다는점이다. 단순 반복 되는 코드는 실수가 생기기 마련이고 반복작업과 디버깅 작업에는 시간적비용이 많이든다. 또한 새로운 결제방식이 추가되었을 때..
@AuthenticationPrincipal - 현재 사용자 조회하기 해당 코드는 Github에 공개 되어 있습니다. Spring Security에서는 Session에서 현재 사용자 정보를 조회할 수 있다. @AuthenticationPrincipal 애노태이션과 어댑터 패턴을 이용해서 이를 효율적으로 조회해보도록 하자. Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); User user = (User)authentication.getPrincipal(); 이는 @AuthenticationPrincipal 로도 구현 가능하고 이 결과는 UserDetailsService를 구현한 AccountService에서 반드시 상속받아야 하는 loadUserByUsername 메..