TECH/Java
-
Singleton Pattern이란?TECH/Java 2022. 12. 16. 13:55
Singleton Design Pattern 한 클래스에서 여러 객체가 생성될 수 없도록 하는 방법. Singleton 사용 사례 로깅, 데이터베이스 등 Singleton 클래스가 되려면? 반드시 하나의 인스턴스만 갖는다. 인스턴스는 글로벌 범위에서 접근할 수 있어야 한다. Singleton 클래스를 만드는 방법 Eager Initialization 방식, Lazy Initialization 크게 두 방식이 있다. Eager Initialization 클래스의 실제 사용 여부와 무관하게 객체는 무조건 생성된다. 간단하게 구현할 수 있다는 장점이 있는 반면, 실제로 사용되지 않아도 객체를 생성한다는 단점이 있다. Lazy Initialization 실제로 객체가 필요한 시점에 생성된다. Singleton ..
-
Managed Language 자바, 자바는 어떻게 힙에서 제거할 객체를 알아낼까?TECH/Java 2022. 11. 29. 11:23
Managed Language Java vm은 객체가 더 이상 필요 없을 때 메모리를 회수한다. 프로그래머가 직접 메모리를 해제해야 하는 다른 언어와 가장 큰 차이점이다. 자바에서 메모리 leak이 발생하는 것은 불가능하다. 자바에서 new 키워드를 사용할 경우 os에서 메모리를 가져오는 것이 아니라 virtual machine을 통해서 가져오게 된다. virtual machine은 c로 작성된 프로그램이고, 이 프로그램이 os에서 가져온 메모리를 관리한다. 따라서 vm에 문제가 없다면, os 레벨의 메모리 leak은 발생할 수 없다. 메모리 leak이 발생했다면 그것은 vm의 문제이고 자바 프로그래머의 책임이 아니다. GC는 메모리를 free up하는 과정이다. GC는 Lisp에서 개발되었고, 자바는 ..
-
Java String Pool이란?TECH/Java 2022. 11. 17. 20:54
String Interning String의 불변성 덕분에, JVM은 String Pool 내에서 단일 문자열에 대해 단 하나의 복제본만 가짐으로서 String에 할당된 메모리를 최적화 할 수 있다. 이 과정을 interning이라고 한다. String 변수를 만들고, 값을 할당할 때 JVM은 같은 값을 갖는 String 을 pool에서 찾는다. 발견한 경우 Java Compiler는 추가로 메모리를 할당하지 않고 간단히 메모리 주소에 대한 레퍼런스를 응답한다. 발견하지 못한 경우, pool에 String을 추가되고 (interned) 레퍼런스를 응답한다. String constantString1 = "foo"; String constantString2 = "foo"; assertThat(constant..
-
Mono.zipWith 혹은 Mono.zipWhen이 호출되지 않을 때TECH/Java 2022. 10. 23. 19:43
소스 Mono가 empty이거나 Mono인 경우, 일부 조합은 절대 호출되지 않을 수 있다. 정의에 따르면 소스에서 결과물을 만들어 내기 위해 요소가 필요한 zip, zipWith, zipWhen와 같은 transformer(변환 연산자)에서 흔히 발생하는 일이다. 따라서 data-supressing 오퍼레이터를 zip에 사용하는 것은 문제가 된다. data-supressing operators 예시 then thenEmpty(Publisher) ignoreElements ignoreElement() when(Publisher) 설명이 잘 와닿지가 않는데, 간단하게 예시를 통해 살펴보자. @Test void test1() { StepVerifier.create(Mono.empty() // 1 ... em..
-
JVM 메모리 - heap, stackTECH/Java 2022. 8. 7. 11:24
JVM의 메모리는 크게 힙, 스택, 메타 영역으로 나뉜다. 그 중 스택과 힙 영역에 대해 먼저 알아보자. Stack 스택은 쓰레드 생성과 함께 생성된다. 쓰레드는 자신의 스택만 볼 수 있다. 즉 쓰레드 세이프하다.(다른 쓰레드의 데이터를 볼 수 없다.) 함수가 호출될 때 파라미터의 복제본이 스택에 push되고, 해당 함수의 변수들도 스택에 push 된다. 함수가 리턴할 때 스택에 저장된 데이터들이 pop된다. LIFO 구조 Stack에 접근하는 것은 heap 메모리에 접근하는 것보다 빠르다. Heap 스택은 객체와 같은 복잡한 데이터를 저장하는데 사용할 수 없다. primitive 타입과 같은 단순한 데이터 타입만 저장할 수 있ㄷ가. 스택에 저장되지 않은 모든 데이터는 heap에 저장된다. 스택과 달리 ..
-
Slack api 호출시 account_inactive 에러가 발생하는 경우TECH/Java 2022. 2. 5. 09:19
로컬에선 슬랙 API를 정상적으로 호출하던 동작하던 코드가 GitHub에 코드를 올리고, GitHub Action을 통해 실행을 시키면 자꾸 에러가 나는 경우가 있었다. Slack API 문서에 의하면 삭제된 사용자나 워크스페이스에 대한 토큰을 사용한 경우에 발생하는 에러라고 하는데 이런 케이스도 아니였다. account_inactive Authentication token is for a deleted user or workspace when using a bot token https://api.slack.com/methods/auth.test#errors 서버 호출 curl -X POST https://{your-app-url}/v1/message {"message":"account_inactive"..