Home

0

Linux 로그 확인 및 관리 방법

Linux 로그 시스템 개요Linux 시스템에서 로그는 시스템 상태, 애플리케이션 동작, 보안 이벤트 등을 추적하는 중요한 도구입니다. 로그를 효과적으로 관리하고 분석하는 것은 시스템 관리자와 개발자에게 필수적인 역량입니다. 1. systemd 기반 로그 관리 (journalctl)현대 Linux 배포판의 대부분은 systemd를 사용하며, journalctl은 systemd의 로그 조회 도구입니다. 기본 조회# 전체 시스템 로그 확인journalctl# 최근 로그만 확인 (기본 10줄)journalctl -n# 최근 100줄 확인journalctl -n 100# 실시간으로 로그 확인 (tail -f 처럼)journalctl -f# 페이지 단위로 확인 (기본)journalctl --no-pager 서비스별 로그 확인# 특정 서비스 로그 확인journalctl -u nginx.servicejournalctl -u apache2.servicejournalctl -u mysql.service# 여러 서비스 동시 확인journalctl -u nginx.service -u mysql.service# 서비스 로그 실시간 모니터링journalctl -u nginx.service -f 시간 기반 필터링

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

Django 시작하기 - 설치부터 프로젝트 생성까지 🚀

안녕하세요! 👋 오늘은 Python의 대표적인 웹 프레임워크인 Django를 시작하는 방법에 대해 알아보겠습니다. Django를 처음 접하시는 분들도 쉽게 따라할 수 있도록 자세히 설명해드릴게요! 😊 1️⃣ Django란 무엇인가요? 🤔Django(장고)는 Python으로 작성된 무료 오픈소스 웹 애플리케이션 프레임워크입니다. “빠른 개발”과 “깔끔하고 실용적인 디자인”을 목표로 만들어졌어요. Django의 주요 특징 ✨MTV 패턴 📐Django는 MTV(Model-Template-View) 패턴을 사용합니다. 이는 다른 프레임워크의 MVC 패턴과 유사한데요: Model: 데이터베이스와 상호작용하는 부분 💾 Template: 사용자에게 보여지는 화면 (HTML) 🎨 View: 비즈니스 로직을 처리하는 부분 ⚙️ 배터리 포함(Batteries Included) 🔋Django는 웹 개발에 필요한 거의 모든 기능을 기본적으로 제공합니다: 강력한 ORM(Object-Relational Mapping) 시스템 사용자 인증 시스템 🔐 관리자 페이지(Admin Page) 자동 생성 👨‍💼 폼(Form) 처리 📝 세션 관리 보안 기능 (CSRF, XSS, SQL Injection 방지) 🛡️ 확장성과 안정성 💪Instagram, Pinterest, NASA 등 많은 대형 서비스들이 Django를 사용하고 있어요. 이는 Django가 얼마나 안정적이고 확장 가능한지를 증명합니다!

0

Kubernetes Node 재실행 후 swap 으로 인한 kubelet 무한 재시작

최근 홈 서버에 Kubernetes 클러스터를 구성하던 중, 노드가 재실행한 후에 노드가 NotReady 상태로 떨어지며 kubelet 이 계속 재시작되는 문제를 겪었다.systemd 로그를 확인해 보니, kubelet 이 무한 재시작되며 restart counter 가 6500회를 넘는 심각한 상태였다. 🔍 문제 상황계속 재시작 되는 노드로 들어가서 kubelet 서비스 상태를 확인하면 다음과 같은 메시지가 반복적으로 출력된다. > sudo systemctl status kubelet● kubelet.service - kubelet: The Kubernetes Node Agent Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; preset: enabled) Drop-In: /usr/lib/systemd/system/kubelet.service.d └─10-kubeadm.conf Active: activating (auto-restart) (Result: exit-code) since Sun 2025-11-23 10:52:13 KST; 1s ago Docs: https://kubernetes.io/docs/ Process: 150004 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (code=exited, status=1/FAILURE) Main PID: 150004 (code=exited, status=1/FAILURE) CPU: 90ms> sudo journalctl -u kubelet -n 50 --no-pagerNov 23 10:52:54 systemd[1]: kubelet.service: Main process exited, code=exited, status=1/FAILURE Nov 23 10:52:54 systemd[1]: kubelet.service: Failed with result 'exit-code'. Nov 23 10:53:04 systemd[1]: kubelet.service: Scheduled restart job, restart counter is at 6578. Nov 23 10:53:04 systemd[1]: Started kubelet.service - kubelet: The Kubernetes Node Agent. Nov 23 10:53:04 kubelet[150116]: Flag --container-runtime-endpoint has been deprecated, This parameter should be set via the config file specified by the Kubelet's --config flag. See https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/ for more information. Nov 23 10:53:04 kubelet[150116]: Flag --pod-infra-container-image has been deprecated, will be removed in a future release. Image garbage collector will get sandbox image information from CRI. Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.710817 150116 server.go:209] "--pod-infra-container-image will not be pruned by the image garbage collector in kubelet and should also be set in the remote runtime" Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.715367 150116 server.go:492] "Kubelet version" kubeletVersion="v1.29.15" Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.715402 150116 server.go:494] "Golang settings" GOGC="" GOMAXPROCS="" GOTRACEBACK="" Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.715759 150116 server.go:924] "Client rotation is on, will bootstrap in background" Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.716990 150116 certificate_store.go:130] Loading cert/key pair from "/var/lib/kubelet/pki/kubelet-client-current.pem". Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.718180 150116 dynamic_cafile_content.go:157] "Starting controller" name="client-ca-bundle::/etc/kubernetes/pki/ca.crt" Nov 23 10:53:04 kubelet[150116]: I1123 10:53:04.727293 150116 server.go:750] "--cgroups-per-qos enabled, but --cgroup-root was not specified. defaulting to /" Nov 23 10:53:04 kubelet[150116]: E1123 10:53:04.727405 150116 run.go:74] "command failed" err="failed to run Kubelet: running with swap on is not supported, please disable swap! or set --fail-swap-on flag to false. /proc/s 핵심 에러 메시지는 아래 한 줄이다. running with swap on is not supported, please disable swap! 즉, swap 이 활성화된 상태에서 kubelet이 실행되고 있기 때문에 강제로 종료되고 있었던 것이다. 초기 설정때 껏는데.. 재실행되면서 켜진 모양이다. 😭 ❗ Kubernetes 는 왜 swap을 허용하지 않을까?Kubernetes 는 노드 리소스를 엄격하게 관리하기 위해 메모리 관리 정책을 자체적으로 수행한다. 하지만 swap 이 활성화되어 있으면 다음과 같은 문제가 발생한다.

