컨셉 - JetBrains 사에서 만든 언어- JVM 기반 언어 - .java에서 컴파일된 .class 파일을 동일하게 코틀린에서도 사용 - 자바에서 소스파일을 .java로 사용하듯 코틀린에서 같은 레벨에 .kt 파일로 정의됨- 코틀린이 자바와 100% 호환될 수 있는 이유: 코틀린도 .class 파일로 컴파일되기 때문. 따라서 import를 통해 코틀린 소스코드 내에서 자바 라이브러리, 스프링 등을 참조할 수 있음(import 시 이미 컴파일된 class를 참조하기 때문)- 2016년 코틀린 1.0 릴리즈, 스프링 프레임워크 5.0부터 코틀린 공식 지원, gradle의 경우 Groovy에 더해 Kotlin DSL 지원- JetBrains 사에서 코틀린 기반의 백엔드 애플리케이션 프레임워크 ..
jib 개요 Jib은 Docker 데몬 없이 Java 애플리케이션에 최적화된 Docker 및 OCI 이미지를 빌드하고 Docker Hub와 같은 레지스트리로 저장하는 '플러그인'이다. jib은 gradle, maven과 같은 빌드툴과 함께 사용된다. jib과 기존 Dockerfile 기반 빌드 비교 위 그림과 같이 jib은 빌드와 Dockerfile 작성의 과정을 하나의 파이프라인으로 단일화한다. jib은 프로젝트를 빌드함과 동시에 컨테이너 이미지까지 만들어서 Docker Hub, AWS ECR 등 원하는 레지스트리에 푸시까지 해준다. jib 장점 1) Fast Jib은 애플리케이션을 여러 계층으로 분리하여 클래스에서 종속성을 분리한다. 이제 Docker가 전체 Java 애플리케이션을 다시 빌드할 때까지..
이번 포스팅에서는 Jenkins를 기반으로 CI(Continuous Integration)를 구축했던 과정을 다룬다. Jenkins에서 제공하는 플러그인들과 기능들을 활용하여 빌드 파이프라인 구성뿐만 아니라, 빌드 자동화, 테스트 자동화, 코드 품질 자동화 등의 작업을 파이프라인 상에 같이 연동시켜 사용하는 경우가 많다. 이번 포스팅에서는 Jenkins를 설치하고 간단한 빌드 파이프라인을 구축하는 과정만 다룰 것이고 아래와 같은 순서로 구성된다. 1) Jenkins 설치 및 기본 설정 (컨테이너 기반 Jenkins 설치, 플러그인 설치, SSH 셋업) 2) CI/CD Pipeline Job 구성 (GitHub 연동, Jenkinsfile 작성) 3) 이슈 처리 cf. Jenkins는 Java 프로그램이기..
최종 연산과 중간 연산 스트림이란 일련의 데이터의 흐름이다. 실질적으로는 스트림은 인스턴스로 존재하고 여러 개의 파이프를 통과함으로써 알련의 작업이 처리된다. 여기서 파이프는 메소드 호출을 통해 이루어진다. 최종 연산을 담당하는 파이프는 가장 마지막에 위치해야 한다. 최종 연산이 아닌 그 외 연산은 모두 중간 연산이라고 부른다. - 최종 연산(Terminal Operation) : 스트림을 연산하기 위한 파이프 중 가장 마지막의 연산을 담당하는 파이프 - 중간 연산(Intermediate Operation) : 최종 연산이 아닌 파이프에서 처리되는 연산들 예를 들어 홀수만 찾아내고 이들의 합을 구하는 연산이 있다고 가정하면 총 2가지 연산(홀수 찾기, 더하기)이 존재하고 이들 간의 순서는 홀수를 찾는 것..
아파치 Tomcat의 BIO Connector / NIO Connector 개념 1) BIO Connector - Response를 보내고 끝내는 것이 아니라 TCP Connection이 만료될 때까지 Thread가 활성 상태로 남아있으며 소켓이 닫히면 Pool로 반환되는 구조 - Connection이 만료되기 전까지 Thread가 활성상태로 남아 있기 때문에 Idle Thread 발생 - '최대 동시접속 클라이언트 수'와 '쓰레드 풀의 쓰레드 수'가 같음 2) NIO Connector - Java의 I/O 라이브러리인 NIO를 활용하여 Tomcat에서 만들어진 Connector - Poller라는 단일 쓰레드가 Selector를 이용하여 처리가 가능한 순간에만 Thread를 활성화시킴으로써 Idle T..
디폴트 메소드 도입 자바 8부터 인터페이스의 기능이 개선되었다. 그중 하나가 인터페이스가 구현체를 가지게 된 것인데 이것이 인터페이스의 디폴트 메소드이다. 인터페이스는 모든 메소드가 추상 메소드로만 이루어진 클래스를 의미한다. 하지만 자바 8부터 디폴트메소드가 인터페이스에 들어갈 수 있게 되면서 추상 클래스와의 차이가 거의 없어졌다. 예시 default void say() { // 디폴트 메소드의 구현 몸체부 // 디폴트 메소드의 구현 몸체는 이를 구현하는 클래스가 아닌, // 인터페이스가 자체적으로 가지고 있음 } 디폴트 메소드를 사용하는 이유 - 어뎁터의 기능 사용 - 디폴트 메소드 등장으로 인해 static 메소드도 가질 수 있게 됨. - default, static 메소드들은 implements를..
Collection 인스턴스 동기화 - 2개 이상의 쓰레드가 컬렉션에 동시에 접근한다는 가정이 필요할 땐 동기화를 해주어야 한다. - 일반적인 대부분의 컬렉션들(ArrayList, HashMap 등)은 동기화가 되어있지 않다. 컬렉션 동기화 메소드 1) public static Set synchronizedSet(Set s) 2) public static List synchronizedList(List list) 3) public static Map synchronizedMap(Map m) 4) public static Collection synchronizedCollection(Collection c) - 위 메소드에서 동기화가 되어 있지 않은 컬렉션을 인자로 주면 동기화 기능이 추가된 컬렉션으로 반환..
정렬 알고리즘에서 시간복잡도의 핵심 - 정렬 알고리즘의 평균적인 시간복잡도는 C * nlg(n) + A이지만 (C는 상수) 여기서 C값을 결정하는 요인은 '지역성의 원리'이다. - 지역성의 원리란 '최근에 참조된' 또는 '참조된 데이터의 주변의 데이터'가 또다시 참조될 가능성을 의미한다. - 따라서 이를 활용하면 캐시 hit 발생률이 높아지고 메모리까지 가지 않아도 빠르게 데이터를 읽어올 수 있다. - 예를 들어, merge sort의 경우에는 인접한 데이터들끼리 쪼개서 정렬 후 병합하기 때문에 지역성의 원리가 잘 활용된다고 볼 수 있다. - 퀵 소트의 경우 pivot 주변에서 데이터의 이동이 빈번하게 발생하기 때문에 작은 C값을 가진다. (퀵 소트는 추가적인 메모리 사용 없이도 정렬한다는 점에서 '평균..
- Total
- Today
- Yesterday
- K8s
- kafka
- Non-Blocking
- LFCS
- golang
- Kubernetes
- 컨트롤러
- 코틀린
- Java
- GitOps
- github actions
- go
- db
- CICD
- Linux
- 우분투
- ubuntu
- argocd
- 쿠버네티스
- docker
- Controller
- Kotlin
- RDB
- Stream
- ci/cd
- spring
- container
- rolling update
- 카프카
- jvm
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |