일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- disjoint set
- kapt
- 분리 집합
- tarjan
- DP
- union-find
- 위상정렬
- concurreny
- Linux
- BindingAdapter
- Java
- kruskal
- 구현
- 알고리즘
- SCC
- spring boot
- 누적 합
- Meet in the middle
- 투 포인터
- 페르마 소정리
- BFS
- MST
- springdoc
- 그래프
- miller-rabin
- 위상 정렬
- 이분 탐색
- MySQL
- 백트래킹
- DFS
- Today
- Total
목록전체 글 (52)
기맹기 개발 블로그
'도커 교과서' 책을 읽으면서 도커 이미지 빌드 캐싱에 대해서 접하게 되었고, 스프링부트 애플리케이션은 어떻게 최적화할 수 있을지 생각해보며 정리하게 되었습니다. 가장 기본적인 형태의 도커 이미지는 아래와 같습니다. FROM adoptopenjdk:11-jre-hotspot WORKDIR my-application COPY target/my-application.jar . ENTRYPOINT ["java", "-jar", "my-application.jar"] 도커 이미지는 Dockerfile에 정의된 인스트럭션마다 layer를 가집니다. 위의 예시에서는 기반이 되는 jre 이미지 위에 WORKDIR, COPY, 그리고 jar를 실행하는 ENTRYPOINT 레이어로 구성되어 있습니다. 하지만 개발 시에 ..
1. 원인 파악 nginx를 80포트에서 실행하려고 한다. 하지만 이미 80포트를 사용하고 있어서 실행되지 않는다. 우선 80포트를 사용중인 프로세스들을 조회해보자. $ sudo lsof -i :80 -P -t 그렇다면 아래처럼 pid 목록이 나온다. 9130 9131 9132 심지어 여러개이다. 위 프로세스들을 조회해보자. $ ps -aux | grep -e 9130 -e 9131 -e 9132 아래처럼 프로세스 상세 정보를 얻을 수 있다. root 9130 0.0 0.4 6676 4716 ? Ss 09:06 0:00 /usr/sbin/apache2 -k start www-data 9131 0.0 0.4 752812 4400 ? Sl 09:06 0:00 /usr/sbin/apache2 -k start ..
이번에 젠킨스를 사용해보려고 AWS EC2 프리티어를 하나 더 만들었다. 프리티어라서 t2.micro를 사용하는데, 램 용량이 1GiB이다. CloudWatch를 이용해서 인스턴스 메모리 사용량을 모니터링해보자. 위는 젠킨스 컨테이너를 실행한 이후에 메모리 사용량이다. 51.9% (약 500MiB)를 사용한다. 벌써부터 예감이 좋지 않다. gradle 빌드까지 하면 메모리가 부족해진다. 이로 인해서 인스턴스의 응답이 오지 않아서 중지 후 재실행해야한다. 메모리 스왑 근본적인 방법은 메모리가 넉넉한 인스턴스 유형으로 변경하는 것이겠지만, 주어진 메모리에서 최선을 다해보자. 메모리 스왑을 이용해서 disk의 일부 용량을 메모리처럼 활용해야 한다. aws에 따르면 2GiB 이하의 메모리에서는 [메모리 * 2]..
분산 스트리밍 플랫폼 상위 계층의 메시지 브로커 내부적으로는 그 자체로 분산시스템 메시지들을 관리하기 위해 여러 개의 브로커들을 사용 Apache Kafka vs. RabbitMQ 아파치 카프카 장점 대규모 실시간 데이터 처리에 적합한 분산 메시징 시스템 초당 수백만 개의 메시지를 처리할 수 있는 고성능을 가지고 있음 데이터의 보존성을 보장하기 위해 데이터를 디스크에 저장함 브로커를 추가하여 확장이 가능하며, 다양한 클라이언트 라이브러리를 제공함 대규모 로그 처리, 이벤트 스트리밍, 실시간 스트리밍 등 다양한 분야에서 사용됨 단점 복잡한 설정과 운영이 필요하며, 초기 구성 시간이 오래 걸림 복잡한 메시지 패턴을 지원하지 않음 메시지에 대한 응답 시간이 길어질 수 있음 RabbitMQ 장점 높은 신뢰성과 ..
테이블을 설계할 때 큰 길이의 문자열이 들어갈 것으로 예상되는 컬럼에는 TEXT 타입을 선언해본 경험이 있다. 그렇다면 VARCHAR 와 TEXT 는 무엇이 다르며, 각 타입은 어떤 경우에 설정하는 것이 적절한지 알아보도록 하자. 1. 문자열 타입들 VARCHAR와 TEXT를 비교하기 앞서서 문자열 타입들의 종류와 특징들을 살펴보자. 1-1. CHAR , VARCHAR CHAR은 고정 길이 문자열으로, 테이블 정의에 선언된 길이로 고정된다. 따라서 남은 공간은 공백으로 채워진다. 그렇다면 다음의 경우 조회 쿼리의 결과는 어떻게 될까? CREATE TABLE my_test (name CHAR(10)); INSERT INTO my_test VALUES ('hello'); SELECT name = 'hello..
1. JVM, JRE, JDK JVM (Java Virtual Machine) 스택 기반의 VM 명령어와 데이터가 모두 스택에 저장된다. 장점 : 스택에 저장된 값의 메모리 주소를 사용하지 않기 때문에 명령어 크기가 작다. 단점 상수 값에 비해 스택에서 값을 가져오는 작업이 느려서 성능이 떨어질 수 있다. 스택에 저장된 값이 메모리 상에 연속적으로 존재하지 않기 때문에 캐시 효율성이 떨어질 수 있다. 레지스터 기반 VM은? 레지스터에 저장된 값을 직접 사용하기 때문에 스택 기반 VM보다 빠르지만, 메모리 사용량이 증가한다. 바이트코드를 OS에 의존적인 머신코드로 변환하여 실행한다. JVM 자체는 바이트코드를 실행하는 표준이며, 특정 벤더에 의해서 구현된다. JVM Specification (Java SE..
이 글은 인프런 강의 재고시스템으로 알아보는 동시성이슈 해결방법 을 수강하고 정리한 내용입니다. 동시성 이슈 하나의 공유 자원에 동시에 여러 스레드가 쓰기 작업을 하는 상황에서는 Race condition이 발생할 수 있다. 간단한 재고 관리 시스템을 예시로 웹 애플리케이션에서의 동시성 이슈와 해결 방법들을 알아보자. @Service public class StockService { ... @Transactional public void decrease(Long id, Long quantity) { Stock stock = stockRepository.findById(id).orElseThrow(); stock.decrease(quantity); stockRepository.saveAndFlush(sto..
JIT 메소드 인라인 OOP에서 캡슐화를 위해 private 필드를 게터/세터만을 이용해서 접근할 수 있도록 합니다. 이로 인해 메소드 호출 스택이 늘어나는 오버헤드가 발생하지 않을까라는 의문을 해결해보고자 합니다. Java JIT 컴파일러의 최적화 Java는 컴파일과 인터프리터 방식을 모두 사용합니다. *.java 코드는 javac에 의해 *.class의 바이트코드로 변환됩니다. JVM 내부에서는 바이트코드를 네이티브 코드로 변환하기 전에 JIT(Just-In-Time) 컴파일러는 런타임에 바이트코드를 최적화합니다. 이 때 최적화를 위해 메소드 인라이닝이 진행됩니다. 메소드 인라이닝 메소드 인라이닝 (inlining)이란 메소드를 호출을 본문으로 대체하는 것입니다. JIT 컴파일러는 자주 호출하는 메소..