자바에서 Exception은 아래의 구조를 가진다. 코틀린도 이와 별반 다르지 않다. Error는 말그대로 프로그램을 더이상 운영할 수 없는 정도의 아주 크리티컬한 에러이고, Exception은 우리가 catch 해야할 Exception의 유형들이다. 그 중에서 CheckedException을 처리하는 방법이 Kotlin과 Java와의 차이가 있다. class Test { public static void main(String[] args) { Thread.sleep(1) } } Java에서 위 코드는 컴파일 에러를 뱉는다. 왜냐하면 sleep 메소드는 checkedException을 전파하는 메소드이고 메인 메소드가 이에 대해서 별도로 처리하지 않았기 때문이다. fun main() { Thread.sl..
Null 참조의 위험성 자바를 포함한 많은 프로그래밍 언어에서 가장 많이 발생하는 예외가 바로 NullPointerException일 것입니다. 줄여서 NPE라고도 합니다. Null을 발명한 토니호어는 1965년 null을 발명한 것이 자신의 1조원짜리 실수였다고 고백합니다. 왜냐하면 null로 인해서 발생한 오류와 피해가 수십년간 수십억 달러에 달하기 때문이라고 합니다. 자바에서는 이러한 Null로 인해 발생하는 NPE를 줄이기 위해 Optional 이라는 클래스 타입을 제공하기 시작했습니다. 하지만 자바에서 아무리 Optional을 사용한다고 하더라도 Optional은 타겟값을 감싸는 클래스이기 때문에 그에 대한 오버헤드가 발생하고 컴파일을 하는 단계에서는 문법적 요소만 통과한다면 Null 가능성에 ..
안녕하세요. 업무하는 도중에 JsonNode 인스턴스를 다루었는데 해당 json의 field name들을 List로 가져와야 하는 일이 있었습니다. 이 때, jsonNode.fieldNames() 해당 코드가 반환타입이 Iterator 이었고 이를 List 타입으로 변환이 필요하여 찾아보았고 업무를 종료하고 정리를 해두면 다른분들도 결정하실때 좋을 것 같아서 공유합니다. JsonNode jsonNode = ...; Iterator fieldNameIterator = jsonNode.fieldNames(); 해당 iterator 변수를 List 타입으로 바꾸어 보자! 반복문(for, while 등) List fieldNameList = new ArrayList(); while(fieldNameIterato..
if 문 가장 기본적인 형태의 if 문 val job = "Backend Developer" if (job == "Backend Developer") { println("백엔드 개발자") } else if (job == "Frontend Developer") { println("프론트엔드 개발자") } else { println("개발자 아님") } if문은 표현식이다. 따라서 Java에서와는 다르게 동작한다. 대입이 가능하다. val age : Int = 10 val str = if (age > 10) { "성인" } else { "아이" } 자바에서는 str = "성인", str = "아이" 처럼 if문 안에 대입문을 넣어주었어야 할텐데 코틀린에서는 표현식으로 동작하기 때문에 위와 같은 대입식이 가능..
코틀린은 자바보다 다양한 함수 사용 스타일을 보여준다. default Parameter나 named argument를 봤을 때는 자바를 사용하는 실무에서 마주칠법한 오류에 많은 도움이 될 것 같아보였다. 다른 내용들은 기본적인 내용이므로 코틀린을 많이 작성하다 보면 잘 익어갈만한 내용으로 보인다! 기본적인 함수 fun sum(num1 : Int, num2 : Int) : Int { return num1 + num2 } 표현식 스타일 함수 fun sum2(num1 : Int, num2 : Int) : Int = num1 + num2 표현식과 반환 타입을 생략 가능한 함수 fun sum3(num1 : Int, num2 : Int) = num1 + num2 (단계가 어째 자바 람다식 축약하는 것 같다...) ..
해당 포스팅은 해당 게시글을 번역한 포스팅임을 명시합니다. 서론 마이크로서비스 아키텍처 패턴을 사용하여 온라인 스토어 애플리케이션을 개발한다고 가정해 봅시다. 대부분의 서비스들은 하나의 종류의 데이터베이스에 데이터를 저장해야 합니다. 예를 들어, Order Service는 Order에 대한 데이터를 저장하고 Customer Service는 Customer에 대한 데이터를 저장합니다. Problem 마이크로서비스 애플리케이션의 데이터베이스 아키텍처는 무엇입니까? Forces 서비스는 독립적으로 개발, 배포 및 확장될 수 있도록 느슨한 결합이 필요합니다. 일부 비즈니스 트랜잭션은 여러 서비스에 걸쳐 처리되도록 불변성을 적용해야 합니다. 예를 들어, Place Order 유스케이스에서는 새로운 주문이 발생할 ..
해당 포스팅은 해당 게시글을 번역한 포스팅임을 명시합니다. 서론 마이크로서비스 아키텍쳐 패턴을 활용하여 온라인 스토어 애플리케이션을 개발한다고 가정해 봅시다. 대부분의 마이크로서비스에서는 일종의 데이터베이스에 데이터를 저장합니다. 예를 들어 Order Service는 주문(Order)에 대한 정보를 저장하고 Customer Service는 고객(Customer)에 대한 정보를 저장합니다. Problem 마이크로서비스 애플리케이션의 데이터베이스 아키텍처는 무엇인가?? Forces 서비스는 독립적으로 개발, 배포 및 확장될 수 있도록 느슨한 결합이 필요합니다. 일부 비즈니스 트랜잭션은 여러 서비스에 걸쳐 처리되도록 불변성을 적용해야 합니다. 예를 들어, Place Order 유스케이스에서는 새로운 주문이 발..
해당 포스팅은 해당 게시글을 토대로 서술되었습니다. Java 8 에서는 컬렉션을 데이터 스트림으로 쉽게 반복할 수 있는 Stream API를 도입했습니다. Stream은 병렬로 실행할 수 있고 여러 프로세서 코어를 사용하는 것도 매우 쉽습니다. 그에 따라 더 많은 코어에 작업을 할당하여 나누는 것이 항상 더 빠르다고 생각하기 쉽습니다. 하지만 그렇지 않은 경우도 있습니다. 해당 포스팅에서는 순차 스트림과 병렬 스트림의 차이점에 대해서 살펴보겠습니다. 먼저 병렬 스트림에서 사용하는 default fork-join pool을 살펴보겠습니다. 또한, 메모리 지역 및 분할/병합 비용을 포함하여 병렬 스트림 사용의 성능 영향을 다뤄보겠습니다. 마지막으로 순차 스트림을 병렬 스트림으로 변환하는 것이 합리적인 경우를..