프로그래밍 언어로서 코틀린은 다양한 라이브러리들이 코루틴을 활요할 수 있도록 표준라이브러리를 통한 최소한의 기본적인 수준(low-level)의 API만을 제공합니다. 비슷한 기능을 가진 다른 프로그래밍 언어와는 다르게 async와 await는 코틀린에에서 뿐만 아니라 표준 라이브러리에서도 예약어(keyword)가 아닙니다. 더군다나 코틀린에서의 suspend function의 개념은 비동기 작업에 있어서 Promis나 Future보다 더 안전하고 에러로부터 자유로운 추상화를 제공합니다. kotlinx.coroutines은 JebBrains(Kotlin을 개발한 회사)에 의해 개발된 훌륭한(rich) 코루틴 라이브러리입니다. 이는 이 문서에서 다루는 코루틴에서 사용할 수 있는 여러개의 높은 수준(high-..
오늘부터 시간이 날 때마다 코루틴 공식 문서 읽기를 번역해서 올려보려고 합니다. Kotlin Coroutine 관련 스터디를 하고 있는데 이와 별개로 공식문서를 작은 Snippet 단위로 번역해보고 차근차근 읽어가보는게 도움이 될 것 같아서입니다. 링크는 번역 전에는 공식문서로 연결되고, 번역을 완료하면 포스팅된 글로 연결하겠습니다. 번역 우선순위는 자체적으로 판단해서 실무적으로 필요한 부분(실제 Kotlin Coroutine을 많이 사용하고 있기 때문에)부터 해볼 생각입니다. 저는 영어에 능통하지도 않고 번역과는 더더군다나 무관한 사람이기 때문에 잘못된 내용이 있을 수 있음을 참고해서 함께 읽어주시면 감사하겠습니다. 비동기나 논블로킹 프로그램은 개발환경에서 중요한 부분입니다. 서버나 데스크탑, 혹은 모..
최근에 Kotlin Coroutine을 공부하다 보니 Thread와 관련돼서 알아보게 되었고 JVM Memory에 관해서 다시 알아보다가 Baeldung에 최근에 올라온 글이 있어서 번역해보려고 합니다. 아래 목록을 참고하셔서 읽으시면 도움이 될 수 있습니다. 기본적으로 제가 읽고 번역한 사항이고 부분적으로 Google 번역기를 이용하였습니다. 원 글에서 Stack은 Memory로 표현했고 Heap은 Space로 표현했으나 둘 다 메모리 영역이고, Memory와 Space를 구분하는 게 무의미하여 Stack과 Heap으로만 표현했습니다. 번역을 했으나 부자연스러운 부분은 물음표(?)로 표시해놓았으니 원글을 통해서 확인하시면 도움이 될 것 같습니다. 1. 들어가면서 (Introduction) Applica..
Kotlin을 개발하다 보면 listOf()와 emptyList()를 자주 사용하게 되는데, 두 함수의 내부가 궁금해졌다. 결론부터 적어보자면, 표현식이 다를 뿐 listOf()와 emptyList()는 Immutable List를 만들어내는 함수들이다. 아래는 이에 대해 알아본 내용이니 시간 있다면 한 번 보는 것도 나쁘지는 않다. 일단 emptyList와 listOf는 모두kotlin.collections 패키지 안에 포함되어있다. Kotlin에서 제공하는 Collection 지원들인데, 그렇다면 어떤 것이 다를까? 일단 emptyList의 코드는 아래와 같다. /** * Returns an empty read-only list. The returned list is serializable (JVM)..
본 글은 해석한 내용이며 원문 링크는 하단에 있습니다. Cassandra vs. MongoDB Cassandra나 MongoDB를 다음 프로젝트의 데이터베이스로 생각하고 있으신가요? 두 데이터베이스를 비교하고 싶으신가요? Cassandra 와 MongoDB 모두 NoSQL 데이터베이스이지만 사실 둘은 매우 다릅니다. 그들은 매우 다른 능력과 방향성을 갖고 있으므로 미묘한 차이를 갖고 있습니다. 두 데이터베이스 중 어느 것도 RDBMS를 대체하지는 않으며 ACID를 보장하지도 않습니다. 만약 당신이 이러한 트랜잭션 단위의 작업이 주된 요구사항이라면 이러한 데이터베이스는 적합하지 않습니다. 이러한 경우에는 MySQL이나 PostgreSQL, Oracle과 같은 트랜잭션을 지원하는 관계형 데이터베이스를 사용하..
Atlassian의 Confluence를 세팅하는데 에디터 부분에서 자꾸 에러가 났다. 개발자 콘솔로 뜯어본 결과 통신형태에서 http 프로토콜 뿐만 아니라 websocket도 병행적으로 요청이 일어났으며 데이터 동기화를 유지하도록 하는 것이 목적인듯 보였다. Confluence는 기본적으로 8090번 포트를 사용하는데 http뿐만 아니라 websocket의 경우도 Apache의 Reverse Proxy기능을 이용하여 80에서 8090으로 포워딩이 필요했다. 결론부터 말하자면 proxy_wstunnel 뿐만 아니라 rewirte 모듈도 필요한 케이스였다. (ProxyPass로는 별 짓을 다 해봤는데 못찾은건지 몰라라도 안됐음) Web Socket 요청이 들어갈 때 Http Request Header에 C..
JPA는 ORM이기 때문에 RDB를 관리하는데 있어서 양방향 참조를 필요로 한다. 물론 필수는 아니지만 Entity는 본질적인 데이터를 표현하는 것이기 때문에 그 관계에 대하여 명세해주는 것이 원칙이라고 생각한다. (이에 대해 별개로 처리하는 부분이 있다면 DTO를 통하는 방법이 맞다고 생각한다.) 이러한 양방향 참조로 인해서 RESTFul API 서버를 구현하는데 있어서 문제가 생겼는데 바로 응답에 Entity를 담아서 보낼 경우에 JsonSerializer가 toString()을 호출할 때 property들을 매핑하는 과정에서 무한 순환 참조가 일어나게 되는 문제이다. 예를 들어 다음과 같다. public class Article { @Id private long id; // ... @OneToMan..