본문 바로가기

분류 전체보기

(67)
ZGC 왜 좋은데 최근 STW가 너무길어져 JDK11의 G1GC 환경을 JDK21의 ZGC로 업그레이드 하는 작업을 진행했다.적용 후 모니터링을 해보니 기존과 확실히 다른양상을 보이고 안정적인 그래프가 보여 ZGC가 왜 좋은지 정리한다. 동작 원리G1 GC Young GCGC Root (STW) : stack, static 변수에서 생존 객체를 식별Evacuation (STW) : eden -> survivor -> old 로 객체를 이동후처리 (STW) : 객체 포인터 갱신 Mixed GC (Old + Young) - IHOP 설정된 값 (기본 45%)를 초과하면 시작하며, old와 young 영역을 모두 처리한다.Initial Mark : GC Root가 직접 마킹 (STW)Concurrent Mark : 힙 영역 ..
Hibernate QueryPlanCache 메모리 이슈 비상 비상 문제가 발생했다대량의 내역을 집계하기 위한 처리를 하던중, 서버의 메모리가 급격하게 찼고 몇번의 재시작을 해야하는 이슈가 발생했다. 원인 : Query Plan Cacheheap dump 파일을 생성해 분석해보니 몇몇의 메모리가 가득찬 친구들이 보였다.org.hibernate.internal.SessionFactoryImplorg.hibernate.engine.query.spi.QueryPlanCacheorg.hibernate.engine.query.spi.HQLQueryPlanBoundedConcurrentHashMap...참조하고있는 것들을 모두 보면 공통적으로 나오는것 QueryPlanCache 이었다.뭐하는 놈인데에엑JPQL/HQL을 실행할땐 생각보다 비용이 크다.HQL 문자열-> 렉싱..
JPA 비관적 락 (Pessimistic Lock) 락의 필요성금융이나 결제쪽 개발을 할때 동시성 제어가 필요한 경우가 있다.물론 synchronized 처리를 떠올리지만, 쓰레드 레벨로 막는 것이고 실제로는 여러대의 서버를 두기때문에 부족하다.이 경우 DB(RDBMS, Redis 등) 레벨의 락이 필요한데, 이럴때 사용할 수 있는 JPA 락 방법이 있다. 락의 종류흔히 2가지로 나뉜다.낙관적 락 (Optimistic Lock) : 이름은 락이지만, 락을 걸진않고 수정 시 업데이트 되었는가를 감지비관적 락 (Pessimistic Lock) : 다른 트랜잭션의 데이터 (조회, 수정) 혹은 수정만 막는다.낙관적 락은 JPA에서 @Version 이라는 어노테이션을 통해 사용하고수정 시 버전이 다른 경우, ObjectOptimisticLockingFailureE..
Spring Controller 중복 호출되는 이슈 최근에 로그를 보다가 Controller에 특정 페이지를 리턴하는 메소드에서 중복 호출이 되고있는 것을 발견했다.사실 이전에도 발견되어 인지하고있었지만, 따닥 이라던가 새로고침을 빠박 할 수도 있기 때문에 넘어갔는데생각보다 너무 자주 로그가 찍혀있고 시간 간격도 매우 짧기 때문에 원인을 찾아야겠다는 생각이 들었다. 상황은 이렇다.@Controllerpublic class TestController { ... @GetMapping("index") //아니면 "/" public String index(Model model, HttpServletRequest request, args...) { ... return "/~~~/index" } ...}해당 ..
[Linux] Ubuntu 사용자 계정 생성 및 접속 설정 먼저 root로 접속해준다 sudo su root 권한으로 하지않으면 아래와 같은 에러문구가 출력된다 adduser: Only root may add a user or group to the system. 계정 생성 adduser 계정아이디 해당 커맨드를 입력하면 아래와같이 추가 입력 부분이 출력된다. New password: Retype new password: passwd: password updated successfully Changing the user information for rkdvnfms5 Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []:..
Spring JPA @Id 복합키 설정 Spring JPA를 사용하면서 기본키가 2개 이상 컬럼으로 구성된 테이블을 Entity로 지정할 때가 있다. 예시로 아래와 같은 Work 테이블과 WorkE 엔티티 클래스가 있다고 가정했을때 @Table(name = "Work") public class WorkE { @Id @Column(name = "name") private String name; @Id @Column(name = "type") private String type; .... } 이름(name)과 구분(type) 두개의 컬럼을 기본키로 사용하고 있는 경우, 위처럼 두 필드에 모두 @Id 어노테이션을 사용하면 된다고 생각할 수 있다. 하지만 추가해야할 것이 있는데, 아래처럼 엔티티에 @IdClass 어노테이션을 추가해줘야한다. @IdC..
Maven Jar 빌드 외부 dependency 추가 Spring Webflux로 오브젝트 스토리지 솔루션 프로젝트를 만들면서 빌드 도구는 maven, 배포는 내장 netty 서버 쓸거라서 처음으로 jar로 배포하게 되었다. 한심하다고 느낀건 아직도 나는 maven을 제대로 모른다는 것이다. 시간이 될때 maven에 대해서 공부하고 정리를 해볼 필요를 느꼈다. 문제 pom.xml에 외부 jar파일을 추가해서 사용하고 있었는데 로컬에서 실행하면 잘 돌아가지만 jar로 배포해서 실행하면 NoClassDefFoundError가 발생하는 특정 경우가 있었다. 원인 pom에서 추가한 외부 jar dependency는 적용이 잘 되었지만, 빌드 후 생성된 jar 파일을 풀어서 BOOT-INF/lib를 보면 해당 외부 라이브러리가 없었기 때문에 필요한 클래스가 정의되지..
iptables 80포트 설정 iptables를 오랜만에 쓰면 자꾸 잊어버린다. 방화벽 목록 확인 iptables --list 출력 이미지에 표시된 reject-with icmp-host-porhibited를 볼 수 있는데, 이 REJECT라인 밑으로 적용된 설정은 적용되지 않는다. 예를 들기 전, 80포트를 추가하자 iptables -A INPUT -p tcp --dport 80 -j ACCEPT 이 후에 다시 리스트를 출력하면 REJECT 설정 밑으로 80포트가 설정된 것을 볼 수 있다. 이렇게 되면 80포트 INPUT이 되지 않는다는 것이다. 이 경우에는 REJECT를 INPUT에서 지워줬다가 다시 추가하면 된다. iptables -D INPUT -j REJECT --reject-with icmp-host-prohibited i..