Coroutines

  • [Coroutine Flow] flatMapMerge 을 사용해 flow 변환 동시 처리하기

    flatMapMerge는 무슨 역할을 하는가? flatMapConcat과 flatMapLatest는 flow에서 발행된 데이터를 변환할 때 발행된 순서대로 순차적으로 변환한다. 반대로 flatMapMerge는 변환을 병렬로 수행한다. 대부분의 연산이 flatMapConcat이나 flatMapLatest를 이용한 순차 처리에 해당하지만 들어오는 데이터들을 동시에 수집한 후 수집한 값들이 가능한 빨리 방출 될 수 있도록 병렬로 처리되어야 할 때가 있다. 예를 들어 비용 처리..

  • [Coroutine Flow] flatMapLatest 이용해 최신 데이터만 사용해 flow 변환하기

    flatMapLatest란? flatMapLatest는 flow를 최신데이터만을 이용해 새로운 flow로 변환할 수 있도록 도와주는 함수이다. flatMapLatest를 사용하면 flow에서 발행된 데이터를 변환하는 도중 새로운 데이터가 발행될 경우, 변환 로직을 취소하고 새로운 데이터를 사용해 변환을 수행한다. collectLatest의 경우 먼저 발행된 데이터를 처리하는 도중 새로운 데이터가 들어올 경우 이전 데이터 처리를 취소하고 새로운 데이터를 이..

  • [Coroutine Flow] flatMapConcat을 사용해 flow를 다른 flow로 변환하기

    Flow의 Flattening Operator flow는 데이터 파이프라인이다. 코드 상에서 데이터 파이프라인은 그 자체로 사용되는 경우는 거의 없으며 보통 다른 데이터 파이프라인들과 합쳐져 하나의 데이터 파이프라인을 완성한다. flow 또한 여러 flow가 합쳐져 하나의 flow로 만들어지기 위한 연산자를 제공하는데 데이터 파이프라인을 합치는(Flatten) 연산자여서 Flattening Operator(하나로 만드는 연산자)라 한다. 우리는 이번 글에서..

  • [Coroutine Flow] conflate를 이용해 최신 데이터 collect 하기

    collectLatest를 이용한 최신 데이터 collect의 한계점 그림1과 같이 데이터 발행 시간 사이의 간격보다 데이터를 처리하는 suspend fun이 수행하는 시간이 오래 걸릴 경우, 새로 들어온 데이터는 계속해서 소비되지 못한다. 즉 이런 상황에서 collectLatest를 쓸 경우 중간 데이터를 하나도 얻지 못하고 마지막 데이터만을 얻을 수 있다. 예를 들어 아래 그림2와 같이 데이터 발행에 0.1초가 걸리는데 데이터 소비에 1초가 걸..

  • [Coroutine Flow] buffer 이용해 발행과 소비를 위한 Coroutine 분리하기

    collect에서 데이터 발행과 소비가 일어나는 방식 flow의 collect를 사용하면 하나의 Coroutine에서 발행과 소비가 같이 일어나기 때문에 데이터가 발행된 후 소비가 끝나고 나서 다시 다음 데이터가 발행된다. 즉 발행과 소비가 순차적으로 일어난다. 이를 그림으로 표현하면 다음과 같다. 하지만 이 방식은 매우 비효율적이다. 발행하는 쪽이나 소비하는 쪽의 delay를 미리 처리하지 않는다면 발행부와 소비부 양쪽에서 모두..

  • [Coroutine Flow] collect와 collectLatest의 차이는 무엇인가?

    collect를 사용한 데이터 소비의 한계점 Flow는 Coroutine상에서 Reactive한 프로그래밍을 할 수 있도록 만들어진 데이터 파이프 라인이다. Flow는 데이터를 발행하는 역할을 하며 Flow에서 발행하는 데이터는 collect의 action 파라미터에 의해 소비된다. public suspend inline fun Flow .collect(crossinline action: suspend (value: T) -> Unit): Unit = collect(object : FlowCollector { override suspend fun emit(valu..

Kotlin

  • [Kotlin] Array 생성하고 변경하는 방법 한 번에 정리하기

    Array란 무엇인가?  Array는 메모리의 연속적인 공간을 차지하고 있는 정적인 자료구조이다. 이러한 특성으로 인해 Array는 생성 시 크기를 지정해야 하며, 생성한 이후에는 크기의 조절이 불가능하다. Array의 특징  위의 특성으로부터 Array의 여러가지 특성이 나오는데, 아래 두 가지가 대표적인 특성이다. 1. Array는 Random access가 가능해 검색 속도가 빠르다. Array는 연속적인 공간을 차지하고 있으므로, Index를..

  • [Kotlin] abstract class 란 무엇인가?

    abstract class란 무엇인가? abstract class는 그 자체로 인스턴스화 될 수 없는 클래스이다. abstract class는 abstract class를 여러 클래스에서 공통으로 쓰는 프로퍼티와 메서드를 모아놓는 용도로 쓴다. abstract class란여러 클래스의 추상적인 부분(=공통적인 부분)을 모아놓은 클래스인데 그 자체로는 인스턴스화 할 수 없는 클래스이다. 프로그래밍 언어들에서는 abstract class를 abstract type을 가진다고 하고 abstr..

  • [Kotlin] var과 val의 차이는 무엇인가?

    변수란 무엇인가? 변수는 값(데이터)을 저장하는 메모리 공간에 붙은 이름이다. 이름처럼 고전적인 변수는 값을 읽고 쓰는 것을 모두 지원한다. 실제로 다른 프로그래밍 언어인 Java나 Python등에서는 변수를 만들면 값을 쓰고 읽을 수 있다. 하지만 변수의 값이 바뀔 수 있는 부분이 많아진다는 것은 프로그램에 오류가 일어날 수 있는 부분이 많아진다는 것을 뜻한다. 때문에 최근 함수형 프로그래밍 패러다임에서는 값의 불변..

  • [Kotlin] apply, run, with, let, also 차이 한 번에 정리하기

    범위 지정 함수(Scope function)란? 범위 지정 함수는 특정 객체에 대한 작업을 블록 안에 넣어 실행할 수 있도록 하는 함수이다. 블록은 특정 객체에 대해 할 작업의 범위가 되며, 따라서 범위 지정 함수라 부른다. 특정 객체에 대한 작업을 블록안에 넣게 되면 가독성이 증가하여 유지 보수가 쉬워진다. 코틀린에서는 let. run, apply. also, with 총 5가지 기본적인 범위 지정함수를 지원한다. 코틀린의 범위 지정 함수 1. ap..

  • [Kotlin] Kotlin object 이용한 무명 객체(Anonymous Object) 생성 : 익명 클래스(Anonymous Class)의 구현과 활용 방법

    무명 객체란 무엇인가? 무명 객체란 익명 클래스로부터 생성되는 객체를 뜻한다. 익명 클래스는 다른 클래스들과 달리 이름을 가지지 않는 클래스다. 정리하면 이름을 가지지 않는 익명 클래스로부터 무명 객체를 생성할 수 있다. Kotlin에서는 이를 object라는 하나의 키워드를 통해 구현할 수 있다. 먼저 무명 객체가 왜 필요한지 살펴본 후, 무명 객체를 어떻게 구현하는지 확인하도록 하자. 무명 객체가 필요한 이유 무명 객..

  • [코틀린과 객체지향] 2. 자율적인 객체

    실제 세계의 객체와 객체지향 세계의 객체의 차이  앞선 글에서 객체를 실제 세계에 비유하니 객체가 무엇인지 한 번에 이해를 했을 것이다. 이러한 이유 때문에 흔히들 객체를 실제 세계에 비유해 설명한다. 하지만, 실제 세계의 객체는 프로그래밍 상의 객체와 다른 점이 있다. 실제 세계에서는 대부분의 객체들은 수동적이며, 사람이나 고양이 혹은 강아지 같은 자율적인 객체들에 의해 수동적으로 행동한다. 하지만 객체지..

Android

  • 오류 수정 방법 : Android Gradle plugin requires java 11 to run. you are currently using java 1.8

    이번에 안드로이드 스튜디오를 Artic Fox로 올리면서 다음과 같은 오류가 생겼다. Build file '/Users/james.c/AndroidStudioProjects/MyApplication7/app/build.gradle' line: 2 An exception occurred applying plugin request [id: 'com.android.application'] > Failed to apply plugin 'com.android.internal.application'. > Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8. You can t..

  • R8을 이용해 안드로이드 앱을 최적화하고 코드 유출 방지하기 : minifyEnabled, shrinkResource, proguard

    안드로이드 앱의 보안은 왜 중요할까? 우리가 안드로이드 앱을 빌드하면 aab파일 혹은 apk파일로 만들어진다. 뭔가 aab나 apk하면 보안이 강할거 같다는 생각이 들지만 이 방식들은 단순히 우리가 짠 코드들을 압축한 것에 불과하다. 따라서 apk의 압축을 풀면 우리가 짠 코드의 내부가 모두 보인다. 우리가 안드로이드 앱을 빌드하면 윈도우 상에는 그림1과 같은 apk파일이 생긴다. 더블 클릭해도 열리지는 않지만 이를 안드로..

  • [Koin] 5. single과 factory를 이용한 의존성 주입 비교

    예제 링크 :  https://github.com/seyoungcho2/KoinExample 예제 브랜치명 : example/example5 *브랜치 필수 확인 의존성 제공 메서드 single과 factory single은 한 번만 객체를 생성하고 factory는 호출 될때마다 객체를 생성한다. 다음과 같은 Student("student-kim")은 single로 제공되고 Student("student-cho")는 factory로 제공되는 상황을 가정해보자. module { single(named("kim")) { Student("student-kim") } fac..

  • [Koin] 4. get()을 이용하여 생성자에 주입하기

    생성자 주입이 달라야 하는 이유 제공된 객체가 다른 객체의 생성자에 주입되어야 한다고 해보자. class Student(val name: String) class Teacher(val name: String, val teachingStudent: Student) 이럴 경우 Teacher은 Student를 주입받아야 한다. 이때 우리는 다음과 같이 get()을 이용해 제공된 객체를 주입받을 수 있다. single { Student("student-kim") } single { Teacher("teacher-cho", get()) } get()의 역할 예제..

  • [Koin] 3. named 메서드를 이용해 같은 Type 객체 구분하기

    예제 링크 : https://github.com/seyoungcho2/KoinExample 예제 브랜치명 : example/example2 *브랜치 필수 확인 seyoungcho2/KoinExample Koin Usage Example. Contribute to seyoungcho2/KoinExample development by creating an account on GitHub. github.com 같은 Type의 객체 여러개 주입 시 문제점 같은 타입의 객체가 두개이 이상이면 어떤 객체를 주입해야 할지 구분하는데 문제가 생긴다. 예를 들어 아래와 같은 주입..

  • [Koin] 2. Koin을 이용한 의존성 주입

    이 글을 이해하기 위해서는 의존성 주입에 대한 이해가 필수적이다. 의존성주입에 관해 모른다면 아래 글을 읽고 오도록 하자. 의존성 주입이란 무엇이며 왜 필요한가? 목표 의존성 주입이 무엇인지 이해한다. 의존성 주입이 왜 필요한지 이해한다. 의존성 주입이란?  의존성 주입이란 클래스간 의존성을 클래스 외부에서 주입하는 것을 뜻한다.  더 자세하게는 kotlinworld.com Koin과 의존성 주입의 구성요소 의존성 주입에..

Spring

  • Spring MVC Framework란 무엇인가? Spring MVC의 구조와 의의

    Spring MVC란 무엇인가? Spring MVC는 Spring에서 제공하는 웹 모듈로, Model, View, Controller 세가지 구성요소를 사용해 사용자의 다양한 HTTP Request을 처리하고 단순한 텍스트 형식의 응답부터 REST 형식의 응답은 물론 View를 표시하는 html을 return하는 응답까지 다양한 응답을 할 수 있도록 프레임웍이다. Spring MVC는 다양한 요청을 처리하고 응답하기 위해 주요 구성요소들을 만들어놓고 구성요소들을 확장할 수 있..

  • [Spring] Servlet에서 Request 처리해 Response 리턴하기

    Servlet에서 Request의 파라미터를 받아오는 방법 예를 들어 다음과 같이 user에 대한 쿼리를 넣어 http 요청을 한다고 해보자. http://localhost:8080/hello?user=devcho 서블릿 상에서 위 user을 받아오기 위해서는 HttpServletRequest 인터페이스의 getParameter 메서드를 이용하면 된다. getParameter은 인풋을 String으로 받으며 결과값을 리턴하는 메서드로 user 파라미터를 받아오기 위해 다음과 같이 사용할 수 있다. @W..

  • [Spring] Servlet 만드는 방법 정리

    Spring에서 서블릿 만드는 방법 1. 서블릿 스캔을 위해 SpringBootApplication 위에 @ServletComponentScan Annotation을 붙인다. @ServletComponentScan // 서블릿 자동 등록 @SpringBootApplication class ServletExampleApplication fun main(args: Array ) { runApplication (*args) } 2. 1에 의해 ServletExampleApplication 하위의 모든 패키지의 @WebServlet이 스캐닝 되므로 base 패키지를 추가하고 HelloServlet 클래스..

CI/CD

  • [Gradle] 프로젝트 수준의 Gradle에서 모듈 수준의 Gradle 제어하기

    Project 수준의 build.gradle에서 모듈 수준의 build.gradle 제어하기 멀티 모듈 프로젝트를 만들다보면, 모든 모듈에 dependencies나 task들이 적용되어야 하는 경우가 있다. 이를 위해 프로젝트 수준의 build.gradle에서 모듈 수준의 build.gradle을 제어해야 할 경우가 생긴다. 이를 위해 Gradle에서는 allprojects, subprojects, project 메서드를 제공하는데 이번 글에서는 이 메서드들을 다루어볼 것이다. allprojects :..

  • [Gradle] Plugin이란 무엇인가? 플러그인 이해하고 Custom Plugin 만들기

    Gradle Plugin이란? Plugin이란 Gradle Task의 집합이다. Gradle Task는 어플리케이션 빌드부터 테스트까지 다양한 작업을 수행하는 작업 단위를 뜻한다. *만약 Task에 대한 이해가 부족하다면 다음글을 참조하길 바란다. Plugin을 우리가 특정 작업(어플리케이션 개발 등)을 하기 위해서 모아놓은 Task 들의 묶음이다. 예를 들어 안드로이드 어플리케이션을 개발하기 위해서는 필요한 라이브러리들을 받아온 후 해당 라이브러리..

  • [Gradle] Custom Task 만들고 Task Chaining 하기

    build.gradle의 task build.gradle의 task는 Project 객체의 메서드이다. task는 task이름과 람다식을 인자로 받으며, 이 task는 gradle [task 이름]을 통해 수행 가능해진다. build.gradle에 커스텀 task 만들기 build.gradle에는 메서드와 같이 커스텀 task를 만들 수도 있다. 커스텀 task는 다음의 문법으로 만들어진다. task 자체가 메서드이며, task의 인자로 task 이름이 넘어간다. task [task 이름] { [task에서 수행할..