본문 바로가기
Spring Boot 가상 스레드와 Tomcat 스레드 풀 설정 영향 분석 결과 목적: Spring Boot에서 가상 스레드(Virtual Threads) 활성화가 Tomcat 스레드 풀 설정에 미치는 영향을 실증적으로 분석가설: 가상 스레드 활성화 시에도 Tomcat 스레드 풀 설정이 여전히 필요하고 성능에 영향을 미칠 것결론: 가상 스레드는 Tomcat 스레드 풀 제한을 완전히 우회함, 가상 스레드 true 지정 시 tomcat 설정이 무효화됨실험 환경시스템 정보Java: OpenJDK 21.0.2Spring Boot: 3.4.3서버: 내장 Tomcat 10.1.36테스트 gateway, engine : 192.168.2.13:8751, 192.168.2.13:8731테스트 설정engine-mvc-dev.yamlserver: shutdown: graceful tomcat: .. 2025. 9. 10.
8주차 (16~18장) 16장 플로우16.1 플로우는 연속적인 값의 스트림을 모델링한다16.1.1 플로우를 사용하면 배출되자마자 원소를 처리할 수 있다일시 중단 함수의 한계:// 일시 중단 함수는 단일 값만 반환 가능suspend fun createValues(): List { return buildList { add(1) delay(1.seconds) add(2) delay(1.seconds) add(3) delay(1.seconds) }}// → 3초 후에 모든 값이 한번에 출력됨플로우의 장점:// 플로우는 값이 계산되자마자 즉시 처리 가능fun createValues(): Flow { return flow { emit(.. 2025. 9. 1.
7주차(14,15) 14장 코루틴14.4-14.6 코루틴왜 코루틴이 필요할까?문제: 블로킹 코드의 한계*// 기존 방식 - 스레드를 블록시킴* fun showUserInfo(credentials: Credentials) { val userID = login(credentials) *// 네트워크 요청 (2초 대기)* val userData = loadUserData(userID) *// 네트워크 요청 (3초 대기)* showData(userData) *// 화면에 표시*}*// 문제점:// 1. 총 5초 동안 스레드가 멈춤// 2. UI가 있다면 화면이 얼어버림// 3. 서버라면 다른 요청을 처리할 수 없음*해결: suspend 함수 사용*// 코루틴 방.. 2025. 9. 1.
6주차 (13장) 13.1 API에서 DSL로목표: 깔끔한 API 만들기깔끔한 API의 2가지 조건*// 1. 명확성 - 무슨 일이 일어날지 명확하게 이해 가능*val user = User.Builder() .name("김철수") .email("chulsu@email.com") .build()*// 2. 간결성 - 불필요한 구문 최소화*val user = user { name = "김철수" email = "chulsu@email.com"}코틀린의 간결한 구문들Before vs After 비교*// 일반 구문 (번잡함)*StringUtil.capitalize(s)1.to("one")set.add(2)map.get("key")file.use({ f -> f.read() })val m = mutabl.. 2025. 9. 1.
5주차(11~12장) 11장 제네릭스타입을 나중에 지정할 수 있게 해주는 문법코드 재사용 가능(다양한 타입에도 동작함), 타입 안정성 확보(엉뚱한 타입 못넣음)List은 문자열만 담는 리스트List는 숫자만 담는 리스트// 일반 - String만 담을 수 있음val stringBox: List = listOf("사과", "바나나")// 제네릭 - 어떤 타입이든 담을 수 있음fun makeBox(): List = listOf()11.1 타입 인자를 받는 타입 만들기: 제네릭 타입 파라미터11.1 타입 인자를 받는 타입 만들기기본 개념*// 이렇게 쓰는 것들이 제네릭!*val numbers: List = listOf(1, 2, 3)val names: List = listOf("철수", "영희")val pairs: Map = m.. 2025. 9. 1.
4주차(9~10장) 9장 연산자 오버로딩과 다른 관례(convention)관례(Convention)란?특정 함수 이름과 언어 기능을 연결하는 약속9.1 산술 연산자 오버로딩기본 개념연산자를 오버로딩하는 함수 앞에는 반드시 operator가 있어야 함→ 실수로 관례에서 사용하는 함수 이름을 사용하는 경우를 막아줌data class Point(val x: Int, val y: Int) { operator fun plus(other: Point): Point { return Point(x + other.x, y + other.y) }}val p1 = Point(10, 20)val p2 = Point(30, 40)val p3 = p1 + p2 *// Point(40, 60) - plus 함수 호출됨!*지원.. 2025. 9. 1.
3주차 (6~8장) 6장 컬렉션과 시퀀스6.1 컬렉션에 대한 함수형 API6.1.1 filter와 mapval numbers = listOf(1, 2, 3, 4, 5)// filter: 조건에 맞는 것만 골라내기val evenNumbers = numbers.filter { it % 2 == 0 } // [2, 4]// map: 각 원소를 다른 형태로 변환val squares = numbers.map { it * it } // [1, 4, 9, 16, 25]6.1.2 reduce와 fold : 값들을 하나로 합치기val numbers = listOf(1, 2, 3, 4)// reduce: 첫 번째 값부터 시작해서 차례로 합치기val sum = numbers.reduce { acc, element -> acc + eleme.. 2025. 9. 1.
2주차 (4~5장) 4장 클래스. 객체, 인터페이스4.1 클래스자바와 달리 코틀린 선언은 기본적으로 final이며 public이다. 게다가 내포 클래스는 기본적으로는 내부 클래스가 아니다. 즉, 코틀린 내포 클래스에는 외부 클래스에 대한 암시적 참조가 없다자바에서는 A클래스 안에 B클래스를 정의하면 B클래스는 자동으로 A클래스의 내부 클래스가 되어 A클래스 안의 객체를 참조할 수 있음. 코틀린에서는 이 경우 기본적으로 중첩 클래스가 된다. 내부 클래스로 만들고 싶으면 inner 를 붙여 클래스를 선언해야 함4.1.1 코틀린 인터페이스코틀린 인터페이스 인터페이스를 정의하고 구현하는 방법추상 메서드 뿐 아니라 구현이 있는 메서드도 정의할 수 있다.인터페이스에는 아무런 상태도 들어갈 수 없다.4.1.2 open, final, a.. 2025. 9. 1.
1주차 (1~3장) https://play.kotlinlang.org/1장다중 패러다임 언어, 정적 타입지정 언어(statically typed)→ 실행 시점이 아니라 컴파일 시점에 많은 오류를 잡아낼 수 있다객체 지향 언어와 함수형 언어 아이디어의 조합특성 1. 정적 타입 지정성능, 신뢰성, 유지보수성 향상타입 추론: 컴파일러가 문맥을 고려해서 자동으로 변수 타입 지정널이 될 수 있는 타입: 신뢰성 향상 (NullPointerException 방지)val name = "홍길동"// String 타입 자동 추론val age: Int = 25// 명시적 타입 지정val email: String? = null// 널 허용 타특성 2. 객체 지향과 함수형 프로그래밍의 조합객체 지향: 클래스, 상속, 캡슐화 지원함수형: 일급 시민.. 2025. 9. 1.