Journey to CS 98

Jenkins와 Kubernetes를 조합한 CI/CD 파이프라인

1. Jenkins의 작동 메커니즘과 생태계Jenkins는 다양한 외부 서비스들을 하나로 묶어주는 오케스트레이터(Orchestrator) 역할을 수행한다.젠킨스의 전체적인 CI/CD 흐름은 다음과 같다. SCM(Source Code Management) 연동: 젠킨스 파이프라인에서 SCM은 자동화의 트리거(Trigger) 역할을 한다. Webhook을 통해 코드 변경을 실시간으로 감지하고 작업 공간(Workspace)으로 소스를 가져온다.(Checkout)CI(지속적 통합): 빌드 도구와 테스트 프레임워크를 통해 코드 품질을 검증하고 실행 가능한 아티팩트*를 생성한다.CD(지속적 배포): 생성된 아티팩트를 레지스트리에 저장하고 최종 목적지인 서버나 클러스터에 배포한다.💡아티팩트(artifact)란?소스..

Journey to CS/웹 2026.01.24

[Java] 래퍼 클래스(Wrapper Class)와 오토 박싱

자바는 객체 지향 언어지만 성능을 위해 비객체형인 기본형(Primitive)을 지원한다.하지만 제네릭이나 컬렉션 프레임워크처럼 객체만 다룰 수 있는 상황에서는 기본형을 객체로 감싸야 하는데, 이때 사용하는 것이 래퍼 클래스(Wrapper Class) 다.박싱(Boxing)과 언박싱(Unboxing)Boxing: 기본형 → 래퍼 클래스 (int → Integer)Unboxing: 래퍼 클래스 → 기본형 (Integer → int)JDK 1.5부터는 컴파일러가 이를 자동으로 처리해주는 Auto-boxing/Auto-unboxing을 지원한다.덕분에 개발자는 기본형과 래퍼 클래스를 혼용해서 사용할 수 있다.📌코드 예시 : null 처리와 유틸리티 활용래퍼 클래스는 null을 담을 수 있어 DB 연동 시 유용..

[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진수 ..