본문 바로가기
IT

[백엔드 면접] GPT4o 기반 CS 기술 면접

by 유나니나노 2024. 7. 4.
반응형

 

Spring 구성 요소

  • Spring Core
  • Spring MVC
  • Spring AOP
  • Spring DataAccess
  • Spring Security
  • Spring Boot

Spring Core

Spring Core는 스프링 프레임워크에서 핵심 모듈로 애플리케이션의 기본 구조와 동작을 책임집니다.

  • IoC(제어의 역전) 컨테이너: 객체의 생성, 설정, 생명 주기를 관리
  • DI(의존성 주입): 객체간의 의존성을 설정하고 관리하여 코드 결합성을 낮추고 재사용성과 테스트의 용이성을 높임
    • 소프트웨어 디자인 패턴 중 하나로 객체들이 서로의 의존성을 직접 주입하지 않고 외부에서 주입받는 방식을 의미
    • 주입자는 애플리케이션의 의존성을 생성하고 객체에 주입하는 역할을 함
    • 의존성주입될 객체를 의미
    • 결합도 감소, 테스트 용이, 코드 가독성과 유지보수성 향상
    • @Autowired
      • 스프링 프레임워크에서 의존성 주입을 간편하게 사용하기 위해서 사용되는 어노테이션
      • 주로 클래스의 필드, 생성자, 메소드에 적용되어서 스프링 컨테이너가 해당 타입의 빈을 자동으로 주입
      • 문제 및 해결 방안
        • Bean을 찾지 못해서 발생하는 에러
          • @Service, @Component와 같이 빈이 제대로 등록되어 있는지 확인 필요
        • 같은 타입의 빈이 여러개 있을 경우
          • @Qualifier 어노테이션을 통해 특정 빈을 명시적으로 지정
        • 필드 주입을 사용할 경우
          • 테스트가 용이하지 못하고, 의존성이 명확하지 않음
          • 되도록이면 생성자 주입을 진행, 이는 모킹 테스트가 용이하고 의존성이 명확함
  • Bean 관리: Bean을 정의하고 라이프 사이클을 관리
  • 환경 설정 및 프로파일 제공: 다양한 환경에 따라 설정을 다르게 적용
  • 리소스 관리: 파일, 클래스패스, URL 등 다양한 리소스를 쉽게 로드하고 관리

 

HashMap vs TreeMap

HashMap

  • 해싱을 이용하여 데이터를 저장
  • O(1)의 시간 복잡도
  • 키와 값의 순서를 보장하지 않음
  • 하나의 null키와 여러 개의 null값을 허용
  • 순서가 중요하지 않고, 빠른 접근과 수정이 필요한 경우 사용
  • 캐시 구현이나 데이터베이스 레코드 접근에 사용
  • 단점
    • 메모리 사용량이 많아질 수 있음
    • 해시 충돌이 발생할 경우 성능 저하
    • 정렬된 데이터를 원할 때는 부적합

TreeMap

  • 레브-블랙트리를 이용하여 데이터를 저장
  • O(logN)의 시간복잡도
  • 키가 항상 정렬된 순서로 저장
  • null키를 허용하지 않음
  • 키의 정렬이 필요하고, 순서에 따라 데이터를 순회해야 하는 경우 사용
  • 범위 검색이나 정렬된 데이터가 필요한 경우에 사용
  • 단점
    • 해시맵보다 속도가 느릴 수 있음
    • 메모리 사용량이 상대적으로 많고, 구조를 유지하는 데 추가적인 시간이 필요
    • null키를 허용하지 않기 때문에 특정 시나리오에서 사용이 제한될 수 있음

 

TCP vs UDP

TCP

  • 연결 지향적: 데이터 전송 전에 연결을 설정
  • 신뢰성: 데이터의 순서 보장(패킷 순서 보장), 데이터 손실 시 재전송 기능이 있음
  • 흐름제어 및 혼잡제어: 네트워크의 혼잡을 방지하고 수신자가 데이터를 처리할 수 있는 속도로 전송
  • HTTP, HTTPS, FTP, SMTP 등 신뢰성이 중요한 프로토콜에서 사용

