go 기반 오픈소스인 Argo CD에 기여하기 위해 PR을 날리자, 깃허브 액션 lint 테스트에서 다음과 같이 실패하게 되었습니다.에러 코드를 보니 golangci-lint와 gofumpt로 go의 컨벤션을 지키고 있는듯해서, 로컬에서도 이를 설치해 테스트를 완료한 뒤 커밋을 해야겠다는 생각이 들었습니다.golangci란?golangci-lint 는 Go 프로젝트에서 여러 lint 도구들을 통합하여 동시에 실행할 수 있는 다중 Linter입니다.주요 Linter들:gofmt: 코드 포매팅을 확인합니다.go vet: 코드에서 잠재적인 오류를 찾아냅니다.staticcheck: 코드에서 비효율적인 부분을 검사합니다.errcheck: 오류를 확인하지 않은 부분을 찾아냅니다.ineffassign: 비효율적으로 ..
Argo CD에 기여를 할 때 PR을 작성하고 나면, 테스트에서 다음과 같이 DCO라는 녀석이 실패하는 경우가 있습니다.DCO란?Developer Certificate of Origin의 줄임말로, 자신의 코드에 대해 인증하는 방법들을 의미합니다.signed-off commit은 DCO의 일종으로 sign off로 자신의 코드에 이름과 이메일을 남겨 서명하는 것입니다.서명하는 방법은 간단합니다. 커밋 메세지를 쓸 때 다음과 같이 -s 옵션을 주면 됩니다.git commit -s -m "my message"그러나 개인 레포에서 개발하다가 오픈 소스를 개발할 때, 별 생각 없이 intellj 혹은 Goland 같은 IDE를 이용해 커밋을 하게 된다면 -s 옵션이 생략되어 DCO 인증에서 막히게 됩니다.하지만..
프로그램은 여러 가지 원인으로 인해서 의도하지 않은 방향으로 동작하거나, 종료될 수 있습니다. 따라서 어떤 언어를 선택하든간에 로깅과 에러핸들링, 테스팅은 가장 기본적이며 가장 먼저 체화해야 한다고 생각합니다. 다양한 언어에서 오류/예외를 처리할 때 Opaque(불투명) error handling을 채택하곤 합니다. 그렇다면 golang에서는 왜 Opaque error handling을 선택해야 하며, Opaque erro handling이란 무엇인가 알아보겠습니다. Opaque Type (불투명한 타입) 불투명한 반환 타입이 있는 함수 또는 메서드는 반환값의 타입 정보를 가립니다. 함수의 반환 타입으로 구체적인 타입을 제공하는 대신에 반환값은 지원되는 프로토콜 측면에서 설명됩니다. 반환값의 기본 타입이..
Spring Boot와 mysql 연동 중 다음 에러가 발생했다. 해결방법 1(실패): implementation 'mysql:mysql-connector-java' → implementation 'mysql:mysql-connector-j' 해결방법 2(실패): connenctor.jar 파일 설치 후 프로젝트에 추가 원인 알고보니 원인은 config를 정의할때 뒤에 공백이 하나 들어가있었던 것….. 진짜 바보같은 이유지만 항상 조심하자 찾아준 동기 왈 : "IDE가 친절하게 노란색으로 표시까지 해주잖아" 할말하않 ..
이번에는 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 로깅 핸..
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..
토이 프로젝트를 만들더라도, 파일 계층은 여러개로 나뉠 수 밖에 없는데, 사용자가 만든 파일을 import 하는 것은 당연히 필요한 일이다. golang에서 사용자 패키지를 import하는 방법을 배워보자. 폴더 계층 main 파일과 같은 계층에 폴더를 생성하고, 그 하위에 import하고자 하는 파일을 생성한다. ex) module ├─ main.go │ ├─ ioView │ └─ ioView.go 패키지와 메서드 작성 해당 파일(ioView.go)의 최상단에 package 이름을 적어준다. 주의사항: 패키지는 반드시 소문자로 작성되어야 한다. (파일명과 폴더 명은 상관없다.) + 내보내고자 하는 함수(export)는 반드시 대문자로 시작해야한다. ex) import하는 패키지에 작성된 함수라도, 소문..
최근 가장 많이 하는 생각이 어떻게 해야 로그와 예외 처리를 잘 할 수 있을까에 대한 고민이다. 자바에는 여러 로깅 라이브러리가 있는데, 그 중에서 오늘은 log4j2를 사용해 로깅 설정을 해보자. log4j2는 다음 표에서 알 수 있듯이 Multi Thread 환경에서 비동기 로거의 경우 다른 로킹 프레임워크보다 많은 처리량과 짧은 대기 시간을 제공한다. 마침 멀티쓰레딩 프로그램에 사용할 예정이기에, 아주 적합하다고 볼 수 있다. 개발환경 Plain java java17 wsl2 - ubuntu18.04 의존성 추가 먼저 최신 log4j2에 대한 의존성을 build.gradle에 추가해준다. dependencies{ . . implementation 'org.apache.logging.log4j:log..