도입최근에 이펙티브 자바 책을 읽고있다. 책의 객체 생성과 파괴 파트에서 try-with-resources 관련 내용을 볼 수 있었다. 저자는 try-finally 보다는 try-with-resources를 사용을 권장한다.InputStream, OutputStream, java.sql.Connection 등 close 메서드를 직접 닫아줘야하는 자원에 대해서 이러한 내용을 제시하였다.저자는 다양한 자원들이 finalizer, cleaner를 안전망으로 활용하고 있으나, 이에 대한 문제점을 제기한다.닫아야할 자원이 여러 개인 경우 try-finally는 중첩으로 인해 지저분한 구조를 갖게 된다.finally 블록에서도 예외가 발생할 수 있으므로 finally 블록에서 발생한 예외가 다른 예외를 삼켜버려 ..
사내에서 래핑?한 라이브러리 중에 Async Cache와 관련된 내용들이 있는데 프로젝트에서 잘 다루고자 학습하게 되었다. 특히 그중에서도 Spring Caffeine Async Cache에 대한 내용을 다룬다. Async Cache? 다양한 로컬 캐시가 있음에도 그 중에서도 비동기인 Spring Caffeine AsyncCache를 다루는 이유는 Spring Webflux 때문이다. Spring Webflux 기반 프로젝트의 경우, 일반적인 동기 캐시를 사용하는 경우 블로킹으로 인한 문제가 발생할 수 있다. 따라서 Webflux 프로젝트에서 로컬 캐시를 사용하고자 할 때, Spring Caffeine Async Cache는 고려할 수 있는 좋은 Cache 라이브러리라고 생각된다. 비동기 캐싱을 지원하는..
여태껏 진행했던 프로젝트들과 회사에서 진행하는 프로젝트의 가장 큰 차이점이 있다면 안정성, 가독성이라고 생각한다. 단순 기능 구현에 급급하지 않았는 지, 내부 코드를 확인해보기는 했는 지.. 부족한 부분이 많이 있었음을 깨닫고 있는 것 같다. 그 중에서 코드 리뷰를 많이 받았던 부분에 대해서 정리해보고자 한다. 개인적인 의견(코드 스타일)이다. 누군가는 가독성이 좋다고 느낄 수 있지만, 또 다른 누군가는 가독성이 오히려 좋지 않다고 느낄 수 있다. 그래서 정답이라기보다 하나의 생각을 정리한 글으로 인지했으면 좋겠다. 바로 Null , Empty에 관한 내용이다. Null, Empty 체크를 하지 않았거나, 스스로 봤을 때도 가독성이 많이 떨어지는 코드를 많이 작성했다. 이 외에도 Default Confi..
프로젝트를 진행하면서 테스트 코드에 대한 필요성 대해 더욱 자각하게 되었다. 그 이유로는 git Action을 통해 클라우드에 서버가 배포되기 때문에 Github에 푸쉬한 이 후에 배포 환경에서 예상치 못한 에러가 발생하는 것을 경험하게 되었다. 각 서버(혹은 컨테이너) 간 상관관계가 일부 존재하기 때문에 서버 간 정보를 주고 받는 경우를 테스트 하기 위한 방법이 필요하였다. 따라서, 테스트 코드를 상세히 작성하여 테스트 코드만으로 "1) 버그와 결함을 조기에 발견, 2) 변경 사항에 대한 동작 확인, 3) CI/CD에서 발생하는 예기치 않은 문제 해결" 이라는 장점을 얻고자 단위 테스트와 통합 테스트에 대해 정리하고자 한다. 단위 테스트(Unit Test) 단위 테스트란 애플리케이션의 작은 단위(일반적..
개요 현재 WebRTC 프로젝트에서 사용자의 시스템 접속 상태관리를 위해 상태관리 서버를 사용하고 있다. 또한, 현재 마이크로서비스 간 통신을 위해 TCP connection pool을 통해 연결해놓고 있다. 여기서 개선방향을 찾고자 다른 방법에 관하여 공부해보고자 한다. 먼저 gRPC에 앞서 RPC에 대해 이해해야 한다. 기초 지식 RPC란? RPC는 Remote Procedure Call이다. 이는 한국어로 해석하면 원격 프로시져 호출, 즉, 범위 외부에 있는 대상을 호출하는 것이다. 따라서, 마이크로서비스에 적용하기에 국한 시켜 이해하자면, 네트워크로 연결된 마이크로서비스의 함수를 호출할 수 있는 통신 기술이다. 장점으로 개발자는 인터페이스를 통해 원격 함수를 호출하므로, 다른 마이크로서비스의 내부..
에러(Error)는 컴파일 시 문법적인 오류와 런타임 시 널 포인터 참조와 같은 오류로 프로세스에 심각한 문제를 야기시켜 프로세스를 종료시킬 수 있다. 예외(Exception)은 컴퓨터 시스템의 정상적으로 실행되는 도중 예상하지 못했던 예외적인 조건으로 수행 중인 프로그램이 영향 받는 것이다. 오류와 달리 예외는 try-catch 블록을 사용하는 등 Java 코드에서 적절한 예외 처리를 통해 정상적으로 응답하고, 적절한 오류 메시지를 제공하며, 복구할 수 있다. 그렇다면, Java의 에러는 심각하고, 복구할 수 없는 반면 예외는 복구할 수 있다. Java에서 예외와 에러는 어떨까? Throwable 위 그림을 통해 확인할 수 있다시피, Throwable 클래스는 에러와 예외를 나타내는 모든 클래스의 상위..
개발 중에 고민했던 내용 중 데이터 변환 과정에서 다형성을 적용한 경험을 정리하였다. 상황 현재 개발 중인 WebRTC 프로젝트는 MSA 형태로 구성되어있으며 실시간 데이터를 관리해야한다. 이 때 실시간 데이터를 관리하기 위한 방법으로 Redis(실시간 데이터 저장소)와 연동되는 것은 State(상태관리) 서버 뿐이며, TCP를 통해 Signaling 서버, Chat 서버로 부터 실시간 데이터를 받는다. 문제가 발생한 것은 Signaling 서버 및 Chat 서버로 부터 데이터를 받는 부분이었다. 우리 주제는 WebRTC 기반 스터디 이기 때문에 사용자가 방에 입장해서 버튼을 누르면 공부시간을 기록할 수 있다. 그렇기 때문에 Signaling 서버에서 유저ID , 버튼 누른 시각 을 보낸다. Chat 서..
WebRTC 프로젝트에서 마이크로서비스 아키텍처 중 채팅 서비스 구현 중 문제가 발생했다. Kafka에 데이터를 넣었으나 직렬화 관련 에러였다. 문제 원인 파악 먼저, 아래 에러 로그에서 직렬화 중 Deserializer에서 문제가 발생했다. 카프카에 객체 클래스를 전송했고 org.springframework.kafka.support.serializer.JsonDeserializer 를 사용하여 역직렬화함을 확인했다. java.lang.IllegalStateException: This error handler cannot process 'SerializationException's directly; please consider configuring an 'ErrorHandlingDeserializer' ..
스프링 프로젝트를 생성하던 중 Jar, War에 대한 설정이 궁금해져서 공부해보게 되었다. 대부분의 경우 Jar를 선택하는 데 이 둘은 어떤 차이점이 있을까? Jar, War Jar(Java Archive), War(Web Application Archive)는 둘 다 java jar tool을 사용하여 압축된 아카이브 파일이다. 애플리케이션을 간단히 배포하고 어느 환경에서나 구동시킬 수 있도록 소스들이나 관련 파일들을 하나로 패키징한 것이다. .jar 파일 Java ARchive path 정보를 유지한 상태로 압축한다. 자바 클래스 파일과, 각 클래스들이 사용하는 관련 리소스파일 및 메타데이터을 압축한 파일이다. 실제로는 ZIP 파일 포맷으로 압축된 파일이다. 그러나 .jar파일은 압축을 따로 해제해주..
API란? Application Programming Interface 이다. API란 정의된 프로토콜을 기반으로 상호 작용을 할 수 있도록 일종의 약속된 시스템이다. 즉, 라이브러리처럼 실제로 구현되어 사용할 수 있는 것이 아니라, 프로그램 구현에 있어 어떤 형태의 약속이라고 볼 수 있다. 그렇다면 RESTful API란 REST(Representation State Transfer) 이다. 네트워크 통신, 특히 웹(http)통신에 있어서 어떤 자원에 대한 CRUD(Create, Read, Update, Delete)요청을 상호 작용하기 위한 인터페이스이다. Get,Post 등의 메서드를 사용하여 요청을 보내며 이런 REST를 준수하며 구현된 API를 RESTful API라고 한다. RESTful AP..