본문 바로가기

분류 전체보기53

[아이템 8] finalizer와 cleaner 사용을 피하라 자바는 finalizer와 cleaner라는 두 개의 소멸자가 있다. 결론은 두 소멸자를 사용할 시 오작동, 낮은 성능, 이식성 문제의 원인이 될 수 있어 사용을 지양해야 한다. finalizer와 cleaner는 즉시 수행된다는 보장이 없다. finalizer를 달아두면 그 인스턴스의 자원 회수가 제멋대로 지연될 수 있다. finalizer 스레드는 다른 애플리케이션 스레드보다 우선순위가 낮아서 실행될 기회를 얻지 못할 수 있다. cleaner는 자신을 수행할 스레드를 제어할 수 있지만 즉각 수행되라는 보장이 없다. 수행 시점 뿐만 아니라 수행 여부조차 보장받지 못한다. System.gc, System.runFinalization 메서드가 실행 가능성을 높여줄 수 있으나, 보장은 못한다. finaliz.. 2022. 1. 1.
[Delivery] Redis에 session 저장하기 Delivery 프로젝트는 대용량 트래픽을 대비해 Scale-out 환경으로 구축했습니다. Scale-out 환경엔 session 로그인 구현 시 아래 그림과 같은 문제가 생길 수 있는데 로그인을 했음에도 세션이 저장되어 있지 않은 서버가 요청을 받는다면 다시 로그인을 해야 하는 문제입니다. 저는 session storage 방식으로 해결했습니다. 세션을 관리하는 Redis 서버를 별도로 두어 어느 애플리케이션 서버에 요청이 들어와도 로그인은 한 번만 하면 됩니다. UserLoginService @Service @AllArgsConstructor public class UserLoginService { private final HttpSession httpSession; private final User.. 2021. 12. 31.
[Delivery] 반복되는 로직을 AOP로 분리하기 Delivery 프로젝트에 주문 관련 로직을 담당하는 OrderService 클래스가 있습니다. OrderService에서 제공하는 대표적인 메서드는 사용자에 따라 아래의 내용처럼 기능을 제공합니다. User (소비자) - 주문 요청 Owner (식당 주인) - 주문 받기 - 주문 거절 Rider (배달원) - 주문 배달 받기 - 주문 배달 완료 각각의 메서드는 Order Entity의 상태 값을 변경시켜줍니다. ORDER_REQUEST, ORDER_APPROVAL, IN_DELIVERY, DELIVERY_COMPLETE, ORDER_CANCEL, ORDER_REFUSED 저는 실시간으로 상태 값을 보여주고 또한 알림의 목적으로 Firestore를 도입하기로 했습니다. 아래 코드는 Firestore에 O.. 2021. 12. 31.
[Delivery] 프로젝트 구조 Delivery 프로젝트는 대용량 서비스를 대비한 구조로 만들어 보려고 노력을 했다. 하지만 웹 개발자를 위한 대규모 서비스를 지탱하는 기술이란 책을 최근에 읽어보면서 Delivery 구조는 부족함이 많았다. 그래도 일단 지금까지 구성한 내용을 설명하고 부족한 것 같은 부분도 써보겠다. ▶Application Server Spring boot + tomcat 환경으로 scale out 방식으로 분산처리가 가능하도록 했다. ▶Nginx 웹서버로 로드밸런싱을 위해 도입했다. 아파치도 고려를 해보았으나 아파치는 요청마다 자식 프로세스를 생성함으로 리소스를 많이 먹는다. Nginx는 싱글 스레드로 event driven 방식으로 저렴한 비용으로 비동기 작업을 수행한다. ▶Jenkins Jenkins로 CI/CD.. 2021. 12. 28.
javax.net.ssl.SSLException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty ubuntu환경인 서버에 spring boot 프로젝트를 배포하고 실행하는 작업에서 아래와 같은 에러가 발생했다. javax.net.ssl.SSLException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 구글링을 통해 원인을 찾아보니 ubuntu에 open-jdk를 설치를 하면 $JAVA_HOME/lib/security 경로에 cacerts 파일이 없기 때문이란 것을 알게 되었다. 정확한 해결책을 못 찾았지만 나의 로컬에 있는 cacerts 파일을 ubuntu 서버에 그대로 복사하여 해결은 하였다. cacerts이 무엇인지 왜 필요한지 알아봐야.. 2021. 12. 23.
[아이템 7] 다 쓴 객체 참조를 해제하라 자바는 GC가 메모리 관리를 해주긴 하지만 개발자가 메모리에 신경을 쓰지 않아도 된다는 것은 아니다. 책에서 나온 사례를 간략하게 설명해보겠다. ▶ scope에 따라 GC의 대상이 안될 수 있다. 메서드와 같은 중괄호 { } 안에 만들어진 객체 같은 경우 괄호를 빠져나오게 되면 GC 대상이 되어 수거된다. 하지만 인스턴스 변수나 전역 변수는 GC 대상이 안되기 때문에 사용하지 않는 객체라면 null을 선언해주어 GC 대상이 되도록 만들어야 메모리 낭비가 안된다. ▶ 캐시 데이터를 빠르게 접근하기 위해 캐시라는 임시 저장 공간을 사용한다. 하지만 객체를 캐시에 넣고 나서 그대로 나누면 메모리를 낭비한다. WeakHashMap 사용 : key 값이 null 되면 key, value 값을 제거한다. Sched.. 2021. 12. 23.
728x90