2025/03/09 10

스레드 풀 생성 전략과 작업 거절 정책

스레드 풀은 시스템 자원을 효율적으로 사용하고, 안정적인 작업 처리를 위해 필수적인 요소다. 다양한 상황에 맞춰 적절한 풀 생성 전략과 작업 거절 정책을 설정하면, 트래픽 급증 시에도 시스템이 예측 가능한 성능을 유지할 수 있다. 아래는 대표적인 Executor 기반 스레드 풀 생성 전략과 거절 정책에 대한 정리다.Executor 전략Executor 스레드 풀 관리스레드 관리 속성corePoolSize기본적으로 유지되는 스레드 수다. 이 수만큼의 스레드를 초기화해두고, 작업이 들어오면 먼저 활용한다.maximumPoolSize생성될 수 있는 스레드의 최대치다. corePoolSize 이상의 스레드는 필요한 경우에만 만들고, 더 이상 새 스레드를 만들 수 없으면 작업을 거절한다.keepAliveTime, ..

WEB BE/JAVA 2025.03.09

스프링 + 비동기 프로그래밍

비동기 프로그래밍은 시스템의 처리 효율을 높이고 블로킹을 최소화하기 위한 핵심 기법이다. 동기 호출로 인한 블로킹 문제를 해결하기 위해 이벤트 드리븐 아키텍처와 같은 패러다임이 채택되며, 이를 통해 처리 흐름을 비동기로 전환하고, 데이터 흐름 제어(backpressure) 및 에러 처리를 체계적으로 관리할 수 있다.이벤트 드리븐 아키텍처I/O 처리와 zip 요청I/O 작업 시 상류 스트림에서 zip 요청을 받는다. 내부에서 동기 호출이 이루어지면 블로킹이 발생하므로, 비동기 요청을 일관되게 사용하는 것이 바람직하다.이벤트와 콜백 메커니즘이벤트나 콜백을 통해 작업 완료를 알 수 있다. 상류 스트림에서는 backpressure를 적용한 Flux를 통해 데이터 요청을 관리하며, zip을 통해 Mono로 데이터..

동기/비동기 관점에서 바라본 Java IO vs Java NIO

동기 및 비동기 방식의 관점에서 Java IO와 Java NIO를 살펴보면, 두 기술은 입출력 처리 방식과 구조적인 접근에서 본질적인 차이를 보인다. Java IO는 전통적인 스트림 기반 방식으로 설계되었으며, 모든 입출력 작업이 완료될 때까지 호출 스레드가 대기하는 블로킹 방식을 채택한다. 반면 Java NIO는 이벤트 기반과 논블로킹 방식을 통해 다수의 연결을 효율적으로 처리할 수 있도록 설계되었다.Java IO구성요소InputStream / OutputStream: 데이터를 읽거나 쓰기 위한 기본 구성 요소로, 내부에 성능 최적화를 위해 버퍼(예: BufferedInputStream, BufferedOutputStream)를 사용할 수 있다.사용 방식블로킹 방식: 입출력 요청 시 데이터가 준비될 때..

"프로그래밍 패러다임" 이란?

프로그래밍 패러다임은 소프트웨어 설계와 구현 방법론을 구체화하는 개념이며, 각 패러다임은 문제 해결 접근 방식에 따른 특징과 이점을 갖는다. 다양한 패러다임이 존재하며, 아래와 같이 체계적으로 분류할 수 있다.명령형 프로그래밍 (Imperative Programming)컴퓨터에게 수행해야 할 작업을 명령어의 순차적 집합으로 지시하는 방식이다.절차적 프로그래밍 (Procedural Programming): 명령형 프로그래밍의 한 갈래로, 작업을 함수나 서브루틴 단위로 나누어 순차적으로 수행한다. 예를 들어, C 언어와 Pascal이 이에 해당한다.구조적 프로그래밍 (Structured Programming): 코드의 흐름을 제어 구조(조건문, 반복문 등)를 통해 명확하게 구성함으로써 가독성과 유지보수를 향..

CAP 이론, 그리고 BASE 원칙이란?

분산 시스템은 여러 컴퓨터 노드가 하나의 통합된 시스템처럼 동작하도록 구성된 환경이다. 네트워크 지연이나 일부 노드의 장애 등 다양한 문제에 직면할 수 있기에, 시스템 설계자는 이러한 제약 조건을 고려한 원칙에 따라 트레이드오프를 명확히 이해하고 선택해야 한다.CAP 이론CAP 이론은 분산 시스템 설계 시 고려해야 할 세 가지 핵심 요소 간의 상호작용을 설명한다.Consistency (일관성):모든 노드가 동일한 데이터를 동시에 반영하여, 사용자에게 항상 최신의 일관된 정보를 제공하는 상태를 유지한다.Availability (가용성):시스템이 모든 요청에 대해 항상 응답할 수 있도록 보장한다. 일부 노드에 장애가 발생하더라도 전체 시스템은 계속 운영된다.Partition Tolerance (분할 허용성)..

백엔드 개발자가 알아야 할 소프트웨어 공학 관련 면접 질문