0

[PostgreSQL] 인증 및 보안 강화하기

🔐 PostgreSQL 인증 강화 가이드 — 비밀번호만으로는 부족하다PostgreSQL은 기본적으로 username + password 조합으로 인증하지만,그 외에도 여러 보안 강화 방법을 제공하여 MFA(다단계 인증) 수준의 보호를 구축할 수 있습니다.이 글에서는 PostgreSQL의 인증 강화 방안을 단계별로 정리합니다. 1️⃣ 비밀번호 보안 강화 (기본 강화)기본적인 로그인 방식을 유지하면서도 훨씬 안전하게 만드는 방법입니다. ✅ SCRAM-SHA-256 전환md5보다 훨씬 안전한 해시 알고리즘입니다. # postgresql.confpassword_encryption = scram-sha-256 # pg_hba.confhost all all 10.0.0.0/8 scram-sha-256 ✅ 채널 바인딩 (MITM 방어)

0

[Spring] - 트랜잭션 동기화 (TransactionSynchronizationManager)

리소스 동기화 - TransactionSynchronizationManager트랜잭션을 유지하기 위해서는 트랜잭션 시작부터 끝까지 같은 데이터 베이스 Connection 을 유지해야 합니다. 스프링에서는 트랜잭션 동기화를 위해 트랜잭션 동기화 매니저를 제공합니다. 트랜잭션 매니저는 DataSource 를 통해 데이터 베이스 Connection 을 생성하고 트랜잭션을 시작합니다. 트랜잭션 매니저는 트랜잭션이 시작된 Connection 을 트랜잭션 동기화 매니저에 저장합니다. Repository 는 트랜잭션 동기화 매니저에 저장된 Connection 을 사용합니다. 트랜잭션이 종료되면 트랜잭션 매니저는 트랜잭션 동기화 매니저에 저장된 Connection 을 통해 트랜잭션을 종료하고 Connection 을 닫습니다. TransactionSynchronizationManagerTransactionSynchronizationManager 는 ThreadLocal 을 사용해서 각 쓰레드별 데이터 베이스 Connection 을 저장하고 사용할 수 있도록 있습니다. TransactionSynchronizationManager 사용하기TransactionSynchronizationManager 에 저장된 Connection 을 가져오기 위해 DataSourceUtils 를 사용합니다. Connection getConnection(DataSource dataSource) DataSource 를 이용해 Database Connection 을 가져옵니다. Connection 이 없을 경우 생성하고 이미 있을 경우 ThreadLocal 에 저장된 Connection 을 가져옵니다. void releaseConnection(@Nullable Connection con, @Nullable DataSource dataSource) DataSource 에 연결된 Database Connection 을 닫습니다. 만약 해당 Connection 을 사용중인 프로세스가 있을 경우 닫지 않고 반환합니다.

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] - Cold Start

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

0

[Spring Boot] - 스프링 프로퍼티 암호화

스프링부트 민감정보 암호화 하기운영 중인 프로그램에서 DB 암호나 API 키와 같은 민감 정보를 설정 파일에 평문으로 저장할 경우, 프로그램이 유출되면 그대로 외부에 노출되는 심각한 보안 문제가 발생할 수 있습니다. 이를 방지하기 위해 프로퍼티 암호화를 적용하면, 설정값이 유출되더라도 평문이 아닌 암호화된 형태로만 노출되므로 보안성을 크게 강화할 수 있습니다. 자바 환경에서는 이러한 암·복호화를 손쉽게 지원하는 Jasypt 모듈을 활용할 수 있어, 운영 환경에서 안전하게 민감 정보를 관리할 수 있습니다. 이번 포스팅에서는 Spring boot 에 Jaspyt 적용해 프로퍼티를 암복호화 하는 내용을 작성했습니다 암복호화를 위한 라이브러리 추가// Jasypt for property encryptionimplementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5' 값 암호화 하기java -cp "build/libs/app.jar" com.ulisesbocchio.jasyptspringboot.cli.JasyptEncryptorCLI \ input="my-db-pass" \ password="${JASYPT_ENCRYPTOR_PASSWORD}" \ algorithm="PBEWITHHMACSHA512ANDAES_256" \ ivGeneratorClassName="org.jasypt.iv.RandomIvGenerator" Configuration 추가