Kafka 설치해보기

목표

docker 카프카 RKaft 모드(no zookeepler) server 만들기

과정

  1. 윈도우 wsl 우분투 설치
  2. 카프카 docker pull 하기
  3. 카프카 실행시키기
  4. 메세지 보내보기

윈도우에 리눅스 설치

  1. 윈도우 기능 켜기 끄기에서 linux용 하위 시스템 활성화
  1. wsl -l -o 입력하여 설치 가능한 배포 확인
  2. wsl –install [배포판]으로 설치
  3. wsl 입력해서 가상 리눅스로 접속
자세히 보기

Junit 기능 테스트

목표

junit 기본 기능 테스트해보기


주 사용 어노테이션

@Test: 테스트 메서드를 나타냅니다. 이 어노테이션이 붙은 메서드는 테스트 프레임워크에 의해 실행
@BeforeEach: 각 테스트 메서드가 실행되기 전에 실행. 테스트 초기화 작업에 사용
@AfterEach: 각 테스트 메서드가 실행된 후에 실행. 테스트 정리 작업에 사용
@BeforeAll: 모든 테스트 메서드가 실행되기 전에 한 번 실행. 주로 클래스 레벨의 초기화 작업에 사용
@AfterAll: 모든 테스트 메서드가 실행된 후에 한 번 실행. 주로 클래스 레벨의 정리 작업에 사용
@Disabled: 테스트 메서드나 클래스가 실행되지 않음. 주석 처리와 비슷한 역할
@DisplayName: 테스트 메서드의 이름을 지정. 테스트 결과 보고서에 표시


주 사용 펑션들

assertEquals(expected, actual): 두 값이 같은지 확인
assertNotEquals(unexpected, actual): 두 값이 같지 않은지 확인
assertTrue(condition): 조건이 참인지 확인
assertFalse(condition): 조건이 거짓인지 확인
assertNull(object): 객체가 null인지 확인
assertNotNull(object): 객체가 null이 아닌지 확인
assertThrows(expectedType, executable): 예외가 발생하는지 확인

자세히 보기

Java 가상쓰레드 속도 비교

목표

일반 thread 와 가상 thread 속도 비교하기(IO작업)

일반 thread 코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.time.Instant;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class PlatformThreadTest {
public static void main(String[] args) throws Exception {
var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder()
.uri(new URI("http://localhost:4000/"))
.build();

int totalRequests = 100000;
int batchSize = 100;
int numBatches = totalRequests / batchSize;

Instant start = Instant.now();

for (int batch = 0; batch < numBatches; batch++) {
var executor = Executors.newFixedThreadPool(batchSize);
CompletableFuture<?>[] futures = new CompletableFuture<?>[batchSize];

for (int i = 0; i < batchSize; i++) {
futures[i] = CompletableFuture.runAsync(() -> {
try {
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
// System.out.println("Response code: " + response.statusCode());
} catch (Exception e) {
e.printStackTrace();
}
}, executor);
}

CompletableFuture.allOf(futures).join();
executor.shutdown();
executor.awaitTermination(1, TimeUnit.MINUTES);
}

Instant end = Instant.now();
System.out.println("Time taken with platform threads: " + Duration.between(start, end).toMillis() + " ms");
}
}
자세히 보기

Sqlalchemy Pool_recycle 설정

sqlalchemy pool_recycle옵션

  • 세팅한 값(초) 후에 db 커넥션 풀을 다시 만든다. 디폴트는 -1

언제 세팅해야할까?

  • mysql 처럼 디폴트로 커넥션 타임 아웃이 있는 db를 사용할 때 설정해줘야 한다 mysql을 사용하는데 pool_recycle 세팅을 안 한하고 배치 같은 작업을 돌린다면
    1
    sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2006, 'MySQL server has gone away')
    에러를 보게 될 것이다

사용 예시

1
2
POOL_RECYCLE_TIME = 60 * 60 * 4
engine = create_engine(f"mariadb+pymysql://{user}:{passwd}@{host}:{port}/{database}?charset=utf8mb4", pool_recycle=POOL_RECYCLE_TIME)
자세히 보기