연결 지향적이며, 데이터 전송 전에 세션을 설정합니다. 패킷의 순서가 보장되고, 패킷 손실 시 재전송을 통해 데이터의 신뢰성을 보장합니다. 흐름제어와 혼잡제어를 지원합니다.

UDP

  • 비연결 지향적: 데이터 전송 전에 연결 설정이 필요 없음
  • 신뢰성 없음: 데이터의 순서 보장이나 재전송 기능이 없음
  • 빠른 전송 속도: 연결 설정이 없으므로 데이터 전송이 빠름
  • DNS, DHCP, TFTP, VoIP 등 속도가 중요하고, 일부 데이터 손실이 허용되는 프로토콜에서 사용

비연결 지향적이며, 세션 설정 없이 데이터를 전송합니다. 패킷의 순서가 보장되지 않으며, 재전송을 하지 않습니다. 따라서 , 실시간 애플리케이션이나 속도가 중요한 경우에 사용됩니다.

 

프로세스 vs 스레드

프로세스

  • 프로그램의 인스턴스, 독립적인 메모리 공간을 가짐
  • 프로세스 간에는 기본적으로 메모리를 공유하지 않으며, 독립적으로 실행
  • 운영체체는 각 프로세스를 독립적으로 관리
  • 문맥 전환 시 비용이 큼

스레드

  • 프로세스 내에서 실행되는 작업 단위
  • 동일한 프로세스 내의 스레드들은 메모리를 공유
  • 스레드 간의 문맥 전환 비용이 낮고, 데이터 공유가 쉬움
  • 다중 스레드를 사용하면 병렬 처리가 가능하지만, 동기화 문제를 신경 써야 함

멀티프로세싱 vs 멀티스레딩

멀티프로세싱

  • 여러 개의 프로세스가 동시에 병렬로 실행되는 것
  • 메모리를 공유하지 않음
  • 장점
    • 독립성, 병렬 처리
  • 단점
    • 메모리 사용량 증가
    • 프로세스 간 통신 비용
    • 컨텍스트 스위칭 비용이 높음

멀티스레딩

  • 하나의 프로세스에서 여러 개의 스레드가 동시에 실행되는 것
  • 메모리를 공유
  • 장점
    • 빠른 통신
    • 컨텍스트 스위칭 비용이 낮음
  • 단점
    • 동기화가 어려움

 

객체지향 프로그래밍(OOP) 개념 4가지

캡슐화

  • 객체의 필드와 메서드를 하나로 묶는 것
  • 객체의 내부 상태를 외부로부터 숨기고, 객체의 메서드를 통해서만 변경하거나 접근

다형성

  • 하나의 클래스나 인터페이스가 여러가지 형태를 가질 수 있는 것
  • 동일한 인터페이스를 통해 서로 다른 구현체를 사용할 수 있도록 하여 코드의 유연성과 확장성을 높임

상속

  • 하나의 클래스가 다른 클래스의 특성과 행위를 물려받는 것
  • 코드의 재사용성을 높이고, 클래스 간의 계층 구조를 형성

추상화

  • 불필요한 세부사항을 숨기고 중요한 개념이나 기능만을 노출하는 것
  • 복잡성을 줄이고, 객체의 중요한 특성만을 중심으로 설계할 수 있도록 함

 

해시테이블(HashTable), 충돌 해결 방법

  • 키-값 쌍을 저장하는 자료구조키를 인덱스로 변환하여 값을 저장
  • 충돌 해결 방법
    • 체이닝: 해시테이블의 각 버킷 또는 슬롯이 연결 리스트를 갖도록 하는 방법
    • 주소 개방법: 충돌이 발생하면 다른 빈 슬롯을 찾는 방법

 

퀵 소트의 시간복잡도와 작동 원리

  • 퀵 소트는 비교 기반 정렬 알고리즘으로, 분할 정복 기법을 사용
  • 시간복잡도는 평균적으로 O(NlogN)
  • 분할 - 재귀적 호출
    • 피벗을 기준으로 분할
    • 분할된 부분을 재귀 호출로 정렬 진행
  • 피벗의 잘못된 설정으로 최악의 경우 시간복잡도는 O(n^2)

 

ACID 특성

데이터베이스에서 트랜잭션이 안전하게 수행되도록 보장하는 특성

원자성

  • 트랜잭션이 완전히 수행되거나 완전히 수행되지 않는 것

