Journey to CS 96

[Java] 기본형(Primitive)과 참조형(Reference)의 메모리 구조 차이

자바의 변수는 데이터를 저장하는 방식에 따라 크게 두 가지로 나뉜다.이 둘의 차이는 '데이터가 메모리의 어디에, 어떻게 저장되는가'에 있다.1. 기본형 (Primitive Type)C언어의 일반 변수와 같다.메모리의 스택(Stack) 영역에 실제 값(Literal)을 직접 저장한다. int, double, boolean 등 8가지 타입이 존재하며, null을 가질 수 없다.종류타입 이름크기저장 가능한 값의 예시비고논리형boolean1 bit*true, false조건문(if)에서 주로 사용문자형char2 byte'A', '가', '3'문자 하나만 저장 (작은따옴표 사용)정수형byte1 byte-128 ~ 127파일 데이터 등 매우 작은 단위 short2 byte-32,768 ~ 32,767C언어 호환 외엔..

Spring Boot와 NestJS를 비교해보자

이번 포스팅에서는 백엔드 개발 생태계의 두 프레임워크, 자바 진영의 스프링부트와 노드(Node.js) 진영의 NestJS의 구조적 차이를 알아보고, 각각의 네트워크 처리 방식과 보안적 관점을 알아본다. 1. 언어 및 런타임 환경우선 사용하는 언어와 실행 기반부터 차이가 있다.Spring Boot: Java(or Kotlin)를 기반으로 하며 JVM(Java Virtual Machine) 위에서 동작한다. 강력한 정적 타입 시스템과 객체 지향 프로그래밍(OOP)을 강제하여 대규모 프로젝트의 유지보수성과 안정성을 보장한다.NestJS: TypeScript를 기반으로 Node.js 런타임 위에서 동작한다. 자바스크립트의 유연함에 타입의 안정성을 더했으며, 프론트엔드(React, Vue 등)와 언어를 통일할 ..

Journey to CS/웹 2026.01.10

리눅스 환경에서 Node.js/Express로 웹 서버 구동하기

가상화 기술과 클라우드 환경이 보편화되면서 웹 애플리케이션의 구조는 거대한 모놀리식(Monolithic) 형태에서 가볍고 유연한 마이크로서비스 형태(MSA)로 변화하고 있다.특히 Docker 컨테이너나 Kubernetes Pod 환경에서는 애플리케이션이 얼마나 '가볍게' 구동될 수 있는지가 관건이다.이러한 트렌드 속에서 기존의 Apache/Nginx와 Tomcat 조합보다 훨씬 경량화된 Node.js와 Express.js가 백엔드 개발의 핵심 도구로 자리 잡았다.리눅스(Ubuntu) 환경에서 Node.js 개발 환경을 구축하고, 버전 호환성 문제를 해결하며 간단한 웹 서버를 띄우는 과정을 단계별로 정리한다.1. 환경 구축: NVM을 이용한 Node.js 설치리눅스 시스템의 패키지 매니저(apt)를 통해 ..

Journey to CS/웹 2026.01.08

[Spring Boot] Spring Initializr로 프로젝트 시작하기 (+인텔리제이 환경설정)

Spring Initializr를 이용한 프로젝트 생성 방법과 IntelliJ에서 발생할 수 있는 주요 오류 해결 방법 정리1단계: Spring Initializr 설정 (start.spring.io)먼저 Spring Initializr 사이트에서 프로젝트의 뼈대를 만든다. [설정 예시]Project: Gradle - GroovyLanguage: JavaSpring Boot: SNAPSHOT이나 M1이 붙지 않은 최신 정식 버전 (예: 4.0.x, 3.4.x 등)Project Metadata: Group, Artifact 이름 설정Packaging: JarJava: 17 (현재 가장 많이 쓰이는 LTS 버전)💡 중요: 여기서 Java 17을 골랐다면, 이후의 모든 IntelliJ 설정도 17로 통일해야..

Journey to CS/웹 2026.01.03

[수강 후기] 비전공자도 이해할 수 있는 Docker 입문/실전

이 강의를 선택하게 된 계기백엔드/클라우드를 공부하기 시작하면서 프로젝트를 배포할 때 많이 사용하는 도커를 접하게 되었는데, CLI 환경에서 이미지를 내려받고 컨테이너를 띄우고 하다보니 어떤 원리로 동작을 하는 것인지 머릿속에 잘 그려지지 않았다. 또 내가 아직 현업자가 아니다보니 현업에서는 도커를 실제로 어떻게 쓰는지 감을 잡고 싶었다. 그래서 인프런에서 도커 입문 강의를 찾아보게 되었다. 내가 선택한 강의는 JSCODE 박재성 님의 비전공자도 이해할 수 있는 Docker 입문/실전이다. 이 강의는 단순한 도커 명령어 실습 위주로 흘러가지 않고, 도커를 이용한 백엔드, 프론트엔드 프로젝트 배포 등 현업에서 자주 쓰이는 기술들의 개념을 명확하게 잡고 적용할 수 있도록 도움을 준다. 매 파트마다 주요 개..

[ATmega328P] 레지스터: I/O 주소와 데이터 주소 이해하기

