Category: Develop

0

Git - Git Hook으로 워크플로우 자동화하기

Git Hook이란?Git Hook은 Git에서 특정 이벤트가 발생했을 때 자동으로 실행되는 스크립트입니다. 커밋, 푸시, 머지 등의 작업 전후에 사용자 정의 스크립트를 실행하여 코드 품질 검사, 테스트 자동화, 메시지 검증 등 다양한 워크플로우를 자동화할 수 있습니다. Git Hook의 종류Git Hook은 크게 클라이언트 훅(Client-side Hooks) 과 서버 훅(Server-side Hooks) 으로 나뉩니다. 클라이언트 훅 (Client-side Hooks)개발자의 로컬 저장소에서 실행되는 훅입니다. Commit 관련 훅 pre-commit: 커밋 메시지 작성 전 실행 (코드 린트, 테스트 실행) prepare-commit-msg: 커밋 메시지 에디터가 열리기 전 실행 (메시지 템플릿 설정) commit-msg: 커밋 메시지 검증 (메시지 형식 확인) post-commit: 커밋이 완료된 후 실행 (알림 전송) Merge/Rebase 관련 훅

0

Git - Gitleaks로 민감정보 탐지하기

Gitleaks란?Gitleaks는 Git 저장소에서 비밀번호, API 키, 토큰과 같은 민감한 정보(secrets)를 탐지하는 오픈소스 보안 도구입니다. 코드를 커밋하기 전이나 CI/CD 파이프라인에서 실행하여 실수로 민감정보가 코드 저장소에 포함되는 것을 방지할 수 있습니다. 주요 특징 빠른 스캔: Go 언어로 작성되어 빠른 성능 제공 다양한 탐지 규칙: 100개 이상의 내장 규칙으로 주요 서비스의 비밀정보 탐지 커스터마이징 가능: 사용자 정의 규칙 추가 가능 Git 통합: pre-commit hook으로 설정 가능 CI/CD 통합: GitHub Actions, GitLab CI 등과 쉽게 통합 설치macOS (Homebrew)brew install gitleaks Linux# Binary 다운로드wget https://github.com/gitleaks/gitleaks/releases/download/v8.18.0/gitleaks_8.18.0_linux_x64.tar.gztar -xzf gitleaks_8.18.0_linux_x64.tar.gzsudo mv gitleaks /usr/local/bin/

0

[JAVA POI] HSSFWorkbook vs XSSFWorkbook vs SXSSFWorkbook 비교

