전체 글 180

[JAVA] InitialRAMPercentage / MaxRAMPercentage 옵션

java -XX:InitialRAMPercentage=70.0 -XX:MaxRAMPercentage=70.0 -jar MyApp.jar Java8에서 도입된 InitialRAMPercentage / MaxRAMPercentage은 각각 JVM의 초기, 최대 힙 사이즈를 설정하는데 사용함 JVM은 프로그램 실행 중에 메모리를 사용하여 객체를 생성하고 관리하는데, 이때 JVM은 힙 메모리라는 메모리 영역을 사용함, 해당 옵션들은 힙 메모리의 크기를 설정하여 JVM의 성능을 최적화할 수 있게 해줌 InitialRAMPercentage JVM이 시작될 때 할당되는 초기 힙 크기를 설정, 전체 시스템 메모리의 백분율로 표현 예를 들어서 시스템 메모리가 4GB인 경우, -XX:InitialRAMPercentage=..

JAVA 2023.05.31

[OTHER] 헥사고날 아키텍처

계층형 아키텍처의 문제 계층형 아키텍처는 토대가 DB이기 때문에, DB 주도 설계를 유도함 계층형 아키텍처는 DB중심적인 아키텍처이기 때문에 비즈니스 관점에서 맞지 않음 → 도메인 로직을 먼저 만들고 제대로 이해해야하 영속성과 웹계층을 만들 수있음 계층형 아키텍처는 같은 계층에 있는 컴포넌트나 아래 계층에 접근이 가능하기 때문에 암묵적으로 용인하면 영속성 → 도메인으로 접근하는 코드가 늘어나게 됨 계층형 아키텍처는 시간이 지나면서 시스템이 비대해질수록, 계층을 건너뛰어 접근하는 경우도 생기게 되면서, 도메인 로직이 전체에 걸쳐 책임이 섞이게 됨 계층형 아키텍처의 이러한 문제의 해결방법으로는 DIP(의존성 역전법칙)으로 해결을 했었음 → 모든 계층에 DIP로 해결해서 적용하면 헥사고날 아키텍처의 형태를 띄..

OTHER 2022.09.06

[KAFKA] 기본 개념

Kafka 정의 이벤트 스트리밍 플랫폼 Kafka 아키텍처 Kafka는 발행-구독(publish-subscribe) 모델을 기반으로 동작하며 크게 프로듀서, 컨슈머, 브로커로 구성 프로듀서는 메세지(이벤트)를 카프카에 넣고, 브로커는 메세지(이벤트)를 저장 (브로커는 일반적으로 3대이상 구성, 클러스터 형태), 컨슈머는 메세지(이벤트)를 읽는 역할 주키퍼는 카프카 클러스터를 관리하는 역할, 추후에는 컨플루언트에서 주키퍼와 연동하지 않도록 구성할 예정이라고함 Kafka 구성요소 Topic / Partition / Offset 종류 Topic 메세지를 구분하는 단위 즉 특정 스트리밍 데이터임 (예시로 파일시스템 폴더라고 생각하면됨) 토픽은 이름으로 구분 한개의 토픽은 한개 이상의 파티션으로 구성됨 Parti..

KAFKA 2022.09.06

[OTHER] 동시성 문제 해결 방법

동시성 문제 해결 방법 Synchronized 이용 RDB Lock 활용 Redis 활용 (Lettuce or Redisson) Synchronized 이용 Synchronized 키워드를 통하여 메소드 해당 블럭을 동기화처리를 함 Synchronized가 선언된 블럭에는 동시에 하나의 스레드만 접근이 가능하기 때문에 동시성 문제를 해결가능 하지만 Synchronzied를 통하여 해결하는 방법은 단일 인스턴스일 경우에만 가능함, 예를 들어서 데이터에 여러개의 인스턴스가 접근하는 경우에는 다수의 인스턴스가 접근이 가능하기 때문에 레이스컨디션이 발생함 (실무에서는 거의 사용되지 않는 방법) RDB Lock 활용 Lock 종류 종류 특징 Pessmistic Lock 실제로 데이터에 Lock을 걸어 정합성을 맞..

OTHER 2022.09.01

[KOTLIN] 불필요한 객체 생성을 피하라

