전체 글 111

[크래프톤 정글] 해시 테이블

해시 테이블의 정의**해시 테이블(Hash Table)**은 해시 함수를 사용하여 데이터(키-값 쌍)를 특정 인덱스에 매핑(mapping)함으로써, 평균적으로 O(1) 시간 복잡도로 데이터의 **삽입(Insertion), 삭제(Deletion), 검색(Search)**을 지원하는 효율적인 자료 구조다.해시 테이블은 주어진 키를 빠르게 검색할 수 있도록 해시 값을 사용하여, 데이터를 저장할 위치를 계산하고 해당 위치에 데이터를 저장한다.O(1) 복잡도(상수 시간 복잡도)는 알고리즘의 실행 시간이 입력 크기와 상관없이 일정한 경우를 나타낸다. 해시 테이블의 주요 구성 요소해시 함수(Hash Function):입력 값(키)을 고정된 크기의 해시 값으로 변환하는 함수다. 이 해시 값은 해시 테이블에서 데이터가 ..

[크래프톤 정글] 재귀 함수

재귀 함수란재귀 함수는 정의 단계 에서 자신을 재참조 하는 함수를 뜻 한다.문제를 해결하기 위해 특정 분기 까지 계속 해서 자기 자신을 호출 한다. 이는 주로 반복문 구현 에 사용하게 된다.흔히들 사용하게 되는 for,while,reduce등의 반복문등이 존재하는데 , 이러한 반복 문으로 구현이 가능한 로직은 재귀로도 구현이 가능하다.재귀 함수 의 용도재귀 함수는 큰 목표 작업을 여러 개의 작은 작업으로 쪼개서 해결할 수 있는 경우에 특히 유용하다. 이는 문제를 반복적으로 동일한 유형의 더 작은 문제로 나눌 수 있을 때 재귀 함수가 효과적이라는 의미다. 구체적으로, 재귀 함수는 다음과 같은 상황에서 유용하게 사용될 수 있다:큰 문제를 더 작은 동일한 문제로 분할 가능할 때문제를 풀기 위해 동일한 종류의 ..

[TInypilot] Tinypilot 도커로 컨테이너화 해보기

