최근에 오렌지파이5를 구매하고 기존에 진행했던 프로젝트를 해당 기기에 도커를 통해 배포하면서 만난 여러가지 문제점들을 기록해두고자 한다. 사실 대부분의 문제점은 도커를 오랜만에 사용하면서 기존에 만나보았던 문제점들이지만 도커를 자주 사용할 것같지 않아 미리 정리해두려 한다. 아키텍처 가장 먼저 직면했던 것은 아키텍처 문제였다. Windows 환경에서 개발한, 즉 x86_64, amd64 아키텍처 환경에서 개발하고 amd64 아키텍처에 배포하던 기존의 환경에서 arm64, aarch64 아키텍처에 배포하면서 아키텍처가 다른 문제가 발생한 것이었다. 가장 먼저 개발 환경의 아키텍처와 배포 환경의 아키텍처를 확인이 필요한데 다음 커맨드를 통해 확인할 수 있다. $ lscpu | grep Architecture..
CRDT CRDT란 무엇일까? CRDT는 synchronization이나 consensus와 같은 비싼 작업없이도 conflict가 발생하지 않음이 보장되는 오브젝트를 의미합니다. CRDT이기 위해서는 모든 업데이트가 commutative하고 eventual consistency함을 만족해야 합니다. CRDT에 대해 설명하기 전에 2011년에 처음으로 발표된 논문의 Abstract를 읽고 시작하겠습니다. Eventual Consistency(EC)를 기반으로 하는 분산 데이터 시스템은 어떤 로컬 머신이라도 리모트 머신의 동기화의 도움없이 업데이트하는 것이 가능해진다. 이는 클라우드와 같은 큰 규모의 분산 시스템에서도 performance와 scalibility를 보장해준다. 하지만 이전까지의 EC를 이용..
상황 자바에는 String에 replaceAll 메서드가 존재한다. 이 메서드에서 \r\n을 찾는 표현식을 작성하고자 하면 다음과 같은 형식으로 코드를 작성해야 한다. rawText.replaceAll("(\\\\r\\\\n|\\\\n)", "\\\\n");결과적으로 하나의 \를 입력하기 위해서 총 4개의 백슬래쉬(\\\\)를 입력해야 하는 상황이 발생한다. 이유 이러한 식으로 작성해야 되는 이유는 다음과 같다. Java에서 \를 인식하기 위해서 \\가 필요함. replaceAll에 들어가는 첫 번째 parameter가 regexp이므로 여기서도 \를 입력하기 위해 \\가 필요하다. 위 2가지 조건이 중첩되어 Java에서 \를 인식하게 하기 위해 \\를 입력한 후에야 \를 \로 인식. 이때 만약 \\r만..
실제 코딩을 할 때나 코딩 인터뷰에서 사용해도 괜찮을법한 비트 연산자 유즈 케이스를 알아보자. n/2, n*2, 2^n n / 2 n >>> 1 n >>> 1 연산은 Java의 경우 n / 2 사용할 경우 발생할 수 있는 overflow를 원천적으로 봉쇄할 수 있다는 장점이 있다. n >> 1를 사용하는 경우 overflow가 발생할 수 있음에 주의. n * 2 n >로 먼저 n자리만큼 0으로 밀어낸 후 & 연산자를 이용하여 해당값이 1인지 판별하는 방법이며 x & (1
암호학의 간략한 역사 태초에 DES(Data Encryption Standard)가 있었다. DES는 Confusion(혼돈, 원문의 내용을 짐작하기 어렵게 함.)과 Diffusion(확산, 알고리즘의 패턴을 짐작하기 어렵게 함.)을 높이기 위해 여러 번의 round를 반복하는 파이스텔 구조(Substitution과 Permutation을 번갈아 수행하는 구조)로 되어 있었다. 하지만 DES는 대칭키 알고리즘을 이용한 암호화 방식이었으므로 대칭키를 이용하여 암호화하기 위해서는 수신자와 송신자가 서로 같은 키를 가지고 있어야 하지만 이때 key를 안전하게 주고 받을 수 없는 문제점이 있었고 이 문제를 해결하기 위해 DH key exchange (Diffie-Hellman) 방식이 탄생하게 되었다. DH 알..
Base64는 바이너리 데이터 (주로 이미지)를 인코딩하는데 사용되는 알고리즘이다. 8bit로 표현되던 ASCII 코드를 6bit로 끊어 표현하게 되는데 이때 8:6의 비율로 변환되고 이는 4:3 == 1.3333..., 즉 33% (~ 37%까지. 줄바꿈에 의해 4%의 추가 오버헤드 발생)의 오버헤드를 발생시키게 된다. 이러한 오버헤드에도 불과하고 아직까지 Base64를 널리 사용하고 있기에 이를 이해하기 위해서는 역사를 먼저 알아야 할 필요가 있다. Base64 인코딩이 나타나기까지 태초에 0과 1이 있었다. 그때의 컴퓨터는 0과 1 밖에 이해하지 못 하는 계산기에 불과했고 (물론 지금도 그렇다) 인간은 0과 1로 표현할 수 있는 바이너리를 넘어선 무언가를 계산기끼리 주고받게 하기를 원했다. 0과 1..
자바에서 OOP라는 개념은 어떤 것일까? OOP는 여러 개발방법론 중 하나인 객체 지향 프로그래밍을 의미하며 여러 개발 패러다임 중 하나에 속한다. 패러다임이라는 것은 "우리 이건 앞으로 이렇게 생각하자."를 누군가가 주창하면 그것은 하나의 패러다임이 되며 해당 패러다임이 여러 사람에 의해 충분히 입증되고 과거에 잔재했던 여러 문제를 해결하게 되면 과거의 패러다임은 폐기, 축소되고 새로운 패러다임으로 사고하게 되는 "패러다임 시프트"가 일어나게 된다. 즉, OOP라는 패러다임을 이해하고자 하면 OOP 이전에 존재했던 패러다임을 알아보고 과거의 패러다임이 어떤 문제를 가졌고 OOP가 그 문제를 어떻게 해결했는지를 알아야 한다. 절차적 프로그래밍 기존에 절차적 프로그래밍(Procedural Programmi..
인풋 데이터가 json 포맷으로 주어지는 경우가 있다. json 파싱 라이브러리로는 gson, json-simple, Jackson 등이 존재하는데 여기서는 본인이 생각하기에 직관적이고 편하다고 생각되는 gson 라이브러리를 사용한다. GSON 라이브러리 gson 라이브러리를 import한다. Gradle // https://mvnrepository.com/artifact/com.google.code.gson/gson implementation 'com.google.code.gson:gson:2.9.0' Maven com.google.code.gson gson 2.9.0 Nested 형태일 경우 String json = "{\n" + " \"data\": [\n" + " {\n" + " \"email\"..
유닛 테스트를 진행할때 사용하는 객체들에 대한 용어를 정리한다. 확실하게 정의가 내려진 용어가 아니므로 사람마다 의견이 다르기에 Martin Fowler의 정의+ @를 통해 정리하고자 한다. Fake Fake 실제로 동작하는 객체이나 테스트를 위한 목적으로 가볍고 단순하게 만들어져 있어 실제로 프로덕션 레벨에서 사용하기 부적합한 객체를 의미한다. (e.g. fake web service, InMemoryTestDatabase etc) Stub, Mock Stub 테스트를 위해 미리 정해진 응답만을 하도록 만들어진 객체. 단순히 테스트를 도와주기 위해 동작하는 객체라고 볼 수 있다. Mock Stub 객체에 assertion이 추가된 객체. Mock은 Stub의 superset으로 볼 수 있다. Dummy..
동시성 문제 동시성 문제란 멀티스레드의 환경에서 하나의 리소스에 여러 스레드가 동시다발적으로 접근하게 되어 같은 리소스에서 값을 가져오더라도 서로 다른 값을 가져오는 등의 문제가 발생하는 경우를 일컫는다. 이러한 동시성 문제가 발생하지 않도록 애플리케이션을 설계하는 것을 Thread Safe라 한다. 자바에서는 이러한 동시성 문제를 해결하기위해 아래과 같은 방법을 이용한다. synchronized, volatile synchronized (Pessimistic Locking, 비관적 잠금) synchronized 키워드를 사용하면 공유 변수에 동시에 접근하는 스레드를 단 하나로 한정지음으로서 다른 모든 스레드들은 공유 변수에 접근할 수 없고 이용 중인 스레드가 릴리즈 할 때까지 대기하게 된다. synch..
- Total
- Today
- Yesterday
- neovim
- Dap
- ModelAttribute
- JavaScript
- IDE
- RequestBody
- 아키텍처
- RequestPart
- lunarvim
- 레디스
- vim
- 도커
- 루나빔
- 배포
- RequestParam
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |