만쥬의 개발일기
[Go] - golang 에러처리에 대한 고민과 opaque 에러로 똑똑하게 처리하기

프로그램은 여러 가지 원인으로 인해서 의도하지 않은 방향으로 동작하거나, 종료될 수 있습니다. 따라서 어떤 언어를 선택하든간에 로깅과 에러핸들링, 테스팅은 가장 기본적이며 가장 먼저 체화해야 한다고 생각합니다. 다양한 언어에서 오류/예외를 처리할 때 Opaque(불투명) error handling을 채택하곤 합니다. 그렇다면 golang에서는 왜 Opaque error handling을 선택해야 하며, Opaque erro handling이란 무엇인가 알아보겠습니다. Opaque Type (불투명한 타입) 불투명한 반환 타입이 있는 함수 또는 메서드는 반환값의 타입 정보를 가립니다. 함수의 반환 타입으로 구체적인 타입을 제공하는 대신에 반환값은 지원되는 프로토콜 측면에서 설명됩니다. 반환값의 기본 타입이..

article thumbnail
[Spring / trouble Shooting] - java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver

Spring Boot와 mysql 연동 중 다음 에러가 발생했다. 해결방법 1(실패): implementation 'mysql:mysql-connector-java' → implementation 'mysql:mysql-connector-j' 해결방법 2(실패): connenctor.jar 파일 설치 후 프로젝트에 추가 원인 알고보니 원인은 config를 정의할때 뒤에 공백이 하나 들어가있었던 것….. 진짜 바보같은 이유지만 항상 조심하자 찾아준 동기 왈 : "IDE가 친절하게 노란색으로 표시까지 해주잖아" 할말하않 ..

[Python] - 파이썬 log 라이브러리 rich 사용법과 logging의 중복 로그 현상

이번에는 python의 로깅을 자세히 파고들어봤다. 지난번 tqdm에 이어서 파이썬 로깅 라이브러리인 rich를 실제 프로젝트에 적용해보았다. 우선 가상환경에 라이브러리를 설치한다. pip install rich 다음 명령어로 설치 여부를 확인해 줄 수 있다. python -m rich 로깅 포맷 logging 모듈을 사용할 때에는 로깅 메시지의 포맷을 커스터마이징 할 수 있다. 사용 가능한 어트리뷰트는 공식 문서에 자세히 나와있다. ex) "%(asctime)s - %(levelname)s — %(funcName)s:%(lineno)d — %(message)s" # 위 포매팅 설정 결과는 아래와 같다. # 2021-07-01 12:29:53,182 - INFO - :1 - hello world 로깅 핸..

article thumbnail
[Python] - Selenium과 Chrome Driver log 숨기기

Chrome Driver를 쓰면 의도치 않아도 로그를 남길때 INFO 레벨에서 드라이버를 사용하는 로그가 남는다. 이게 한두번이면 모르지만, 크롤링을 여러사이트에서 하게 될경우 상당히 거슬리고 가독성이 안좋다. 따라서 다음 코드를 driver 설정 전에 추가해주면, 이 log를 숨길 수 있다. os.environ['WDM_LOG'] = '0' Selenium은 option을 설정할때 다음 코드를 추가해준다. options.add_argument('--log-level=3') options.add_argument('--disable-loging') reference https://stackoverflow.com/questions/70698508/how-to-stop-selenium-from-printing..

article thumbnail
[Go] - Golang으로 사용자 작성 패키지 import 하는 방법

토이 프로젝트를 만들더라도, 파일 계층은 여러개로 나뉠 수 밖에 없는데, 사용자가 만든 파일을 import 하는 것은 당연히 필요한 일이다. golang에서 사용자 패키지를 import하는 방법을 배워보자. 폴더 계층 main 파일과 같은 계층에 폴더를 생성하고, 그 하위에 import하고자 하는 파일을 생성한다. ex) module ├─ main.go │ ├─ ioView │ └─ ioView.go 패키지와 메서드 작성 해당 파일(ioView.go)의 최상단에 package 이름을 적어준다. 주의사항: 패키지는 반드시 소문자로 작성되어야 한다. (파일명과 폴더 명은 상관없다.) + 내보내고자 하는 함수(export)는 반드시 대문자로 시작해야한다. ex) import하는 패키지에 작성된 함수라도, 소문..

article thumbnail
[Java] - log4j2를 이용한 로깅 설정

최근 가장 많이 하는 생각이 어떻게 해야 로그와 예외 처리를 잘 할 수 있을까에 대한 고민이다. 자바에는 여러 로깅 라이브러리가 있는데, 그 중에서 오늘은 log4j2를 사용해 로깅 설정을 해보자. log4j2는 다음 표에서 알 수 있듯이 Multi Thread 환경에서 비동기 로거의 경우 다른 로킹 프레임워크보다 많은 처리량과 짧은 대기 시간을 제공한다. 마침 멀티쓰레딩 프로그램에 사용할 예정이기에, 아주 적합하다고 볼 수 있다. 개발환경 Plain java java17 wsl2 - ubuntu18.04 의존성 추가 먼저 최신 log4j2에 대한 의존성을 build.gradle에 추가해준다. dependencies{ . . implementation 'org.apache.logging.log4j:log..

article thumbnail
[Puppeteer / Trouble Shooting] puppeteer가 좀비 프로세스를 종료하지 않는 문제

puppeteer로 만든 프로그램을 돌리는 중, chromium 브라우저가 종료되지 않는 문제가 발생했다. 다음 명령어로 chromium 창이 몇개 떠 있는지 확인해보자. pgrep chromium | wc -l 949개?! 엄청난 메모리 손실을 유발하고 있었다. 지금은 겨우 버티고 있을지 몰라도, 언제 서버가 다운될 지 모르는 상황이다. ps -ef로 확인을 해보니, 좀비 프로세스로 끝도 없이 남은 모습.. 분명히 browser.close()를 해준 것 같은데 왜 좀비로 남은 걸까? 그 이유는 try catch문으로 감싸서 브라우저를 닫아줄 때, try문에만 browser.close를 적어주었기 때문이다. 이미 브라우저를 켠 상태에서 error가 날 경우 프로그램이 종료되며 해당 브라우저는 좀비 프로세..

[Javascript] - Winston을 사용하여 node.js에서 로깅하는 법

자바스크립트 코드 작성시 로거의 필요성을 느껴 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..