1. 마이크로서비스 아키텍처(MSA) vs 모놀리식 아키텍처마이크로서비스 아키텍처 (MSA)마이크로서비스 아키텍처는 애플리케이션을 독립적인 서비스 단위로 분리하여 운영하는 방식을 의미한다.장점독립적 배포 및 확장: 각 서비스는 별도로 배포 및 확장이 가능하여, 필요에 따라 개별적으로 조정할 수 있다.장애 격리: 하나의 서비스에 장애가 발생해도 전체 시스템에 미치는 영향을 최소화할 수 있다.기술 선택의 유연성: 서비스마다 최적의 기술 스택을 선택할 수 있어 개발 환경에 유연하게 대응할 수 있다.단점운영 및 모니터링 부담 증가: 서비스 수가 늘어남에 따라 운영, 모니터링 및 로깅 체계가 복잡해진다.테스트 난이도 상승: 분산 환경에서의 통합 테스트 및 서비스 간 상호작용 테스트가 어려워진다.구현 및 운영 복잡..

백엔드 개발자가 알아야 할 기초 보안 - 인증, 인가, OAuth, OpenID Connect

1. 인증과 인가인증 (Authentication)정의: 사용자가 주장하는 신원을 확인하는 절차이다.목적: 사용자로부터 제공된 정보를 바탕으로, 실제로 해당 사용자인지 검증한다.인가 (Authorization)정의: 인증된 사용자가 특정 리소스에 접근할 권한이 있는지를 확인하는 절차이다.목적: 인증을 마친 사용자에게 적절한 접근 권한을 부여하여 시스템 자원의 보안을 유지한다.2. 암호화 방식 및 특징대칭 키 암호화원리: 암호화와 복호화에 동일한 키를 사용한다.장점: 연산 속도가 빠르며 대용량 데이터 암호화에 효율적이다.단점: 키의 분배와 관리가 취약하여, 키 노출 시 전체 보안에 심각한 영향을 미친다.공개 키 암호화원리: 서로 상보적인 공개 키와 개인 키를 사용하여 암호화와 복호화를 수행한다.장점: 키 ..

OSI 7 Layer, TCP/IP 4 Layer, 그리고 HTTP와 HTTPS

1. 계층 모델1.1 OSI 7계층OSI 7계층은 네트워크 통신의 각 기능을 계층별로 분리하여 정의한 모델이다. 각 계층은 아래와 같이 역할을 수행한다.물리 계층 실제 전송 매체를 통해 비트 단위의 데이터 전송을 담당한다.전기 신호, 광 신호, 무선 주파수 등을 사용하여 데이터 전송이 이루어진다.데이터 링크 계층 물리 계층에서 전송된 데이터를 프레임 단위로 관리하며, 오류 검출 및 수정 기능을 수행한다.MAC 주소 등을 이용한 노드 간의 통신을 지원한다.네트워크 계층 데이터를 패킷 단위로 관리하며, 최적의 경로를 선택해 목적지까지 전달하는 라우팅 기능을 담당한다.IP 주소를 사용하여 패킷의 출발지와 도착지를 지정한다.전송 계층 종단 간 데이터 전송의 신뢰성과 순서를 보장하기 위한 연결 설정, 데이..

프로세스와 스레드, 교착 상태

아래 내용은 면접을 대비한, 간단하게 정리된 프로세스와 스레드, 교착 상태에 대한 내용이다.프로세스와 스레드프로세스정의: 실행 중인 프로그램의 독립된 인스턴스이다.특징:각 프로세스는 별도의 메모리 공간과 시스템 자원을 보유한다.다른 프로세스와의 통신은 주로 IPC(Inter-Process Communication)를 통해 이루어진다.의의: 시스템 안정성과 보안을 위해 프로세스 간의 강한 격리를 제공한다.스레드정의: 하나의 프로세스 내에서 실행되는 경량 작업 단위이다.특징:동일 프로세스 내의 스레드들은 메모리 공간과 자원을 공유한다.스레드 간 전환 비용이 낮아 효율적으로 작업을 수행할 수 있다.한 프로세스 내에서 여러 스레드를 사용하여 병렬 처리가 가능하다.의의: 자원 공유와 빠른 전환을 통해 응용 프로그..

Java 의 주요 자료구조 - ArrayList & Hash Map

ArrayList의 동작 방식ArrayList는 내부적으로 배열을 사용하여 데이터를 저장하며, 그 작동 원리는 다음과 같다.내부 배열 관리데이터를 순차적으로 저장하는 배열을 사용한다.배열은 일정한 용량(Capacity)을 가지며, 초기 용량은 지정할 수 있다.용량 확장 방식add 연산 시 남은 공간이 없으면, 현재 용량의 50%를 추가하여 새로운 배열을 생성한다.이 과정에서 기존 배열의 내용을 arraycopy 메서드를 사용하여 새로운 배열로 복사한다.용량 확장 시 복사로 인한 성능 오버헤드가 발생하지만, 대부분의 삽입 연산은 평균적으로 O(1)의 시간 복잡도를 유지한다.참고로, C++의 vector는 용량을 두 배로 늘리는 방식으로 확장하는 점에서 차이가 있다.해시테이블의 작동 원리 및 충돌 해결 방법..

WEB BE/JAVA 2025.03.09