4차산업혁명의 일꾼 319

데이터베이스 커넥션 풀(Connection Pool)을 사용하지 않으면 어떤 문제가 발생할 수 있나요?

애플리케이션과 데이터베이스가 통신을 하기 위해서는 데이터베이스 커넥션이 필요합니다.데이터베이스 커넥션의 생애주기 :데이터베이스 드라이버를 사용하여 데이터베이스에 연결데이터 읽기/쓰기를 위한 TCP 소켓 열기소켓을 통한 데이터 읽기/쓰기연결 종료소켓 닫기커넥션 풀이 없다면 애플리케이션에서 데이터베이스에 접근해야하는 요청을 처리할 때마다 커넥션을 새로 생성하여 연결하고 해제하는 과정을 반복해야 합니다. 이 과정은 비용이 상당히 많이 들기 때문에 요청의 응답시간이 길어집니다.또 동시에 많은 요청이 들어올 경우 매번 새로운 커넥션을 생성하게 되는데, 데이터베이스의 최대 연결 수를 초과할 수 있습니다. 데이터베이스는 일반적으로 동시에 처리할 수 있는 요청 개수에 제한이 있는데, 이 제한을 초과하면 요청이 거부되어..

스레드, 프로세스, 코어의 수는 많을 수록 좋을까요?

백엔드와 관련된 질문이에요.스레드, 프로세스, 코어의 수가 많을수록 시스템 성능이 향상된다고 생각할 수 있지만, 실제로는 그렇지 않을 확률이 큽니다.스레드가 많으면?스레드가 지나치게 많아지면 운영체제가 스레드 간 컨텍스트 스위칭을 자주 수행해야 하여 CPU 자원이 스레드 관리에 소모됩니다. 이로 인해 실제 작업 수행 효율이 떨어질 수 있으며, 많은 스레드가 동시에 실행될 경우 메모리나 캐시, 락 등의 자원을 경쟁하게 되어 성능 저하나 데드 락이 발생할 가능성이 높아집니다. 또한, 스레드가 많아지면 동기화와 상태 관리가 복잡해져 버그 발생 가능성도 커집니다.프로세스가 많으면?각 프로세스는 독립된 메모리 공간을 가집니다. 그래서 많은 프로세스가 동시에 실행되면 메모리 사용량이 급격히 증가할 수 있습니다. 또..

공유 락과 배타 락에 대해서 설명해주세요.

DBMS에서 트랜잭션을 특별한 제어 없이 병행 수행을 허용한다면 데이터의 일관성과 무결성을 보장하기 어려울 수 있습니다. 이때, 병행 수행되는 트랜잭션들을 제어하기 위해서 락을 사용할 수 있으며 DBMS에서 락은 크게 공유 락과 배타 락으로 분류할 수 있습니다.공유 락(Shared Lock) 은 읽기 락(Read Lock)이라고 부르며, 공유 락이 걸린 데이터에 대해서 다른 트랜잭션에서도 공유 락을 획득할 수 있지만, 배타 락은 획득할 수 없습니다. 즉, 공유 락을 사용하면 트랜잭션 내에서 조회한 데이터가 변경되지 않는다는 것을 보장합니다.SELECT * FROM table_name WHERE id = 1 FOR SHARE;배타 락(Exclusive Lock) 은 쓰기 락(Write Lock)이라고 부르..

동기와 비동기의 차이점은 무엇인가요?

동기와 비동기는 호출하는 함수의 작업 완료를 기다리는지 여부의 차이가 있습니다. 함수 A가 동기로 함수 B를 호출하면 A는 B의 작업이 완료될 때까지 기다려야 합니다. 따라서 작업이 순차적으로 진행됩니다. 반면, 함수 A가 비동기로 함수 B를 호출하면 A는 B의 작업 완료를 신경 쓰지 않고 따로 동작합니다. 따라서 작업이 순차적으로 진행되지 않습니다.블로킹과 동기는 어떤 차이가 있나요? 🤔두 개념은 유사하면서도 다른데요. 동기 호출에서는 호출된 함수가 작업을 완료할 때까지 호출한 함수가 기다립니다. 즉, 작업이 순차적으로 진행되는 것을 의미합니다. 반면, 블로킹은 함수가 호출된 후, 호출한 함수의 결과를 기다리기 위해 실행을 멈추는 상태를 의미합니다. 즉, 제어권이 반환되지 않고 대기하는 상황입니다.스..

