전체 글 67

Apache Beam의 sideInput() 이해하기

sideInput() sideInput()은 파이프라인의 한 단계에서 처리되는 메인 입력 PCollection 외에 추가적인 입력 데이터를 제공하는 방식이다. 파이프라인은 PCollection을 처리해 결과 데이터를 다시 PCollection으로 반환한다. 그런데 PCollection 처리 과정에서 다른 데이터를 참고해야 하는 경우가 있다. 예를 들어, 주문 정보를 처리하며 할인 정보를 참고하는 경우가 있을 수 있다. 추가적인 입력 데이터를 파이프라인 처리 전에 묶어서 새로운 타입의 input을 만들 수도 있겠지만, 각 데이터 처리에서 공용으로 접근해서 참고할 불변의 데이터라면 sideInput을 사용하는 게 낫다. sideinput은 메모리에 한 번만 로드하면 되기에 더 효율적이다. sideInput(..

Data engineering 2023.03.08

Electron 일렉트론 Main, Renderer Process 이해하기

Electron Electron은 웹 기술(HTML, CSS, JavaScript)을 사용하여 데스크톱 애플리케이션을 만들기 위한 오픈 소스 프레임워크다. Chromium 브라우저와 Node.js 런타임 환경을 내장하고 있어서 웹 개발자들이 친숙하게 데스크톱 애플리케이션을 개발할 수 있다. Main Process Electron에는 Main Process와 Renderer Process라는 두 개의 별도의 프로세스가 있다. Main Process는 전체 Electron 애플리케이션에서 단 하나만 존재한다. Main Process는 Node.js 환경에서 동작하며, Electron의 주요 모듈과 네이티브 API를 사용할 수 있다. 주요 기능은 앱의 라이프사이클을 관리하고, 각종 네이티브 API를 노출시켜 ..

Application 2023.03.08

Kubernetes 기초 끝내기 🙊

쿠버네티스란? 가장 대표적인 컨테이너 오케스트레이션 시스템으로, 사실상 표준이다. 구글에서 사용하던 배포시스템 borg를 기반으로 재작성해 2014년에 오픈소스로 공개하였다. 심심하면 아래 문서를 읽자. Concepts Production-Grade Container Orchestration kubernetes.io 컨테이너 오케스트레이션 시스템이란? 컨테이너의 배포, 관리, 확장, 네트워킹을 자동화하는 기술 Docker, Docker Compose는 하나의 머신에서 컨테이너를 관리하기 위한 기술이다. 컨테이너 오케스트레이션 시스템은 여러 머신으로 구성된 클러스터 상에서 컨테이너를 효율적으로 관리하기 위한 시스템이다. 쿠버네티스 외에 Rancher, Apache MESOS, Nomad, Docker Sw..

DevOps 2023.03.01

Docker 기초 끝내기 🙉

컨테이너 기술의 발전 Traditional Deployment: Hardware - Operating System - App(Libs & Frameworks) 문제점: 서비스가 점점 커지면서 한 서버에서 운영하는 서비스가 여러 개가 되면, 각각의 서비스에 필요한 라이브러리에 대해 의존성 충돌이 생길 수 있다. 관리가 어려워지고 서비스의 확장성이 낮아진다. Virtualized Deployment Hardware - Operating System - Hypervisor - Virtual Machines (Operating System - App(Libs & Frameworks)) 운영체제 상의 Hypervisor 컴포넌트를 통해 게스트OS(별도의 CPU, RAM, HDD 등)를 만든다. 하나의 Virtua..

DevOps 2023.03.01

동시성 이슈 해결하기

주문이 한꺼번에 몰리는 한정판 판매를 구현할 때, 재고 수량의 정합성을 어떻게 보장할 수 있을까?! 문제점 아래는 Spring Framework, JPA를 사용한 재고 시스템 코드이다. 주문 시에 재고(Stock) 엔티티의 quantity의 값이 차감되어, 0이 되면 더이상 주문이 불가능하다. 이 코드에는 문제가 있다. package com.example.domain; @Entity @Getter public class Stock { @Id @GeneratedValue(strategy = GeneratedType.Identity) private Long id; private Long productId; private Long quantity; public Stock(Long productId, Long ..

Application 2023.02.26

책 <디자이너를 위한 웹성능 최적화 기법>

페이지를 로딩하는 데 3초가 지나면 최대 40%의 사용자가 사이트를 떠난다. 사이트 멈춤, 에러, 페이지 로딩 지연, 복잡한 결제 과정을 거친 사용자의 75%는 해당 사이트에서 상품을 구매하지 않는다. 사용자의 88%는 불쾌한 경험을 한 사이트를 재방문하려고 하지 않는다. 100밀리초 미만의 지연은 사용자에게 순간처럼 인식되지만 100~300밀리초 사이의 지연은 그렇지 않다. 300~1,000 밀리초 사이의 지연이 생기면 사용자는 사이트가 느려도 움직이고는 있다고 느끼지만 만약 1,000 밀리초 이상 지연된다면 사용자는 더 이상 집중하지 못하고 아마 다른 생각을 하기 시작할 것이다. 페이지 로딩 시간에는 사이트의 프론트엔드에서 클라이언트의 요청에 응답하는 과정뿐 아니라 데이터베이스 호출이나 템플릿을 컴파..

Optimization 2022.10.23

알고리즘과 Big-O 표기법

실행 시간, 메모리, 개발자의 노력등을 포함해 알고리즘을 비교하여 최적의 알고리즘을 찾아낸다. 다음은 항상 언급되는 성장률(입력에 따라 함수 실행 시간이 증가하는 비율)의 목록이다. Time complexity Name Example 1 Constant Adding an element to the front of a linked list logn Logarithmic Finding an element in a sorted Array n Linear Finding an element in an unsorted array nlogn Linear Logarithmic Sorting n items by 'divide-and-conquer--Mergesort n² Quadratic Shortest path bet..

Application 2022.10.19

애자일 Agile 개발 방법론

전통적인 프로젝트 수행 방식의 한계 프로젝트 초기에 구체적인 요구사항을 도출하기 어렵다. 프로젝트 중간에 발생하는 요구사항의 변경을 반영하기 어렵다. 프로젝트 과정 중 중간 문서 산출물이 많이 요구되어 개발 업무가 지연된다. 프로젝트 관리자 중심의 명령과 통제 방식때문에 구성원은 수동적으로 바뀌고, 커뮤니케이션이 부족하다. 애자일 소프트웨어 개발 선언문의 중심 내용 프로세스와 도구보다는 개인과 개인 간의 상호작용에 더 큰 가치를 둔다. 포괄적 문서화보다는 동작하는 소프트웨어에 더 큰 가치를 둔다. 계약 협상보다는 고객과 협력에 더 큰 가치를 둔다. 계획을 따르기보다는 변화에 대응하는 것에 더 큰 가치를 둔다. 애자일 소프트웨어의 개발 원칙 12가지 소프트웨어 개발의 최우선 목표는 빠르고 지속적으로 가치 ..

Principal 2022.10.17

알아두면 좋을 유용한 JDK 도구

javac, java, jar 도구만 알고 있는가? JDK의 bin/ 디렉토리에는 유용한 도구가 많다. PATH 환경변수에 포함되었다면 어디서든 호출할 수 있다. 어떤 것들이 있는지 알아두면 나중에 유용하게 쓰일 것이다. jps 실행 중인 모든 JVM 목록을 보여준다. 프로세스 ID와 애플리케이션 주 클래스 이름만 출력하므로 프로세스를 구분하기 쉽다. ps aux | grep java 명령어 대신 간단하게 사용해볼 수 있다. -l : 주 클래스의 완전히 식별가능한 이름을 보여준다. -m : main 메서드에 전달된 매개변수를 보여준다. -v : JVM 자체에 전달된 모든 매개변수를 보여준다. javap javap 을 실행하면 해당 클래스 파일의 필드와 메서드를 볼 수 있다. -c : 메서드의 완전한 바이..

Java 2022.10.10

Kotlin과 Java 함께 사용하기

타입 코틀린에서 자바 코드를 불러오면 코틀린 타입으로 전환된다. e.g.) int → Int / Integer → Int! / void → Unit / double[] → DoubleArray! / T[] → Array! / Object → Any 자바의 참조 타입을 코틀린으로 불러오면 타입 이름 뒤에 느낌표가 붙는다. (String! 처럼) 이는 실제 문법은 아니고 IDE에서 Nullable인지 Not-Null인지 알 수 없어서 표시하는 것뿐이다. String! 타입은 String?이나 String으로 적을 수 있으나, null이 들어오지 않는다는 확신이 없으면 String?으로 적어주는 것이 안전하다. 자바에서 @NotNull 어노테이션이 붙은 매개변수 타입은 코틀린에서 String으로 인식된다. 키..

Kotlin 2022.10.08