
puppeteer로 만든 프로그램을 돌리는 중, chromium 브라우저가 종료되지 않는 문제가 발생했다. 다음 명령어로 chromium 창이 몇개 떠 있는지 확인해보자. pgrep chromium | wc -l 949개?! 엄청난 메모리 손실을 유발하고 있었다. 지금은 겨우 버티고 있을지 몰라도, 언제 서버가 다운될 지 모르는 상황이다. ps -ef로 확인을 해보니, 좀비 프로세스로 끝도 없이 남은 모습.. 분명히 browser.close()를 해준 것 같은데 왜 좀비로 남은 걸까? 그 이유는 try catch문으로 감싸서 브라우저를 닫아줄 때, try문에만 browser.close를 적어주었기 때문이다. 이미 브라우저를 켠 상태에서 error가 날 경우 프로그램이 종료되며 해당 브라우저는 좀비 프로세..
자바스크립트 코드 작성시 로거의 필요성을 느껴 Winston이라는 라이브러리를 사용해 로깅을 해보자. 모듈 설치 npm install winston --save npm install winston-daily-rotate-file --save npm install moment npm install app-root-path Logger.js 작성 const appRoot = require('app-root-path'); // root 경로를 가져오기 위해 사용 var winston = require('winston'); // log 파일 작성 require('winston-daily-rotate-file'); // log 파일을 일자별로 생성하기 위해 사용 const moment = require('mome..

설치 터미널에서 다음 명령어로 jest를 설치한다. npm install --save-dev jest 설정 package.json 에서 스크립트의 test를 jest로 수정해준다. 다음 예시처럼 폴더계층을 만들어준다. ├── package-lock.json ├── package.json ├── src │ ├── index.js │ └── tests │ └── test.js 테스트 작성 test.js에 테스트 코드를 짠다. describe('Jest 사용 예시', () => { test('숫자 0은 false이다', () => { expect(Boolean(0)).toBe(false); }); // 프리미티브 타입 검사의 경우 toEqual()을 사용해도 큰 문제는 없습니다. test('숫자 0은 fals..

Go를 쓸 일이 언제 오나 싶었는데, 마침 Golang으로 제작된 오픈소스를 쓸 일이 생겨 이 참에 사용해보았다. tar 파일 받기 https://go.dev/dl/ All releases - The Go Programming Language go.dev 먼저 Go 공식 홈페이지에서 리눅스용 Go를 다운받습니다. tar.gz는 tar 파일을 압축한 상태입니다. 따라서 압축 파일을 받은 뒤 다음 명령어로 압축을 풀어줍니다. tar -xvzf 아카이브파일.tar.gz Go 위치 설정 압축이 풀린 go 폴더가 생성되었다면, 원하는 위치로 위치를 옮겨 줍니다. 저는 다음 명령어를 통해 /usr/local 위치로 옮겨 주었습니다. sudo mv go /usr/local Go PATH 등록하기 저는 Zsh 셸을 사..

Tomcat Access Log란? 웹 서버의 로그 파일로서 클라이언트의 HTTP 요청 및 응답에 대한 정보를 기록하는 로그입니다. 이를 통해 애플리케이션의 동작 상태를 파악하고 문제를 해결하는 데 유용하게 사용됩니다. Tomcat Access Log 사용 목적 💡 가장 주요한 사용 목적은 HTTP 요청 및 응답 정보를 기록 애플리케이션의 동작 상태 파악 애플리케이션의 성능 분석 보안 이슈 파악 사용자 행동 분석 Access Log의 구성 요소 구성 요소의 종류 구성요소 약어 설명 Remote Host %a HTTP 요청을 보낸 클라이언트의 IP 주소 Timestamp {yyyy-mm-dd HH:mm:ss} HTTP 요청이 발생한 시간 Request Line %r HTTP 요청 메서드, URL 및 HTT..
gson은 json 파일의 내용을 읽어서 java 객체로 만들어주는 라이브러리다. implementation 'com.google.code.gson:gson:2.8.9' 위와 같이 build.gradle에 의존성을 추가하면 사용 가능하다. 그러나 해당 라이브러리를 참조하는 과정에서 오류가 생길 때가 있었다. intellij등의 IDE를 통해 자바 프로젝트를 실행하면 라이브러리를 잘 참조했으나, jar 파일로 만들어 실행하면 다음과 같은 에러가 뜨는 것이었다. Exception in thread "main" java.lang.NoClassDefFoundError: com/google/gson/Gson at Potatonet.PortScan.application.APICaller.getIpListWithPo..

Spring Boot로 외부 메인 서버에 서버를 띄웠을 때, 분명 서버도 잘 올라가 있고 내부망에서는 API 송수신이 되는데, 간혹 외부 접속은 아예 불가능 한 경우가 있었다. 그때의 해결 방법들을 모아보자. 다음 먼저 개발 환경은 다음과 같다. Spring Boot 버전 3 이상 Linux Ubuntu 20.04 스프링 설정에서 외부 접근 권한이 막혔을때 application.properties에 다음 내용을 추가한다. server.port=8080 server.address=0.0.0.0 server.port 설정은 내가 서버를 열 포트를 지정한다. (default는 8080) server.address=0.0.0.0 는 모든 IP에서의 접근을 허용한다. 스프링 부트의 port가 외부 접근이 막혔을 ..
해당 자료형을 java.util.Date 로 변경해주면 해결된다. reference https://coderanch.com/t/515027/databases/SerializationException-deserialize