- [ Language/JAVA ]Java 21 Virtual Thread 알아보기2025-04-11 14:23:44Java 21에서 도입된 Virtual Thread는 기존의 플랫폼 스레드 모델과는 근본적으로 다른 방식으로 동작하는 새로운 스레드 개념이다.기존 Thread의 구조와 문제점기존 Java 스레드는 Thread 클래스를 통해 생성되며, 각 Java 스레드는 OS 커널 스레드와 JNI(Java Native Interface)를 통해 매핑되는 1:1 모델을 기반으로 한다.스레드 실행 중 I/O 작업이나 sleep() 상태가 발생하면, 운영체제는 효율적인 자원 활용을 위해 컨텍스트 스위칭을 수행한다. 이 과정에서 현재 실행 중인 Kernel Level Thread의 작업을 일시 중단하고 다른 Thread로 전환하게 된다. 컨텍스트 스위칭은 CPU 레지스터, 스택 포인터, 명령어 포인터와 같은 실행 상태 정보를 ..
- [ Programming Note ]CLOB과 BLOB2025-04-08 14:26:41대용량 데이터를 저장하고 처리할 때 CLOB과 BLOB은 매우 유용한 데이터 타입이다. 각각의 특징과 용도를 자세히 살펴보면, 어떤 상황에서 어느 타입을 선택해야 할지 명확해진다.발음 참고: 흔히 "클롭, 블롭"으로 읽히지만, Oracle 공식 문서에 따르면 올바른 발음은 '씨랍'과 '비랍'이다.CLOB의 특징CLOB (Character Large Object)는 대량의 텍스트 데이터를 저장할 수 있는 데이터 타입이다.저장 용량: 일반적으로 최대 4GB까지 저장 가능하며, 데이터베이스 시스템에 따라 다를 수 있다.용도: 긴 문서, HTML/XML 문서, 다양한 언어(UTF-8, UTF-16 등)로 된 콘텐츠 등 대용량 텍스트 데이터 관리에 최적화되어 있다.기능: 텍스트 검색과 조작이 용이해 문서 버전 관..
- [ Programming Note ]Session Storage, Local Storage, IndexedDB2025-04-04 14:40:30웹 애플리케이션에서 클라이언트 측 데이터 저장 방식으로 Session Storage, Local Storage, IndexedDB가 있다. 이 저장소들은 각각 고유한 목적과 특성을 가지고 있어, 다양한 웹 개발 시나리오에 유연하게 대응할 수 있다. 1. Session StorageSession Storage는 브라우저 세션 동안에만 임시로 데이터를 저장하는 클라이언트 측 저장소이다. 사용자가 브라우저 탭을 닫거나 새로고침 하면 저장된 데이터가 즉시 삭제된다. 이는 단기적이고 일시적인 데이터 관리에 최적의 설루션이다. 장점- 세션 고유의 데이터 관리- 직관적이고 간편한 데이터 조작 단점 - 일시적인 데이터 저장// 데이터 저장sessionStorage.setItem("username", "JohnDoe")..
- [ Language/JAVA ]Java 패턴 매칭(Pattern Matching)2025-03-25 15:40:231. Java의 Pattern Matching이란?Pattern Matching은 Java에서 보다 간결하고 읽기 쉬운 코드를 작성하기 위해 도입된 기능이다.이는 조건 검사를 더 효율적으로 수행하고, 복잡한 객체의 타입을 식별하여 각 상황에 맞는 동작을 실행할 수 있도록 돕는다.주요 예제로는 switch 문과 instanceof 연산자를 활용한 Pattern Matching이 있다. 이 기능은 조건문에서 불필요한 반복 코드를 제거하고 코드의 가독성을 높인다.2. Pattern Matching의 특징기존의 Java 코드에서는 타입 확인 후 명시적으로 타입 변환(casting)을 수행해야 했다. Pattern Matching은 이러한 과정을 자동화하여 코드량을 줄이고, 가독성을 높여 준다. 그리고 Patte..
- [ Language/JAVA ]Java 16 Record class2025-03-24 15:41:261. record 키워드란?Java 16에서 도입된 record는 불변 객체를 생성하기 위한 특별한 클래스 유형이다.쉽게 말해, record를 사용하면 모든 필드가 자동으로 final로 선언되며, 객체의 상태를 변경할 수 없게 된다. 이는 데이터 전송 객체(DTO; Data Transfer Object)나 간단한 데이터 구조를 만들 때 매우 유용하다. record는 기본적으로 데이터의 저장과 접근을 간편하게 해주는 메서드를 자동으로 생성해 주기 때문에, 개발자는 반복적인 코드 작성을 줄일 수 있다.예를 들어, 일반적인 Java 클래스에서는 필드를 정의하고, 생성자, 접근자(getter) 메서드, toString(), equals(), hashCode() 메서드를 수동으로 작성해야 했다. 하지만 recor..
- [ Language/JAVA ]Java 17 sealed class (sealed - permit 예약어)2025-03-24 14:30:231. sealed 키워드란Java 17에서 sealed - permits 예약어가 추가되었다. sealed는 봉인된이라는 뜻으로, 기존에 상속을 완전히 차단하는 final과는 다르게, 일부 하위 클래스에 한하여 상속을 허용하는 기능을 제공한다. 이를 통해 상속 계층을 명확하게 정의하고 불필요한 확장을 방지하여 더 안전한 코드 설계를 가능하게 한다.하지만 sealed 키워드는 유연성을 일부 희생해야 하는 단점도 존재한다. 새로운 하위 클래스를 추가하려면 원본 클래스를 수정해야 하므로 유지보수가 번거로울 수 있으며, permits 목록이 길어질 경우 관리가 어려워질 수 있다.2. sealed 키워드의 특징sealed 예약어는 클래스(class)뿐만 아니라 인터페이스(interface)에도 사용할 수 있다. ..
- [ Programming Note ]컴퓨터에서 수와 문자의 표현2025-03-24 00:56:41비트(Bit)와 바이트(Byte)컴퓨터는 2진수를 사용한다. 전기를 이용하여 표현할 수 있는 건 전기가 흐르거나(1) 전기가 흐르지 않거나(0)로 2가지뿐이라는 것이다. 이 최소 단위를 비트(Bit)라고 부른다. 언뜻 보이기에는 2진수를 이용해 표현할 수 있는 것이 많아 보이진 않지만 이 비트를 여러 개 조합하면 아주 많은 것들을 표현할 수 있다. 이 비트를 4개만 합쳐도 0000, 0001, 0010, 0011, 0100, 0101, 0110… 1111까지 2^4개인 16개 표현이 가능해진다. 비트를 늘릴수록 2의 제곱수로 가짓수가 늘어나므로 부족하진 않은 셈이다. 하지만 우리는 컴퓨터를 사용하면서 비트라는 단위보다 더 많이 듣는 단위가 있다. 바로 바이트(Byte)이다.바이트는 8개의 비트를 합친 크..
- [ Develope/Discord ][Discord Bot] #1 디스코드 봇 시작하기2025-02-10 17:15:24디스코드를 사용하다 보면 다양한 기능을 제공하는 봇(bot)을 자주 만나게 됩니다. 이러한 봇들은 서버에 편의 기능이나 콘텐츠를 추가하는 데 활용되며, 음악 재생, TTS(Text-to-Speech), 서버 관리 지원 등 다양한 역할을 수행합니다. 본격적으로 봇을 개발하기 전에, 그 동작 원리를 먼저 살펴보겠습니다. 디스코드 봇 동작 원리우선 디스코드 플랫폼과 개별 서버(길드)의 개념을 명확히 구분할 필요가 있습니다. 디스코드는 분산된 서버 인프라를 통해 운영되며, 사용자가 개설하는 각각의 서버(길드)는 독립적인 커뮤니티를 형성합니다. 본 문서에서는 디스코드 플랫폼을 '디스코드 플랫폼', 사용자가 개설하는 서버를 '길드'라고 부르겠습니다. 디스코드 봇은 단순한 프로그램이 아니라, 디스코드 플랫폼과 지속..
- [ Programming Note ]Docker 원격 사용 및 Docker Engine API2024-12-19 17:16:23Docker는 기본적으로 Server-Client 구조로 되어있기 때문에 원격 사용이 가능하다.우리가 흔히 사용하는 Docker CLI는 Client이고 모든 기능은 Docker Daemon이라는 Server를 호출하여 사용하는 구조이다. 이를 모두 묶어서 Docker Engine이라고 부른다.(Docker Desktop은 Docker CLI를 포함하고 있으며 GUI 환경으로 Docker CLI를 간편하게 사용하기 위한 도구이다.) 위 이미지에서 보는 것과 같이 Docker daemon은 REST API를 제공하고 이를 통해 사용이 가능한 구조이다. 그렇기 때문에 설정만 한다면 원격에서 REST API를 사용하여 Docker daemon에 접근할 수 있다.Daemon 확인 후 서비스 수정하기docker ..
- [ Language/JAVA ]자바 직렬화(Serialization)와 역직렬화(Deserialization)2024-12-19 14:29:51자바에서 직렬화는 객체 혹은 데이터를 전송 또는 저장하기 위해 Byte Array로 변환하는 과정을 말한다. 역직렬화는 반대로 변환된 Byte Array를 객체 혹은 데이터로 변환하는 과정이다.직렬화(Serialization)직렬화 방법은 아래와 같다.public static byte[] serialize(Object obj){ try(ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos)){ oos.writeObject(obj); return baos.toByteArray(); }catch(IOException e){ ..