스프링 부트 모니터링(Prometheus + Loki + Grafana, Docker)
·
Back-end/Spring
들어가기AWS EC2와 같은 클라우드 서버를 이용해서 배포를 한 경우 로그를 확인하려면 번거롭게 SSH 접속을 해서 확인해야 했다. 이를 개선하기 위해 모니터링을 도입하기로 결정했다. Prometheus프로메테우스는 시계열 기반의 오픈소스 모니터링 시스템으로, 애플리케이션에서 발생하는 메트릭 데이터를 수집, 저장, 분석, 알림까지 전반적으로 처리해주는 도구이다. 주로 애플리케이션의 성능, 상태, 트래픽 등을 수치로 수집해 시각화하거나 문제가 발생했을 때 경고를 보내주는 데 사용된다. Loki로키는 Grafana Labs에서 만든 로그 수집 및 검색 시스템으로, 프로메테우스처럼 시계열 기반의 데이터를 기반으로 로그를 저장하지만, 숫자 기반의 메트릭을 저장하는 프로메테우스와 달리 로키는 문자열 기반의 로그 ..
Spring JDBC Bulk Insert 알아보기
·
Back-end/Spring
들어가기 프로젝트 진행 중 20만 건 이상의 데이터 Row를 데이터베이스에 Insert해야 했다. JPA saveAll() 방식을 사용했을 때 저장 속도가 느려서 성능 향상이 필요하다고 느꼈고 JDBC Bulk Insert로 저장 속도를 향상시킬 수 있었다. JPA saveAll() 아래의 코드는 JPA saveAll() 코드로, while 문 안의 두 번째 라인에서 엔티티를 하나씩 save하도록 구현되어 있다. @Transactionalpublic List saveAll(Iterable entities) { Assert.notNull(entities, "Entities must not be null"); List result = new ArrayList(); Iterator var4 ..
@RequestBody, @ResponseBody에 대해서
·
Back-end/Spring
들어가기 Spring에서 비동기 통신을 위해 주로 Controller에서 사용하는 어노테이션 @RequestBody, @ResponseBody에 대해서 알아보자. @RequestBody클라이언트가 서버로 보내는 JSON 형식의 HTTP Body를 자바 객체로 변환하는 역할을 한다.@Getter@NoArgsConstructor@AllArgsConstructorpublic class AddArticleRequest { private String title; private String content;}@RestController@RequiredArgsConstructorpublic class BlogApiController { private final BlogService blogService..
HTTP Status Code, ResponseEntity에 대해서
·
Back-end/Spring
들어가기 HTTP 응답을 제어할 수 있는 ResponseEntity 객체에 대해서 알아보자. ResponseEntity ResponseEntity는 HttpEntity를 상속하여 구현되어 있다. HttpEntity의 구현 필드를 살펴보자.public class HttpEntity { public static final HttpEntity EMPTY = new HttpEntity(); private final HttpHeaders headers; @Nullable private final T body; ...}  HttpEntity는 HttpHeader를 설정할 수 있는 필드와, 제네릭 타입으로 Body 필드를 가지고 있다. 다음으로 이를 상속하는 ResponseE..
@NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor에 대해서
·
Back-end/Spring
들어가기 Lombok 라이브러리의 어노테이션 @AllArgsConstructor, @NoArgsConstructor, @RequiredArgsConstructor에 대해서 알아보자. @NoArgsConstructor @NoArgsConstructor는 파라미터가 없는 디폴트 생성자를 자동으로 만들어주는 어노테이션이다.@NoArgsConstructorpublic class Dog { private String name; private int age; // Omitted Getter & Setter}public class Dog { private String name; private int age; // Omitted Getter & Setter public D..