본문 바로가기

전체 글

[Spring] Reactive Web (3) Callback Hell 개선 | 코드 future.addCallback(data -> { ListenableFuture future2 = asyncRestTemplate.getForEntity( Service2Uri, String.class, data.getBody() ); future2.addCallback(data2 -> { ListenableFuture future3 = myServiceV2.work(data.getBody()); future3.addCallback( data3 -> dr.setResult(data3), ex -> dr.setErrorResult(ex) ); }, ex -> { dr.setErrorResult(ex); }); }, ex -> { dr.setErrorResult(ex.. 더보기
[Error] WebClient MacOS 에러 애플리케이션을 처음 구동한 후, WebClient를 사용한 로직이 실행되면 다음과 같은 에러가 발생한다. Unable to load io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider, fallback to system defaults. This may result in incorrect DNS resolutions on MacOS. Check whether you have a dependency on 'io.netty:netty-resolver-dns-native-macos' 해당 에러는 한 번 발생한 후 그 다음 요청에는 발생하지 않고, 로직 실행에도 문제를 주는 것은 아니다. 하지만, 애플리케이션을 구동할 때마다 해당 에러가 보이는 것은.. 더보기
[Refactoring] 정리 (2) 코딩으로 학습하는 리팩토링 - 인프런 | 강의 리팩토링은 소프트웨어 엔지니어가 갖춰야 할 기본적인 소양 중 하나입니다. 이 강의는 인텔리J와 자바를 사용하여 보다 실용적인 방법으로 다양한 코드의 냄새와 리팩토링 기술을 설명하고 직 www.inflearn.com | 인프런 - 백기선님의 코딩으로 학습하는 리팩토링 강의를 수강하며 정리한 글입니다. 조건부 로직 간소화 ** 복잡한 조건문을 다루는 기술 조건문 분해하기 -> if 문 안의 복잡한 로직은 메서드 추출하기 적용 조건식 통합하기 중첩 조건문을 보호 구문으로 바꾸기 -> return으로 아래 로직이 실행되지 않게 만들기 Before int result; if (isVip()) { result = vipPoint(); } else if (isPlat().. 더보기
[Refactoring] 정리 (1) 코딩으로 학습하는 리팩토링 - 인프런 | 강의 리팩토링은 소프트웨어 엔지니어가 갖춰야 할 기본적인 소양 중 하나입니다. 이 강의는 인텔리J와 자바를 사용하여 보다 실용적인 방법으로 다양한 코드의 냄새와 리팩토링 기술을 설명하고 직 www.inflearn.com | 인프런 - 백기선님의 코딩으로 학습하는 리팩토링 강의를 수강하며 정리한 글입니다. 가장 기본이 되는 리팩토링 기술 함수 추출하기 함수 인라인하기 변수 추출하기 변수 인라인하기 함수 선언 변경하기 -> 함수 이름, 매개 변수, 리턴 타입... 변경 변수 캡슐화하기 변수 이름 바꾸기 매개변수 객체 만들기 여러 함수를 클래스로 묶기 여러 함수를 변환 함수로 묶기 단계 쪼개기 캡슐화 * 모듈에서 외부 시스템으로 공개하지 않아도 되는 데이터를 숨기는 기.. 더보기
[Refactoring] 24. 주석 코딩으로 학습하는 리팩토링 - 인프런 | 강의 리팩토링은 소프트웨어 엔지니어가 갖춰야 할 기본적인 소양 중 하나입니다. 이 강의는 인텔리J와 자바를 사용하여 보다 실용적인 방법으로 다양한 코드의 냄새와 리팩토링 기술을 설명하고 직 www.inflearn.com | 인프런 - 백기선님의 코딩으로 학습하는 리팩토링 강의를 수강하며 정리한 글입니다. 주석 코드 리팩토링 시, 불필요한 주석을 줄일 수 있다. 관련 리팩토링 함수 추출하기 -> 설명이 필요한 부분을 별도의 메서드로 뺴낸다. 함수 선언부 변경하기 -> 함수 이름을 재정의할 수 있다. 어서션 추가하기 -> 시스템적으로 어떤 필요한 규칙이 있는 경우 Refactoring 1. 어서션 추가하기 Assertion을 사용하면 코드로 표현하지 않은 조건들을 명.. 더보기
[Spring] Reactive Web (2) Spring 비동기 기술 Client 요청의 응답이 될 떄까지 커넥션을 물고 있는다. 클라이언트로부터 요청을 받은 후 실제 작업은 Work Thread Poll에 위임하고 Servlet Thread는 Pool에 반환 한 후, 다음 요청이 들어올 경우 해당 Servlet Thread를 바로 사용할 수 있도록 한다. 한계점 하나의 요청에 대한 작업을 수행하면서, 외부의 서비스들을 호출하는 작업이 많이 있는 경우, Servlet Thread는 바로 사용이 가능하지만, Work Thread는 I/O 작업으로 인한 Block 상태이기 때문에 결국 대기한다. * Thread Pool Hell Pool안에 있는 Thread에 대한 사용 요청이 급격하게 증가해 추가적인 요청이 들어올 때, 사용 가능한 스레드가 없어 사.. 더보기
[Refactoring] 23. 상속 포기하기 코딩으로 학습하는 리팩토링 - 인프런 | 강의 리팩토링은 소프트웨어 엔지니어가 갖춰야 할 기본적인 소양 중 하나입니다. 이 강의는 인텔리J와 자바를 사용하여 보다 실용적인 방법으로 다양한 코드의 냄새와 리팩토링 기술을 설명하고 직 www.inflearn.com | 인프런 - 백기선님의 코딩으로 학습하는 리팩토링 강의를 수강하며 정리한 글입니다. 상속 포기하기 서브 클래스가 슈퍼 클래스에서 제공하는 메서드나 데이터를 잘 활용하지 않는다면, 해당 상속 구조는 문제가 있다는 의미이다. 관련 리팩토링 메서드와 필드 내려주기 -> 슈퍼 클래스에 공동으로 사용하는 기능만 남길 수 있다. 슈퍼 클래스 또는 서브 클래스 위임으로 교체하기 -> 서브 클래스가 슈퍼 클래스의 기능을 재사용하고 싶지만 인터페이스를 따르고 싶.. 더보기
[Refactoring] 22. 데이터 클래스 코딩으로 학습하는 리팩토링 - 인프런 | 강의 리팩토링은 소프트웨어 엔지니어가 갖춰야 할 기본적인 소양 중 하나입니다. 이 강의는 인텔리J와 자바를 사용하여 보다 실용적인 방법으로 다양한 코드의 냄새와 리팩토링 기술을 설명하고 직 www.inflearn.com | 인프런 - 백기선님의 코딩으로 학습하는 리팩토링 강의를 수강하며 정리한 글입니다. 데이터 클래스 데이터 클래스 -> 필드 또는 필드에 대한 게터, 세터만 존재하는 클래스 코드가 적절한 위치에 존재하지 않기 때문에 이러한 냄새가 생길 수 있다. 예외적으로 단계 조개기에서 중간 데이터를 표현하는데 사용할 레코드는 불변 객체로 데이터를 전달하는 용도로 사용할 수 있다. 관련 리팩토링 레코드 캡슐화하기 -> public 필드를 가지고 있다면, 게터, .. 더보기