"책으로 공부하는 Apache Kafka" 아파치 카프카 (Apache Kafka) 아파치 카프카란, 대용량 또는 대규모 메시지 데이터를 빠르게 처리할 수 있도록 개발된 분산 메시징 플랫폼이다. 카프카는 각각의 애플리케이션끼리 연결하여 데이터를 처리하는 것이 아니라 한곳에 모아 처리할 수 있도록 중앙집중화했다. 카프카를 통해 데이터 스트림을 한 곳에서 실시간으로 관리할 수 있다. 카프카 내부에 데이터가 저장되는 파티션의 동작은 FIFO(First In First Out) 방식의 큐 자료구조와 유사하다. 프로듀서 (Producer) : 큐에 데이터를 보낸다. 컨슈머 (Consumer) : 큐에서 데이터를 가져간다. 카프카 특징 카프카를 통해 전달할 수 있는 데이터 포맷은 제한이 없다. 직렬화, 역직렬화를 ..
코틀린 함수 이름 명시 val list = listOf(1, 2, 3) println(list) // [1, 2, 3] 만약 (1; 2; 3) 처럼 원소 사이를 세미콜론(;)으로 구분하고 괄호로 리스트를 둘러싸고싶다면? (1; 2; 3) 코틀린은 이런 요구 사항을 처리할 수 있는 함수가 표준 라이브러리에 이미 들어있다. 코틀린이 지원하는 기능을 사용하지 않고 직접 구현해보자. 직접 구현하기 /* 이 함수는 어떤 타입의 값을 원소로 하는 컬렉션이든 처리할 수 있다. */ fun joinToString( collection: Collection, separator: String, prefix: String, postfix: String ): String { val result = StringBuilder(p..
코틀린에서의 컬렉션 코틀린은 자신만의 컬렉션 기능을 제공하지 않고, 자바 컬렉션을 활용한다. 코틀린에서는 변경 가능한(mutable) 컬렉션과 변경 불가능한(immutable) 컬렉션으로 구분하여 사용한다. Set 데이터 순서가 없으며, 중복이 불가능하다. 기본적으로 변경 불가능(immutable)하며, mutableSetOf(), hashSetOf(), linkedSetOf(), sortedSetOf()로 변경 가능한 Set 생성이 가능하다. fun main() { val set = hashSetOf(1, 7, 53) // 객체가 어떤 클래스에 속하는지 추측하기 println(set.javaClass) // Java의 getClass() } Map key와 value가 한 쌍의 데이터로 이루어진 컬렉션..
throw 예외처리 코틀린의 예외 처리는 자바나 다른 언어의 예외 처리와 비슷하다. 코틀린에서의 throw 예외처리 특징을 알아보자. new 연산자를 사용하지 않아도 된다. fun main() { val i = 50 if (i !in 0.. 100) { // new 연산자를 사용하지 않아도 된다. throw IllegalArgumentException("exception : $i") } val percentage = exam(50) println(percentage) } throw는 식이다. 다른 식에 포함될 수 있다. fun main() { val percentage = exam(101) println(percentage) } fun exam(i: Int) { val percentage = if (i ..
while, do~while Kotlin에서 while, do~while문 사용은 Java와 동일하다. 새로 추가된 기능도 없다. for루프 코틀린에는 자바의 for에 해당하는 요소가 없다. 이런 루프의 가장 흔한 용례인 초기값, 증가값, 최종값을 사용한 루프를 대신하기 위해 코틀린에서는 범위(range)를 사용한다. 범위는 기본저긍로 두 값으로 이뤄진 구간이다. 보통은 그 두 값은 정수 등의 숫자 타입의 값이며, .. 연산자로 시작 값과 끝 값을 연결해서 범위를 만든다. // 양 끝을 포함하는 구간 : 10까지 포함 val oneToTen = 1..10 어떤 범위에 속한 값을 일정한 순서로 이터레이션하는 경우를 수열(progression)이라고 부른다. 예제 fun fizzBuzz(i: Int) = w..
enum enum은 class 앞에 있을때는 특별한 의미를 지니지만, 다른 곳에서는 이름에 사용할 수 있다. 이를 소프트 키워드(soft keyword)라고 부른다. enum class Color { RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET; } 이름에 사용할 수 있다? 예를들어 class는 키워드다. class는 이름 자체로 사용할 수 없어서, class 라는 이름을 사용하려면 clazz 또는 aClass 등과 같이 사용해야한다. enum 예제 구현해보기 enum class Color2 ( val r: Int, val g: Int, val b: Int // 상수의 프로퍼티를 정의한다. ) { RED(255, 0, 0), ORANGE(255, 165, 0),..
클래스 선언 Kotlin은 기본적으로 public class가 생성된다. package _기본문법._4_클래스_프로퍼티 // default : public class `4_클래스`(val name: String) 프로퍼티 package _기본문법._4_클래스_프로퍼티 class `5_프로퍼티` ( val name: String, var isMarried: Boolean, ) 읽기 전용 프로퍼티 비공개 필드 필드를 읽는 단순한 공개 getter 를 만든다. val name: String, 쓸 수 있는 프로퍼티 비공개 필드 필드를 읽는 공개 getter 를 만든다. 필드를 쓰는 공개 setter 를 만든다. var isMarried: Boolean, getter 메서드를 직접 생성할 수 있다. package..
타입 추론 (Type Inference) 코를린은 변수 타입 생략이 가능하다. val answer = 42 // Type 생략 가능 val answer2 : Int = 42 // Type 명시 가능 변수 선언시 초기화를 함께 해주지 않는 경우, 타입을 명시해줘야한다. val answer3: Int // 초기화하지 않을시, 타입을 명시해줘야한다. nswer3 = 42 val - 변경이 불가능한 변수 (Immutable) val로 선언된 변수는 일단 초기화하고 나면, 재대입이 불가능하다. Java의 final 변수에 해당한다. // 변경 불가능한 함수 val a = 1 // a = 2 :변경이 불가능하다. val 참조 자체는 불변일지라도, 그 참조가 가리키는 객체의 내부 값은 변경이 가능하다. // val ..
코틀린 코드 맛보기 data class Person(val name: String, val age: Int? = null) fun main(args: Array) { val persons = listOf(Person("영희"), Person("철수", age = 29)) val oldest = persons.maxByOrNull {it.age ?: 0} println("나이가 가장 많은 사람 : $oldest") } JAVA 코드에 익숙해서 그런지, 코드가 눈에 잘 들어오지 않는다. 한줄 한줄 분석해보자. 아래의 내용들이 전부 이해는 되지 않지만, 책을 읽어가면서 내용들을 배울 때마다 아래 내용들에 포스팅 URL을 채워나갈 예정이다. property -> name, age Int? -> null이 될 수..
Kotlin 첫 입문 프로젝트 생성 인텔리J 프로젝트 생성 : [File] - [New] - [Project...] Main 클래스 생성 Main.kt 잘못된 예제 (X) Java 와 동일하게 Main 클래스 안에 main 메서드를 두었다. class Main { fun main(args: Array) { print("hello world") } } 정상적인 예제 (O) Kotlin은 Main 클래스 외부에 main 메서드를 선언한다. class Main { } // 코틀린은 main 메서드를 클래스 외부에 생성한다. fun main(args: Array) { print("hello world") } 결과 hello world
상황 휴대폰번호 010 - 1234 - 5678 번호의 3가지가 각 객체로 존재한다. String front = "010"; String middle = "1234"; String back = "5678"; 위 3가지 객체를 붙여서 hpno 객체를 완성한다. String hpno = front + middle + back; 여기에 문제점이 존재한다. front, middle, back 변수 중 null 값이 존재한다면 "null"로 그대로 완성된다. String hpno = front + middle + back; // middle 이 null일 경우 log.info(hpno); // "010null1234" 해결방안 front, middle, back 각 객체의 null 체크를 하여 if-else로 처..
상황 TEST 데이터를 저장하는 /test/saveTest API 테스트 코드를 작성한다. @SpringBootTest @AutoConfigureMockMvc class SaveControllerTest { @Test @DisplayName("TEST 데이터 저장") void saveTest() throws Exception { /* param set */ TestDto testDto = new TestDto(); testDto.setName("test"); MvcResult result = mockMvc.perform(post("/test/saveTest") .contentType(MediaType.APPLICATION_JSON) .content(toJson(rmVenParamDto))) .andExp..