객체 생성 비용 발생하는 경우 64비트 JDK에서 객체는 8바이트의 배수, +_앞부분은 12바이트 헤더 캡슐화된 객체는 함수 호출 비용이 발생하며 비용은 크지는 않지만 티끌모아태산임 객체 생성시 비용이 발생함 불필요한 객체를 제거할 방법 객체 선언 객체를 재사용함 캐시를 활용하는 팩토리 함수 팩토리 메서드를 가지면 캐시를 가질수 있음 쓰레드풀, 커넥션풀 등 객체생성이 무겁고 동시에 여러 mutable 객체를 사용하는 경우 적합함 모든순수 함수는 캐싱을 활용할 수 있음 (메모이제이션)적합 캐싱처리하면 대신 메모리 사용은 증가, 적절하게 활용해야함 private val FIB_CACHE = mutableMapOf() //캐싱 처리해서 재사용 예시 fun fib(n: Int): BigInteger = FIB_..

KOTLIN 2022.08.03

[KOTLIN] SEALED CLASS

Sealed 클래스 자기 자신이 추상클래스이고, 자신을 상속받는 여러 서브 클래스들을 가질 수 있음 enum 클래스와 달리 상속을 지원하여, 상속을 활용하여 구현이 가능 자신을 상속받는 서브 클래스의 종류를 제한할 수 있음 Sealed 클래스 특징 서브 클래스들은 반드시 같은 파일 내에 선언 되어야함 sealed 클래스는 기본적으로 추상클래스임 sealed 클래스는 private 생성자를 기본적으로 가지게 됨 Sealed 클래스 예시 sealed class Color { data class Red(val r: Int, val g: Int, val b: Int) : Color() data class Orange(val r: Int, val g: Int, val b: Int) : Color() data cl..

KOTLIN 2022.07.27

[KOTLIN] 멤버 확장 함수의 사용을 피하라 (이펙티브 코틀린)

멤버 확장 함수의 사용을 피하라 어떤 클래스에 대한 확장함수를 정의할 때 이를 멤버로 추가하는 것은 좋지 않음 암묵적 접근을 할 때 두 리시버 중에서 어떤 리시버가 선택될지 혼란스러움 class A { val a = 10 } class B { val a = 20 val b = 30 fun A.test() = a + b // 40일까? 50일까? } fun main() { B().apply { println(A().test()) } // 정답 : 40 } 확장함수가 외부에 있는 다른 클래스를 리시버로 받을 경우, 해당 함수가 어떻게 동작하는지 애매모호하게 됨 class A { var state = 10 } class B { var state = 20 fun A.update() = state + 10 // ..

KOTLIN 2022.07.27

[KOTLIN] 복잡한 객체를 생성하기 위한 DSL을 정의하라 (이펙티브 코틀린)

DSL Domain Specific Language의 약자로 특정 도메인에 국한해 사용하는 언어 코틀린을 통하여 DSL들을 접하는 경우가 많음 코틀린 DSL 예시 Gradle DSL plugins { 'java-library' } dependencies{ api("junit:junit:4.12") implementation("junit:junit:4.12") testImplementation("junit:junit:4.12") } configurations{ implementation{ resolutionStrategy.failOnVersionConflict() } } Test DSL class MyTests: StringSpec({ "반환되는 길이는 String의 크기이어야 합니다." { "test s..

KOTLIN 2022.07.20

[KOTLIN] 일반적인 프로퍼티 패턴은 프로퍼티 위임으로 만들어라 (이펙티브 코틀린)

프로퍼티 위임 코틀린에서 제공하는 관례에 의존하는 특성 중 하나 프로퍼티 위임을 사용하면 값을 뒷받침 하는 필드에 단순히 저장하는 것보다 더 복잡한 방식으로 작동하는 프로퍼티를 쉽게 구현 가능함 일반적인 프로퍼티의 행위를 추출해서 재사용이 가능함 프로퍼티 위임 예시 var token: String? = null get() { print("token returned value $field") return field } set(value) { print("token changed from $field to $value") field = value } var attempts: Int = 0 get() { print("attempts returned value $field") return field } set(..

KOTLIN 2022.07.13

[KOTLIN] 제네릭 타입과 VARIANCE 한정자를 활용하라 (이펙티브 코틀린)

제네릭 요약 참고 https://tgyun615.com/134?category=908821 [JAVA] 제네릭 제네릭 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법 외부에서 사용자에 의해 타입이 지정되는 것을 의미 제네릭 장점 잘못된 타입이 들어올 수 있는 것을 tgyun615.com Variance 한정자 (out / in) class Box fun main(args: Array) { val box1: Box = Box() // OK!! val box2: Box = Box() // Compile Error!! } ---------------------------------------------- class Box fun main(args: Array) { val box1..

KOTLIN 2022.07.10