본문 바로가기
반응형

분류 전체보기316

Docker 리소스 일괄 삭제(docker system prune)-미사용 Docker 리소스 모두 삭제 Docker를 사용하다보면 한번씩 사용되고 미사용되는 여러 Container, Image, Network, Volume 등 리소스들이 계속 쌓이게 되고, 이는 호스트 환경의 성능에 안좋은 영향을 미치게 된다. 개별적인 리소스들을 정리하는 방법들이 있지만 docker system prune 명령을 사용하여 일괄적으로 삭제가 가능하다. 먼저 개별적인 리소스 삭제 명령을 정리해보자 docker container prune 미사용 컨테이너 일괄 삭제 docker image prune 미사용 이미지 일괄 삭제 docker volume prune 미사용 볼륨 일괄 삭제 docker network prune 미사용 네트워크 일괄 삭제 docker system prune 명령은 위의 명령들을 모두 실행한다고 볼 수 있.. 2023. 5. 29.
PostgreSQL 문자열 합치기 PostgreSQL에서 문자열을 합치는 방법을 알아보자. PostgreSQL은 기본적으로 Oracle과 문법이 많이 비슷하다. 1. '||' 사용 // 문법 STR1 || STR2 || ... // 예시 'Hello' || 'World' // HelloWorld 한가지 주의할 부분은 합치려는 문자열 중에 NULL이 있는 경우 NULL이 리턴된다는 것이다. 'Hello' || NULL || 'World' // NULL 2. CONCAT 사용 // 문법 CONCAT(STR1, STR2,...) // 예시 CONCAT('Hello', 'World') // HelloWorld CONCAT을 사용할 때는 NULL이 포함이 되어도 NULL을 무시한다. 'Hello' || NULL || 'World' // Hello.. 2023. 5. 29.
PostgreSQL Upsert(Update&Insert) 사용 PostgreSQL를 사용해서 upsert를 실행하는 문법을 알아보자. upsert는 Insert 시 pk가 중복 등으로 Insert 하려는 값이 존재하는 경우 해당 row를 update하는 쿼리이다. 먼저 문법을 보면 아래와 같다. INSERT INTO // insert문 ON CONFLICT // 충돌 체크 DO UPDATE // update문 문법을 기준으로 쿼리를 작성해보면 아래와 같은 예시가 된다. USER테이블에 insert문을 실행하는데 'id' 컬럼에 해당하는 row가 없으면 insert, 이미 존재하면 age에 +1을 한 값으로 update한다. INSERT INTO USER (id, name , age) VALUES('user1', 'Hong', 1) ON CONFLICT (id) DO.. 2023. 5. 29.
SpringBoot cannot deserialize from Object value 에러 SpringBoot로 백엔드를 구현하고 테스트 중에 아래와 같은 에러가 발생하는 경우가 있다. cannot deserialize from object value (no delegate- or property-based creator) API 요청 시 Request Body의 JSON 데이터를 DTO(Java Object)로 변환을 해주는 이때 DTO의 기본 생성자를 찾을 수 없어서 나는 에러이다. 일반적으로 Java 클래스를 생성하면 기본 생성자는 아무런 설정없이 사용할 수 있다. public class UserDto{ private String userId; .... } .... UserDto userDto = new UserDto(); // 기본생성자 사용 하지만 가끔 Lombok을 활용하여 아래와 .. 2023. 5. 27.
Gradle 멀티모듈에서 특정(one) 모듈(subproject)만 빌드 Gradle에서 멀티모듈 환경으로 개발을 하는 경우 기본적으로 빌드 시 매번 전체 모듈이 빌드가 된다. 하지만 상황에 따라서 특정 모듈(subproject)만 빌드를 수행하고 싶을 때가 있다. 이럴때 매번 전체 모듈을 빌드하더라도 원하는 결과물은 생성되겠지만 불필요하게 빌드시간이 증가하게 된다. 아래와 같이 간단한 Gradle 명령으로 특정 모듈만 빌드가 가능하다. Parent(Root) - A모듈 - B모듈 - C모듈 위와 같이 Parent에 A, B, C 프로젝트가 자식 모듈(subproject)로 구성된 멀티 모듈 환경이 있다고 가정하자. 먼저 일반적인 Gradle 명령은 다음과 같다. Parent(Root) 기준으로 전체 모듈이 빌드가 된다. gradle build 특정 모듈만 빌드를 하고 싶은 .. 2023. 5. 27.
helm upgrade configmap, secret 변경 시 pod 자동 재시작 쿠버네티스에서 Helm을 사용하여 배포를 관리할 경우 configmap이나 secret을 변경하고 helm upgrade 했을 때 기본적으로 관련 pod들은 재시작하지 않는다. 그래서 실제적으로 configmap, secret의 변경 내용이 pod에 반영이 안된다. 예를 들면 아래와 같은 케이스이다. # configmap, secret 변경 vi app-configmap.yaml # helm upgrade로 반영 helm upgrade app -f values.yaml . # pod 재시작 여부 확인 => (재시작 안됨 = 변경 내용 어플리케이션에 반영 안됨) kubectl get po configmap, secret 변경 시 pod 자동 재시작을 위해서 deployment나 pod yaml에 아래 설정.. 2023. 3. 20.
Distroless 이미지로 안전하고 최적화된 이미지 생성 Docker 빌드를 할 때 베이스 이미지로 이미지 경량화를 위해 Alpine이미지를 많아 사용해왔다. 초경량을 위해서는 scratch도 있긴 하지만 이는 너무 row레벨이고 언어별로 사용하는데 제약이 많다. Distroless 이미지를 사용하면 Alpine보다 좀 더 경량화된 이미지를 생성할 수 있고 보안적으로도 좀 더 안전한 이미지를 생성할 수 있다. Distroless 이미지는 Google에서 제공하는 이미지로써 작성한 어플리케이션과 런타임 종석성만을 포함하고 있다. 그리고 표준 Linux 배포판에서 볼 수 있는 yum과 같은 Package Manager, Shell, 기타 프로그램들이 포함되어 있지 않아서 이미지를 경량화 할 수 있고, 불필요한 프로그램들이 없어서 이미지 보안적으로 장점을 가질 수 .. 2023. 3. 13.
Kafka 구성 및 SpringBoot 연동 SpringBoot에 kafka 연동을 적용해보면서 kafka에 대한 기본 개념과 springboot와 연동 방법을 알아본다 Kafka 개요 매우 높은 처리량과 낮은 지연시간(latency) 높은 확장성 고가용성: 클러스터 내 Replication 각 메세지들을 여러 개로 복제해서 카프카 클러스터 내 브로커들에 분산시키는 동작 ex. 토픽 생성시 --replication-factor 3 으로 지정하면 원본을 포함하여 총 3개의 replication 생성 Topic 자체를 복제하는 것이 아닌 Topic의 파티션을 복제를 하는 방식 내구성: acks 옵션, 메시지 디스크 저장 개발 편의성: Producer와 Consumer의 분리 다양한 기능과 3rd Party 를 통해 관리 편의성 kafka 구성 주키퍼(.. 2023. 3. 13.
반응형