분류 전체보기 51

Java GC(Garbage Collection) 기초 개념 정리

Java에서의 메모리 관리는 자동으로 이루어지며, 그 중심에는 Garbage Collector(GC)가 있습니다. 이번 글에서는 GC의 기본 원리와 각 영역의 역할, 그리고 객체가 살아가는 흐름에 대해 정리합니다. 1. GC란 무엇인가?GC(Garbage Collection)는 프로그램 실행 중 더 이상 사용되지 않는 객체를 자동으로 메모리에서 제거하여, 메모리를 효율적으로 관리하는 JVM의 기능입니다. Java에서는 개발자가 명시적으로 메모리를 해제하지 않아도 GC가 이를 대신해줍니다. 2. JVM 메모리 구조와 GC 관련 영역JVM의 힙(Heap)은 다음과 같이 나뉩니다:Young GenerationEden 영역: 새로 생성된 객체들이 저장됨Survivor 영역(S0, S1): Eden에서 살아남은 ..

Docker "Failed to start docker.service: Unit docker.service not found" 오류

Docker가 snap 기반으로 설치 되어 서비스가 정상 기동이 되지 않을 경우 해결 방법 1. docker가 Snap인지 확인 #which docker /snap/bin/docker로 나오면 Snap 기반 2. Snap으로 설치된 Docker 제거sudo snap remove docker 3. Snap 대신 Docker 공식 설치로 전환- Docker 공식 리포지터리를 통한 설치 (Ubuntu 24.04 기준)sudo apt updatesudo apt install -y ca-certificates curl gnupgsudo install -m 0755 -d /etc/apt/keyringscurl -fsSL https://download.docker.com/linux/ubuntu/gpg | \ su..

자바 클래스 로더와 WAS에서의 로딩 우선순위 — 충돌 없이 이해하기