script 태그에서 async와 defer의 차이점

먼저, 두 속성 모두 스크립트를 비동기적으로 로드한다는 공통점이 있습니다. 하지만 실행 시점에서 중요한 차이가 있습니다.async 속성async 속성에는 다음과 같은 특징들이 존재합니다.스크립트를 비동기적으로 다운로드합니다.다운로드가 완료되면 즉시 실행됩니다.HTML 파싱과 병렬로 진행되지만, 스크립트 실행 시 HTML 파싱이 잠시 중단됩니다.여러 async 스크립트가 있을 경우, 다운로드가 완료되는 순서대로 실행됩니다.defer 속성defer 속성에는 다음과 같은 특징들이 존재합니다.스크립트를 비동기적으로 다운로드합니다.HTML 문서 파싱이 완전히 끝난 후에 실행됩니다.DOMContentLoaded 이벤트 발생 직전에 실행됩니다.여러 defer 스크립트가 있을 경우, HTML에 작성된 순서대로 실행됩니..

TCP 3-way handshake에 대해서 설명해주세요.

TCP 3-way handshake는 TCP/IP 네트워크에서 안정적이고 연결 지향적인 통신을 설정하기 위해 사용되는 절차입니다. 이 절차는 클라이언트와 서버 간에 신뢰할 수 있는 연결을 설정하기 위해 세 개의 메시지(세그먼트)를 교환하는 과정을 포함합니다.우선 클라이언트는 서버에 연결을 요청하는 SYN 세그먼트를 보내는데요. 이 세그먼트에는 초기 순서 번호(Sequence Number)와 윈도우 크기(Window Size) 정보가 포함되어 있습니다.이후 서버는 클라이언트의 요청을 수락하고, SYN과 ACK 플래그가 설정된 세그먼트를 클라이언트에 보냅니다. 이 세그먼트는 서버의 초기 순서 번호와 클라이언트의 초기 순서 번호에 대한 응답(ACK=클라이언트의 초기 순서 번호 + 1)을 포함합니다.클라이언트는..

동기 방식으로 외부 서비스를 호출할 때 외부 서비스 장애가 나면 어떻게 조치할 수 있나요?

외부 서비스 장애로 인해 응답이 오래 걸린다고 했을 때 외부 API 응답으로 대기하는 자원들이 운영 서버 내부에 쌓이면서 성능에 악영향을 줄 수 있습니다. 이를 해결하기 위한 가장 기본적인 방법은 타임아웃을 설정하는 것입니다. 크게 타임아웃에는 커넥션 타임아웃과 리드 타임아웃, HTTP 커넥션 풀 타임아웃을 설정해 볼 수 있습니다.다음과 같이 특정 서비스의 장애가 전체 서비스에 영향을 주는 경우는 어떻게 해결할 수 있을까요? 🤔1. A 서비스, B 서비스, C 서비스 연동 코드가 HTTP 커넥션 풀을 공유한다.2. A 서비스의 장애로 응답 시간 지연이 발생하는 경우 2-1. 풀에 남은 커넥션이 점점 줄어든다. 2-2. 풀에서 커넥션을 구하는 대기 시간이 증가한다. 2-3. B, C 서비..

자바스크립트 함수에 대해서 아는대로 설명해주세요