Apache POI Workbook 종류Apache POI는 Microsoft Office 파일을 처리하기 위한 Java 라이브러리입니다. Excel 파일을 다루기 위해 세 가지 주요 Workbook 구현체를 제공합니다. 📌 HSSFWorkbookHSSF (Horrible SpreadSheet Format) 는 Excel 97-2003 파일 형식(.xls)을 처리하는 구현체입니다. 특징 파일 형식: .xls (Excel 97-2003) 최대 행 수: 65,536행 (2^16) 최대 열 수: 256열 (2^8) 최대 Cell Style: 4,000개 메모리 사용: 중간 수준 (전체 파일을 메모리에 로드) 처리 속도: XSSF보다 빠름 사용 예시import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.ss.usermodel.*;import java.io.FileOutputStream;import java.io.IOException;public class HSSFExample { public static void main(String[] args) throws IOException { // HSSFWorkbook 생성 Workbook workbook = new HSSFWorkbook(); Sheet sheet = workbook.createSheet("Sample"); // 데이터 작성 Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("Hello, HSSF!"); // .xls 파일로 저장 try (FileOutputStream fileOut = new FileOutputStream("sample.xls")) { workbook.write(fileOut); } workbook.close(); }} 장점

0

[JAVA POI] - The maximum number of Cell Styles was exceeded.

문제 상황Apache POI를 사용하여 Excel 파일(.xlsx)을 생성하거나 수정할 때 다음과 같은 오류가 발생할 수 있습니다. java.lang.IllegalStateException: The maximum number of Cell Styles was exceeded.You can define up to 64000 style in a .xlsx Workbook 발생 원인1. Cell Style 생성 방식의 문제Excel의 .xlsx 파일 형식에서는 최대 64,000개의 Cell Style만 생성할 수 있습니다. 이 제한은 Excel 파일 포맷의 스펙에 정의된 하드 리미트입니다. 일반적으로 이 오류는 다음과 같은 상황에서 발생합니다: // 잘못된 예시 - 반복문 안에서 매번 새로운 스타일 생성for (int i = 0; i < rows.size(); i++) { Row row = sheet.createRow(i); Cell cell = row.createCell(0); // 매 셀마다 새로운 스타일을 생성 (문제!) CellStyle style = workbook.createCellStyle(); Font font = workbook.createFont(); font.setBold(true); style.setFont(font); cell.setCellStyle(style); cell.setCellValue(data.get(i));} 위 코드에서 10,000개의 행을 처리한다면, 10,000개의 동일한 스타일이 생성되어 메모리를 낭비하고 결국 64,000개 제한에 도달하게 됩니다.

0

JAVA - 자바 버전별 주요 특징 총정리 (Java 8 ~ Java 25)

들어가며자바는 1996년 처음 등장한 이후 지속적으로 발전해왔습니다. 특히 Java 8 이후로는 6개월마다 새로운 버전이 출시되면서 빠르게 진화하고 있습니다. 이 글에서는 Java 8부터 최신 버전인 Java 25까지의 주요 특징들을 살펴보겠습니다. 각 버전의 핵심 기능들을 이해하면 현대적인 자바 개발을 더 효과적으로 할 수 있습니다. Java 8 (2014년 3월) - LTSJava 8은 자바 역사상 가장 혁명적인 변화를 가져온 버전입니다. 함수형 프로그래밍 패러다임을 본격적으로 도입하면서 자바의 코딩 스타일을 완전히 바꾸어 놓았습니다. 람다 표현식 (Lambda Expressions)람다 표현식은 익명 함수를 간결하게 표현할 수 있게 해주는 기능입니다. 기존에는 익명 내부 클래스를 사용해야 했던 코드를 훨씬 간결하게 작성할 수 있게 되었습니다. // Java 7 이전button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("Button clicked!"); }});// Java 8 이후button.addActionListener(e -> System.out.println("Button clicked!")); 스트림 API (Stream API)

0

JAVA - 버전별 주요 특징과 예시

정리 기준 자바 8부터 25까지의 흐름을 LTS 위주로 묶고, 미리보기/인큐베이터 상태를 함께 표기했다. 코드 예제는 해당 버전에서 동작하도록 작성했고, 미리보기 기능은 --enable-preview 플래그가 필요하다. Java 8 (2014, LTS)람다, Stream API, Optional, 새로운 java.time 패키지가 등장해 함수형 스타일과 안전한 시간 처리의 기반이 마련되었다. 인터페이스에 default/static 메서드를 둘 수 있어 라이브러리 진화도 쉬워졌다. List<String> names = Arrays.asList("Java", "Kotlin", "Scala");List<String> upper = names.stream() .filter(s -> s.startsWith("J")) .map(String::toUpperCase) .collect(Collectors.toList()); Java 9 (2017)프로젝트 지그소로 JDK 자체와 애플리케이션을 모듈화할 수 있게 되었고, JShell 덕분에 REPL 실험이 편해졌다. HTTP 클라이언트가 인큐베이터로 공개되어 이후 표준화의 발판을 마련했다. // module-info.javamodule com.example.app { requires com.example.service; exports com.example.app.api;} Java 10 (2018)

0

[JAVA] - Cold Start

목차 [JAVA] - 가비지 컬렉션 튜닝 [JAVA] - Garbage Collection(가비지 컬렉션) [JAVA] - JVM (자바 가상 머신) 🧊 Cold Start란?Cold Start는 JVM이 애플리케이션이 처음 실행될 때 초기화 과정 때문에 발생하는 지연(latency) 을 의미합니다. 마치 추운 겨울날 자동차 시동을 걸 때 엔진이 따뜻해질 때까지 시간이 걸리는 것과 비슷합니다. 일반적인 서버 환경에서는 애플리케이션이 한 번 시작되면 계속 실행되기 때문에 이 문제가 크게 부각되지 않았습니다. 하지만 MSA 는 인스턴스가 빈번히 생성 및 소멸되고 여러 서버가 긴밀히 통신하는 환경입니다. 이로 인해 특정 시스템이 재부팅되면 연결된 다른 시스템의 응답 속도까지 지연되는 문제가 발생했으며, 무중단 배포·잦은 배포·오토스케일링 등으로 인해 기존 아키텍처보다 성능 지연 현상이 더 빈번하게 나타나게 되었고, 전체적인 서비스 성능 이슈의 문제가 됐습니다. 🚦 Cold Start가 발생하는 이유Java 애플리케이션은 네이티브 코드가 아닌 JVM 위에서 바이트코드 실행 방식으로 동작하기 때문에, 첫 실행 시 다음과 같은 과정에서 오버헤드가 발생합니다. 1. JVM 초기화 과정의 복잡성Java 애플리케이션이 시작될 때 여러 단계의 초기화 과정을 거쳐야 합니다:

0

[Java] - 가비지 컬렉션 히스토리

목차 [JAVA] - 가비지 컬렉션 튜닝 [JAVA] - Garbage Collection(가비지 컬렉션) [JAVA] - JVM (자바 가상 머신) 초기 GC들 (JDK 1.0~1.4)Serial GC 가장 오래된 GC 단일 스레드로 동작 작은 애플리케이션이나 클라이언트 환경에 적합 Stop-the-World 시간이 길어서 현재는 제한적으로 사용 Parallel GC (Throughput Collector) JDK 1.4에서 도입 멀티코어 환경에서 여러 스레드를 사용해 처리량을 개선 JDK 6~8에서 기본 GC 여전히 긴 정지 시간이 단점 저지연 목표 GC들 (JDK 1.4~)Concurrent Mark Sweep (CMS) GC

0

[Docker] 이미지 history

목차 [Docker] 이미지 history [Docker] 이미지 레이어 [Docker] 이미지 Build 참고 Docker History 명령어 공식문서 📋 이미지 historyDocker 이미지를 받아서 사용하다보면 해당 이미지가 어떻게 생성 됐는지, 어떤 명령어를 사용했는지 확인해봐야 할때가 있습니다. Docker 에서는 history 명령어를 이용해 해당 이미지가 어떤 명령어를 이용해 이미지가 생성 됐는지 확인할 수 있는 기능을 제공합니다. 저 같은 경우는 제대로 작동되지 않는 빌드된 이미지에 대한 디버깅용으로 사용을 많이 했었습니다. ✅ docker history 명령어기본 명령어

0

[Docker] 이미지 레이어

목차 [Docker] 이미지 레이어 [Docker] 이미지 Build 참고 Docker 공식 문서 - 이미지 레이어 이해하기 Docker 공식 문서 - Storage drivers 🔍 이미지 레이어란?Docker 이미지의 핵심적인 특징 중 하나는 레이어 기반 구조 입니다. Docker 이미지는 빌드시 한번에 만들어 지는 것이 아닌 기존 이미지에 레이어를 하나씩 쌓는 방식으로 이미지를 만듭니다. 이미지 레이어는 Dockerfile 에 있는 명령어를 실행할때 각 명령어별로 생성됩니다.. 각 레이어들은 읽기 전용 (read-only) 속성을 가지며, 순서대로 쌓여서 하나의 완전한 이미지를 구성합니다. 최종적으로 생성되는 이미지는 여러개의 레이어들이 쌓여서 만들어진 결과물이라 생각하면 됩니다. ✅ 레이어의 특징

0

[Docker] 이미지 Build

🔍 Docker Build 란?Docker Build 는 서비스를 격리된 환경에서 실행할 수 있도록 운영체제 및 필요한 의존성과 설정, 실행 파일등을 하나의 이미지로 패키징하는 것을 의미합니다. 이미지 Build 는 Dockerfile 을 기반으로 수행되며, Dockerfile 에는 이미지 생성에 필요한 명령어들이 있으며, 순서대로 실행됩니다. ✅ Build 명령어# 현재 디렉토리 위치에 Dockerfile 가 있고 현재 위치에서 이미지를 생성할 경우docker build -t <만들 이미지 이름>:<만들 이미지 태그> .# Dockerfile 이 다른 경로에 있을 경우docker build -t <만들 이미지 이름>:<만들 이미지 태그> -f <파일 경로> <빌드 컨텍스트 경로># Dockerfile 명이 다를 경우우docker build -t <만들 이미지 이름>:<만들 이미지 태그> -f <파일 경로/파일 이름> <빌드 컨텍스트 경로> ✅ 이미지지 레이어Docker 는 Build 시 Dockerfile 의 베이스가 되는 이미지부터 시작해 각 명령어를 실행할 때마다 새로운 이미지를 생성합니다. 이것을 이미지 레이어를 생성한다고 이야기 합니다. 때문에 초기 명령어들이 같고 중간 단계 부터 달라지는 Dockerfile 의 경우 빌드시 각각 이미지 레이어를 생성하는게 아닌 기존에 만들어진 이미지 레이어를 바탕으로 새로운 이미지를 생성해 빌드시간과 저장공간을 절약할 수 있습니다. ✅ Dockerfile

0

[Docker] Volume - 컨테이너 데이터 관리

목차 [Docker] Volume - 컨테이너 데이터 관리 [Docker] Network - 컨테이너간 통신 [Docker] 🤔 Docker Volume 이 왜 필요한가? 컨테이너내 데이터는 휘발성입니다. Docker 와 컨테이너 기술이 막 떠오를때 PC 에 깔아서 개발을 하고 있는데 Docker 내에서 설정한 값들이 재실행할때 마다 초기화 되는 현상들을 겪었습니다. 당시 너무 화가나서 여러 책들을 읽어봤는데 생각해보니 컨테이너의 특성을 제대로 이해하지 못해 생기는 문제였었습니다. 컨테이너는 기본적으로 휘발성 이기 때문에 컨테이너가 종료되거나 삭제되면 내부 데이터도 함께 사라집니다. 쉽게 생각해서 격리돼 있는 컨테이너의 특성상 컨테이너가 생성한 모든 파일들은 결국 컨테이너내에서만 존재하고 컨테이너 삭제시에는 컨테이너와 함께 데이터도 삭제가 되는 것입니다. Docker 에서는 Docker Volume 을 통해 컨테이너 내에서의 데이터 휘발성 문제를 해결하고 영구적으로 저장할 수 있는 방법을 제공합니다. ✅ Docker Volume 이란?Docker Volume 은 컨테이너 외부 에 데이터를 저장할 수 있는 공간입니다. 컨테이너와는 별도로 존재하기 때문에, 컨테이너를 삭제하더라도 데이터는 유지되며 데이터 영속성이 보장됩니다.

0

[Docker] Network - 컨테이너간 통신

목차 [Docker] Volume - 컨테이너 데이터 관리 [Docker] Network - 컨테이너간 통신 [Docker] 📌 Docker Network 란?Docker Network는 컨테이너 간 통신을 가능하게 해주는 가상 네트워크입니다. 컨테이너는 독립적인 환경에서 실행되지만, 애플리케이션을 만들다 보면 서로 데이터를 주고받아야 하거나 외부 요청을 받아야 할 일이 많습니다. Docker 네트워크는 이러한 컨테이너간 통신을 가능하게 해주는 역할을 합니다. 🔍 Docker Network 의 종류Docker는 기본적으로 다음과 같은 네트워크 드라이버들을 제공합니다 드라이버 설명 bridge 기본 드라이버. 컨테이너 간 통신이 가능하며, 같은 호스트에서 작동합니다. host 컨테이너가 호스트의 네트워크를 그대로 사용합니다. 격리는 없지만 속도는 빠릅니다. none 네트워크를 사용하지 않도록 설정합니다. 완전한 격리가 필요할 때 사용합니다. overlay 여러 호스트 간 컨테이너를 연결할 수 있습니다. Docker Swarm에서 유용합니다. macvlan 컨테이너에 고유한 MAC 주소를 부여해 물리 네트워크처럼 동작시킵니다. ✅ Docker 네트워크 생성

0

Django - App 생성하기

목차 Django - App 생성하기 Django - 장고 시작하기 장고 앱 만들기장고 App 생성은 manage.py 가 있는 프로젝트 폴더에서 startapp 명령어를 사용합니다. startapp 명령어를 사용해 hello_world 라는 이름의 앱을 만들어 줍니다. python manage.py startapp hello_world view.py 작성하기앱 폴더 내에 views.py 파일에 다음과 같은 코드를 작성해줍니다. from django.http import HttpResponsedef hello(request): return HttpResponse("Hello, world. You're at the hello_world index.")# Create your views here.] url.py 작성하기

0

Django - 장고 시작하기

목차 Django - App 생성하기 Django - 장고 시작하기 장고 설치하기pip install django 장고 프로젝트 생성하기 - django-admindjango 를 설치하면 django-admin 명령어를 사용할 수 있습니다. 설치된 django-admin 에 startproject 명령어를 사용하면 새롭게 장고 프로젝트를 시작할 수 있습니다. django-admin startproject mysite 장고 서버 실행하기 - manage.py새로운 장고 프로젝트에 들어가면 manage.py 파일이 있습니다. runserver 명령어를 사용하면 장고 서버를 실행할 수 있습니다.