구닥다리TV

구닥다리TV

Republic of Korea
JAVA

[Kotlin] Kotlin으로 Java/Kotlin 모두 사용 가능한 유틸성 라이브러리 만들기

유틸성 라이브러리의 필요성 프로젝트를 진행하다 보면, 공통적으로 필요한 기능들이 정말 많다는 것을 알 수 있다. 그리고 이런 공통의 기능들을 사용하기 좋게 기능들을 모아둔 것을 '유틸성 라이브러리'라고 한다. 아마도 국내에서 많은 개발자들이 쓸법한 유틸성 라이브러리라 하면 스프링이나 전자정부 프레임워크에서 제공하는 유틸성 라이브러리일 것이다. 물론 대부분의 경우 이런 라이브러리를
6 min read
Docker

[Docker] iptables vX.X.X (legacy): can't initialize iptables table `nat': Table does not exist (do you need to insmod?)

Docker... 또 너야? 리눅스를 업데이트 하고 재부팅한 어느 날, 갑자기 도커의 컨테이너와 연결이 되지 않는 문제가 발생했다. 알고보니, 모종의 이유로 컨테이너가 자꾸만 다운되고 있었던 것이다. 컨테이너 로그를 살펴보니 다음과 같은 로그가 도배되고 있었다... iptables v1.8.3 (legacy): can't initialize iptables table `nat': Table does not exist
3 min read
Kotlin

[Kotlin] lateinit 변수의 값이 세팅 되었는지 확인하기

Kotlin과 늦은 초기화 전략 kotlin 언어에서는 변수에 null이 들어오지 않았으면 하지만, 값을 초기에 설정할 수 없는 경우를 대비해 두 가지 '늦은 초기화' 방식을 제공한다. 그 중 하나는 lateinit, 그리고 나머지 하나는 lazy이다. 여기서는 lateinit 변수에 값이 세팅 되었는지 확인하는 방법에 대해 다루어보도록 하겠다. 이 변수, 값이 들어오긴 했나?
3 min read
Nodejs

Ghost 블로그 5.60.0 -> 5.80.0으로 업데이트 하면서 생겼던 문제들

꽤 오랜만에 업데이트 하면서 생긴 몇 가지 문제에 대한 해결 방법이 도움이 될까 싶어서 이 글을 남겨본다. 필자가 블로그를 업데이트 하면서 생긴 문제는 크게 두 가지 인데 하나는 config.production.json의 mail.options.service 값의 오류였고, 나머지 하나는 데이터베이스 커넥션 에러였다. 1. mail.options.service의 잘못된 value 오류 보통 국내에서
1 min read
JAVA

[JAVA] Bouncy Castle로 LEA/ARIA 블록 암호화 하기

C/C++ 예제는 많은데... 예전부터 국산 암호화 기술에 관심은 많았는데, 이상할 정도로 Java나 Kotlin으로 작성된 예제는 그렇게 많지 않았다. 심지어 KISA 공식 홈페이지에서도 LEA 블록 암호화 알고리즘 정도나 암호화 모드별로 샘플 소스코드가 제공되고 있고, ARIA는 엔진 코드만 제공되어 있을 정도로 Java 진영에서는 찬밥 취급이다. 아마도 국내에서는 해당 알고리즘들이 DRM 위주로만
8 min read
JAVA

[JAVA] ResourceBundle로 다국어 메시지 처리

ResourceBundle이란? 프로그램을 만들 때, 다국어 처리(이하 i18n)를 지원해야하는 경우가 있다. i18n은 동일한 내용을 가진 메시지를 지역에 따라 서로 다른 언어로 메시지를 처리하는 것을 말한다. 예를 들어, 한국에서는 안녕하세요!라고 보여주는 메시지를 영어를 쓰는 국가에서는 Hello!로 보여줄 수 있도록 하는 것이 바로 i18n다. Java에서는 ResourceBundle이라는 클래스를 사용해  i18n을
4 min read
Docker

[Docker] Portainer 설치하기

☝️Portainer를 설치하려면 반드시 Docker가 설치되어 있어야 한다. 다만 이 글에서는 Docker 설치 방법에 대해서는 다루지 않는다. Docker 설치가 필요하다면, 다음의 글을 보고 설치하기 바란다. [Linux] Docker 간편하게 설치하기 (retrotv.dev) Portainer란? Portainer란 Docker를 웹으로 관리할 수 있도록 하는 UI 도구다. 현재 실행되고 있는 Docker의 컨테이너, 이미지, 볼륨, 네트워크 등을 웹으로
2 min read
Docker

[Linux] Docker 간편하게 설치하기

Docker는 원래 운영체제, CPU 아키텍처(X86, ARM 등...) 별로 설치하는 방법이 조금씩 상이하다. 그래서 공식 홈페이지에서는 운영체제, CPU 아키텍처 별로 설치하는 방법을 설명해주고 있다. 하지만 본인들도 이게 귀찮은 것을 아는 것인지 자동으로 운영체제와 CPU 아키텍처를 감지해서 설치해 주는 설치 스크립트를 배포하고 있다. 아래의 명령어는 대부분의 운영체제에서 Docker를 간편하게 설치할 수
1 min read
JAVA

