Spring
-
[Spring] 프록시 패턴과 데코레이터 패턴 - 3Spring 2022. 6. 16. 16:57
인터페이스 기반 프록시를 적용한다면 이전까지 정리했던 내용을 다시 한번 확인하자면 '클라이언트 -> 프록시 -> 서버'로 의존관계가 이루어져야한다. 이를 웹 서버로 바라보자면 클라이언트 -> 프록시 컨트롤러 -> 컨트롤러 -> 프록시 서비스 -> 서비스 -> 프록시 리포지토리 -> 리포지토리 순으로 요청이 흘러가고 응답은 이의 역순으로 흘러간다는 것을 알 수 있다. @Configuration public class InterfaceProxyConfig { // ControllerInterface : 컨트롤러 인터페이스 // ControllerImpl : 컨트롤러 구현체 // ControllerProxy : 컨트롤러 프록시 @Bean public ControllerInterface controller() ..
-
[Spring] 프록시 패턴과 데코레이터 패턴 - 2Spring 2022. 6. 16. 16:21
프록시 패턴 적용 프록시 패턴을 적용하기 위해서는 먼저 인터페이스를 작성해야한다. 그리고 실제 객체는 이를 구현하고 클라이언트 코드는 이를 의존한다. public interface Subject { // 단순 메서드 1개 존재 String operation(); } // 1. 실제 객체 - 인터페이스를 구현 public class RealSubject implements Subject { @Override public String operation() { /*구현한 코드 몸통*/ } } //2. 클라이언트 코드 - 인터페이스를 의존 public class Client { private final Subject subject; public Client(Subject subject) { this.subjec..
-
[Spring] 프록시 패턴과 데코레이터 패턴 - 1Spring 2022. 6. 16. 15:53
이전 정리하였던 템플릿 메서드 패턴과 콜백 패턴을 사용하면 새로운 코드를 추가할 때 코드 수정을 최소화 할 수 있다. 하지만 최소화 할 수 있었을 뿐 기존 원본 코드를 변경해야한다는 것은 변함이 없었다. 이를 해결하기 위해서 프록시를 활용하게 된다. 프록시(Proxy)란? 클라이언트가 서버에 필요한 것을 요청하고 서버는 클라이언트의 요청을 처리한다는 개념, 정의는 이미 알고 있다. 이 때 클라이언트가 서버를 직접 호출 및 결과를 받는 것(직접 호출)이 아니라 서버에 호출을 대신 전해주는 무언가에 간접적으로 요청(간접 호출)을 할 수 있다. (클라이언트 -> 000 -> 서버) 이때 클라이언트가 간접적으로 요청하는 대상을 프록시라고 한다. 프록시가 클라이언트의 요청을 먼저 받고 이를 서버에 전달하는 구조를..
-
[Spring] 전략 패턴 - 상속이 아닌 위임을 활용Spring 2022. 6. 15. 03:29
이전에 정리하였던 템플릿 메서드 패턴의 경우 변하지 않는 템플릿을 부모 클래스에 두고 변하는 부분은 자식 클래스에 두어서 상속을 활용하였다. 전략패턴에서는 상속이 아니라 변하지 않는 부분을 클래스로 두고 변하는 부분을 인터페이스로 만든 다음 해당 인터페이스를 구현하도록 하여서 문제를 해결한다. 전략 패턴의 의도(indent)는 아래와 같다 알고리즘 제품군을 정의하고 각각을 캡슐화하여 상호 교환하게 만들자. 전략을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다. 전략패턴에서 변하지 않는 로직을 가지고 있는, 템플릿 역할을 하는 코드를 컨텍스트라고 한다. 해당 컨텍스트 안에서 인터페이스를 구현한 부분을 통해 일부 전략이 변경된다. 즉 컨텍스트 내부에는 해당 인터페이스를 필드를..
-
[Spring] 템플릿 메서드 패턴 - 변하는 것과 변하지 않는 것의 분리Spring 2022. 6. 15. 01:33
코드를 작성하다보면 중복되는 코드들로 인해 수정 시 많은 노력을 가했던 경험들이 있다. 이를 위해서 공통 부분을 메서드로 추출하는 등 다양한 노력을 하지만 쉽지 않은 경우들이 많았다. @RestController @RequiredArgsConstructor public class CarApiController { private final ApiKey API_KEY; private final ConnectUrl connectUrl; private final CarApiService carApiService; @PostMapping("/data") public ResponseEntity findCarData(@RequestBody SearchDto search) { try { String apiUrl = "..
-
[Spring] 동시성 문제 해결하기 - ThreadLocalSpring 2022. 6. 14. 19:40
이전 호출 스택에서 특정 값을 다음 호출에서도 사용할 수 있도록 하기 위해서는 파라미터를 활용하여 값을 전달하는 방법이 있다. // 첫번째 메서드에서의 msg를 호출하는 메서드에서 유지하기 (파라미터) public void first(int number) { number += 1; String msg = "메시지"; second(msg); } public void second(String msg) { ... } 하지만 파라미터로 값을 전달한다면 수정소요가 발생하였을 때 해당 파라미터를 받는 메서드를 모두 찾아 수정/삭제 해야하고 최초에 파라미터를 작성하는 것도 많은 노력이 필요하다. 이를 해결하기 위해서 필드를 활용한 방법을 사용할 수 있다. 필드 동기화 방법을 사용한다면 특정 클래스의 필드 변수만 관리..