728x90
728x90
jvm heap memory java -XX:InitialRAMPercentage=60.0 -XX:MaxRAMPercentage=60.0 -jar myapp.jar java heapsize 를 할당받은 메모리의 60% 로 설정 java -XX:+PrintFlagsFinal -version | grep HeapSize 리눅스에서 자바 max 힙사이즈 크기 확인 자바 애플리케이션의 최대 힙 메모리 크기를 퍼센테이지로 가져갈 때 몇 퍼센트를 가져가는 것이 좋은지 여부는 애플리케이션의 특성에 따라 다릅니다. 일반적으로 애플리케이션이 사용하는 메모리 크기의 60~70%를 최대 힙 메모리 크기로 설정하는 것이 좋다. 이렇게 하면 애플리케이션이 충분한 메모리를 사용할 수 있으면서도 메모리 부족 오류가 발생할 가능성을..
HikariPoolConnection Error DB CPU 사용률이 95% 까지 치솟자 애플리케이션에서 HikariPoolConnetion Error 발생 => Connectio Timeout 발생 ⇒ AWS Target Group 에 연결된 애플리케이션이 Kill(exit signal) Signal 을 통해 종료 ⇒ ALB 단에서 502 를 응답
아파치 카프카는 ActiveMQ, Artemis, RabbitMQ 와 유사한 메시지 브로커이다. 그러나 카프카는 특유의 아키텍쳐를 가지고 있다. 카프카는 높은 확장성을 제공하는 클러스터로 실행되도록 설계되었다. 그리고 클러스터의 모든 카프카 인스턴스에 걸쳐 토픽을 파티션으로 분할하여 메시지를 관리한다. RabbitMQ 가 거래소와 큐를 사용해서 메시지를 처리하는 반면, 카프카는 토픽만 사용한다. 카프카의 토픽은 클러스터의 모든 브로커에 걸쳐 복제된다. 클러스터의 각 노드는 하나 이상의 토픽에대한 리더로 동작하며, 토픽 데이터를 관리하고 클러스터의 다른 노드로 데이터를 복제한다. 각 토픽은여러 개의 파티션으로 분할될 수 있다. 이 경우 클러스터의 각 노드는 한 토픽의 하나 이상의 파티션(토픽 전체가 아니다..
유레카란? 마이크로서비스가 서로를 찾을 때 사용되는 서비스 레지스트리의 이름이다. 유레카는 마이크로서비스 애플리케이션에 있는 모든 서비스의 중앙 집중 레지스트리로 작동한다. 유레카 자체도 마이크로서비스로 생각할 수 있고 더 큰 애플리케이션에서 서로 다른 서비스들이 서로를 찾는 데 도움을 주는 것이 목적이다. 유레카의 역할 때문에 서비스를 등록하는 유레카 서비스 레지스트리를 가장 먼저 설정하는 것이 좋다. 서비스 인스턴스가 시작될 때 해당 서비스는 자신의 이름을 유레카에 등록한다. 동일한 이름을 갖는 서비스 인스턴스가 여러개 생성될 수 있다. 어느 순간 다른 서비스가 some-service 를 사용해야 할 때 이 때 some-service 의 특정 호스트 이름과 포트 정보를 other-service 코드에..
JDBC 트랜잭션 Spring 에서 JDBC 를 사용하여 트랜잭션을 사용할 수 있다. // 데이터베이스를 사용하기 위해 연결을 진행 Connection connection = dataSource.getConnection(); try (connection) { // Java 에서 데이터베이스 트랜잭션을 시작하는 유일한 방법이다. // setAutoCommit(false) 는 트랜잭션을 직접 관리할 수 있게 해준다. 개발자가 원할 대 커밋 또는 롤백이 가능 connection.setAutoCommit(false); // 쿼리문 작성 connection.commit(); // 커밋을 진행 } catch (SQLException e) { connection.rollback(); // 예외가 발생한 경우 롤백 }..
Entity 클래스를 생성할 때, 주의할 것은 무분별한 setter 메소드 생성이다. 자바빈 규약을 생각하시면서 getter/setter를 무작정 생성하는데, 이렇게 되면 해당 클래스의 인스턴스 값들이 언제 어디서 변해야하는지 코드상으로 명확히 구분할수가 없어, 차후 기능변경시 정말 복잡해진다.해당 필드의 값 변경이 필요하면 명확히 그 목적과 의도를 나타낼 수 있는 메소드를 추가해야만 합니다. 예를들어 주문 취소 메소드를 만든다고 가정하면 아래 코드로 비교해보시면 될 것 같다. 잘못된 사용 public class Order{ public void setStatus(boolean status){ this.status = status } } public void 주문서비스의_취소메소드 (){ order.se..