[JAVA] 현명하게 예외처리하기

예외 처리의 중요성 대부분의 언어에는 예외 처리(혹은 오류 처리)라는 것이 존재한다. 예외 처리는 프로그래밍 시, 아주 중요한 작업이다. 시스템의 문제 여부를 빠르게 확인하고 어떠한 문제인지 파악하는데 도움을 받을 수 있기 때문이다. 또한 어플리케이션이 다시 정상적으로 동작할 수 있도록 도움을 줄 수도 있다. 예외의 종류 JVM 계열 언어(Java,
11 min read
JAVA

IntelliJ properties 한글 깨짐 해결하기

인텔리제이에서 properties 파일을 수정 하려다 아래와 같이 한글이 유니코드 형식으로 보이는 것을 확인했다. 이클립스에서는 위와 같은 현상을 해결하기 위해 플러그인을 설치해줘야 한다. 하지만 인텔리제이는 설정에서 인코딩 설정만 바꿔주면 해결된다. 설정 > 에디터 > 파일 인코딩으로 이동한 다음, 프로퍼티 파일에 대한 디폴트 인코딩을 UTF-8로 변경해주고 명확한 Native에서 ASCII로의 변환 옵션을 활성화
1 min read
JAVA

[JAVA] 자바 null 박살내기

개발자들의 영원한 적, null의 탄생 개발자들에게 프로그래밍 하면서 자신을 가장 괴롭히는 것을 몇 가지 꼽아보라 한다면, 보통 그 리스트에 null처리는 반드시 들어가게 될 것이다. 그만큼 null은 개발자를 괴롭히는 적이며, 그들은 이 null을 처리하기 위해 끝이 없어보이는 힘겨운 싸움을 하게 된다. null은 컴퓨터 과학자인 토니 호어(Tony Hoare)가 알골 W(
10 min read
Nodejs

NVM 설치하고 Node.js 버전 관리하기

Node.js 버전 관리의 필요성 Node.js의 버전 업은 상당히 빠른 편이다. Node.js는 짝수 버전이 장기 지원 버전이긴 하지만 그 출시 간격이 상당히 짧은 편으로, 보통 1년에 2개의 장기 지원 버전이 출시 된다. 안정성이나 라이브러리 호환성 관점에서 생각하면 장기 지원 버전이 이렇게 자주 출시하는 것은 마냥 좋은 일은 아니다.
3 min read
Computer

PuTTY 설정 백업하기

사정 상 PuTTY를 사용할 일이 참 많은데, 컴퓨터를 포맷 할 때마다 구글에서 PuTTY 백업 하는 글을 찾기 귀찮아서 여기에 남기려고 한다... 레지스트리 편집기 열기 실행 창을 열어서 regedit을 연다. SimonTatham 내보내기 컴퓨터\HKEY_CURRENT_USER\Software으로 이동한 뒤, SimonTatham 우클릭 > 내보내기 클릭. 내보내기에 성공하면 다음과 같은 reg 파일이 생성된다.
1 min read
JAVA

@Transactional 옵션으로 (rollbackFor = Exception.class)를 왜 쓸까?

☝️여기서 설명하는 @Transactional은 org.springframework.transaction.annotation.Transactional이다. javax, jakarta 패키지에 기본 포함된 @Transactional의 경우 동일한 기능을 하기는 하나, 일부 옵션의 이름이 상이할 수 있으니 유의 바란다. 참고로 javax, jakarta에서 rollbackFor와 동일한 옵션은 rollbackOn이다. 그런 글들 자주 봤다 @Transactional 관련 글을 보면 예제로 @Transactional(rollbackFor=Exception.class)를 적어두거나, 선임이
8 min read
JAVA

스프링 부트 3에 Swagger 적용하기

REST API 문서 도입기 최근 REST API 문서 생성을 위해 Swagger 도입을 고려하고 있었다. 그래서 구글링을 통해 Swagger 적용 방법에 대한 글을 찾아보고 그대로 적용해 보았다. 그런데 이게 웬걸? Swagger를 적용하고 접속해본 곳에는 오직 Whitelabel Error Page 만이 반겨줄 뿐이었다. 스택 오버플로우를 찾아도 스프링 부트 버전을 2.5.X으로 낮추라는
5 min read
Spring

Mustache CSRF 적용하기

더 이상의 CSRF disable은 NO! 보통 스프링 시큐리티 설명을 위한 글들을 보면 Config 코드에 다음과 같이 작성된 코드를 많이 볼 수 있다. http.csrf().disable().build(); // 혹은 http.csrf(CsrfConfigurer::disable) 코드만 봐도 알겠지만, 이는 HttpSecurty에서 CSRF 보안을 사용하지 않도록 설정하는 것이다. 물론 예제나 테스트를 위한 프로젝트에서는 꺼도 상관없겠지만, 실제로
2 min read
Programming

변수나 함수에 붙는 언더바(_)는 뭘까?

요상한 언더바 다른 사람들이 작성한 코드나 라이브러리를 보면, 변수나 함수의 이름 앞뒤에 _가 붙어 있는 걸 간혹가다 볼 수 있다. 대부분의 언어에서 _는 $와 함께 변수/함수명에 허용되는 유이한 특수문자다. 따라서 일반적으로 코딩 컨벤션에서 허용하는 경우가 아닌 이상(EX. 스네이크 기법) 해당 특수문자들이 변수명이나 함수명에 사용되는 경우는 흔하지 않다. 즉,
6 min read
JAVA

[JAVA] BufferedReader readLine() 메소드가 동작 안할 때

선행 요약 BufferedReader를 통해 읽어들일 문자열 끝에 개행 문자(\n)가 붙었는지 확인하자. 개행 문자가 존재하는지 확인해야 하는 이유는, BufferedReader가 개행 문자를 통해 경계를 구분하기 때문이다. 개행 문자가 존재하지 않으면 여전히 데이터를 수신하고 있는것으로 판단하기 때문에, readLine() 메소드를 사용해도 데이터를 읽어올 수 없다. 소켓 통신이 굴린 거대한 스노우 볼 최근,
4 min read
JAVA

Java에서 Random 클래스를 사용하지 말자

SonarLint에서 수상쩍은 경고가 떴다 SonarLint 혹은 SonarQube를 쓰는 경우, Random 객체를 사용했을 때 다음과 같은 이슈를 본 사람이 있을지도 모른다. "Random" objects should be reused 위의 경고는 Random rand = new Random(); 같이 코드를 작성했을 때 발생한다. 이런 경고가 발생하는 이유는 난수를 발생할 때 사용할 시드를 그때마다 생성시키는 비효율성
5 min read
Algorithm

[보안] 단방향 암호화 / 양방향 암호화란?

소프트웨어를 개발할 때, 외부 유출에 민감한 데이터를 다룬다면 좋든 싫든 데이터 암호화를 고려할 수 밖에 없다. 이 때 일반적으로 패스워드는 단방향 암호화 알고리즘을, 그 외의 개인을 식별할 수 있는 정보나 원본 데이터로 복구가 필요한 데이터는 양방향 암호화 알고리즘을 통해 암호화 한다. 암호화면 암호화지 또 뭔 단방향, 양방향으로 나뉜다는 것일까? 단방향,
14 min read
Git

[Git] error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 해결하기

http 프로토콜을 이용해 git push를 할 때, 다음과 같은 에러가 발생했다. error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 send-pack: unexpected disconnect while reading sideband packet fatal: the remote end hung up unexpectedly Everything up-to-date 위와 같은 에러가 발생하는 이유는 기본적으로 git push를 할 때,
2 min read
JAVA

다시, 인터페이스 (feat. 객체지향 언어에 인터페이스가 존재하는 이유)

지난번에 "객체지향 언어에 인터페이스가 존재하는 이유" 라는 글을 쓴 적이 있었다. 하지만 다시 읽어보니 지나치게 난잡 하다는 느낌을 지울수가 없어서, 이 기회에 다시 글을 적어보게 되었다. 객체지향 언어에 인터페이스가 존재하는 이유코드의 결합도가 높으면 생기는 문제 어떤 개발자가 고객으로부터 계정의 패스워드를 암호화 해서 저장을 해야하니, 패스워드를 암호화 하는 기능을
20 min read
Linux

쉘 스크립트 root 권한으로만 실행되게 하기

리눅스를 관리하다 보면 작업의 자동화를 위해 쉘 스크립트를 쓰는 경우가 아주 많다. 그런데 간혹가다 root 권한으로 쉘 스크립트를 실행할 필요가 있는 경우가 생길 수 있다. 일반적으로 root 권한을 요구하는 쉘 스크립트를 일반 계정으로 실행 할 경우 진행하다 권한 문제로 알아서 막히게 된다. 하지만 이런 식으로 예외처리에 기대는것 보다는, 스크립트 진입점에서
1 min read
Linux

sudo 명령어 패스워드 없이 사용하기

💡sudo 명령어 사용 시, 패스워드를 요구하지 않도록 하는 것은 보안상 권장되지 않는다. 따라서 key를 이용한 ssh 접속이 가능한 환경 및 물리적인 서버에 혼자 접근이 가능한 환경 등, 기본적인 보안이 보장되는 경우에만 적용하도록 하자. 리눅스 운영체제는 대부분 sudo 명령어를 사용할 때, 일정 시간마다 해당 사용자의 패스워드를 요구한다. "이미 패스워드를 입력하고
4 min read