MCU 프로그래밍을 할 때 데이터시트를 보면 같은 레지스터에 두 가지 주소가 붙어있는 걸 볼 수 있다. 하나는 I/O 주소, 다른 하나는 데이터 주소다. I/O 주소ATmega328P에는 64바이트짜리 작은 공간이 있다.여기에 PORTB, DDRB, PINB 같은 하드웨어 제어 레지스터가 배치돼 있다.이 공간의 주소를 I/O 주소라고 부른다.이 영역은 CPU의 특수 명령어 IN, OUT, SBI, CBI 같은 걸로 접근할 수 있다.장점은 빠르다는 것. 1클럭에 입출력을 처리할 수 있다. 데이터 주소동시에, 똑같은 레지스터들이 SRAM 공간에도 매핑돼 있다.이게 데이터 주소다.예를 들어 PORTB의 경우:I/O 주소: 0x05데이터 주소: 0x25데이터 주소로 접근할 때는 LDS, STS 같은 일반 메모리..

[ATmega328P] 레지스터 직접 제어 방식으로 프로그래밍 해보기

이번 포스팅에서는 ATmega328P 마이크로컨트롤러를 레지스터 직접 제어 방식으로 프로그래밍하는 방법에 대해서 알아본다. 레지스터 방식은 Arduino IDE에서 사용하는 digitalWrite() 같은 함수 호출 방식보다 더 효율적이고 하드웨어에 가깝게 제어할 수 있다. 💡 레지스터란?레지스터는 마이크로컨트롤러 내부에 있는 매우 빠른 임시 저장 공간이다.ATmega328P에서는 특정 기능을 제어하기 위해 여러 레지스터를 사용한다.아래 예시 프로그램에서는 포트의 입출력 방향을 설정하는 DDRB 레지스터와, 포트의 출력 상태를 제어하는 PORTB 레지스터를 사용한다. 예시: ATmega328P의 PB5 핀에 연결된 LED를 1초 간격으로 깜빡이는 프로그램#define F_CPU 16000000UL#in..

[메모리] 엔디언(Endianness)과 포인터 캐스팅(casting)

이번 포스팅에서는 메모리 주소와 관련된 개념인 엔디언과 포인터 캐스팅에 대해 다루어 보려고 합니다.1. 엔디언(Endianness)이란?컴퓨터 메모리는 바이트(byte) 단위로 구성되어 있습니다.int와 같은 여러 바이트로 이루어진 데이터 타입을 메모리에 저장할 때, 바이트들의 순서를 정하는 방식이 바로 엔디언입니다.엔디언에는 크게 두 가지 방식이 있습니다.빅 엔디언(Big Endian): 가장 큰 바이트(최상위 바이트)를 가장 작은 주소에 저장하는 방식입니다. 사람이 숫자를 읽는 방식과 유사해 직관적입니다.리틀 엔디언(Little Endian): 가장 작은 바이트(최하위 바이트)를 가장 작은 주소에 저장하는 방식입니다. 대부분의 x86 아키텍처(인텔, AMD 등)가 이 방식을 사용합니다.예) 16진수 ..

[C] 2차원 배열의 포인터 연산으로 메모리 주소값 찾기

이번 포스팅에서는 C언어에서 2차원 배열과 메모리 주소와의 관계에 대해 알아보고, &, *, + 같은 포인터 연산자가 어떻게 동작하는지 예제를 통해 자세히 뜯어보려고 한다.포인터를 잘 이해하면 임베디드의 핵심인 메모리를 잘 다루는 데 도움이 된다고 하니 잘 익혀두는 것이 좋겠다. 우선 다음의 2행 3열의 배열의 각 요소들이 메모리에 어떤 순서로 저장되는지 살펴보자. int main(void){ int a[2][3] = {{0, 1, 2}, {3, 4, 5}};} 먼저, int a[2][3] = {{0, 1, 2}, {3, 4, 5}}; 배열의 메모리 구조를 이해하는 것이 중요하다.C 언어에서 2차원 배열은 행(row) 우선으로 메모리에 연속적으로 저장된다.int의 크기가 4바이트이므로, 각 요소의 주소..

[자료구조] 스택(stack)을 이용하여 중위 표기식을 후위 표기식으로 변환해보자

프로그래밍 언어나 컴파일러 이론을 공부하다 보면 후위 표기식(Postfix notation)이라는 개념이 자주 등장하는 것을 볼 수 있습니다. 컴퓨터가 수식을 계산하는 방식은 우리가 흔히 사용하는 중위 표기식(Infix notation)과는 조금 다릅니다. 중위 표기식은 연산자가 피연산자 사이에 위치해 있어 사람에게는 직관적이지만, 컴퓨터가 처리하기 위해서는 연산자 우선순위와 괄호 등을 복잡하게 고려해야 하죠.이러한 문제를 해결하기 위해 사용되는 것이 바로 후위 표기식(Postfix notation)입니다. 후위 표기식은 연산자가 피연산자 뒤에 위치하며, 괄호가 필요 없고 연산자 우선순위를 고려하지 않고도 순서대로 계산할 수 있다는 장점이 있습니다. 그렇다면 중위 표기식을 후위 표기식으로 어떻게 변환할까..