일관성

  • 트랜잭션이 수행되고 난 후에는 데이터베이스가 일관된 상태를 유지하는 것

독립성

  • 여러 개의 트랜잭션이 동시에 수행될 때, 서로의 작업이 간섭받지 않도록 하는 것

지속성

  • 트랜잭션 커밋이 완료되면, 데이터베이스에는 영구적으로 저장되어야 하는 것

가비지 컬렉션(Garbage Collection)

더 이상 사용되지 않는 객체가 메모리를 점유하여 생기는 메모리 누수를 방지하는 기술

Generation garbage

  • Young 영역과 Old 영역으로 구분
  • 객체가 할당되면 Young 영역으로 들어오고 일정 기간 동안 해제되지 않으면 Old 영역으로 이동
  • Young 영역에서 가비지 컬렉션이 활발하게 이루어짐
  • Yound 영역은 Eden-Servivor1-Servivor2로 이루어지면, Eden에서 객체가 생성, 살아남은 객체가 Servivor 영역으로 이동

Mark-and-Sweep

  • 마킹 단계
    • 루트 객체로부터 도달 가능한 모든 객체를 마크
    • 마크된 객체들은 아직 사용중인 객체로 간주
  • 스위핑 단계
    • 메모리 영역을 순회하면서 마크되지 않은 객체를 식별
    • 해지된 메모리 공간은 이후에 다른 객체들이 사용할 수 있도록 회수

Copying

  • 메모리를 두 개로 나누어 한쪽에서 다른 쪽으로 객체를 복사하는 방식으로 동작
  • 복사 단계
    • 루트 객체로부터 도달 가능한 모든 객체를 탐색하고 새로운 메모리 영역으로 복사
  • 스위칭 단계
    • 역할을 바꾸어 새로운 메모리 영역이 다음 가비지 컬렉션까지 사용

Mark-and-Compact

  • 마킹 단계
    • 루트 객체로부터 시작하여 도달 가능한 모든 객체를 마크
  • 압축 단계
    • 마크된 객체들을 메모리의 한 쪽 끝으로 이동시켜 연속적으로 배치
    • 빈 공간이 한 쪽 끝에 모이게 되어 메모리 단편화가 해결

 

RESTful 기본 원칙과 중요한 이유

자원(Resource) 기반

  • 모든 것은 자원으로 간주, 고유한 URI로 식별

표현(Representation) 사용

  • 클라이언트는 자원의 상태를 표현하는 데이터를 서버로부터 전송 받음
  • 이 표현은 JSON, XML, HTML 등 다양한 형식으로 제공될 수 있음

상태 없음(Stateless)

  • 서버는 각각의 요청을 독립적으로 처리하며 요청 간에 클라이언트의 상태를 저장하지 않음
  • 모든 필요한 상태 정보는 요청에 포함되어야 함

클라이언트-서버 구조

  • 클라이언트와 서버는 독립적으로 발전할 수 있음
  • 클라이언트는 사용자 인터페이스를 관리
  • 서버는 데이터 저장 및 비즈니스 로직을 처리

캐시 가능(Cacheable)

  • 응답은 캐시될 수 있어야 함
  • 성능을 향상시키고 서버 부하를 줄일 수 있음

계층화 시스템(Layered System)

  • 클라이언트는 중간 서버를 통해 요청을 전달할 수 있음
  • 보안, 로드 밸런싱 등의 기능을 추가할 수 있음

인터페이스 일관성

  • RESTful API는 일관된 인터페이스를 제공해야 함
  • 리소스에 대한 조작은 HTTP 메서드를 통해서 이루어짐

중요한 이유

  • 확장성: 클라이언트와 서버가 독립적으로 발전할 수 있어서 시스템 확장이 용이
  • 유지보수성: 일관된 인터페이스를 제공함으로써 코드의 가독성과 유지보수성을 높임
  • 성능: 캐시 메커니즘을 통해 성능 최적화
  • 안정성: 상태 없음 원칙을 통해 서버가 각 요청을 독립적으로 처리하며 시스템의 안정성을 높임
  • 재사용성: 표준화된 HTTP 메서드를 사용함으로써 다양한 클라이언트에서 재사용할 수 있음
반응형