✅ 면접 기초지식 총정리 (+꼬리질문)
🔷 1. 객체지향 (OOP)
- 정의: 객체(데이터 + 행위) 단위로 프로그램을 구성하여 유연하고 확장 가능한 구조를 만드는 프로그래밍 패러다임
- 핵심 개념:
- 캡슐화: 데이터 보호, 접근 제한
- 상속: 코드 재사용
- 다형성: 인터페이스 다양성
- 추상화: 공통 행위 추출
꼬리질문: 추상 클래스와 인터페이스의 차이는?
- 답변: 추상 클래스는 일부 구현을 포함할 수 있으며 단일 상속만 가능, 인터페이스는 모든 메서드가 추상이며 다중 구현 가능
🔷 2. JWT (JSON Web Token)
- 정의: 인증과 권한 검증을 위한 JSON 기반의 토큰 포맷. Header, Payload, Signature 3부분으로 구성
- 특징: 자체 정보를 포함하며, 서버의 상태 저장이 필요 없음 (stateless)
꼬리질문: JWT는 안전한가요?
- 답변: 서명으로 위변조는 막을 수 있으나, Payload는 Base64로 인코딩되기 때문에 민감정보는 암호화 필요
🔷 3. OAuth
- 정의: 사용자 인증과 권한 위임을 위한 프로토콜. 타 서비스에 내 계정 정보 접근을 안전하게 허용
- 흐름: 인증 요청 → 권한 부여 → Access Token 발급 → API 접근
꼬리질문: OAuth에서 Access Token과 Refresh Token의 차이는?
- 답변: Access Token은 짧은 기간 동안 리소스 접근에 사용, Refresh Token은 Access Token 재발급용
🔷 4. Java
- 정의: 객체지향 기반의 범용 프로그래밍 언어. JVM 위에서 동작하며, 풍부한 라이브러리와 플랫폼 독립성이 강점
꼬리질문: Java에서 메모리 영역에는 어떤 것이 있나요?
- 답변: Heap, Stack, Method Area, PC Register, Native Method Stack
🔷 5. Spring Framework
- 정의: Java 기반의 경량 프레임워크로, DI와 AOP 기반의 유연한 구조 제공
- 주요 기능: DI(의존성 주입), AOP, MVC 아키텍처, 트랜잭션 처리 등
꼬리질문: Spring의 장점은?
- 답변: 느슨한 결합, 모듈화 용이, 테스트 용이, 유연한 구조
🔷 6. DispatcherServlet
- 정의: Spring MVC에서 모든 HTTP 요청을 받아 컨트롤러에 전달하는 Front Controller
- 역할: 요청 → HandlerMapping → Controller → ViewResolver → 응답 흐름 제어
꼬리질문: DispatcherServlet이 없다면 어떤 문제가 생길까요?
- 답변: 요청 분기, 일관성 유지, 보안, 에러 처리 등 공통 기능이 흩어지고 복잡도가 상승함
🔷 7. JVM (Java Virtual Machine)
- 정의: Java 바이트코드를 실행하는 가상 머신
- 구성요소: 클래스 로더, 실행 엔진, GC, 메모리 영역(Heap, Stack 등)
꼬리질문: JVM이 Java의 플랫폼 독립성을 어떻게 보장하나요?
- 답변: Java 코드는 바이트코드로 컴파일되고, 각 OS에 맞는 JVM이 바이트코드를 실행함
🔷 8. 파싱 & 매핑
- 파싱: 데이터를 구문 분석하여 의미 있는 구조로 변환 (예: JSON → 객체)
- 매핑: 구조화된 데이터(객체)를 다른 표현(예: DB Row)로 연결
꼬리질문: JSON을 파싱하면 어떤 객체가 만들어지나요?
- 답변: 보통 언어별 DTO나 VO 객체로 매핑됨. Java에서는 Jackson, Gson 사용
🔷 9. 직렬화 & 역직렬화
- 직렬화: 객체를 바이트 스트림으로 변환
- 역직렬화: 바이트 스트림을 객체로 복원
- 사용처: 네트워크 전송, 파일 저장, 캐시 등
꼬리질문: 직렬화 시 transient 키워드는 왜 사용하나요?
- 답변: 직렬화 대상에서 제외하기 위한 키워드, 보안 또는 불필요한 필드 제외 목적
🔷 10. Spring DI / IoC
- DI(Dependency Injection): 객체 간의 의존성을 외부에서 주입 (생성자, 필드, Setter 방식)
- IoC(Inversion of Control): 객체 생성과 제어 권한을 개발자에서 프레임워크로 위임
꼬리질문: 생성자 주입과 필드 주입의 차이는?
- 답변: 생성자 주입은 테스트와 불변성 확보에 유리, 필드 주입은 간단하지만 테스트가 어려움
🔷 11. Spring MVC
- 정의: 모델-뷰-컨트롤러 패턴 기반의 웹 애플리케이션 구조
- 구성: Controller, Service, Repository, View (Thymeleaf 등)
꼬리질문: Controller에서 Service를 호출하는 이유는?
- 답변: Controller는 요청을 받고 전달만, 로직은 Service에 분리하여 유지보수성과 재사용성을 확보함
🔷 12. N+1 문제
- 정의: 하나의 쿼리 실행 후, 연관된 N개의 쿼리가 추가로 실행되어 성능 저하 발생
- 원인: Lazy Loading된 엔티티의 반복 조회
- 해결법: Fetch Join, @EntityGraph, batch-size 설정
꼬리질문: Lazy Loading은 왜 쓰나요?
- 답변: 초기 성능 최적화를 위해 필요 시점까지 로딩을 미루는 방식. 단, N+1 문제 주의 필요
🔷 1. AOP (관점 지향 프로그래밍)
- 정의: 핵심 로직 외의 공통된 관심사를 분리하여 모듈화하는 기법 (ex. 로깅, 트랜잭션 등)
- Spring AOP: 프록시 기반으로 동작하며, 주로 @Aspect와 @Around, @Before, @After 등으로 구현
꼬리질문: AOP와 OOP는 어떤 관계인가요?
- 답변: OOP는 기능 단위, AOP는 관심사 단위로 모듈화. AOP는 OOP를 보완하여 횡단 관심사를 처리
🔷 2. Django
- 정의: Python 기반의 웹 프레임워크로 MTV(Model-Template-View) 아키텍처 사용
- 특징: ORM 내장, admin 자동 생성, 빠른 개발 속도, 보안 기능 탑재
꼬리질문: Django의 ORM이 하는 일은?
- 답변: 객체와 데이터베이스 레코드를 매핑해 SQL 없이도 DB 조작 가능
🔷 3. TDD (Test Driven Development)
- 정의: 테스트를 먼저 작성한 후 기능 구현을 진행하는 개발 방법론
- 순서: 실패하는 테스트 작성 → 코드 구현 → 테스트 통과 → 리팩토링
꼬리질문: TDD의 장점은?
- 답변: 유지보수성 증가, 리팩토링 용이, 요구사항 정확도 상승, 버그 사전 방지
🔷 4. 오버라이딩 vs 오버로딩
- 오버라이딩: 부모 클래스의 메서드를 자식 클래스가 재정의 (동적 바인딩)
- 오버로딩: 같은 이름의 메서드를 매개변수 다르게 정의 (정적 바인딩)
꼬리질문: 오버라이딩 시 주의할 점은?
- 답변: 접근 제한자는 같거나 더 넓어야 하고, 예외는 같거나 더 좁아야 함
🔷 5. 트랜잭션
- 정의: 데이터베이스 작업의 논리적 단위로, 모두 성공하거나 모두 실패해야 함
- ACID: 원자성, 일관성, 고립성, 지속성
꼬리질문: 트랜잭션의 고립성이란?
- 답변: 동시에 실행되는 트랜잭션들이 서로 영향을 주지 않도록 보장 (격리 수준 설정 가능)
🔷 6. 정규화 / 반정규화
- 정규화: 데이터 중복 제거 및 무결성 확보 (1NF ~ 5NF)
- 반정규화: 성능 향상을 위해 일부 중복 허용 (조회 속도 개선 등)
꼬리질문: 반정규화는 언제 사용하나요?
- 답변: 복잡한 조인이 성능 저하를 유발할 때 조회 위주의 시스템에서 사용
🔷 7. Redis
- 정의: In-memory 기반 Key-Value 저장소. 캐시, 세션 저장 등에 활용
- 특징: 빠른 속도, 다양한 자료구조 지원 (List, Set, Hash 등), 퍼시스턴스 기능 존재
꼬리질문: Redis는 언제 사용하는 게 좋나요?
- 답변: 빠른 조회가 필요한 경우, 세션 저장, 캐시 서버, Pub/Sub 구현 시 적합
🔷 8. MySQL
- 정의: 대표적인 오픈소스 관계형 데이터베이스
- 특징: SQL 기반, 다양한 저장 엔진(InnoDB, MyISAM 등), ACID 지원
꼬리질문: InnoDB와 MyISAM 차이점은?
- 답변: InnoDB는 트랜잭션과 외래키 지원, MyISAM은 빠르지만 트랜잭션 미지원
🔷 9. 프로세스 vs 스레드
- 프로세스: 실행 중인 프로그램, 독립된 메모리 공간 사용
- 스레드: 프로세스 내 실행 단위, 메모리 공간 공유
꼬리질문: 스레드 사용의 장점은?
- 답변: 메모리 공유로 자원 효율적, 컨텍스트 스위칭 비용 감소, 병렬성 향상
🔷 10. 가상메모리
- 정의: 물리적 메모리보다 큰 주소 공간을 제공하는 메모리 관리 기법
- 기법: 페이징(Paging), 스와핑(Swapping) 등
꼬리질문: 가상메모리의 장점은?
- 답변: 실제 메모리보다 많은 프로그램 실행 가능, 메모리 보호, 주소 공간 확장
🔷 11. 교착상태 (Deadlock)
- 정의: 여러 프로세스가 자원을 점유한 채 서로 다른 자원을 기다리며 무한 대기 상태에 빠지는 현상
- 조건: 상호 배제, 점유 대기, 비선점, 순환 대기 (4가지 조건이 모두 충족될 때 발생)
꼬리질문: 교착상태를 예방하는 방법은?
- 답변: 자원 순서를 정하거나, 타임아웃, 자원 선점 전략 등으로 예방 가능
🔷 12. 기아상태 (Starvation)
- 정의: 특정 프로세스가 자원을 오랫동안 할당받지 못해 실행되지 못하는 상태
꼬리질문: 기아상태는 언제 발생하나요?
- 답변: 우선순위가 낮은 프로세스가 자원을 계속 선점당할 때 발생. Aging 기법 등으로 해결 가능
🔷 1. 기아 상태 (Starvation)
- 정의: 우선순위가 낮은 프로세스가 자원을 장시간 할당받지 못해 실행되지 못하는 상태
- 원인: 높은 우선순위 프로세스가 지속적으로 자원을 선점할 때 발생
꼬리질문: 기아 상태를 해결하려면?
- 답변: Aging 기법으로 시간이 지남에 따라 우선순위를 높여주는 방식 사용
🔷 2. 프로세스 동기화
- 정의: 여러 프로세스/스레드가 공유 자원에 안전하게 접근할 수 있도록 순서를 제어하는 것
- 기법: 뮤텍스(Mutex), 세마포어(Semaphore), 모니터(Monitor)
꼬리질문: 세마포어와 뮤텍스의 차이는?
- 답변: 뮤텍스는 1개의 쓰레드만 접근 가능, 세마포어는 지정된 수만큼 동시 접근 가능
🔷 3. TCP 3-Way Handshake
- 정의: TCP 연결 설정 시 클라이언트와 서버 간의 3단계 연결 절차
- 절차:
- 클라이언트 → SYN
- 서버 → SYN + ACK
- 클라이언트 → ACK
꼬리질문: 3-Way Handshake가 필요한 이유는?
- 답변: 양측의 수신 가능 여부와 초기 순서 번호를 동기화하기 위함
🔷 4. TCP vs UDP
- TCP: 연결 지향, 신뢰성 보장, 순서 보장, 느림
- UDP: 비연결 지향, 신뢰성 없음, 빠름, 실시간성 요구 시스템에 적합
꼬리질문: TCP가 신뢰성을 보장하는 방식은?
- 답변: 순서 번호, 재전송, 수신 확인(ACK), 흐름 제어, 혼잡 제어 등으로 보장
🔷 5. RESTful API
- 정의: HTTP 메서드(GET, POST, PUT, DELETE 등)를 활용한 자원 중심의 API 설계 방식
- 원칙: URI는 자원을 표현하고, 행위는 HTTP 메서드로 표현함
꼬리질문: RESTful 설계에서 URI는 어떻게 구성해야 하나요?
- 답변: 명사 중심으로 자원을 표현하며, 동사는 HTTP 메서드로 표현 (예: /users/1)
🔷 6. HTTP vs HTTPS
- HTTP: HyperText Transfer Protocol, 암호화되지 않은 웹 통신 프로토콜
- HTTPS: HTTP + SSL/TLS를 통한 암호화된 보안 통신
꼬리질문: HTTPS 통신은 어떤 방식으로 암호화되나요?
- 답변: SSL/TLS 프로토콜을 이용해 대칭키를 안전하게 주고받은 후, 본문은 대칭키로 암호화
🔷 7. 비대칭키 암호화
- 정의: 공개키(Public Key)와 개인키(Private Key)를 사용하는 암호화 방식
- 특징: 한쪽 키로 암호화한 데이터를 다른 쪽 키로만 복호화 가능
꼬리질문: 비대칭키는 어디에 사용되나요?
- 답변: SSL 인증서, 디지털 서명, 전자 서명 등에서 주로 사용됨
🔷 8. 대칭키 암호화
- 정의: 암호화와 복호화에 같은 키를 사용하는 방식
- 특징: 처리 속도가 빠르지만, 키 전달 시 보안에 취약
꼬리질문: 대칭키의 단점은?
- 답변: 키가 노출되면 모든 통신이 해독 가능, 키 분배가 어렵다는 점
🔷 9. 단방향 암호화
- 정의: 복호화가 불가능한 암호화 방식 (해시함수)
- 사용 예시: 비밀번호 저장 (SHA-256, bcrypt 등)
꼬리질문: 해시 함수의 충돌이란?
- 답변: 서로 다른 입력값이 동일한 해시값을 갖는 현상, 안전한 해시 알고리즘은 충돌 가능성이 낮음
🔷 10. 제네릭 (Generic)
- 정의: 클래스나 메서드를 다양한 타입으로 일반화하여 재사용성과 타입 안정성 향상
- 사용 예시: List<String>, Map<String, Integer> 등
꼬리질문: 제네릭을 사용하는 이유는?
- 답변: 타입 안정성 확보, 컴파일 타임 오류 방지, 코드 재사용성 증가
✅ 면접 기초지식 총정리 (+꼬리질문)
🔷 1. 어노테이션 (Annotation)
- 정의: 자바 코드에 메타데이터를 추가하는 문법 요소로, 컴파일러나 프레임워크에 의미를 전달함
- 예시: @Override, @Autowired, @RestController
꼬리질문: 어노테이션은 어떻게 동작하나요?
- 답변: 리플렉션(Reflection)을 통해 런타임에 처리되며, 프레임워크가 해당 어노테이션을 분석해 동작을 결정함
🔷 2. 인터페이스 vs 추상 클래스
- 인터페이스: 모든 메서드가 추상적이며, 다중 구현 가능
- 추상 클래스: 일부 구현 가능, 단일 상속만 가능
꼬리질문: 언제 인터페이스를, 언제 추상 클래스를 쓰나요?
- 답변: 공통 기능 없이 명세만 필요할 땐 인터페이스, 공통 로직 포함할 땐 추상 클래스 사용
🔷 3. 클래스 vs 객체
- 클래스: 객체를 생성하기 위한 설계도
- 객체: 클래스를 기반으로 메모리에 생성된 실체
꼬리질문: 객체를 여러 개 만들면 메서드는 복사되나요?
- 답변: 아니요. 객체마다 데이터(인스턴스 변수)는 따로지만, 메서드는 공유됩니다
🔷 4. SOLID 원칙
- S: 단일 책임 원칙
- O: 개방 폐쇄 원칙
- L: 리스코프 치환 원칙
- I: 인터페이스 분리 원칙
- D: 의존 역전 원칙
꼬리질문: SOLID 원칙 중 가장 중요하다고 생각하는 것은?
- 답변: 상황에 따라 다르지만, 유지보수 측면에서는 단일 책임 원칙이 핵심이라 생각함
🔷 5. Autowiring
- 정의: 스프링이 의존성 주입을 자동으로 수행하는 기능
- 방법: @Autowired, 생성자 주입, 필드 주입, 세터 주입
꼬리질문: Autowiring이 실패하면 어떻게 되나요?
- 답변: 기본적으로 예외 발생. required = false 옵션으로 방지 가능
🔷 6. 파이썬 코루틴 (Coroutine)
- 정의: 중단 가능한 함수로, async/await 키워드를 사용해 비동기 처리를 지원
- 특징: 이벤트 루프 기반으로 동작하며, I/O 효율이 높음
꼬리질문: 코루틴과 스레드의 차이점은?
- 답변: 코루틴은 싱글 스레드 기반이며 문맥 전환 비용이 적고, 스레드는 병렬 실행 가능하지만 비용이 큼
🔷 7. 파이썬 데코레이터 (Decorator)
- 정의: 함수의 동작을 변경하거나 확장할 수 있는 함수
- 예시: @staticmethod, @login_required, @app.route() 등
꼬리질문: 데코레이터는 언제 쓰나요?
- 답변: 공통 기능(로깅, 인증, 캐싱 등)을 코드 수정 없이 재사용하고자 할 때 사용
🔷 8. GIL (Global Interpreter Lock)
- 정의: CPython에서 하나의 스레드만 실행되도록 보장하는 전역 락
- 영향: 멀티스레드 CPU 병렬 처리에 제약이 있음
꼬리질문: GIL이 있는 이유는?
- 답변: 메모리 안전성과 GC 처리의 간단화를 위해 도입됨
🔷 9. MRO (Method Resolution Order)
- 정의: 다중 상속 시 메서드 호출 순서를 결정하는 규칙
- Python 방식: C3 Linearization 알고리즘
꼬리질문: MRO 순서를 확인하는 방법은?
- 답변: ClassName.__mro__ 또는 ClassName.mro()를 사용하면 확인 가능
객체지향 프로그래밍 (OOP)
- 의도 : 이 카테고리는 객체지향 프로그래밍(OOP)의 기본 개념을 이해하고 있는지 평가합니다. OOP는 백엔드 개발에서 매우 중요한 패러다임이므로, 지원자가 클래스, 객체, 상속, 다형성 등 OOP의 기본 원리를 제대로 이해하고, 실제 코딩에 어떻게 적용하는지를 확인하려고 합니다. 또한 디자인 패턴이나 SOLID 원칙을 알고 있으면, 지원자가 유지보수 가능한 코드를 작성할 수 있는 능력을 가진지 판단하는 데 도움이 됩니다.
- 답변에 포함해야 할 키워드
- 클래스(Class): 객체를 생성하기 위한 템플릿
- 객체(Object): 클래스의 인스턴스, 상태와 동작을 가짐
- 다형성(Polymorphism): 동일한 인터페이스를 구현하는 여러 객체가 다양한 방식으로 동작
- 상속(Inheritance): 클래스 간 코드 재사용
- 캡슐화(Encapsulation): 객체의 내부 상태를 숨기고 외부와 상호작용을 제어
- SOLID 원칙: OOP 설계 원칙 (단일 책임, 개방-폐쇄 원칙 등)
✅ 객체지향 및 설계 원칙 면접 질문 정리 + 실무 연관 질문
🔹 1. [하] Class와 Object에 대해 설명해주세요.
- 답변: 클래스는 객체를 생성하기 위한 설계도이며, 객체는 클래스의 인스턴스입니다. 클래스는 속성과 행위를 정의하고, 객체는 그 클래스를 기반으로 생성된 구체적인 실체입니다.
- 예시: class Car {}는 설계도이고, Car myCar = new Car();는 객체입니다.
🔹 2. [중] Polymorphism 개념에 대해 설명하고, 개인/팀 프로젝트에 적용한 사례가 있다면 이야기해주세요.
- 답변: 다형성은 동일한 인터페이스로 서로 다른 구현을 실행할 수 있게 하는 객체지향의 핵심 개념입니다. 오버로딩(컴파일타임)과 오버라이딩(런타임) 두 가지 방식이 있습니다.
- 프로젝트 예시: 결제 모듈에서 Payment 인터페이스를 구현한 KakaoPay, CreditCardPay 클래스를 다형적으로 처리했습니다.
🔹 3. [하] Encapsulation(캡슐화)이란 무엇인가요?
- 답변: 캡슐화는 객체의 데이터와 메서드를 하나로 묶고, 외부에 직접 접근하지 못하도록 제한하는 것입니다. 주로 접근 제어자(private, public 등)를 통해 구현됩니다.
- 장점: 보안성 증가, 코드 변경 최소화, 유지보수 용이성
🔹 4. [중] 상속(Inheritance)의 개념을 설명하고, 상속의 장단점을 이야기해주세요.
- 답변: 상속은 부모 클래스의 속성과 기능을 자식 클래스가 물려받는 개념입니다.
- 장점: 코드 재사용, 유지보수 용이
- 단점: 결합도 증가, 복잡성 상승, 잘못된 계층 구조로 인한 오용 가능성
🔹 5. [상] SOLID 원칙이란 무엇인지, 각 원칙을 설명해주세요.
- 답변:
- S: 단일 책임 원칙(SRP) - 하나의 클래스는 하나의 책임만 가져야 함
- O: 개방/폐쇄 원칙(OCP) - 확장엔 열려 있고 변경엔 닫혀야 함
- L: 리스코프 치환 원칙(LSP) - 자식 클래스는 부모 클래스의 역할을 대체할 수 있어야 함
- I: 인터페이스 분리 원칙(ISP) - 하나의 인터페이스는 하나의 역할만 가져야 함
- D: 의존 역전 원칙(DIP) - 고수준 모듈은 저수준 모듈에 의존하지 않아야 함. 둘 다 추상화에 의존해야 함
🔹 6. [상] 인터페이스(Interface)와 추상 클래스(Abstract Class)의 차이점은 무엇인가요?
- 답변:
- 인터페이스: 다중 구현 가능, 메서드 선언만 포함 (Java 8 이후 default/static 메서드 허용)
- 추상 클래스: 단일 상속, 일부 메서드 구현 포함 가능
- 사용 기준: 공통 기능이 없고 명세만 필요할 때는 인터페이스, 공통 로직이 필요할 경우 추상 클래스 사용
🔹 7. [중] 추상화(Abstraction)란 무엇이며, 코드로 어떻게 구현할 수 있는지 설명해주세요.
- 답변: 추상화는 불필요한 세부정보는 숨기고 핵심 개념만 표현하는 것. 인터페이스나 추상 클래스를 통해 구현 가능
- 예시:
interface Animal {
void makeSound();
}
class Dog implements Animal {
public void makeSound() { System.out.println("Bark"); }
}
🔹 8. [중] 다형성(Polymorphism)을 프로젝트에서 어떻게 활용했는지 예를 들어 설명해주세요.
- 답변: 쇼핑몰 프로젝트에서 다양한 할인 정책(DiscountPolicy)을 구현하여, calculateDiscount() 메서드를 오버라이딩한 클래스를 동적으로 주입해 다형성 활용했습니다.
- 장점: 새로운 할인 정책이 추가되어도 기존 코드를 수정하지 않고 확장 가능
🔹 9. [상] 의존성 주입(Dependency Injection)이란 무엇이며, 이를 적용했을 때의 장점을 설명해주세요.
- 답변: 객체 간의 의존성을 외부에서 주입받는 방식으로, Spring에서는 생성자/필드/세터를 통해 DI를 구현합니다.
- 장점: 느슨한 결합, 테스트 용이성, 객체 간 책임 명확화
- 예시: @Autowired, 생성자 주입 등으로 서비스에 리포지토리를 주입함
🔹 10. [상] 디자인 패턴 중 싱글톤(Singleton) 패턴을 설명하고, 실제로 구현할 때 고려해야 할 사항을 이야기해주세요.
- 답변: 싱글톤 패턴은 클래스의 인스턴스를 하나만 생성하도록 제한하는 패턴입니다.
- 구현 시 고려사항: 멀티스레드 환경에서는 동기화 처리 필수
- 예시:
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
🔍 참고: 실무 연관 질문
🔸 1. [중] SRP 위반 시 문제점과 해결 경험은?
- 답변: 하나의 클래스가 여러 책임을 가지면, 하나의 변경이 다른 기능에도 영향을 줘 유지보수가 어려워집니다. 실제로 사용자 관리 클래스에서 인증과 알림 기능이 섞여 있었는데, 이를 UserService, NotificationService로 분리하여 변경 영향도를 줄였습니다.
🔸 2. [상] 프로젝트에 DI 적용 방식과 장점은?
- 답변: Spring의 생성자 주입을 사용해 서비스에 DAO를 주입했습니다. 이를 통해 테스트 시 Mock 객체로 쉽게 대체 가능했고, 객체 간 결합도를 낮추고 유연한 설계가 가능했습니다.
🔸 3. [중] 인터페이스-구현체 분리 설계 예시?
- 답변: 로그 저장 기능을 LogRepository 인터페이스로 정의하고, 파일/DB/클라우드 구현체를 분리하여 설정에 따라 유연하게 교체할 수 있도록 설계했습니다.
🔸 4. [중] 상속 대신 구성을 선택한 사례는?
- 답변: 여러 유틸리티 기능을 공통 부모로 상속하려 했으나, 객체 간 관계가 명확하지 않아 책임 분리가 어려웠습니다. 대신 UtilService를 별도로 두고 필요한 클래스에 주입하여 구성(Composition) 방식으로 전환해 해결했습니다.
🔸 5. [상] 싱글톤의 문제점과 해결 방안은?
- 답변: 상태를 공유하는 싱글톤은 멀티스레드 환경에서 동시성 문제가 발생할 수 있습니다. 이를 해결하기 위해 ThreadLocal, 불변 객체 사용 또는 Spring에서의 @Component + @Scope("singleton")으로 안전하게 관리했습니다.
데이터 구조와 알고리즘
- 의도 : 이 카테고리는 데이터를 효과적으로 관리하고 알고리즘을 통해 문제를 해결하는 능력을 평가합니다. 개발자는 다양한 데이터 구조(배열, 리스트, 해시맵 등)를 이해하고, 시간 복잡도와 공간 복잡도를 고려하여 적절한 알고리즘을 선택할 수 있어야 합니다. 이 질문들은 실무에서 효율적인 코드 작성과 성능 최적화를 얼마나 잘할 수 있는지 평가하는데 사용됩니다.
- 답변에 포함해야 할 키워드
- 스택(Stack), 큐(Queue): 선입선출/후입선출 원칙
- 해시맵(HashMap): 키-값 쌍으로 데이터를 저장하는 구조
- 트리(Tree), 그래프(Graph): 계층적 데이터 구조와 네트워크 데이터 구조
- 시간 복잡도(Big-O): 알고리즘의 효율성 측정
- 정렬 알고리즘: 퀵 정렬, 병합 정렬 등의 시간 복잡도 비교
✅ 자료구조 및 알고리즘 면접 질문 정리 (+실제 답변 및 꼬리질문)
🔹 1. [하] Object의 특성에 따라 사용할 수 있는 데이터 구조에는 어떤 것이 있는지 설명해주세요.
- 답변: 객체는 상태와 행위를 포함하는 단위이므로, 객체들을 효율적으로 저장하거나 처리할 수 있도록 리스트(List), 집합(Set), 딕셔너리(Map), 큐/스택 등의 자료구조를 사용합니다.
- 꼬리질문: 객체의 특성(예: 식별자, 상태, 행동)에 따라 어떤 자료구조가 적합한지 실제 예시를 들어 설명할 수 있나요?
- 답변: 사용자 정보(고유 ID 필요)는 해시맵에 저장하고, 순차 처리 작업은 리스트 또는 큐가 적합합니다.
🔹 2. [중] 스택(Stack)과 큐(Queue)의 차이점과 실제로 사용되는 사례를 설명해주세요.
- 답변: 스택은 후입선출(LIFO), 큐는 선입선출(FIFO) 구조입니다.
- 사례: 스택은 함수 호출 기록(콜 스택), 큐는 프린터 작업 대기열 등에 사용됩니다.
- 꼬리질문: DFS/BFS 탐색 시 어떤 구조가 사용되며, 왜 그렇게 사용하는지 설명해보세요.
- 답변: DFS는 스택 기반으로 깊이 우선 탐색, BFS는 큐 기반으로 최단 경로 탐색에 효과적입니다.
🔹 3. [중] 연결 리스트(Linked List)의 구조와 사용 사례를 설명해주세요.
- 답변: 각 노드가 데이터와 다음 노드 주소를 가지는 구조로, 삽입/삭제가 빠릅니다.
- 사례: 운영체제의 메모리 관리, 삽입/삭제가 빈번한 큐/스택 내부 구조에 사용됩니다.
- 꼬리질문: 연결 리스트 기반 큐와 배열 기반 큐의 메모리 처리 방식 차이를 설명해보세요.
- 답변: 배열은 고정 크기와 연속 메모리, 연결 리스트는 동적 크기와 불연속 메모리 사용
🔹 4. [상] 해시맵(HashMap)과 트리(Tree)의 차이점은 무엇이며, 각각 언제 사용하면 좋을지 설명해주세요.
- 답변: 해시맵은 키 기반 검색에 빠르며 평균 O(1), 트리는 정렬된 상태 유지와 범위 검색에 강점이 있습니다.
- 꼬리질문: 실무에서 트리를 사용해야 하는 구체적인 사례를 말해보세요.
- 답변: DB의 인덱스(B+Tree), 사용자 권한 계층, 폴더 구조 등 계층적 탐색이 필요한 경우에 사용됩니다.
🔹 5. [상] 트리(Tree)와 그래프(Graph)의 차이점을 설명하고, 각각의 장단점을 이야기해주세요.
- 답변: 트리는 계층적이며 루트가 있고 순환이 없지만, 그래프는 방향/무방향, 순환 허용 등 관계 표현이 더 자유롭습니다.
- 꼬리질문: 실제 서비스 예시에서 그래프가 필요한 경우는?
- 답변: 추천 알고리즘(사용자-아이템 관계), 도로망 탐색, 소셜 네트워크 분석 등
🔹 6. [중] 배열(Array)과 연결 리스트(Linked List)의 차이점과 시간 복잡도를 설명해주세요.
- 답변:
- 배열: 인덱스 접근 O(1), 삽입/삭제 O(n)
- 연결 리스트: 인덱스 접근 O(n), 삽입/삭제 O(1) (노드 위치 알고 있어야 함)
- 꼬리질문: 실무에서 연결 리스트보다 배열이 선호되는 이유는?
- 답변: CPU 캐시 최적화, 고정 크기 데이터 처리, 빠른 랜덤 접근이 필요할 때 유리하기 때문입니다.
🔹 7. [중] 빅오(Big-O) 표기법이란 무엇이며, 자주 사용되는 데이터 구조의 시간 복잡도를 설명해주세요.
- 답변: 알고리즘의 성능을 입력 크기 n에 대한 함수로 표현한 것으로, 최악의 경우 성능을 가늠할 수 있습니다.
- 예시:
- 배열 탐색 O(1), 삽입 O(n)
- 해시맵 탐색 O(1), 최악 O(n)
- 트리 탐색 O(log n), 최악 O(n)
- 꼬리질문: 빅오만 보는 것이 위험할 수 있는 이유는?
- 답변: 실제 성능은 상수 계수, 캐시 적중률, 입력 특성 등 다양한 요소에 영향을 받기 때문입니다.
🔹 8. [상] 이진 탐색(Binary Search) 알고리즘을 설명하고, 시간 복잡도를 이야기해주세요.
- 답변: 정렬된 배열에서 중간값을 기준으로 탐색 범위를 절반으로 줄이며 찾는 알고리즘입니다.
- 시간 복잡도: O(log n)
- 꼬리질문: 이진 탐색이 실패하는 실무 사례는?
- 답변: 데이터가 정렬되지 않았거나, 연결 리스트처럼 중간 인덱스 접근이 느린 구조에서 비효율적입니다.
🔹 9. [상] 정렬 알고리즘 중 퀵 정렬(Quick Sort)과 병합 정렬(Merge Sort)의 차이점을 설명하고, 각각의 시간 복잡도를 이야기해주세요.
- 답변:
- 퀵 정렬: 평균 O(n log n), 최악 O(n²), 제자리 정렬
- 병합 정렬: 항상 O(n log n), 안정 정렬, 추가 메모리 필요
- 꼬리질문: 병합 정렬이 퀵 정렬보다 유리한 상황은?
- 답변: 안정 정렬이 필요하거나 데이터 크기가 매우 크고 디스크 기반 외부 정렬을 할 때
🔹 10. [상] 그래프에서 깊이 우선 탐색(DFS)과 너비 우선 탐색(BFS)의 차이점과 사용 사례를 설명해주세요.
- 답변:
- DFS: 스택/재귀 기반, 깊이 우선 순회
- BFS: 큐 기반, 최단 경로 탐색에 적합
- 사용 사례:
- DFS: 퍼즐 탐색, 사이클 감지
- BFS: 최단 경로, AI 게임 캐릭터 이동 경로
- 꼬리질문: BFS가 DFS보다 유리한 상황은?
- 답변: 최단 경로를 찾는 문제나, 레벨별로 데이터를 처리해야 할 때 BFS가 더 적합합니다.
데이터베이스
- 의도 : 데이터베이스 카테고리는 데이터베이스 설계 및 관리 능력을 평가합니다. RDBMS와 NoSQL의 차이를 이해하고, 데이터베이스 내에서 데이터를 어떻게 저장하고 조회할지에 대한 기본적인 이해를 확인하려는 의도입니다. 정규화, 인덱스, 트랜잭션 등의 개념을 알고 있는지는 실무에서 중요한 데이터 처리 성능과 무결성을 보장하는 능력으로 이어집니다.
- 답변에 포함해야 할 키워드
- RDB vs NoSQL: 관계형 데이터베이스와 비관계형 데이터베이스의 차이
- 정규화(Normalization): 데이터 중복을 최소화하여 데이터 구조를 최적화하는 과정
- 인덱스(Index): 데이터를 빠르게 검색하기 위한 구조
- 트랜잭션(Transaction): 일련의 데이터베이스 작업의 일관성을 보장하는 방법
- ACID 특성: 데이터베이스 트랜잭션의 신뢰성을 보장하는 특성 (원자성, 일관성, 고립성, 지속성)
✅ 데이터베이스 면접 질문 정리 (+실제 답변 및 꼬리질문)
🔹 1. [중] 개인/팀 프로젝트에 적용해 보았거나 사용할 줄 아는 RDB에 대해 이야기해주세요.
- 답변: MySQL과 PostgreSQL을 주로 사용했습니다. 사용자 관리, 주문 내역, 상품 데이터 등을 정규화된 테이블로 구성하고, 인덱스를 적절히 설정해 성능을 개선했습니다.
- 꼬리질문: ERD 설계 시 어떤 기준으로 테이블을 분리했나요?
- 답변: 실세계 엔티티를 기준으로 정규화 원칙에 따라 중복을 제거하고, 관계 중심으로 모델링했습니다.
🔹 2. [중] RDB와 NoSQL DB의 차이점을 설명해주세요.
- 답변: RDB는 테이블 기반의 정형 데이터 저장, 관계/트랜잭션 강점. NoSQL은 비정형/반정형 데이터 저장, 수평 확장에 유리합니다.
- 꼬리질문: NoSQL이 적합한 서비스는?
- 답변: 빠른 확장성과 다양한 데이터 구조를 처리해야 하는 실시간 채팅, 캐시, 로그 수집 시스템 등
🔹 3. [상] 데이터베이스에서 인덱스를 사용하는 이유와 인덱스가 성능에 미치는 영향을 설명해주세요.
- 답변: 인덱스는 데이터 검색 속도를 향상시키는 자료구조입니다. 조회 성능이 빨라지지만, 데이터 추가/수정 시 인덱스 유지 비용이 발생합니다.
- 꼬리질문: SELECT 문에서 인덱스가 무시되는 경우는?
- 답변: LIKE '%값', 계산된 컬럼, 데이터 소량 등은 인덱스 사용이 비효율적이라 무시될 수 있습니다.
🔹 4. [중] 데이터베이스 정규화(Normalization)와 역정규화(Denormalization)의 차이점에 대해 설명해 주세요.
- 답변: 정규화는 중복 제거와 무결성 확보를 위한 테이블 분리, 역정규화는 조회 성능을 위해 일부 중복을 허용하는 구조입니다.
- 꼬리질문: 역정규화를 적용한 경험이 있다면?
- 답변: 게시판 목록 출력에서 JOIN이 성능 병목이 되어 사용자명 컬럼을 중복 저장한 적 있습니다.
🔹 5. [상] 트랜잭션(Transaction)이 무엇이며, ACID 특성을 설명해 주세요.
- 답변: 트랜잭션은 하나의 논리적 작업 단위로, 반드시 전부 성공하거나 실패해야 합니다.
- A: 원자성(Atomicity)
- C: 일관성(Consistency)
- I: 고립성(Isolation)
- D: 지속성(Durability)
- 꼬리질문: 고립성 수준은 어떻게 조정하나요?
- 답변: DBMS에서 READ COMMITTED, REPEATABLE READ, SERIALIZABLE 등으로 설정 가능합니다.
🔹 6. [상] 데이터베이스에서 JOIN의 개념과 사용 사례를 설명해주세요.
- 답변: JOIN은 두 개 이상의 테이블을 공통 키로 연결해 하나의 결과로 만드는 연산입니다.
- 사례: 사용자와 주문 테이블을 JOIN하여 특정 사용자의 구매 내역을 조회
- 꼬리질문: INNER JOIN과 OUTER JOIN의 차이는?
- 답변: INNER는 교집합, OUTER는 한쪽에만 존재하는 데이터도 포함
🔹 7. [중] 외래 키(Foreign Key)와 참조 무결성(Referential Integrity)에 대해 설명해주세요.
- 답변: 외래 키는 다른 테이블의 기본 키를 참조하는 컬럼이며, 참조 무결성은 참조 대상이 실제로 존재해야 하는 제약입니다.
- 꼬리질문: ON DELETE CASCADE는 언제 쓰나요?
- 답변: 부모 데이터 삭제 시 자식도 함께 삭제되어야 하는 구조(예: 게시글과 댓글)에서 사용합니다.
🔹 8. [상] 데이터베이스에서 발생할 수 있는 데드락(Deadlock)을 방지하는 방법을 설명해주세요.
- 답변: 데드락은 서로 자원을 점유한 채 대기하며 발생합니다. 자원 획득 순서 고정, 타임아웃, 트랜잭션 최소화로 방지할 수 있습니다.
- 꼬리질문: 트랜잭션 내 여러 UPDATE를 처리할 때 데드락을 피하는 전략은?
- 답변: 항상 정해진 순서로 테이블을 갱신하거나, 범위를 명확히 지정하여 락 충돌을 줄입니다.
🔹 9. [중] 데이터베이스 샤딩(Sharding)이란 무엇인가요?
- 답변: 큰 테이블을 여러 서버나 DB에 나누어 저장하는 방식으로, 수평 확장을 통해 성능과 가용성을 높입니다.
- 꼬리질문: 샤딩 시 데이터 일관성을 어떻게 보장하나요?
- 답변: 글로벌 트랜잭션보다는 eventual consistency 전략이나 중앙 샤드 ID 매니저 사용으로 조율합니다.
🔹 10. [상] 데이터베이스에서 파티셔닝(Partitioning)을 적용하는 이유를 설명하고, 수평/수직 파티셔닝의 차이점을 설명해주세요.
- 답변: 파티셔닝은 하나의 테이블을 논리적으로 분할해 성능과 관리성을 높이는 방법입니다.
- 수평 파티셔닝: 행 기준 분할 (예: 월별 데이터)
- 수직 파티셔닝: 컬럼 기준 분할 (자주 쓰는 컬럼만 분리)
- 꼬리질문: 파티셔닝을 통해 어떤 성능 개선을 기대할 수 있나요?
- 답변: 파티션 프루닝을 통해 전체 스캔 없이 필요한 파티션만 조회하므로 쿼리 속도가 크게 향상됩니다.
백엔드 프레임워크
- 의도 : 백엔드 프레임워크 카테고리는 Spring과 같은 백엔드 프레임워크에 대한 이해도를 평가하는 질문입니다. 의존성 주입(Dependency Injection), AOP, 트랜잭션 관리와 같은 개념들은 백엔드에서 코드를 모듈화하고 유지보수를 쉽게 할 수 있도록 도와줍니다. 또한 Spring Boot와 같은 최신 프레임워크의 특징을 이해하고, 실무에서 자동 설정(Auto Configuration)과 JPA를 어떻게 활용하는지 묻습니다.
- 답변에 포함해야 할 키워드
- Spring Boot: Spring의 경량화된 프레임워크로, 빠른 개발 환경 제공
- 의존성 주입(Dependency Injection): 객체 간 결합도를 낮추는 설계 원칙
- AOP(Aspect-Oriented Programming): 공통 기능을 모듈화하여 코드 중복을 줄이는 방식
- JPA vs Hibernate: Java Persistence API와 Hibernate 프레임워크의 차이
- Bean의 라이프사이클: 객체의 생성, 초기화, 소멸 과정
✅ Spring & Kotlin/Java 면접 질문 정리 (+실제 답변 및 꼬리질문)
🔹 1. [상] Java(Kotlin)으로 구성된 프로젝트의 Kotlin(Java) 컨버팅 작업이 가능한지, 무엇을 염두에 두어야 하는지 이야기해주세요.
- 답변: 가능합니다. Kotlin은 Java와 100% 상호 운용되며, IntelliJ의 자동 변환 도구도 활용할 수 있습니다. 그러나 null 처리, 람다 표현식, 클래스 구조 등의 관점에서 수동 점검이 필요합니다.
- 꼬리질문: Kotlin 변환 후 주요 이슈는 무엇이었나요?
- 답변: null 안정성 문제, data class 사용 시 equals/hashCode 재정의 로직, lateinit 초기화 누락 등이 있었습니다.
🔹 2. [중] Legacy Spring과 최근 Spring 또는 Spring Boot의 차이점을 설명해주세요.
- 답변: Legacy Spring은 XML 설정 기반이고 수동 빈 등록이 많았습니다. Spring Boot는 자동 설정, 내장 서버, Starter 패키지 제공 등으로 설정 부담이 적고 생산성이 높습니다.
- 꼬리질문: Spring Boot의 application.properties가 중요한 이유는?
- 답변: 설정값을 외부화하여 환경별로 유연하게 애플리케이션 설정을 변경할 수 있게 해줍니다.
🔹 3. [중] Spring의 의존성 주입(Dependency Injection)이란 무엇이며, 이를 사용하는 이유를 설명해 주세요.
- 답변: 객체 간 의존 관계를 직접 생성하지 않고, 스프링 컨테이너가 주입해주는 방식입니다. 결합도를 낮추고 테스트 용이성, 유지보수성이 향상됩니다.
- 꼬리질문: 생성자 주입이 필드 주입보다 나은 이유는?
- 답변: 불변성 보장, 테스트 시 명시적 주입 가능, 순환 참조 방지 효과 때문입니다.
🔹 4. [상] AOP(Aspect Oriented Programming)가 무엇이며, Spring에서 AOP를 어떻게 구현할 수 있는지 설명해 주세요.
- 답변: AOP는 공통 관심사를 핵심 로직과 분리하여 모듈화하는 방식입니다. Spring에서는 @Aspect, @Around, @Before, @AfterReturning 등을 통해 구현합니다.
- 꼬리질문: 실무에서 어떤 공통 기능을 AOP로 분리했나요?
- 답변: 로깅, 트랜잭션 관리, 사용자 권한 체크, API 요청 타이머 등을 AOP로 구현했습니다.
🔹 5. [상] Spring Boot에서 JPA와 Hibernate의 차이점을 설명해 주세요.
- 답변: JPA는 자바 ORM 기술에 대한 인터페이스 표준이고, Hibernate는 JPA를 구현한 대표적인 구현체입니다.
- 꼬리질문: Spring Boot에서 Hibernate 설정을 직접 건드려본 경험이 있다면?
- 답변: hibernate.ddl-auto, fetch 전략, naming strategy 등을 커스터마이징한 경험이 있습니다.
🔹 6. [중] Spring에서 @Transactional 애너테이션의 역할을 설명해 주세요.
- 답변: @Transactional은 메서드 실행 시 트랜잭션을 시작하고, 예외 발생 시 롤백, 정상 종료 시 커밋을 자동으로 처리합니다.
- 꼬리질문: checked exception 발생 시 롤백되지 않는 이유는?
- 답변: 기본적으로 unchecked(RuntimeException)만 롤백 대상이며, checked 예외는 명시적으로 설정해야 합니다.
🔹 7. [상] Spring Security의 기본 개념을 설명해 주세요.
- 답변: 인증(Authentication)과 권한(Authorization)을 제공하는 보안 프레임워크입니다. 필터 기반 구조로 동작하며, 사용자 로그인, 권한 검사, 세션/토큰 처리 등을 제공합니다.
- 꼬리질문: JWT 기반 인증을 구현한 경험이 있다면?
- 답변: 필터 커스터마이징하여 JWT를 추출하고, 토큰 유효성 검증 후 SecurityContext에 유저 정보를 저장했습니다.
🔹 8. [상] Spring Boot의 자동 설정(Auto Configuration) 기능이 무엇이며, 이를 어떻게 활용할 수 있는지 설명해주세요.
- 답변: 자동 설정은 클래스패스의 라이브러리, 애플리케이션 설정을 기준으로 관련 빈을 자동으로 등록하는 기능입니다. @EnableAutoConfiguration, spring.factories 메커니즘을 기반으로 작동합니다.
- 꼬리질문: 자동 설정이 잘못 동작할 때 디버깅하는 방법은?
- 답변: @ConditionalOn... 조건을 확인하거나 debug=true 설정을 통해 로딩 여부를 로그로 확인합니다.
🔹 9. [중] Spring에서 Bean의 라이프사이클을 설명하고, 이를 관리하는 방법을 이야기해주세요.
- 답변: Bean 생성 → 의존성 주입 → 초기화 → 사용 → 소멸 순으로 관리됩니다. @PostConstruct, @PreDestroy, InitializingBean, DisposableBean 등을 통해 커스터마이징 가능합니다.
- 꼬리질문: Bean 생명주기를 컨트롤해야 했던 사례가 있다면?
- 답변: 외부 리소스를 연결하거나 캐시 초기화를 위한 초기화 작업에 사용했습니다.
🔹 10. [상] Spring에서 REST 컨트롤러와 일반 컨트롤러의 차이점에 대해 설명해 주세요.
- 답변: @RestController는 @Controller + @ResponseBody로 JSON을 기본 응답으로 반환하고, @Controller는 주로 View 템플릿을 반환합니다.
- 꼬리질문: REST 컨트롤러에서 예외 처리 방식은?
- 답변: @ControllerAdvice, @ExceptionHandler를 활용하여 공통 예외 응답 구조를 구성했습니다.
API 설계 및 통신
- 의도 : API 설계와 통신 카테고리는 RESTful API, GraphQL 등의 통신 방식에 대한 이해를 평가합니다. API 버전 관리는 서비스의 유지보수성, 확장성을 높이는 중요한 요소이며, OAuth 2.0과 같은 인증 방식은 보안에 대한 기본적인 이해를 평가하는 질문입니다. API의 상태 코드, 멱등성(Idempotency) 등의 개념도 실무에서 자주 다뤄지는 주제입니다.
- 답변에 포함해야 할 키워드
- RESTful API: HTTP 메서드(GET, POST, PUT, DELETE)의 활용
- GraphQL: 클라이언트가 원하는 데이터만 요청할 수 있는 API 방식
- OAuth 2.0: 사용자 인증과 권한 부여를 위한 프로토콜
- 멱등성(Idempotency): 동일한 요청을 여러 번 보내도 결과가 동일한지 여부
- HTTP 상태 코드: 200(성공), 404(페이지 없음), 500(서버 오류) 등의 의미
✅ REST API 및 웹 통신 면접 질문 정리 (+실제 답변 및 꼬리질문)
🔹 1. [하] RESTful API의 설계 원칙을 설명해주세요.
- 답변: RESTful API는 자원을 URI로 표현하고, HTTP 메서드(GET, POST, PUT, DELETE 등)를 활용하여 상태를 조작하는 방식입니다. 무상태성, 일관된 URI, 계층 구조, 캐시 처리 등을 지켜야 합니다.
- 꼬리질문: REST API 설계 시 URI에 동사를 쓰지 않는 이유는?
- 답변: 행위는 HTTP 메서드로 표현하고 URI는 자원만 표현해야 자원의 의미가 명확해지기 때문입니다.
🔹 2. [중] REST와 SOAP의 차이점을 설명해 주세요.
- 답변: REST는 경량의 HTTP 기반 방식이며 JSON/XML 등 다양한 포맷을 지원합니다. SOAP은 XML 기반의 무거운 메시지 구조와 엄격한 스펙을 따릅니다.
- 꼬리질문: 보안 측면에서 SOAP이 유리한 이유는?
- 답변: WS-Security, 메시지 수준 암호화 등 더 정교한 보안 규격을 내장하고 있기 때문입니다.
🔹 3. [중] API 버전 관리의 중요성과 방법을 설명해 주세요.
- 답변: 기존 클라이언트와의 호환을 유지하면서 기능 확장을 위해 버전 관리가 필요합니다. URI에 버전을 포함하는 방식(/v1/…), Header 또는 Query Parameter 방식이 있습니다.
- 꼬리질문: 실무에서 어떤 방식으로 버전을 관리했나요?
- 답변: URI 방식으로 관리하여 명시적이고 직관적인 접근이 가능하게 했습니다.
🔹 4. [상] GraphQL과 REST API의 차이점을 설명하고, 실무에서 어떤 상황에 적합한지 이야기해주세요.
- 답변: REST는 고정된 endpoint 기반이고, GraphQL은 단일 endpoint에서 필요한 데이터만 쿼리할 수 있습니다. 복잡한 관계형 데이터를 효율적으로 조회할 때 GraphQL이 유리합니다.
- 꼬리질문: GraphQL 도입 시 주의할 점은?
- 답변: 복잡한 쿼리로 인해 성능 문제가 발생할 수 있으므로, 쿼리 깊이 제한이나 Batching 기술을 함께 고려해야 합니다.
🔹 5. [중] OAuth 2.0이 무엇이며, 이를 사용한 인증 방식에 대해 설명해주세요.
- 답변: OAuth 2.0은 타 서비스에 사용자 자원 접근 권한을 위임하는 프로토콜입니다. Authorization Code, Implicit, Resource Owner Password, Client Credentials 방식이 있습니다.
- 꼬리질문: Authorization Code Flow를 사용하는 이유는?
- 답변: 클라이언트와 자원 서버 간 보안을 강화하고, 토큰을 안전하게 주고받기 위한 중간 인증 코드 단계를 거치기 때문입니다.
🔹 6. [중] HTTP 상태 코드 중 200, 404, 500의 차이와 각각의 의미를 설명해주세요.
- 답변: 200은 성공, 404는 요청 자원이 존재하지 않음, 500은 서버 내부 오류를 의미합니다.
- 꼬리질문: 클라이언트 요청이 잘못된 경우 어떤 상태 코드를 사용하나요?
- 답변: 400 Bad Request가 적절하며, 입력값 오류 또는 형식 오류 시 주로 사용됩니다.
🔹 7. [상] 멱등성(Idempotency)이란 무엇이며, API 설계 시 이를 어떻게 고려할 수 있는지 설명해주세요.
- 답변: 동일한 요청을 여러 번 보내도 결과가 같아야 하는 성질입니다. GET, PUT, DELETE는 기본적으로 멱등해야 하며, POST는 비멱등이지만 비즈니스에 따라 조정될 수 있습니다.
- 꼬리질문: PUT과 PATCH의 차이는?
- 답변: PUT은 전체 자원을 대체, PATCH는 일부만 수정합니다. 둘 다 멱등성을 유지해야 합니다.
🔹 8. [중] API 문서를 자동으로 생성하는 방법(Spring REST Docs 등)에 대해 설명해주세요.
- 답변: Spring REST Docs는 테스트 기반으로 API 문서를 생성하고, Swagger는 코드 기반으로 문서를 생성합니다. Spring REST Docs는 테스트 신뢰성이 높고, Swagger는 실시간 인터페이스 제공이 강점입니다.
- 꼬리질문: 둘 중 어떤 도구를 실무에서 사용했고, 이유는?
- 답변: REST Docs를 사용했으며, 테스트 기반으로 실제 스펙과 일치하는 문서를 유지할 수 있었기 때문입니다.
🔹 9. [상] HATEOAS(Hypermedia as the Engine of Application State)란 무엇이며, RESTful API에 어떻게 적용할 수 있는지 설명해 주세요.
- 답변: HATEOAS는 응답에 다음 수행 가능한 링크를 포함시켜 클라이언트가 상태 전이를 안내받을 수 있게 합니다. REST의 자가 발견(self-descriptive) 성격을 강화합니다.
- 꼬리질문: HATEOAS를 도입한 API는 어떤 장점이 있나요?
- 답변: 클라이언트가 서버의 URI 구조를 몰라도 링크만으로 흐름을 따라갈 수 있어 유연성과 유지보수성이 향상됩니다.
🔹 10. [상] HTTP/2와 HTTP/1.1의 차이점을 설명해 주세요.
- 답변: HTTP/2는 멀티플렉싱, 헤더 압축, 서버 푸시 등의 기능을 통해 성능을 대폭 개선했습니다. 반면 HTTP/1.1은 요청/응답 순차 처리로 인해 지연이 많습니다.
- 꼬리질문: HTTP/2의 멀티플렉싱이란?
- 답변: 하나의 TCP 연결로 여러 요청/응답을 병렬로 처리해 HOL 블로킹 문제를 해결합니다.
성능 최적화 및 캐싱
- 의도 : 성능 최적화 카테고리는 데이터베이스 및 서버 성능을 최적화하는 능력을 평가합니다. 특히 캐싱, 쿼리 최적화, CDN 등은 실무에서 서버 부하를 줄이고 사용자 경험을 향상시키기 위해 필수적으로 알아야 하는 기술입니다. 면접관은 지원자가 성능 문제를 식별하고, 이를 해결할 수 있는 방법을 얼마나 잘 알고 있는지를 확인하고 싶어합니다.
- 답변에 포함해야 할 키워드
- 캐시(Cache): 자주 사용되는 데이터를 메모리에 저장하여 성능 향상
- Redis: 자주 사용되는 캐시 저장소
- 쿼리 최적화: 복잡한 데이터 조회 시 인덱스 사용, JOIN 최적화
- CDN(Content Delivery Network): 콘텐츠 전송 속도를 높이기 위한 네트워크
- 성능 모니터링: 애플리케이션 성능을 지속적으로 추적하고 문제를 해결
✅ 백엔드 성능 최적화 면접 질문 정리 (+실제 답변 및 꼬리질문)
🔹 1. [중] 백엔드 성능 최적화 방법을 설명해 주세요.
- 답변: 불필요한 I/O 최소화, 캐싱 전략 활용, DB 쿼리 최적화, 비동기 처리, 병렬 처리, GC 튜닝 등을 통해 전체 응답 속도를 개선할 수 있습니다.
- 꼬리질문: 실제로 어떤 병목을 발견하고 어떻게 개선했나요?
- 답변: 반복 조회 쿼리를 캐싱 처리하거나, 블로킹 I/O를 비동기로 바꿔 응답 시간을 줄였습니다.
🔹 2. [상] 데이터베이스 쿼리 최적화를 위한 방법을 설명해 주세요.
- 답변: 인덱스 사용, N+1 문제 방지(Fetch Join), 적절한 정규화/역정규화, LIMIT, WHERE 절 조건 정리, 실행 계획(EXPLAIN) 분석 등을 활용합니다.
- 꼬리질문: 실행 계획(Explain)을 실제로 활용한 경험이 있다면?
- 답변: FULL SCAN이 발생한 쿼리에 인덱스를 추가하여 RANGE SCAN으로 개선한 경험이 있습니다.
🔹 3. [중] Redis의 주요 사용 사례를 설명해 주세요.
- 답변: 세션 저장소, 캐시, 실시간 순위표, Pub/Sub 메시징, 분산 락 등에 사용됩니다.
- 꼬리질문: Redis에서 캐시로 사용할 때 주의할 점은?
- 답변: 적절한 만료 설정, 캐시 무효화 전략, Redis 장애 시 fallback 로직을 고려해야 합니다.
🔹 4. [중] 캐시(Cache) 메커니즘을 설명하고, 캐시를 사용하는 이유를 이야기해주세요.
- 답변: 캐시는 자주 접근하는 데이터를 미리 저장해두고 빠르게 읽기 위한 메모리 기반 저장소입니다. 처리 속도 향상과 데이터베이스 부하 감소가 주요 이유입니다.
- 꼬리질문: 어떤 데이터를 캐시하면 안 되나요?
- 답변: 실시간으로 변하는 중요 정보나 보안성이 민감한 정보는 캐시에 적합하지 않습니다.
🔹 5. [상] CDN(Content Delivery Network)이 무엇이며, 성능 최적화에 어떤 기여를 하는지 설명해 주세요.
- 답변: CDN은 전 세계에 분산된 캐시 서버를 통해 사용자와 가까운 위치에서 정적 리소스를 제공하는 네트워크입니다. 지연 시간 감소와 트래픽 분산에 효과적입니다.
- 꼬리질문: CDN 적용이 실패하는 상황은?
- 답변: 동적 콘텐츠나 사용자별 커스터마이징된 데이터는 CDN으로 캐싱하기 어렵습니다.
🔹 6. [중] 캐시 무효화(Cache Invalidation) 전략에 대해 설명해주세요.
- 답변: TTL(Time to Live), Write-through, Write-behind, Cache Aside 전략 등이 있습니다.
- 꼬리질문: Cache Aside 전략은 어떤 상황에서 유용한가요?
- 답변: 캐시가 자주 변경되지 않지만, 일관성을 유지해야 하는 경우에 적합합니다.
🔹 7. [상] Redis에서 데이터가 영구적으로 저장되지 않는 이유와 이를 방지하기 위한 방법을 설명해 주세요.
- 답변: Redis는 메모리 기반이므로 장애 시 데이터가 손실될 수 있습니다. RDB 스냅샷 저장, AOF(Append Only File) 설정으로 영속성을 확보할 수 있습니다.
- 꼬리질문: AOF와 RDB의 차이점은?
- 답변: AOF는 변경 사항을 로그에 기록해 복구가 정확하고 RDB는 일정 주기로 전체 데이터를 저장해 빠르지만 손실 위험이 있습니다.
🔹 8. [상] JVM 튜닝을 통한 성능 최적화 방법을 설명해주세요.
- 답변: Heap 크기 조정(-Xms, -Xmx), GC 정책 선택(G1GC, CMS 등), 스레드 수 조절, JIT 설정 등을 통해 성능을 최적화할 수 있습니다.
- 꼬리질문: GC 튜닝을 했던 구체적인 사례가 있다면?
- 답변: Full GC가 빈번했던 서비스를 G1GC로 교체하고, Old 영역 크기 확장으로 GC 시간 감소를 이끌었습니다.
🔹 9. [상] 스레드 풀(Thread Pool)과 비동기 작업을 사용한 성능 최적화 방법을 설명해주세요.
- 답변: 스레드 풀은 제한된 수의 스레드를 재사용하여 리소스 낭비를 막고, 비동기 작업은 I/O 대기 시간을 줄여 응답 속도를 개선합니다.
- 꼬리질문: 스레드 풀 크기는 어떻게 정하나요?
- 답변: CPU 바운드 작업은 코어 수 기반, I/O 바운드는 대기 비율 고려해 더 크게 설정합니다.
🔹 10. [상] 서버의 CPU, 메모리 사용률을 모니터링하고 최적화하는 방법을 설명해 주세요.
- 답변: top, htop, jstat, VisualVM, Prometheus + Grafana 등을 활용해 모니터링하고, 과도한 GC, 메모리 누수, 쓰레드 폭주 등을 분석하여 리소스를 조정합니다.
- 꼬리질문: 실무에서 메모리 누수를 발견했던 사례는?
- 답변: 캐시된 객체를 해제하지 않아 Old 영역이 지속 증가했고, WeakReference로 교체하거나 TTL을 설정해 해결했습니다.
보안 및 인증
- 의도 : 보안 및 인증 카테고리는 웹 애플리케이션의 보안을 유지하는 방법을 평가합니다. 특히 CSRF, XSS, SQL Injection과 같은 웹 보안 문제를 해결하는 능력은 매우 중요합니다. 또한 OAuth, JWT와 같은 인증 방법을 통해 사용자 인증의 보안을 어떻게 강화할 수 있는지를 이해하고 있는지 확인합니다.
- 답변에 포함해야 할 키워드
- JWT(Json Web Token): 사용자 인증에 사용되는 토큰 기반 인증 방식
- 쿠키 vs 세션: 각각의 차이점과 데이터 저장 방식
- XSS(Cross-Site Scripting): 클라이언트 측에서 발생하는 스크립트 공격 방지 방법
- CSRF(Cross-Site Request Forgery): 사용자의 요청을 악용하는 공격 방지 방법
- SSL/TLS: HTTPS를 통해 데이터 전송 시 암호화를 보장
✅ 서버 보안 및 인증 면접 질문 정리 (+실제 답변 및 꼬리질문)
🔹 1. [중] 서버 보안의 기본 원칙에 대해 설명해 주세요.
- 답변: 최소 권한 원칙, 보안 패치 적용, 방화벽 설정, 접근 제어, 민감정보 암호화, 로그 모니터링 등입니다.
- 꼬리질문: 실무에서 가장 먼저 점검해야 할 보안 요소는 무엇인가요?
- 답변: 외부 노출된 포트와 관리 계정 접근 제어, SSL 인증서 적용 등을 우선 점검합니다.
🔹 2. [하] 쿠키와 세션의 차이점이 무엇인지 설명해 주세요.
- 답변: 쿠키는 클라이언트에 저장되고, 세션은 서버에 저장됩니다. 쿠키는 사용자 설정 저장에 적합하고, 세션은 인증 상태 유지에 적합합니다.
- 꼬리질문: 세션이 만료되었을 때 사용자는 어떤 경험을 하게 되나요?
- 답변: 로그인 정보가 사라지고 다시 로그인 화면으로 리다이렉트됩니다.
🔹 3. [중] CSRF(Cross-Site Request Forgery) 공격이 무엇이며, 이를 방지하는 방법을 설명해주세요.
- 답변: 사용자가 인증된 상태에서 악의적인 요청을 유도하는 공격입니다. CSRF 토큰, SameSite 쿠키 설정, Referer 검증 등으로 방지합니다.
- 꼬리질문: CSRF 토큰은 어떻게 동작하나요?
- 답변: 서버가 발급한 고유 토큰을 폼에 포함시키고, 요청 시 동일한 값을 검증함으로써 위조 요청을 차단합니다.
🔹 4. [상] HTTPS와 SSL 인증서의 역할에 대해 설명해 주세요.
- 답변: HTTPS는 HTTP 위에 SSL/TLS를 추가한 프로토콜로, 데이터 암호화와 무결성을 보장합니다. SSL 인증서는 서버의 신원을 확인하고, 암호화 통신을 위한 공개키 교환에 사용됩니다.
- 꼬리질문: SSL 인증서의 루트 체인은 무엇이고 왜 중요한가요?
- 답변: 클라이언트는 루트 인증기관(CA)까지 신뢰 체인을 따라가며 서버 인증서의 유효성을 검증합니다.
🔹 5. [상] JWT(Json Web Token)의 개념과 이를 사용한 인증 방식을 설명해 주세요.
- 답변: JWT는 Header, Payload, Signature 세 부분으로 구성된 토큰입니다. 사용자 인증 후 클라이언트에 토큰을 발급하고, 서버는 이를 검증해 인증을 수행합니다.
- 꼬리질문: JWT에 민감 정보를 담으면 안 되는 이유는?
- 답변: Payload는 Base64 인코딩이라 누구나 열람 가능하므로, 암호화 없이 민감 정보를 포함하면 보안에 취약합니다.
🔹 6. [중] XSS(Cross-Site Scripting) 공격이 무엇이며, 이를 방지하는 방법을 설명해 주세요.
- 답변: 악성 스크립트를 삽입하여 클라이언트에서 실행되게 하는 공격입니다. 입력값 검증, 출력 시 이스케이프 처리, CSP 설정으로 방지할 수 있습니다.
- 꼬리질문: React나 Vue는 XSS에 강한가요?
- 답변: 기본적으로 바인딩 시 HTML을 escape 처리하므로 안전하지만, v-html, dangerouslySetInnerHTML 사용 시 취약해질 수 있습니다.
🔹 7. [상] 서버에서 비밀번호를 안전하게 저장하기 위한 방법(예: 해시 함수, 솔팅 등)을 설명해 주세요.
- 답변: 비밀번호는 단방향 해시(SHA-256, bcrypt 등)로 암호화하고, 동일한 값 방지를 위해 salt를 추가합니다. bcrypt는 자체적으로 salt를 포함합니다.
- 꼬리질문: SHA256보다 bcrypt를 권장하는 이유는?
- 답변: bcrypt는 연산 비용이 높아 무차별 대입 공격에 강하고, 내부적으로 salt를 포함하여 보안성이 높습니다.
🔹 8. [상] SQL 인젝션(SQL Injection)이 무엇이며, 이를 방지하기 위한 방법을 설명해 주세요.
- 답변: 사용자의 입력값에 악의적인 SQL을 삽입해 DB를 조작하는 공격입니다. PreparedStatement 사용, 입력값 검증, ORM 활용 등으로 방지할 수 있습니다.
- 꼬리질문: ORM을 사용해도 SQL 인젝션이 발생할 수 있나요?
- 답변: 네, Raw SQL 또는 JPQL 동적 문자열 조합 시 여전히 위험할 수 있습니다. 바인딩을 지켜야 합니다.
🔹 9. [상] OAuth 2.0과 OpenID Connect의 차이점을 설명해 주세요.
- 답변: OAuth 2.0은 권한 위임을 위한 프로토콜이고, OpenID Connect는 OAuth 2.0 위에 사용자 인증을 추가한 확장입니다. ID Token을 통해 사용자 정보 확인이 가능합니다.
- 꼬리질문: OpenID Connect의 ID Token과 Access Token의 차이는?
- 답변: ID Token은 사용자 정보 인증용, Access Token은 API 접근 권한 부여용입니다.
🔹 10. [중] CORS(Cross-Origin Resource Sharing)가 무엇이며, 이를 해결하는 방법을 설명해 주세요.
- 답변: CORS는 브라우저에서 도메인이 다른 서버로 요청 시 보안 정책상 차단되는 현상을 말합니다. 서버에서 Access-Control-Allow-Origin 등을 설정해 허용할 수 있습니다.
- 꼬리질문: Credential 포함 요청에서 CORS 처리는 어떻게 다르나요?
- 답변: Access-Control-Allow-Credentials: true와 함께, Allow-Origin은 *가 아닌 특정 도메인으로 지정해야 합니다.
배포 및 운영
- 의도 : 배포 및 운영 카테고리는 애플리케이션을 실제 환경에 배포하고 운영하는 능력을 평가합니다. CI/CD 파이프라인을 구축하거나, 무중단 배포를 할 수 있는 방법을 알고 있는지 평가합니다. 또한 컨테이너 도구(Docker, Kubernetes)와 같은 도구를 사용해 서버 환경을 효율적으로 관리할 수 있는 능력도 중요합니다.
- 답변에 포함해야 할 키워드
- 무중단 배포: 서비스가 중단되지 않도록 서버를 업데이트하는 방법
- CI/CD: 지속적인 통합과 배포를 위한 자동화 파이프라인 구축
- 도커(Docker): 애플리케이션을 컨테이너로 패키징하는 도구
- Kubernetes: 컨테이너 오케스트레이션 도구로, 애플리케이션 확장 및 관리
- 로깅 및 모니터링: 서버의 상태를 추적하고 문제 발생 시 대응
✅ 인프라 및 배포 면접 질문 정리 (+실제 답변 및 꼬리질문)
🔹 1. [중] 서버를 무중단 배포(Zero Downtime Deployment)하는 방법에 대해 설명해 주세요.
- 답변: 무중단 배포는 기존 인스턴스를 중단하지 않고 새 인스턴스를 점진적으로 배포하는 방식입니다. 로드 밸런서를 활용한 Blue-Green 배포, 무중단 롤링 업데이트, Kubernetes의 RollingUpdate 전략 등을 사용합니다.
- 꼬리질문: 무중단 배포 시 세션 상태 유지를 어떻게 하나요?
- 답변: 세션 클러스터링, 외부 세션 저장소(Redis 등)를 통해 상태를 공유합니다.
🔹 2. [중] CI/CD(Continuous Integration/Continuous Deployment) 파이프라인을 구축한 경험이 있나요? 사용한 도구를 설명해 주세요.
- 답변: GitHub Actions와 Jenkins를 사용하여 테스트, 빌드, 배포까지 자동화했습니다. Docker 이미지 빌드 후 AWS ECS에 배포하는 플로우를 구성한 경험이 있습니다.
- 꼬리질문: CI/CD 도입 전후의 가장 큰 차이는?
- 답변: 배포 속도와 신뢰도가 향상되었고, 코드 병합 후 자동 테스트로 오류를 조기 발견할 수 있었습니다.
🔹 3. [상] 도커(Docker) 컨테이너와 가상 머신(VM)의 차이점을 설명해주세요.
- 답변: Docker는 호스트 OS의 커널을 공유하는 경량 컨테이너이며, VM은 독립된 OS를 포함한 무거운 가상화 기술입니다. Docker는 실행 속도와 리소스 효율이 높습니다.
- 꼬리질문: 컨테이너 격리 수준은 VM과 비교해 얼마나 안전한가요?
- 답변: OS 커널을 공유하므로 VM보다 격리 수준은 낮지만, 네임스페이스, cgroup 등을 통해 충분한 보안 분리가 가능합니다.
🔹 4. [상] 마이크로서비스 아키텍처(MSA)란 무엇이며, 이를 사용해야 하는 이유를 설명해 주세요.
- 답변: MSA는 애플리케이션을 독립적인 서비스 단위로 나누어 개발, 배포, 확장을 유연하게 하는 아키텍처입니다. 팀 간 독립성 확보, 서비스 확장성, 장애 격리에 유리합니다.
- 꼬리질문: MSA 전환 시 주의할 점은?
- 답변: 서비스 간 통신 안정성, 트랜잭션 분산 처리, 공통 로깅/모니터링 구조 설계가 중요합니다.
🔹 5. [중] 모니터링 도구(예: Prometheus, Grafana)를 사용해 서버 성능을 추적한 경험을 설명해 주세요.
- 답변: Prometheus로 애플리케이션 지표를 수집하고, Grafana 대시보드로 시각화했습니다. CPU, 메모리, 응답 시간, 에러율 등을 실시간으로 모니터링했습니다.
- 꼬리질문: 알람 임계값 설정 기준은 어떻게 정했나요?
- 답변: 평균 부하 기준 + 표준편차 또는 SLA 기준 임계값을 설정했습니다.
🔹 6. [중] Blue-Green 배포와 Canary 배포의 차이점과 사용 사례를 설명해주세요.
- 답변: Blue-Green은 전체 트래픽을 전환하는 방식이고, Canary는 소수 트래픽으로 점진적으로 검증하는 방식입니다.
- Blue-Green: 중단 없는 전체 교체가 필요한 경우
- Canary: 실시간 피드백이 필요한 경우
- 꼬리질문: Canary 배포 시 이상 징후는 어떻게 탐지하나요?
- 답변: 에러율, 응답 시간, 로그 패턴을 기준으로 A/B 테스트 형태로 비교 분석합니다.
🔹 7. [상] Kubernetes에서 Pod가 무엇인지 설명하고, Pod의 라이프사이클을 설명해주세요.
- 답변: Pod는 Kubernetes에서 배포 가능한 가장 작은 단위로, 하나 이상의 컨테이너를 포함할 수 있습니다. 라이프사이클은 Pending → Running → Succeeded/Failed/CrashLoopBackOff 등입니다.
- 꼬리질문: Pod 재시작이 반복될 때 어떻게 디버깅하나요?
- 답변: kubectl describe pod, kubectl logs, liveness/readiness probe 설정 확인 등으로 분석합니다.
🔹 8. [상] 컨테이너 오케스트레이션 도구(Kubernetes 등)를 사용해 본 경험이 있나요? 이를 통해 얻은 이점을 설명해주세요.
- 답변: Kubernetes를 사용해 자동 배포, 롤링 업데이트, 서비스 디스커버리, 오토스케일링 등을 경험했습니다. 특히 서비스 장애 격리와 스케일 아웃이 용이했습니다.
- 꼬리질문: Kubernetes 사용 시 가장 유용했던 기능은?
- 답변: HPA(Horizontal Pod Autoscaler)를 활용한 자동 확장과 ConfigMap/Secret 관리가 인상적이었습니다.
🔹 9. [중] 로깅(logging)의 중요성과 서버 애플리케이션에서 로그를 효과적으로 관리하는 방법을 설명해 주세요.
- 답변: 로깅은 문제 추적, 성능 분석, 보안 감사를 위한 핵심 도구입니다. 로그 수준(Level), 포맷 통일, 외부 수집기(ELK, Fluentd 등)와 연계하여 중앙 집중형 로그 관리를 구축합니다.
- 꼬리질문: 로그 저장 비용이 부담될 때는 어떻게 하나요?
- 답변: 로그 레벨 조정, 보관 주기 설정, 중요 이벤트만 필터링하여 저장합니다.
🔹 10. [상] 애플리케이션 배포 시 발생할 수 있는 다운타임 최소화 방법을 설명해 주세요.
- 답변: 무중단 배포 전략(롤링 업데이트, Blue-Green), 로드 밸런서 헬스체크, 예열(warm-up) 로직을 통해 다운타임을 최소화할 수 있습니다.
- 꼬리질문: 롤링 업데이트 중 에러가 발생하면 어떻게 대응하나요?
- 답변: 헬스체크 실패 시 롤백 트리거를 설정하거나, Canary로 먼저 테스트 후 전체 배포로 전환합니다.
네트워크와 통신
- 의도 : 이 카테고리는 네트워크와 서버 간의 통신을 이해하고 관리하는 능력을 평가합니다. HTTP와 HTTPS, TCP와 UDP와 같은 기본적인 통신 프로토콜을 이해하고, 로드 밸런싱을 통해 서버의 부하를 분산하는 방법을 알고 있는지를 확인합니다. 또한 웹소켓을 활용한 실시간 통신 구현 능력도 평가됩니다.
- 답변에 포함해야 할 키워드
- HTTP vs HTTPS: 보안이 적용된 통신 방식
- TCP vs UDP: 신뢰성 있는 데이터 전송(TCP)과 빠른 전송(UDP)의 차이
- 로드 밸런싱: 서버 부하를 여러 대의 서버로 분산
- 웹소켓(WebSocket): 실시간 양방향 통신 프로토콜
- CORS: 다른 도메인 간의 자원 요청을 관리하는 보안 정책
✅ 네트워크 및 웹 통신 면접 질문 정리 (+실제 답변 및 꼬리질문)
🔹 1. [하] HTTP와 HTTPS의 차이점을 설명해 주세요.
- 답변: HTTP는 데이터를 암호화하지 않고 전송하며, HTTPS는 SSL/TLS를 이용해 데이터를 암호화하여 보안을 강화합니다.
- 꼬리질문: HTTPS 통신 과정에서의 공개키와 개인키 역할은?
- 답변: 서버는 공개키로 암호화한 데이터를 받아, 개인키로 복호화함으로써 보안성을 확보합니다.
🔹 2. [하] TCP와 UDP의 차이점을 설명해주세요.
- 답변: TCP는 연결 지향적이며 신뢰성이 보장되며 순서가 유지됩니다. UDP는 비연결 지향적이고 속도는 빠르지만 신뢰성이 없습니다.
- 꼬리질문: TCP가 사용되는 예시와 UDP가 사용되는 예시는?
- 답변: TCP는 웹 브라우징, 이메일에, UDP는 스트리밍, 게임 등 실시간성이 중요한 곳에 사용됩니다.
🔹 3. [중] 서버 사이드 렌더링과 클라이언트 사이드 렌더링의 차이점을 설명해주세요.
- 답변: 서버 사이드 렌더링(SSR)은 HTML을 서버에서 완성해 보내고, 클라이언트 사이드 렌더링(CSR)은 자바스크립트가 클라이언트에서 렌더링을 수행합니다.
- 꼬리질문: SSR의 장점은 무엇인가요?
- 답변: SEO에 유리하고, 초기 로딩 속도가 빠릅니다.
🔹 4. [상] 웹소켓(WebSocket)이란 무엇이며, 실시간 통신에서 이를 어떻게 사용할 수 있는지 설명해주세요.
- 답변: 웹소켓은 클라이언트와 서버 간의 지속적인 양방향 통신을 가능하게 하는 프로토콜입니다. HTTP 요청 후 업그레이드를 통해 연결을 유지합니다.
- 꼬리질문: 웹소켓 대신 폴링이나 SSE와 비교했을 때 장점은?
- 답변: 지속 연결로 인한 낮은 오버헤드, 빠른 반응속도, 양방향 통신이 가능한 점이 장점입니다.
🔹 5. [중] 웹훅(Webhook)이란 무엇인지 설명해주세요.
- 답변: 웹훅은 특정 이벤트 발생 시 서버가 지정된 URL로 HTTP 요청을 보내는 방식입니다.
- 꼬리질문: 실무에서 웹훅을 사용한 사례는?
- 답변: 결제 승인 완료 후 주문 상태 자동 업데이트, GitHub 푸시 이벤트 알림 등에 사용했습니다.
🔹 6. [중] IP 주소와 DNS(Domain Name System)의 관계를 설명해 주세요.
- 답변: IP 주소는 서버의 위치를 나타내는 숫자 주소이고, DNS는 도메인 이름을 IP 주소로 변환해주는 시스템입니다.
- 꼬리질문: DNS 캐싱은 어떤 영향을 미치나요?
- 답변: 같은 도메인에 대한 반복 요청 시 더 빠른 응답을 가능하게 합니다.
🔹 7. [중] NAT(Network Address Translation)이란 무엇이며, 이를 사용하는 이유를 설명해 주세요.
- 답변: NAT는 사설 IP와 공인 IP 간의 주소를 변환하여 내부 네트워크의 보안을 강화하고 IP 주소 부족 문제를 해결합니다.
- 꼬리질문: NAT 환경에서 포트포워딩이 필요한 이유는?
- 답변: 외부에서 특정 내부 서버에 접근하려면 NAT 라우터가 어떤 내부 IP와 포트를 매핑해야 하기 때문입니다.
🔹 8. [상] HTTP Keep-Alive의 역할과 성능에 미치는 영향을 설명해 주세요.
- 답변: Keep-Alive는 하나의 TCP 연결을 재사용하여 여러 요청을 처리하는 방식입니다. 연결 설정 오버헤드를 줄여 성능을 향상시킵니다.
- 꼬리질문: HTTP/1.1에서 Keep-Alive는 기본인가요?
- 답변: 네, HTTP/1.1에서는 기본적으로 Keep-Alive가 활성화되어 있습니다.
🔹 9. [중] TLS(Transport Layer Security)와 SSL(Secure Sockets Layer)의 차이점을 설명해 주세요.
- 답변: TLS는 SSL의 후속 프로토콜로 보안성과 성능이 향상된 버전입니다. SSL은 더 이상 권장되지 않으며 TLS 1.2 또는 1.3이 현재 표준입니다.
- 꼬리질문: TLS 핸드셰이크 과정은 어떻게 진행되나요?
- 답변: 클라이언트 Hello → 서버 인증서 및 공개키 → 키 교환 → 세션 키 설정 및 암호화 시작
🔹 10. [상] 서버 부하 분산(Load Balancing) 방식 중 라운드 로빈(Round Robin) 방식과 IP 해시 방식의 차이점을 설명해 주세요.
- 답변: 라운드 로빈은 요청을 순차적으로 서버에 분배하고, IP 해시는 클라이언트 IP를 해싱하여 특정 서버로 고정 분배합니다.
- 꼬리질문: IP 해시 방식의 단점은?
- 답변: 서버 수가 변경되면 해시 결과가 바뀌어 세션 일관성이 깨질 수 있습니다.
분산 시스템 및 클라우드
- 의도 : 분산 시스템과 클라우드는 현대 애플리케이션의 확장성 및 고가용성을 위한 필수 요소입니다. 면접관은 지원자가 마이크로서비스 아키텍처(MSA), 클라우드 인프라, 오토스케일링 등을 이해하고, 대규모 애플리케이션에서 발생할 수 있는 문제를 해결할 수 있는 능력을 평가합니다.
- 답변에 포함해야 할 키워드
- 마이크로서비스(MSA): 서비스를 작은 단위로 나누어 독립적으로 배포 및 운영
- 오토스케일링(Auto-scaling): 클라우드에서 트래픽 증가에 따라 서버를 자동으로 확장
- 로드 밸런싱: 여러 서버에 트래픽을 분산하여 성능 최적화
- CAP 이론: 일관성(Consistency), 가용성(Availability), 파티션 허용성(Partition tolerance) 간의 트레이드오프
- Kubernetes: 분산 환경에서 컨테이너 관리
✅ 인프라 및 분산 시스템 면접 질문 정리 (+실제 답변 및 꼬리질문)
🔹 1. [중] 로드 밸런싱(Load Balancing)이 무엇이며, 이를 통해 얻을 수 있는 이점은 무엇인가요?
- 답변: 로드 밸런싱은 여러 서버에 트래픽을 분산시켜 서버 부하를 고르게 하고, 장애 발생 시 자동으로 다른 서버로 요청을 전환해 가용성과 확장성을 높이는 기술입니다.
- 꼬리질문: 로드 밸런싱 방식에는 어떤 종류가 있나요?
- 답변: 라운드로빈, IP 해시, 가중치 기반, 최소 연결 수 방식 등이 있습니다.
🔹 2. [상] 마이크로서비스 아키텍처(MSA)에서 서비스 간 통신을 위한 메시지 브로커(Message Broker)를 사용하는 이유를 설명해 주세요.
- 답변: 비동기 메시지 처리를 통해 서비스 간 느슨한 결합을 유지하고, 장애 전파를 줄이며 확장성과 유연성을 확보하기 위해 사용됩니다.
- 꼬리질문: 어떤 메시지 브로커를 사용했고 어떤 기준으로 선택했나요?
- 답변: Kafka를 사용했으며, 대용량 처리와 내구성, 분산 처리 성능을 고려해 선택했습니다.
🔹 3. [상] 분산 트랜잭션(Distributed Transaction)이란 무엇이며, 이를 관리하는 방법을 설명해 주세요.
- 답변: 둘 이상의 데이터베이스나 시스템에 걸쳐 일어나는 트랜잭션을 의미하며, 일반적인 트랜잭션처럼 원자성을 보장하기 어렵습니다. 해결 방법으로 2PC, SAGA 패턴, 이벤트 기반 보상 트랜잭션 등이 있습니다.
- 꼬리질문: SAGA 패턴의 장점과 단점은?
- 답변: 장점은 유연하고 분산 시스템에 적합하며, 단점은 보상 로직 관리가 복잡하다는 점입니다.
🔹 4. [중] 클라우드에서의 오토스케일링(Auto-scaling)이 무엇이며, 이를 구현할 때 고려해야 할 요소는 무엇인가요?
- 답변: 오토스케일링은 트래픽 부하에 따라 자동으로 인스턴스 수를 조정하는 기능입니다. 고려 요소로는 메트릭 기준(CPU, Memory), 쿨다운 시간, 최소/최대 인스턴스 수 등이 있습니다.
- 꼬리질문: CPU 외에 오토스케일링 조건으로 어떤 지표를 사용할 수 있나요?
- 답변: 네트워크 I/O, 요청 수, 애플리케이션 응답 시간, 큐 길이 등이 사용됩니다.
🔹 5. [상] Kubernetes의 역할과 사용 이유에 대해 설명해 주세요.
- 답변: Kubernetes는 컨테이너화된 애플리케이션의 배포, 스케일링, 관리를 자동화하는 오케스트레이션 도구입니다. 고가용성, 자가 치유, 로드밸런싱, 롤링 업데이트 등의 기능을 제공합니다.
- 꼬리질문: 실제 운영에서 Kubernetes가 가장 유용했던 사례는?
- 답변: 롤링 업데이트 시 다운타임 없이 배포하거나, 장애 Pod의 자동 복구가 매우 효과적이었습니다.
🔹 6. [중] AWS, GCP, Azure와 같은 클라우드 서비스 제공자가 제공하는 주요 서비스에 대해 설명해 주세요.
- 답변:
- AWS: EC2(컴퓨팅), S3(스토리지), RDS(DB), Lambda(서버리스)
- GCP: Compute Engine, Cloud Storage, BigQuery, Cloud Functions
- Azure: Virtual Machines, Blob Storage, SQL Database, Azure Functions
- 꼬리질문: 멀티 클라우드 전략의 장점은?
- 답변: 특정 벤더 종속 방지, 장애 대응력 강화, 비용 및 성능 최적화가 가능합니다.
🔹 7. [상] 분산 시스템에서 데이터 일관성(Consistency)과 가용성(Availability)의 트레이드오프를 설명해 주세요.
- 답변: 분산 시스템에서는 네트워크 파티션 상황에서 일관성과 가용성을 동시에 만족시킬 수 없습니다. 일관성을 유지하면 일부 요청은 거부되고, 가용성을 선택하면 일시적 불일치가 발생할 수 있습니다.
- 꼬리질문: 어떤 상황에서 일관성보다 가용성을 선택하나요?
- 답변: 실시간 채팅, 피드 시스템처럼 최신 데이터보다 응답 속도가 중요한 서비스에서는 가용성이 우선됩니다.
🔹 8. [상] CAP 이론이란 무엇이며, 분산 시스템에서 어떻게 적용되는지 설명해 주세요.
- 답변: CAP 이론은 Consistency(일관성), Availability(가용성), Partition Tolerance(분할 허용성) 중 두 가지만 동시에 보장 가능하다는 이론입니다. 분산 시스템에서는 파티션 허용이 필수이므로, 일관성과 가용성 중에서 선택해야 합니다.
- 꼬리질문: Cassandra와 같은 시스템은 CAP 중 어떤 조합을 따르나요?
- 답변: Cassandra는 AP(가용성 + 파티션 허용)을 선택하고, eventual consistency 모델을 따릅니다.
🔹 9. [중] 클라우드 환경에서의 데이터 백업과 복구 전략에 대해 설명해 주세요.
- 답변: 자동 백업 설정, 스냅샷 주기적 생성, 지역 간 복제, 복구 테스트 시나리오 설계 등을 포함합니다. RTO(복구 시간 목표)와 RPO(복구 시점 목표)를 기준으로 정책을 세웁니다.
- 꼬리질문: 백업은 되었는데 복구가 실패하는 경우는 왜 발생하나요?
- 답변: 복구 테스트 미실시, 버전 불일치, 네트워크 설정 오류 등으로 인해 실제 복구 실패가 발생할 수 있습니다.
🔹 10. [상] 컨테이너 기반 마이크로서비스 아키텍처를 운영할 때의 장점과 단점을 설명해 주세요.
- 답변:
- 장점: 빠른 배포, 독립적 스케일링, 기술 스택 분리, 이식성
- 단점: 복잡한 네트워크 구성, 서비스 디스커버리/보안 이슈, 운영 인프라 부담
- 꼬리질문: 컨테이너 기반 MSA에서 가장 어려웠던 점은?
- 답변: 로그 집계 및 트래픽 추적이 어려웠고, 이를 해결하기 위해 중앙 로깅 시스템과 분산 트레이싱을 도입했습니다.
테스트 및 디버깅
- 의도 : 이 카테고리는 코드의 신뢰성 및 성능을 보장하기 위해 테스트와 디버깅을 수행하는 능력을 평가합니다. 단위 테스트, 통합 테스트를 통해 개발된 기능이 제대로 작동하는지 검증할 수 있는 능력을 확인하고, TDD나 성능 테스트와 같은 테스트 주도 개발 방식을 이해하고 있는지를 묻습니다.
- 답변에 포함해야 할 키워드
- 단위 테스트(Unit Test): 코드의 개별 단위를 테스트
- 통합 테스트(Integration Test): 여러 모듈이 함께 동작하는지 확인
- TDD(Test Driven Development): 테스트를 먼저 작성하고 기능을 구현하는 방식
- 디버깅(Debugging): 코드 실행 중 발생하는 오류를 찾고 수정하는 과정
- 로깅(logging): 서버 애플리케이션에서 발생하는 로그 기록 및 분석
✅ 테스트 및 디버깅 면접 질문 정리 (+실제 답변 및 꼬리질문)
🔹 1. [하] 단위 테스트(Unit Test)와 통합 테스트(Integration Test)의 차이점을 설명해 주세요.
- 답변: 단위 테스트는 하나의 메서드나 컴포넌트를 독립적으로 검증하며, 통합 테스트는 여러 모듈이 함께 동작하는지 확인합니다.
- 꼬리질문: 각각의 테스트는 어떤 시점에서 수행해야 하나요?
- 답변: 단위 테스트는 개발 직후, 통합 테스트는 기능 구현 후 혹은 배포 전에 수행합니다.
🔹 2. [중] TDD(Test Driven Development)가 무엇이며, 이를 적용한 경험이 있나요?
- 답변: 테스트 코드를 먼저 작성하고, 이를 통과하는 최소한의 코드를 구현하는 방식입니다. 기능 개발에 대한 명확한 설계와 빠른 피드백이 장점입니다.
- 꼬리질문: TDD의 단점은 무엇인가요?
- 답변: 초기 구현 속도가 느릴 수 있고, 복잡한 테스트 작성이 부담이 될 수 있습니다.
🔹 3. [중] 로깅(logging)이 중요한 이유와 효과적인 로깅 전략을 설명해 주세요.
- 답변: 로깅은 시스템 상태를 추적하고, 에러 발생 시 원인을 분석하는 데 필수입니다. 레벨 구분(INFO, WARN, ERROR), 구조화 로그, 중앙 로깅 시스템(ELK 등)을 도입해 효과적으로 관리합니다.
- 꼬리질문: 민감한 정보가 로그에 노출되지 않도록 하려면?
- 답변: 개인정보 마스킹, 보안 로그 필터링, 접근 권한 설정이 필요합니다.
🔹 4. [상] 서버에서 발생한 성능 문제를 디버깅한 경험이 있나요? 어떻게 해결했나요?
- 답변: 특정 API 응답 지연 문제를 분석한 결과, N+1 쿼리와 GC 과다 발생이 원인이었습니다. JPA fetch 전략 수정과 G1GC 설정 조정으로 해결했습니다.
- 꼬리질문: GC 로그를 분석하는 방법은?
- 답변: GC 로그를 통해 Full GC 발생 주기, heap 사용량 등을 확인하여 튜닝 포인트를 찾습니다.
🔹 5. [중] JUnit을 사용한 테스트 작성 경험이 있나요? 기본적인 사용법을 설명해 주세요.
- 답변: @Test 애너테이션으로 메서드를 테스트 단위로 정의하고, assertEquals, assertThrows 등을 활용하여 결과를 검증합니다.
- 꼬리질문: 테스트 코드에서 공통 설정은 어떻게 관리하나요?
- 답변: @BeforeEach, @BeforeAll 등을 활용해 공통 초기화 로직을 구성합니다.
🔹 6. [상] 테스트 자동화를 구현하는 방법과 이를 통해 얻을 수 있는 이점에 대해 설명해주세요.
- 답변: GitHub Actions, Jenkins 등을 사용해 CI/CD 파이프라인에서 테스트가 자동으로 실행되도록 설정합니다. 오류를 빠르게 발견하고 코드 품질을 유지하는 데 큰 도움이 됩니다.
- 꼬리질문: 테스트가 불안정하게 실패할 경우 어떻게 대응하나요?
- 답변: 테스트 격리 여부 확인, 의존성 제거, mock 객체 사용 여부 등을 점검합니다.
🔹 7. [상] 성능 테스트(Performance Testing)와 부하 테스트(Load Testing)의 차이점을 설명해 주세요.
- 답변: 성능 테스트는 시스템의 응답 시간, 처리량을 측정하는 테스트이고, 부하 테스트는 정상 상태에서의 최대 처리 용량을 측정하는 테스트입니다.
- 꼬리질문: 성능 테스트 도구로 어떤 걸 써봤나요?
- 답변: JMeter, Gatling을 사용해 요청 수와 응답 시간 등을 분석했습니다.
🔹 8. [중] 버그가 발생했을 때 이를 추적하는 방법과 해결 과정에 대해 설명해주세요.
- 답변: 로그 분석, 재현 시나리오 구성, 버전 이력 확인, 디버거 사용 등을 통해 원인을 파악하고, 단위 테스트를 작성한 후 수정합니다.
- 꼬리질문: 재현이 어려운 버그는 어떻게 추적하나요?
- 답변: 입력/환경 로깅을 강화하고, Sentry 등 오류 수집 도구를 활용해 사용자 환경에서의 정보를 확보합니다.
🔹 9. [상] 코드 품질을 유지하기 위한 정적 분석 도구(예: SonarQube)를 사용한 경험이 있나요? 이를 어떻게 활용했는지 설명해 주세요.
- 답변: SonarQube를 Jenkins와 연동하여 빌드 시 자동 분석되도록 했고, 코드 스멜, 복잡도, 커버리지 등의 지표를 기준으로 리팩토링 우선순위를 정했습니다.
- 꼬리질문: 코드 커버리지는 얼마나 확보해야 하나요?
- 답변: 프로젝트 특성에 따라 다르지만, 핵심 로직은 80% 이상 확보하는 것을 목표로 합니다.
🔹 10. [상] 데이터베이스에서 발생하는 성능 문제를 디버깅한 경험을 설명해 주세요.
- 답변: 대량 데이터 조회 시 응답 지연 문제가 발생해 쿼리 실행 계획을 분석한 결과, 인덱스 미사용과 JOIN 최적화 부족이 원인이었습니다. 인덱스 추가와 쿼리 구조 개선으로 해결했습니다.
- 꼬리질문: DB 성능 문제를 예방하기 위한 방법은?
- 답변: 정기적인 실행 계획 점검, 느린 쿼리 로그 확인, 통계 갱신, 캐시 활용 등이 있습니다.
'취업' 카테고리의 다른 글
면접 정리 [test] (0) | 2025.04.15 |
---|