클래스 충돌, 왜 발생할까요?Java 웹 애플리케이션을 개발하다 보면"이 클래스 왜 안 불러와지지?", "같은 이름인데 충돌이 나네?"이런 현상을 자주 겪게 됩니다.특히 WAS(Web Application Server)를 사용하는 경우, Java SE와는 다른 클래스 로딩 구조를 가지고 있어서충돌이나 예외가 발생하는 원인을 이해하지 못하면 디버깅에 큰 어려움을 겪습니다.이 글에서는 다음 내용을 중심으로 개념을 정리해 봅니다.Java 클래스 로딩 순서와 부모 위임 모델시스템 클래스 오버라이드 가능 여부WAS에서 클래스 우선순위가 달라지는 이유같은 클래스가 classes, JAR, WAS 모듈에 있을 때 어떤 게 로딩될까?Java의 기본 클래스 로딩 구조Java는 기본적으로 부모 위임 모델 (Parent D..

setcap을 이용한 Apache(아파치) 기동 권한 설정

1. setcap이란?setcap은 Linux에서 실행 파일에 특정한 **Capabilities(권한)**을 부여하는 명령어입니다. 일반적으로 1024 이하의 포트(Well-known Ports)는 root 권한이 있는 프로세스만 바인딩 가능하지만, setcap을 이용하면 루트 권한 없이도 특정 실행 파일이 이러한 포트를 사용할 수 있습니다.Apache 웹 서버(httpd)는 기본적으로 80번(HTTP), 443번(HTTPS) 포트에서 실행되기 때문에 일반 사용자로 실행할 경우 포트 바인딩에 실패합니다. 이를 해결하기 위해 보통 Apache는 root 권한으로 실행되었다가, 이후 일반 사용자(apache, www-data 등)로 변경됩니다. 하지만 보안상 root로 실행하는 것은 위험할 수 있기 때문에 ..

WEB_WAS/APACHE 2025.03.17

1. Strategy 패턴

Strategy 패턴이란?Strategy 패턴은 동일한 문제를 해결하는 여러 알고리즘이 있을 때, 이들을 독립된 클래스로 캡슐화하고 런타임에 알고리즘을 교체할 수 있도록 하는 설계 패턴입니다. 이 패턴은 코드 중복을 줄이고 확장성을 높이는 데 매우 유용합니다. 예를 들어, 결제 시스템을 설계한다고 가정해봅시다. 결제 방식은 신용카드, PayPal, 혹은 기타 방식으로 다양할 수 있습니다. 각 결제 방식을 동적으로 변경할 수 있다면 사용자의 요구에 더 잘 대응할 수 있습니다. 하지만 잘못된 설계로 인해 유지보수와 확장성이 떨어질 위험이 있습니다. 다음은 잘못된 설계와 그 문제점을 살펴보고, 이를 Strategy 패턴으로 해결하는 과정을 소개합니다. 이 글의 소스코드 및 설명은 헤드퍼스트 디자인패턴 책을 참..

Java 직렬화와 NotSerializableException 문제

1. 들어가며Java 개발을 하다 보면 직렬화(Serialization)는 네트워크 통신, 파일 저장, 캐시 관리와 같은 작업에서 중요한 역할을 합니다. 그러나 직렬화 과정에서 **NotSerializableException**과 같은 예외를 만날 수 있습니다. 특히, HttpSession 또는 세션에서 가져온 데이터를 사용하는 객체를 직렬화할 때 문제가 자주 발생합니다.이 글에서는 세션에서 데이터를 가져와 사용하는 객체에서 발생한 직렬화 이슈를 중심으로 원인과 해결 방법을 소개합니다. 2. 문제 상황아래는 세션에서 데이터를 가져와 사용하는 객체를 직렬화하려다 발생한 예외 상황입니다.Object obj = this.request.getSession().getAttribute("vis"); 위 코드에서 v..

Java로 TCP 프록시 서버 구현하기 - 라운드 로빈 로드밸런싱을 활용한 백엔드 서버 연결

소개멀티스레드 환경에서 다수의 TCP 요청을 처리하고, 이를 백엔드 서버로 효율적으로 분배하는 TCP 프록시 서버를 구축하는 방법을 소개합니다. 이 프로젝트는 Java의 강력한 네트워크 라이브러리와 라운드 로빈 로드밸런싱 알고리즘을 활용해 간단하고 효율적인 로드밸런싱을 구현합니다. 1. 프로젝트 개요목표TCP 요청을 처리하는 프록시 서버를 구축.백엔드 서버 그룹으로 요청을 분배.라운드 로빈 알고리즘을 통해 요청을 균등하게 분배.멀티스레드를 활용해 여러 클라이언트 요청을 동시에 처리.구성클라이언트: TCP 요청을 보냄.프록시 서버: TCP 요청을 수신하고 백엔드 서버로 전달.백엔드 서버 그룹: 요청을 처리하고 결과를 반환.2. 라운드 로빈 로드밸런싱로드밸런싱이란?로드밸런싱은 다수의 서버에 작업을 균등하게 ..

디자인 패턴

안녕하세요. 오랜만에 블로그 글을 씁니다. 이번에는 디자인 패턴에 대해 공부하고 기록해보려 합니다.디자인 패턴이란?디자인 패턴은 소프트웨어 설계에서 반복적으로 나타나는 문제를 해결하기 위한 검증된 설계 방법입니다. 이는 코드를 효율적이고 체계적으로 작성하도록 돕는 일종의 "모범 답안"이라고 할 수 있습니다.디자인 패턴이 왜 필요한가?문제 해결의 기준 제공: 반복되는 문제에 대해 검증된 해결책을 제공합니다.코드의 가독성과 재사용성 향상: 유지보수하기 쉽고 확장 가능한 코드를 작성할 수 있습니다.개발자 간 의사소통 강화: 공통된 용어와 설계를 통해 팀 간 협업이 원활해집니다.디자인 패턴은 어디에 활용되는가?디자인 패턴은 다음과 같은 상황에서 유용합니다:객체 생성이 복잡하거나 관리가 필요한 경우 (예: Sin..

4-6. 리눅스 사용자 및 권한 관리 - 사용자 그룹 관리

1. 그룹 생성 - groupadd 새로운 그룹을 생성하려면 groupadd 명령어를 사용한다. #sudo groupadd 2. 그룹에 사용자 추가 # sudo usermod -aG 추가된 그룹에 사용자가 추가된걸 확인 할 수 있다. 3. 그룹 삭제 - groupdel 그룹을 삭제하려면 groupdel 명령어를 사용한다. sudo groupdel 정상적으로 그룹이 삭제 된걸 확인 할 수있다. 리눅스에서 그룹은 파일 및 디렉토리 접근 권한을 관리하고 사용자를 논리적으로 그룹화하는 데 사용함으로 관리하는 법을 익히는게 필수라고 볼 수 있다.

4-5. 리눅스 사용자 및 권한 관리 - 사용자 계정 수정 / 삭제

1. 사용자 계정 수정 - usermod # usermod [option] [option] -u [uid]: 사용자 ID 번호 -o: UID를 중복하여 계정 수정 -g [group-name]: 사용자 기본 그룹명 또는 그룹번호(GID) -G group-list: 추가 그룹들의 이름과 번호 목록으로 각 그룹은 콤마로 구분 -d home-dir: 기본 홈 디렉토리 대신 사용될 홈 디렉토리 지정 -s : 로그인 쉘, (디폴트 /bin/sh) -c comment : 사용자에 대한 설명 -l new_name : 새로운 이름으로 수정 -f days : 암호가 만료된 후 계정이 만료될 때까지의 날짜 수 (0:비활성화, 1:활성화) -e date : 계정 만료기한 YYYY-MM-DD 날짜 형식으로 지정 -p passw..