프로젝트: TinyPilot 모놀리식 애플리케이션의 서비스 분리 및 컨테이너화1. 프로젝트 개요TinyPilot은 라즈베리 파이를 활용한 오픈소스 KVM-over-IP 솔루션으로, 원격지에서 웹 브라우저를 통해 물리 서버의 화면, 키보드, 마우스를 제어할 수 있는 강력한 도구임. 하지만 공식적으로는 통합된 라즈베리 파이 이미지 형태로만 배포되어, 클라우드 환경이나 다양한 하드웨어에서의 이식성과 확장성에 한계가 있었음.본 프로젝트는 TinyPilot의 각 구성 요소를 분석하여 개별 서비스로 분리하고, Docker를 통해 컨테이너화함으로써 이식성과 관리 효율성을 극대화하는 것을 목표로 진행했음.주요 성과:공식 지원이 없는 TinyPilot의 Docker 이미지 개발에 성공함.주요 컴포넌트(Web UI, St..

인프라 2024.09.01

[ubuntu 22.04] lxc 설정하기

LXC (Linux Containers) 설치 및 활용 가이드이 문서는 LXC(Linux Containers)의 개념을 설명하고, 설치부터 기본 설정, 컨테이너 생성 및 관리, 그리고 포트 포워딩을 통한 고급 활용까지의 과정을 상세히 기술함.1. LXC란 무엇인가?**LXC (Linux Containers)**는 운영체제 수준의 가상화 기술임. 전체 운영체제를 새로 설치하는 가상 머신(VM)과 달리, LXC는 호스트 리눅스 커널의 기능을 공유하여 프로세스, 네트워크, 파일 시스템 등을 격리된 공간(컨테이너)에서 실행함. 이 방식은 거의 네이티브에 가까운 성능을 제공하며, 빠르고 효율적인 개발 및 테스트 환경 구축에 유용함.2. LXC 설치 및 기본 설정LXC 설치 및 기본적인 환경 설정을 진행함. (Ub..

인프라 2024.08.31

[RaspberryPI] 라즈베리 파이 dwc 커스텀 usb_hid_gadget 설정

라즈베리 파이를 USB 키보드/마우스로 설정하기 (TinyPilot HID 설정 가이드)TinyPilot과 같은 원격 KVM(Keyboard, Video, Mouse) 프로젝트 구성 시, 라즈베리 파이는 단순한 소형 컴퓨터가 아닌, 연결된 서버를 제어하는 주변 장치 역할을 수행해야 함. 즉, 라즈베리 파이의 USB 포트가 키보드와 마우스처럼 동작하도록 설정하는 것이 필요함.이 가이드는 라즈베리 파이가 USB '호스트(Host)'가 아닌 USB '가젯(Gadget)'으로 작동하도록 설정하는 과정을 상세히 기술함. 이 과정은 커널 모듈에 대한 이해와 USB 장치의 동작 방식을 직접 구성하는 내용을 포함하고 있음.1. 핵심 용어 이해본격적인 설정에 앞서, 이 작업에 필요한 세 가지 핵심 요소(UDC, dwc2..

인프라 2024.08.30

[Java] 도메인 계층 vs 서비스 계층

도메인 계층 vs. 서비스 계층: 역할과 책임 명확히 구분하기객체 지향 설계를 하거나 클린 아키텍처를 적용할 때, 많은 개발자가 "이 비즈니스 로직은 어디에 두어야 할까?"라는 고민에 빠지곤 합니다. 특히 **도메인 계층(Domain Layer)**과 **서비스 계층(Service Layer)**의 역할을 명확히 구분하는 것은 견고하고 유지보수하기 좋은 애플리케이션을 만드는 핵심입니다.오늘은 이 두 계층의 역할과 책임을 실제 코드 예시를 통해 명확하게 알아보겠습니다.1. 핵심 비즈니스의 심장, 도메인 계층 (Domain Layer)도메인 계층은 애플리케이션의 가장 핵심적인 부분입니다. 비즈니스의 규칙과 상태, 그리고 그에 따른 로직이 모두 이곳에 정의됩니다.역할: 애플리케이션의 핵심 비즈니스 규칙과 로직..

[Java ] 3-Tier 아키텍처와 DTO:

웹 애플리케이션을 개발할 때 "사용자가 입력한 데이터는 어디로 가서 어떻게 처리될까?"라는 질문은 아키텍처 설계의 가장 기본이 되는 질문입니다. 이 데이터의 여정을 체계적으로 안내하는 지도가 바로 3-Tier 아키텍처이며, 이 여정에서 데이터를 안전하게 실어 나르는 전용 차량이 DTO(Data Transfer Object)입니다.오늘은 웹 애플리케이션의 뼈대를 이루는 3가지 계층과, 각 계층 사이에서 데이터가 어떻게 DTO를 통해 안전하게 이동하는지 알아보겠습니다.1. 애플리케이션의 3가지 핵심 계층견고한 웹 애플리케이션은 보통 세 가지 주요 계층으로 역할을 나눕니다. 각 계층은 자신만의 명확한 책임이 있습니다.① 프레젠테이션 계층 (Presentation Layer) - 고객을 맞이하는 창구역할: 사용..

[Java] Java의 String은 왜 불변(Immutable)할까?

(feat. 메모리, 스레드, 해시코드)Java를 공부하면서 가장 먼저 마주한 흥미로운 사실이 있었다. 바로 String 클래스가 불변(immutable) 이라는 점이다.분명히 나는 str = str + " World"; 와 같은 코드로 문자열을 변경했다고 생각했는데, Java는 이를 "변경"이 아니라 "새로 생성"이라고 말한다.1. String은 변경되는 것이 아니라, 새로 만들어진다먼저 의문이 들었다. "str = str + 'World' 했는데, 왜 불변이라고 하지?"그래서 실제로 참조가 바뀌는지 직접 확인해봤다.import java.util.Arrays;public class Main { public static void main(String[] args) { String str..

[Java] equals overriding 과 hash code

자바에서 ==, equals, hashCode의 차이와 역할== 연산자의 동작객체의 참조 주소를 비교한다.두 객체가 같은 메모리 주소(참조)를 가리키는지 확인한다.참조 변수는 스택 영역에 저장되고, 객체는 힙 영역에 저장된다.따라서, ==는 스택 영역에 있는 두 참조 변수를 비교하여, 같은 객체를 가리키고 있는지 판단한다.Person person1 = new Person("John", 25);Person person2 = new Person("John", 25);System.out.println(person1 == person2); // false를 반환위 예제에서 person1과 person2는 각각 서로 다른 힙 영역에 객체를 가지고 있으므로, == 연산자는 false를 반환한다.equals 메서드의..

[Java] final과 static: '불변'과 '공유'의 미학 (feat. JVM 메모리 구조)

Java의 final과 static: '불변'과 '공유'의 미학 (feat. JVM 메모리 구조)final과 static. 두 키워드는 문법의 가장 기초적인 부분이지만, 그 역할과 동작 원리를 깊이 이해하는 것은 견고한 코드를 작성하는 핵심입니다.final은 **"한 번만 할당할 수 있다"**는 불변의 약속입니다.static은 **"인스턴스가 아닌 클래스에 속한다"**는 공유의 개념입니다.이 글에서는 final과 static의 각기 다른 역할을 코드와 함께 살펴보고, 더 나아가 이들이 JVM 메모리의 어느 공간에 위치하며 동작하는지 심층적으로 알아보겠습니다.1. final - "변경될 수 없는 마지막 값"final 키워드는 "최종적인", "변경될 수 없는" 이라는 의미를 가집니다. 변수, 메소드, 클래스..