WebClient, Nested Class


카카오 로그인 기능을 담당하게 되어 약 일주일 동안 기능 구현과 함께 코드리뷰를 받았다.

WebClient에서 요청을 날릴 때 exchange VS retrieve

retrieve는 바로 response body를 처리 할 수 있고
exchange는 상태값, 헤더 등 client response 자체를 전달해줘서 세밀하게 제어할 수 있는 차이가 있다.

그런데 exchange는 성공, exception, 예상치 못한 응담이라도 response를 처리하지 않으면 메모리 누수가 발생한다.
retrieve와 달리 4XX, 5XX와 같은 응답에 대한 자동 처리가 없어 상태 코드를 확인해야 하는데 그 과정에서 개발자가 실수하게 되면 메모리릭이 발생하기 때문에 retrieve 사용을 권장한다고 한다.

이번 프로젝트에서 kakao의 일부 api만 사용할 것이고 거의 대부분 문제가 되는 응답은 상태가 4XX이라 onStatus() 에서 에러를 처리가 가능해 retrieve를 사용했다.




Nested Class

이펙티브 자바, 토비의 스프링 등을 읽으면서 inner class는 static으로 구현하라는 것을 많이 봤다.

inner class로 인해 메모리릭이 발생하는 경우는 (비동기) outer class와 inner class의 스레드가 돌아가는중에
outer class의 작업이 끝나면 inner class의 outer class 객체 참조로 인해 메모리가 해제되지 않아 생긴다~

static class는 외부 클래스의 객체 생성 없이 내부 클래스의 객체를 생성할 수 있고
암시적인 outer class 객체 참조를 하지 않는다~

위와 같은 이유로 static으로 구현하라는 것이었는데
단지 response로만 사용하는 경우에는 고려하지 않아도 될 문제였다.
그래도 inner class에 대해 다시 한 번 공부할 수 있는 계기가 되었다.

이참에 다시 정리해보자.

  1. Nested Class
    클래스 안에 클래스라는 의미로 이를 사용하는 이유는
    외부 클래스의 멤버들을 쉽게 접근할 수 있고 외부에는 불필요한 클래스 파일을 감춰서(캡슐화) 코드의 복잡성을 줄일 수 있다는 점이다.


  1. 종류