자바스크립트 함수에는 여러가지 특징들이 있습니다.첫번째 특징은 자바스크립트 함수는 일급 객체라는 점입니다.자바스크립트에서 함수는 값처럼 취급될 수 있으며, 변수에 할당하거나, 다른 함수의 인자로 전달하거나, 함수의 반환값으로 사용할 수 있습니다.const sayHello = function() { return 'Hello'; };console.log(sayHello()); // 'Hello'const executeFunction = function(fn) { return fn();};console.log(executeFunction(sayHello)); // 'Hello'이를 통해 매우 유연하게 코드를 작성할 수 있으며, 고차 함수를 포함한 다양한 패턴을 구현할 수 있습니다.두번째 특징은 익명 함수와 ..

@Component, @Controller, @Service, @Repository의 차이점에 대해서 설명해주세요.

@Component, @Service, @Controller, @Repository는 각각의 클래스를 특정 역할을 수행하는 Spring Bean으로 등록할 때 사용됩니다. 각 애너테이션은 클래스가 어떤 역할을 하는지를 명시적으로 나타내며, Spring의 @ComponentScan 기능을 통해 자동으로 Bean으로 등록됩니다. @Service, @Controller, @Repository 어노테이션은 내부적으로 @Component 어노테이션을 사용하고 있으며, 각 특징과 용도는 아래와 같습니다.@Component는 가장 일반적인 형태의 어노테이션으로, 특정 역할에 종속되지 않는 일반적인 Spring Bean을 나타냅니다. 공통 기능을 제공하는 유틸리티 클래스나, 특정 계층에 속하지 않는 일반적인 컴포넌트를..

자바스크립트 배열에 대해서 설명해주세요

자바스크립트의 배열(Array)은 순서가 있는 리스트형 객체로, 여러 값을 하나의 자료구조에 저장할 수 있습니다.배열은 제로 인덱스 기반으로, 배열의 각 값은 인덱스를 통해 접근할 수 있습니다. 배열의 선언은 간단하며, 다양한 데이터 타입을 함께 저장할 수 있습니다.const array = [1, 'apple', true, { key: 'value' }];이 배열은 숫자, 문자열, 불리언, 객체 등 다양한 타입을 저장할 수 있으며, 배열의 첫 번째 요소는 array[0]으로, 두 번째 요소는 array[1]과 같이 접근할 수 있습니다.자바스크립트 배열의 중요한 특징 중 하나는 동적 배열이라는 점입니다. 이는 배열의 크기를 미리 지정하지 않아도 되고, 요소를 추가할 때마다 배열의 크기가 자동으로 조정됩니다..

브라우저 렌더링 파이프라인에 대해서 설명해주세요.

브라우저가 웹 페이지를 화면에 표시하기 위해 거치는 과정을 브라우저 렌더링 파이프라인이라고 합니다. 이 과정은 크게 6단계로 나눌 수 있습니다.첫번째로 DOM 생성입니다.브라우저가 HTML 파일을 받으면, 이 파일을 바이트(byte) 단위로 읽기 시작합니다. 브라우저의 HTML 파서(Parser)는 이 바이트들을 문자(character)로 변환하고, 이 문자들을 다시 HTML 토큰으로 변환합니다. 이 HTML 토큰들은 각각의 태그와 그 안에 포함된 텍스트, 속성 등을 의미하게 됩니다.HTML 토큰이 생성되면, 브라우저는 이를 기반으로 DOM 트리를 생성합니다. DOM 트리는 HTML 문서의 구조를 트리 형태로 표현한 것으로, 각 태그가 노드(node)가 되어 부모-자식 관계를 형성합니다. 예를 들어, ..

연결 리스트(Linked List)의 구조와 사용 사례를 설명해주세요.

연결 리스트(Linked List)의 구조연결 리스트는 데이터를 노드(Node)라는 단위로 저장하며, 각 노드는 데이터(Data)와 다음 노드를 가리키는 포인터(Next Pointer)를 포함하는 구조입니다. 배열(Array)과 달리 연결 리스트는 메모리상에서 데이터를 연속적으로 저장하지 않고, 동적으로 메모리를 할당받아 노드 간 연결을 유지합니다.구조노드(Node):데이터(Data): 저장하고자 하는 실제 값.포인터(Next): 다음 노드를 가리키는 참조값.헤드(Head):연결 리스트의 첫 번째 노드를 가리키는 포인터.종류:단일 연결 리스트(Singly Linked List): 각 노드가 다음 노드만 가리킴.이중 연결 리스트(Doubly Linked List): 각 노드가 다음 노드와 이전 노드를 가리..

