전체 글
-
스프링의 새로운 HTTP 클라이언트 - RestClientSpring 2023. 8. 1. 22:37
스프링 프레임워크 6.1 M2 에서 RestClient 가 추가되었다. RestClient 는 스프링의 새로운 동기식 HTTP 클라이언트로 WebClient API 와 비슷한 방식으로 사용되며 RestTemplate 의 인프라를 제공한다. RestTemplate API 는 오래되기도 했고 사용법도 깔끔하지 않아서 새로 작성하는 코드에서는 WebClient 를 위주로 사용했는 데 사실 WebClient 하나를 사용하자고 spring-boot-starter-webflux 의존성을 넣는 것이 영 찝찝했다. (논블로킹으로 하는 것도 아니면서) 이런 와중 WebClient 의 세련된 API 와 비슷한 방식으로 사용할 수 있는 RestClient 가 나온 것은 매우 반가운 소식이 아닐 수 없다. 현재는 Spring..
-
헤드 퍼스트 디자인 패턴 - 3장 객체 꾸미기 - 데코레이터 패턴도서 2023. 7. 27. 21:26
3. 객체 꾸미기 - 데코레이터 패턴 커피 가격 시스템으로 알아보자 추상 클래스 Beverage 를 만들고 모든 음료가 이를 상속하도록 구현했다 하지만 이는 고객의 커스텀 주문으로 인해 레시피가 바뀌고 그에 따라 가격이 변동되는 부분을 개별 클래스로 만들어 처리해야 하기 때문에 각 사례에 맞는 수 많은 클래스들이 필요했다 만약 인스턴스 변수를 추가한 상속으로 관리해보려고 한다면? 이렇게 5개의 클래스로 끝낼 수 있다고 생각했다 과연 성공적인 구현 방법일까? OCP Open-Closed Principle 클래스는 확장에서는 열려 있어야 하지만 변경에는 닫혀 있어야 한다 기존 코드를 건드리지 않고 확장으로 새로운 행동을 추가하는 것을 목표로 한다 새로운 기능을 추가할 때 유연하고 잘 적응하는 디자인을 만들 ..
-
헤드 퍼스트 디자인 패턴 - 2장 객체들에게 연락 돌리기 - 옵저버 패턴도서 2023. 7. 18. 23:15
가상 모니터링 애플리케이션으로 알아보기 기상 스테이션(기상 정보 수집 물리 장비) WeatherData 객체 디스플레이 장비 3가지 요소로 구성 기상 스테이션과 WeatherData 객체는 제공받는 상황에서 객체와 디스플레이 통합, 디스플레이 표시를 어떻게 구현해야할까? WeatherData 클래스 가상 모니터링 애플리케이션으로 알아보기 기상 스테이션(기상 정보 수집 물리 장비) WeatherData 객체 디스플레이 장비 3가지 요소로 구성 기상 스테이션과 WeatherData 객체는 제공받는 상황에서 객체와 디스플레이 통합, 디스플레이 표시를 어떻게 구현해야할까? WeatherData 클래스 온도, 습도, 기압 값을 리턴하는 메소드를 가짐 이런 기상 관측 값이 생신될 때마다 measurementsCha..
-
헤드 퍼스트 디자인 패턴 - 1장 디자인 패턴의 세계로 떠나기도서 2023. 7. 16. 21:54
디자인 패턴의 세계로 떠나기 Duck 을 상속하여 여러 종류의 오리를 만들었다 날기 기능을 추가하고 싶어서 Duck 클래스에 fly() 메소드를 추가한다면? 날지 않는 오리(장난감 오리)도 날게 되어 버린다. 상속을 활용한다면 규격이 바뀔 때마다 서브 클래스의 메소드를 상황에 따라 오버라이드해야 한다. 상속대신 인터페이스를 구현하는 것으로 바꾼다면 이런 문제는 해결할 수 있다(Flyable, Quackable) 하지만 코드 재사용이 안된다는 점에서 코드 관리에 문제가 발생할 수 있다 디자인 원칙 1 애플리케이션에서 달라지는 부분을 찾아 달라지지 않는 부분과 분리한다 즉 바뀌는 부분은 따로 뽑아 캡슐화를 하여 바뀌지 않는 부분에 영향을 미치지 않고 고치거나 확장할 수 있게 한다 오리의 경우 나는 행동 꽥꽥..
-
나에게 필요한 클린 코드DEV 2022. 3. 9. 22:57
서론 클린 코드를 읽어봐야지 생각만 하다가 시간이 생긴 김에 처음으로 일독한 후 많은 내용을 모두 다 기억하고 적용하면 좋겠지만 지금 내가 코드를 작성할 때 중점을 두고 고민해볼 내용을 정리해보았다. 이름 정하기 지금도 클래스, 메소드, 변수 등의 이름을 지을 때 조금 길어지더라고 한눈에 보고 확인할 수 있는 이름을 정하려고 노력하고 있지만 서로 너무 비슷하거나 혼동되는 이름을 정하지 않도록 좀 더 고려해야 할 것 같다. 이름을 잘 정하고 싶은데 막상 이름이 잘 생각나지 않는 난제는 참 어렵다.. 함수에 대하여 함수는 하나의 일만! 하나의 함수에서 많은 일을 하게 되면 작성할 때는 잘 알지만 조금만 시간이 흐른 뒤에 보게 된다면 도대체 뭘 하고 싶은 건지 모르게 된다. 따라서 함수는 하나의 일만 해야 하..
-
Spring, Kotlin - InterceptorSpring 2021. 11. 25. 23:52
특정 Request 에 특정 기능을 적용하려는 경우에 Interceptor 를 사용할 수 있습니다. Request 를 가로채서(intercept) 실제 처리 이전, 이후의 작업을 추가할 수 있습니다. Method 설명 preHandle 실제 처리 부분 이전 작업 postHandle 실제 처리 부분 이후 작업 afterCompletion 전체 요청이 완료된 후 작업 Request 의 Log 를 찍어주는 Interceptor 를 생성하고 테스트를 통해 확인해보겠습니다. Spring Boot 2.6.0, Kotlin 1.6 버전을 사용하였습니다. class LogInterceptor : HandlerInterceptor { companion object { val log = LoggerFactory.getLo..
-
ZooKeeper 와 Spring Cloud ZooKeeperDEV 2021. 9. 16. 22:53
회사에서 사용하는 기술 중 ZooKeeper 가 무엇인지 궁금하여 공부하면서 정리했습니다. 부족한 부분은 댓글로 남겨주세요. ZooKeeper 란? ZooKeeper는 분산 애플리케이션을 위한 분산 오픈 소스 조정 서비스입니다. 주키퍼는 파일 시스템과 비슷한 namespace 를 제공합니다. 파일 시스템처럼 / 부터 시작하며 주키퍼의 네임스페이스에 있는 모든 노드는 경로로 식별됩니다. 실행 docker compose 를 이용하여 zookeeper 를 실행합니다 version: '3.1' services: zoo1: image: zookeeper restart: always ports: - "2181:2181" 실행이 완료되면 docker exec -it {CONTAINER ID} bin/z..
-
프로그래머스 [위클리 7주차] - 입실 퇴실알고리즘 문제 풀이 2021. 9. 14. 14:35
import java.util.Arrays; import java.util.HashMap; /** * https://programmers.co.kr/learn/courses/30/lessons/86048 * 2021-09-14 */ public class Weekly7 { public int[] solution(int[] enter, int[] leave) { /* 뒤에 들어온 사람보다 늦게 나가면 무조건 만난다. and 1, 2, 3 들어오고 3, 1, 2 로 나갈 때 2 가 1 보다 늦게 들어오고 늦게 나가지만 순서상 3이 나갈 때 까지 나갈 수 없기 떄문에 만날 수 밖에 없다. 따라서 나보다 늦게 들어온 사람이 나보다 먼저 나갈 때 그 사이에 들어온 사람은 만난다 */ // 사람 번호 to inde..