개발
-
PostgreSQL VACUUM개발 2022. 2. 17. 20:20
PostgreSQL 에서 delete를 이용해서 삭제를 수행하는 경우 DB 데이터 상에서는 지워지지만 스토리지 상에서는 바로 삭제하진 않는다. 삭제된 자료를 다른 트랜잭션 상에서 사용하고 있다면 그 자료가 지워져선 안되기 때문이다. 그런데 더이상 사용하지 않는 자료가 스토리지 상에 계속 남아 있다면 불필요한 공간을 차지하게 되는 문제가 생긴다. PostgreSQL 에서는 VACUUM 이라는 명령어를 통해 위와 같은 상황을 관리할 수 있는 기능을 제공한다. 영어단어 '청소기를 돌리다'는 의미와 비슷하게 VACUUM 명령어도 데이터베이스 상에 먼지처럼 남겨진 데이터를 정리할 수 있는 기능을 제공한다. VACUUM 명령어는 크게 두가지로 분리할 수 있다. VACUUM 테이블과 인덱스에서 삭제된 자료(old v..
-
Container & Docker개발/기술 2022. 2. 15. 20:00
Container 컨테이너에 설명하기에 앞서 컨테이너 기술이 만들어진 이유를 소개하는게 좋을 것 같다. 우리가 사용하는 컴퓨터에는 여러개의 애플리케이션이 돌아가고 있다. 그리고 대부분의 애플리케이션은 OS에 설치된 라이브러리를 이용해 실행된다. Spring Boot의 경우 JAVA를 참조하고 C 언어로 이뤄진 게임의 경우 GCC 컴파일러를 이용해 실행하게 될 것 이다. 모든 앱이 사용하는 라이브러리가 겹치지 않으면 상관 없다. 그런데 실행하는 앱 별로 필요한 라이브러리 버전이 다른 경우가 종종 있다. 어떤 앱은 Java8에서 실행해야 하는데 새로 배포하는 앱은 Java11 에서 실행되는 환경이 있다면? 일시적으로 링크를 따로 걸어서 해결 할 수 있지만 같은 로컬 환경에 두개의 라이브러리 버전을 관리하는 ..
-
cypher개발/기술 2022. 2. 14. 20:00
cypher는 Graph Database 인 Neo4j 에서 Query를 작성할 때 사용할 수 있는 언어다. 처음 보면 생소하지만 사용하다보면 SQL 과 흡사한 점이 많아 금방 배울 수 있다. 노드와 관계 그리고 속성을 정의하는 쿼리라는 점에 주목해서 보자. 다음 문장을 나타내는 관계를 만든다고 해보자 Mike writes Neo4j Son reads Neo4j Mike likes Son CREATE 문장에서 각 주어와 목적어는 관계상에서 Node로 표현할 수 있으며 각각의 Node는 Label로 묶어 줄 수 있다. Mike와 Son은 User라는 라벨로 표현하고 Neo4j 은 Book 라벨로 표한하자. 각 Node를 Cypher를 이용하면 아래의 쿼리로 세개의 노드를 생성할 수 있다. create(:U..
-
Javascript 동치비교개발/삽질 기록 2022. 2. 11. 20:20
Javascript 에서는 다른 언어랑 다르게 비교 연산자로 '==' 뿐만 아니라 '===' 가 있어 다른 변수와 비교할 때마다 내가 짠 코드가 정확한 건지 아닌지 헷갈릴 때가 종종 있다. '==' 는 느슨한 비교 연산자고 '===' 는 엄격한 비교 연산자인데 사용할 때마다 결과가 달라 이번 포스트에서는 Javascript 비교 연산자를 깔끔히 정리해보려고 한다. string 비교 연산 변수와 상수형 문자열 사이의 비교는 '==' 든 '==='를 사용하든 상관 없다. 아래 코드를 보면 두개의 비교 연산 모두 true로 리턴하게 된다. const simple = "simple" const is = simple === 'simple' ? 'is' : 'is not' // true, is='is' const ..
-
go - goroutine개발 2022. 2. 3. 21:44
고루틴 은 go 언어 내부에서 비동기 작업을 효율적으로 처리 할 수 있는 쓰레드 라이브러리다. Go 내부에서 스케줄러에 의해 자체적으로 관리되며 OS 에서 관리하는 경량 쓰레드보다 더 경량이라고 하니 go 언어를 만들면서 쓰레드 작업을 최적화 하는데 많은 심혈을 기울였다고 볼 수 있다. Kotlin의 Coroutine과 비슷하면서도 쓰레드 설정이나 suspend 함수 같은게 없어 간소화된 형태다. Java 에서 쓰레드 문제로 몸살을 겪었다면 go 언어에서는 goroutine을 이용해 간단하게 해결할 수 있다. 사용법 함수 앞에 간단하게 go 만 붙여주면 goroutine 을 사용해서 실행하게 된다. func bark() { fmt.Println("bark") } func main() { go bark()..
-
Graph Database - neo4j개발/기술 2022. 1. 24. 20:00
일반적인 관계형 데이터베이스에서 Entity 사이의 관계를 표현할 때 JOIN 함수를 사용한다. 그런데 JOIN 함수를 사용하는 작업은 성능상에 단점이 있을 뿐만 아니라다소 엄격한 스키마를 따라야해 유연하지 못하다. 그래서 일반적인 SQL 데이터베이스는 관계형 데이터베이스임에도 불구하고 관계를 잘 표현하지 못하는 단점이 있다. 이런 문제점을 해결하고자 Graph 데이터베이스에서는 데이터를 더 유연하게 저장하는 방법을 제공한다. JOIN 과 같은 작업은 존재하지 않으며 모든 데이터는 Node와 Relation으로 표현되고 탐색(traverse)에 최적화됐다. Neo4J Neo4J는 오픈소스로 운영되는 Graph Database 이며 ACID compliant 하다. AuraDB 를 이용해 제공되고 있어 ..
-
log4j 이슈 살펴보기개발/기술 2021. 12. 13. 23:42
12월 09일 부터 오늘까지(12월 13일) Log4J라는 라이브러리가 전세계 개발자 커뮤니티를 떠들석하게 만들었다. Log4J는 자바 서버 프로그래밍을 해본 사람이라면 디버깅 용도로 한 번쯤 사용하는 라이브러리인데 특정 버전에서 이 라이브러리를 사용하면 원격에서 자바 프로그램을 실행 할 수 있는 심각한 결함이 있었다. 로그만 찍어주는 별 것 아닌 라이브러리가 어쩌다 이런 취약점이 생겼고 얼마나 문제가 심각한 것인지 이번 포스트를 통해서 정리해보려고 한다. JNDI 취약점이 발생한 원리를 다루기 전에 먼저 JNDI 라이브러리에 대해서 알아보자. JNDI 는 Java Naming and Directory Interface의 약자로 클라이언트가 서버상의 데이터나 객체를 lookup 할 수 있는 Java AP..