Spring (30) 썸네일형 리스트형 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" } ...}해당 .. 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를 보면 해당 외부 라이브러리가 없었기 때문에 필요한 클래스가 정의되지.. Spring Webflux Filter 적용 (Webfilter) Webflux를 사용해보면서 Interceptor를 적용해보고 싶었는데 기존 MVC 구조에서 사용하던 interceptor, 엄밀히 말하면 톰캣을 위해 사용하던 인터셉터는 사용할 수 없었다. 약간 찾아본 결과 Webfilter 사용을 많이 하는듯 보여서 적용해봤다. 적용은 매우 간단하다. Webfilter 인터페이스를 구현한 클래스를 하나 생성해서 @Component만 적용해주면 끝. 그래서 나는 Webfilter를 구현한 AclFilter라는 클래스를 생성했다. AclFilter import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Component; import org.. Spring Webflux Exception 전역 처리 (Functional Endpoints) webflux로 api 서버를 하나 개발하면서 에러 상황들을 전역으로 처리하고 싶었다. 스프링 mvc나 boot에서는 @ControllerAdvice나 @RestControllerAdvice를 사용하는데, webflux도 어노테이션 방식으로 @Controller를 사용한다면 동일하게 @ControllerAdvice를 사용할 수 있을것 같았다. 하지만 나는 request를 Functional Endpoints 방식으로 RouterFunction을 활용해 요청을 라우팅하기 때문에 다른 예제를 찾아보게 되었고, 그 과정에서 메서드를 까보진 않았지만 까보기전 추측한 생각을 정리하려 한다. 참고 : https://www.baeldung.com/spring-webflux-errors Handling Errors i.. 이전 1 2 3 4 다음