분류 전체보기
-
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..
-
kotlin data class 는 상속을 가능하면 쓰지 말자개발/삽질 기록 2021. 12. 8. 22:06
kotlin data class는 데이터만 보유하는 클래스를 만들 때 관리하기 용이한 클래스다. data class 로 클래스를 만들면 객체 간의 동등성 비교시 사용되는 hashCode 함수를 자동으로 만들어주기 때문에 단순히 데이터를 관리하는 것 뿐만 아니라 데이터간의 비교도 쉬워진다. 여기서 hashCode 함수는 생성자의 멤버 변수의 값으로 만들어 지는데 이것은 객체 간의 비교를 주소값으로 하지 않고 객체의 멤버변수의 값으로 하기 위함이다. 아래의 User 데이터 클래스로 선언된 a, b 변수는 모두 다른 메모리에서 선언 됐지만 hashCode 상으로는 동일한 값을 보이므로 동등성 비교에서는 같은 값을 보인다. data class User(val age: Int, val name: String) f..
-
멀티 서버 환경에서 Socket.io 사용하기개발/nodejs 2021. 11. 29. 20:00
서버 인스턴스가 하나로 이뤄진 환경에서는 클라이언트와 서버간의 소켓 통신은 그림 1 처럼 하나의 서버에서 모든 소켓 세션을 관리하는 형태로 구현된다. Server1 이 클라이언트와 연결된 모든 소켓 세션을 갖고 있기 때문에 모든 클라이언트에게 Event를 전달할 수 있다. 그런데 그림 1에서 서버를 하나 늘리면 클라이언트와 서버간의 소켓 통신은 그림 2처럼 된다. 클라이언트는 최초에 접속한 서버에 대해서 소켓 세션을 유지하게 되므로 Server1와 Server2 모두 별도의 소켓 세션을 갖게 된다. 그림 2와 같은 형태에서 Server1 에서 모든 클라이언트에게 직접 이벤트를 보내는 것은 불가능하다. 그림 3에서도 알 수 있듯이 Server1과 Client 2 간의 소켓 연결 세션이 없으므로 Server..
-
AOT(Ahead Of Time) Compiler개발/기술 2021. 11. 26. 20:30
JIT 컴파일러가 바이트코드를 런타임에 기계어로 바꾼다면 AOT는 실행 전에 바이트코드를 기계어로 바꾸는 컴파일러다. 실행 전에 모두 기계어로 변환되기 때문에 JIT 컴파일러가 런타임에 컴파일 하기 때문에 발생하는 성능 이슈가 생기지 않고 거의 네이티브의 성능을 낼 수 있게 된다. AOT 컴파일러가 JIT 컴파일러의 정반대의 원리기 때문에 JIT 컴파일러의 장점은 AOT 컴파일러의 단점이된다. AOT 컴파일러를 사용하면 실행 전에 전체 파일을 빌드해야 하기 때문에 빌드 속도가 느려진다. 설치할 때도 JIT 컴파일러를 사용하는 경우 바이트 코드만 받으면 되는 반면 AOT 컴파일러를 사용하면 기계어로 번역하는 작업까지 포함되기 때문에 느리다. 그리고 JIT 컴파일러의 장점이었던 Hot Reload 기능도 사..