해시맵(HashMap)과 트리(Tree)의 차이점은 무엇이며, 각각 언제 사용하면 좋을지 설명해주세요.

해시맵(HashMap)해시맵은 데이터를 키(key)와 값(value)의 쌍으로 저장하며, 해시 함수를 사용하여 값을 빠르게 검색할 수 있는 자료 구조입니다.사용에 적합한 경우:빠른 데이터 검색:특정 키에 대한 데이터를 매우 빠르게 검색해야 할 때.시간 복잡도가 평균적으로 O(1)로, 대량의 데이터를 다룰 때 매우 효율적.예: 데이터베이스의 인덱싱, 캐시 시스템.키 기반 데이터 관리:키를 통해 데이터를 저장하고 관리해야 할 때.예: 사용자 ID와 사용자 정보를 관리하는 시스템.중복되지 않는 키 값 필요:고유한 식별자(예: ID, 이름)를 통해 빠르게 값을 매핑하는 경우.예: 학교 학생의 학번(ID)과 성적 데이터 매핑.순서가 중요하지 않은 경우:데이터의 순서가 필요 없고, 빠른 접근이 우선시될 때.예: 단..

배열(Array)과 연결 리스트(Linked List)의 차이점과 시간 복잡도를 설명해주세요

배열(Array)의 특징데이터에 빠르게 접근할 때 유리 (O(1)).크기가 고정되어 있어 메모리 효율적인 경우 적합.삽입/삭제가 많지 않고, 데이터의 정렬 상태를 유지해야 하는 경우 사용.사용 사례: 정적 배열, 간단한 데이터 저장, 2D 또는 다차원 배열 활용.연결 리스트(Linked List)의 특징크기를 동적으로 조정 가능하고, 삽입/삭제가 빈번한 경우 적합.탐색이 느리지만, 순차적으로 데이터를 처리하거나 삽입/삭제가 중요할 때 유리.메모리 사용량이 상대적으로 많아질 수 있음.사용 사례: 동적 데이터 저장, 스택/큐 구현, 그래프의 인접 리스트, LRU 캐시. 정리빠른 데이터 접근이 필요하고 크기가 고정된 경우 배열(Array) 사용.크기가 가변적이고 삽입/삭제가 자주 일어나는 경우 연결 리스트(L..

CloseableHttpClient, WebClient, RestTemplate의 특징 및 비교

CloseableHttpClient, WebClient, RestTemplate의 특징 및 비교Java에서 REST API와 같은 HTTP 통신을 수행할 때 가장 많이 사용되는 주요 도구들은 CloseableHttpClient, RestTemplate, WebClient입니다. 각각의 도구는 사용 목적, 패러다임, 특징이 다르기 때문에 적절한 도구를 선택하는 것이 중요합니다.1. CloseableHttpClientApache HTTPClient 라이브러리에서 제공하는 HTTP 클라이언트로, HttpClientBuilder를 사용해 생성합니다.특징저수준(low-level) 클라이언트:HTTP 요청/응답의 세부적인 처리를 해야 할 때 유용.쿠키 관리, 인증, 커넥션 풀, 시간 초과 설정 등의 HTTP 설정을..

리액트의 render phase와 commit phase에 대해서 설명해주세요

.프론트엔드와 관련된 질문이에요.리액트의 렌더링 과정은 크게 두 가지 단계로 나눌 수 있습니다. render phase와 commit phase입니다.먼저 render phase는 리액트가 변화된 상태나 props에 따라 어떤 UI가 변경되어야 할지를 결정하는 단계입니다. 이 과정에서는 실제로 DOM을 업데이트하지 않고, 변경사항을 가상 DOM에서 계산하여 비교합니다. 이 단계는 순수하게 계산과정이기 때문에 성능에 영향을 주지 않도록 중단되거나 다시 실행될 수 있으며, React 18에서 도입된 Concurrent Mode를 통해 비동기적으로 처리될 수도 있습니다.다음으로 commit phase는 실제로 변화된 UI를 DOM에 반영하는 단계입니다. 이때 리액트는 가상 DOM에서 계산된 결과를 실제 DOM..

equals와 hashCode는 왜 함께 재정의해야 할까요?

equals와 hashCode 메서드는 객체의 동등성 비교와 해시값 생성을 위해서 사용할 수 있습니다. 하지만, 함께 재정의하지 않는다면 예상치 못한 결과를 만들 수 있습니다. 가령, 해시값을 사용하는 자료구조(HashSet, HashMap..)을 사용할 때 문제가 발생할 수 있습니다.class EqualsHashCodeTest {    @Test    @DisplayName("equals만 정의하면 HashSet이 제대로 동작하지 않는다.")    void test() {        // 아래 2개는 같은 구독자        Subscribe subscribe1 = new Subscribe("team.maeilmail@gmail.com", "backend");        Subscribe subsc..

리액트의 Strict Mode에 대해서 설명해주세요

리액트에서 StrictMode는 주로 개발 중에 발생할 수 있는 잠재적인 문제를 사전에 감지하고 예방하기 위해 사용됩니다.첫째, 오래된 라이프사이클 메서드와 비권장 API의 사용을 감지합니다. 예를 들어, componentWillMount(), componentWillReceiveProps()와 같은 메서드는 더 이상 사용이 권장되지 않는데, StrictMode는 이러한 메서드들이 코드에 포함된 경우 경고를 표시해줍니다. 이를 통해 개발자가 최신 React API를 사용하여 보다 안정적이고 효율적인 코드를 작성하도록 돕습니다.둘째, 의도치 않은 부수 효과를 방지합니다. 리액트는 컴포넌트의 렌더링이 예측 가능하고 순수하게 이루어지기를 기대합니다. StrictMode는 이를 검증하기 위해 useEffect(..

로그와 메트릭을 설명해주세요

로그와 메트릭을 설명해주세요.백엔드와 관련된 질문이에요.로그는 서버가 동작할 때 서버의 상태와 동작 정보를 시간 경과에 따라 기록된 결과입니다. 로그는 시스템의 오류와 문제들을 쉽게 찾아낼 수 있도록 도와줍니다. 반면, 메트릭은 시스템의 성능과 상태에 대한 통계적인 정보를 의미합니다. 메트릭을 잘 수집하면 시스템의 현재 상태를 손쉽게 파악할 수 있고, 사업 현황에 관한 유용한 정보를 얻을 수 있습니다. 가령, 메트릭은 DAU, Retension, CPU 사용량, 메모리 사용량 등이 있습니다.로그와 메트릭을 수집해 보신 적이 있나요? 🤔아래부터는 예시로 생각해주세요! 각자 진행하신 프로젝트 상황에 맞는 답변을 생각해 주세요. 😀스프링 부트 액추에이터를 사용해 메트릭을 생성하고 프로메테우스에 저장한 다..

얕은 복사와 깊은 복사에 대해서 설명해주세요

백엔드와 관련된 질문이에요.자바에서 객체를 복사할 때 얕은 복사와 깊은 복사라는 두 가지 방식이 있습니다. 먼저 Book과 Author라는 두 클래스를 사용해서 예제를 살펴볼게요. Book은 책의 이름(name)과 저자(author) 정보를 가지고 있고, Author는 저자의 이름을 가지고 있습니다.class Book { private String name; // 책 이름 private Author author; // 저자 public Book(String name, Author author) { this.name = name; this.author = author; } public Book shallowCopy() { // 얕은 복사 re..