본문 바로가기

전체 글106

[TIL]20230815 - 도커 오류 해결 [Ports are not available: exposing port TCP 0.0.0.0:3000 -> 0.0.0.0:0: listen tcp 0.0.0.0:3000: bind: An attempt was made to access a socket in a way forbidden by its access permissions.] 어제 도커에 그라파나와 프로메테우스를 설치하고 오늘 다시 켜보려하니 다음과 같은 에러 메시지와함께 켜지지 않았다. Error invoking remote method 'docker-start-container': Error: (HTTP code 500) server error - Ports are not available: exposing port TCP 0.0.0.0:3000 -> 0.0.0.0:0: listen tcp 0.0.0.0:3000: bind: An attempt was made to access a socket in a way forbidden by its access permissions. 에러 메세지에 대해 찾아보니 이미 사용하고 있는 포트여서 발생하는 현상이라는 글들이 있어 netst.. 2023. 8. 17.
[TIL]20230812 - Grafana와 Prometheus를 이용한 모니터링(2) 1. Actuator build.gradle 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'io.micrometer:micrometer-core' implementation 'io.micrometer:micrometer-registry-prometheus' spring actuator란 SpringBoot의 서브 프로젝트로 스프링부트 애플리케이션이 제공하는 여러가지 정보를 쉽게 모니터링할 수 있게 지원하는 라이브러리이다 SpringBoot애플리케이션에서 Actuator를 활성화 하면 애플리케이션을 모니터링하고 관리할 수 있는 엔드포인트에 접속이 가능해진다. 위와 같이 의존성을 추가하여.. 2023. 8. 16.
[TIL]20230812 - Grafana와 Prometheus를 이용한 모니터링(1) 1. Prometheus Prometheus는 SoundCloud에서 만든 메트릭 기반의 오픈소스 시스템 모니터링 시스템이다. 여기서 메트릭이란 수집하는 시계열 데이터를 말하며 프로메테우스의 메트릭은 "메트릭명{필드1=값, 필드2=값} 샘플링데이터"와 같이 수집된다. 예시로 요청시간, 데이터베이스 활성 연결 수, CPU사용량 프로메테우스가 메트릭을 수집하는 방법은 pulling 방식으로 프로메테우스가 주기적으로 exporter(모니터링 대상 시스템)로부터 pulling방식으로 메트릭을 수집한다. 일반적인 다른 모니터링 도구는 서버에 클라이언트를 설치하고 클라이언트가 메트릭 데이터를 수집해서 서버로 보내는 push방식으로 동작한다. 2. Grafana 그라파나는 프로메테우스를 비롯한 여러 데이터를 시각화해.. 2023. 8. 15.
[TIL]20230811 - CloudWatch 로그 남기기 프로젝트 진행시 로그확인이 필요할거 같아 로그를 저장하고 확인해볼 수 있게 하는 방법을 고민하게 되었다. 우리는 로컬에서는 개발을 주로 하게되고 배포환경에서 서비스를 운영하게 될것이므로 EC2환경에서도 로그확인이 필요했는데 CI/CD를 통해 자동으로 배포하다보니 백그라운드로 애플리케이션이 실행되어 로그 확인이 어려웠다. 때문에 로컬뿐 아니라 클라우드 환경에서도 로그를 확인할 수 있게 해야했다. 1. 로깅 vs System.out.println() 나는 기존에 시스템이 내가 의도한대로 잘 흘러가고 있는지 확인하고 싶을 때, 혹은 에러가 발생했을 때 어느 부분에서 에러가 발생했는지 확인하고 싶을 때 System.out.println()을 통해 콘솔창에 문자열을 출력해서 확인하곤 하였다. 하지만 System... 2023. 8. 15.
[TIL]20230810 - parallelStream() 도입 public void saveTradeList() { List stocks = stockRepository.findAll(); List trades = jsoupCrawling.getTrades(stocks); User user = userRepository.findById(1L).orElseThrow(()-> new IllegalArgumentException("id가 1인 유저가 존재하지 않습니다.")); long start = System.currentTimeMillis(); List buys = trades.stream().map((tradeDto -> new Buy(tradeDto.getQuantity(), tradeDto.getPrice(), tradeDto.getStock(), user))).. 2023. 8. 12.
[TIL]20230809 - JPA save()와 saveAll()의 차이 프로젝트를 진행하면서 초기 데이터를 위한 주식 데이터의 거래내역을 크롤링하여 저장하는 파트를 밭게 되었다. 우리가 목표로 하는 주식 종목의 수는 2000개이고 하루당 분별 거래내역 데이터는 10개씩 40페이지가 존재하여 하루치의 데이터만 80만건이 되었다. 이 과정에서 급하게 코드를 작성하다 보니 건별로 save()를 호출하여 DB에 저장하였고 이후 코드리뷰시간을 가질때 동료분들이 이부분을 발견해주어서 리팩토링 과정을 통해 saveAll()로 한번에 저장하도록 코드 리팩토링을 진행하였다. public void saveTradeList() { List stocks = stockRepository.findAll(); List trades = jsoupCrawling.getTrades(stocks); User.. 2023. 8. 11.