2025 CS 스터디
=== JAVA 핵심 개념 정리 ===
[1] JVM 구조
- 정의: 자바 바이트코드를 실행하는 가상 머신으로, 스택 기반으로 동작하며 자동 메모리 관리를 제공
- 장점: 운영체제 독립성, 가비지 컬렉션(GC)을 통한 메모리 자동 관리
- 단점: 실행 속도가 상대적으로 느림, 다중 상속 불가, 타입 제약 존재
[2] GC (Garbage Collection) 처리 방법
- 역할: 더 이상 사용하지 않는 객체의 메모리를 자동으로 회수
- 특징: GC 중에는 다른 스레드가 일시 중지되고, 정리 후 재개됨 (Stop-the-world)
[3] HashMap vs HashTable vs ConcurrentHashMap
- HashMap: 동기화 미지원 (싱글 스레드용), null 허용
- HashTable: 동기화 지원 (멀티 스레드용), 전체 성능 낮음
- ConcurrentHashMap: 부분 동기화 지원, null 허용 안 됨, 멀티 스레드에 적합
[4] 접근 제어자 종류
- public: 어디서든 접근 가능
- protected: 같은 패키지 + 다른 패키지의 상속 클래스에서 접근 가능
- default: 같은 패키지 내에서만 접근 가능
- private: 해당 클래스 내부에서만 접근 가능
[5] Interface vs Abstract Class
- 공통점: 인스턴스 생성 불가, 하위 클래스에서 구현 필요
- Interface: 메서드 강제 구현, 다중 상속 가능
- Abstract Class: 공통 로직 구현 가능, 단일 상속만 가능
[6] String vs StringBuilder vs StringBuffer
- String: 불변 객체, 문자열 변경 시 새로운 객체 생성
- StringBuilder: 가변 객체, 동기화 미지원 (싱글 스레드용)
- StringBuffer: 가변 객체, 동기화 지원 (멀티 스레드용)
[7] try-with-resource
- 설명: try 블록에 선언한 자원은 자동으로 close 처리됨
- 장점: finally 없이 자원 정리 가능 → 코드 간결화 및 가독성 향상
[8] synchronized 키워드
- 목적: 동시성 문제 방지를 위해 메서드나 블록을 동기화
- 주의: 과도한 동기화는 성능 저하 유발 가능
[9] static 변수 메모리 영역
- 저장 위치: JVM의 Method Area (또는 Class Area)
- 생명주기: 클래스 로딩 시 생성되고, 프로그램 종료 시까지 유지
[10] 컬렉션 프레임워크 요약
- List: 순서 O, 중복 O → ArrayList, LinkedList
- Set: 순서 X, 중복 X → HashSet, TreeSet
- Map: 키-값 저장 → HashMap, TreeMap
- Queue: FIFO 구조 → PriorityQueue 등dk
[11] 제네릭(Generic)
- 개념: 클래스나 메서드에서 사용할 타입을 외부에서 지정
- 장점: 타입 안정성 증가, 코드 재사용성 증가
[12] Vector vs ArrayList vs LinkedList
- Vector: 동기화 O, 성능 ↓
- ArrayList: 동기화 X, 랜덤 접근 ↑
- LinkedList: 삽입/삭제 ↑, 랜덤 접근 ↓
[13] 오버로딩 vs 오버라이딩
- 오버로딩: 같은 메서드 이름 + 매개변수 다름
- 오버라이딩: 상위 클래스 메서드를 하위 클래스에서 재정의
[14] Checked vs Unchecked Exception
- CheckedException: 컴파일 시 체크됨 (IOException, SQLException 등)
- UncheckedException: 런타임 예외, 체크 불필요 (NPE, IndexOutOfBounds 등)
[15] final / finally 차이
- final: 상수 선언 / 메서드 오버라이딩 금지 / 클래스 상속 금지
- finally: 예외 발생 여부와 관계없이 반드시 실행되는 블록
- [new String() vs 리터럴(“”) 차이]
- new String(“abc”): 매번 새로운 객체 (Heap 저장)
- “abc”: String Constant Pool 재사용
- [직렬화 (Serialization)]
- 객체를 바이트로 변환 → 파일 저장, 전송 가능
- 역직렬화: 바이트 → 객체
- 사용: 파일 저장, 네트워크 전송, 캐시
- 구현: Serializable, ObjectOutputStream
- [불변 객체 (Immutable)]
- 생성 후 상태 변경 불가
- 예시: String, Integer, LocalDateTime
- 조건:
- 필드 모두
private final
- 생성자로 초기화
-
상태 변경 시 새 객체 반환
- [인스턴스 생성 과정]
new
사용 → 생성자 호출 → 힙에 메모리 할당- 예시:
Person p = new Person("홍길동");
- [다형성 메소드 예시]
System.out.println(Object)
→ toString 오버라이딩Collections.sort(List)
→ Comparable에 따라 다르게 정렬Object.equals(Object)
→ 타입별 동작 다름
- [Mutex vs Semaphore]
- Mutex: 한 쓰레드만 접근 (synchronized, ReentrantLock)
- Semaphore: 여러 쓰레드 접근 제한 (예: 최대 3개)
→
new Semaphore(3)
- [프로세스 vs 스레드]
- 프로세스: OS 자원 독립적
- 스레드: 프로세스 내 실행 단위, 메모리 공유
- [병렬 스트림 주의사항]
- ForkJoinPool 공유 → 성능 저하 가능
- 상태 공유 시 race condition
- 해결: 상태 없는 작업에만 사용, 커스텀 스레드풀 설정
- [클래스 vs 객체]
- 클래스: 설계도 (
class Car {}
) - 객체: 인스턴스 (
new Car()
)
- 클래스: 설계도 (
- [Mutable vs Immutable 객체]
- Mutable: 상태 변경 가능 (ArrayList 등)
- Immutable: 상태 변경 불가 (String 등), 멀티스레드에 유리
- [스레드 간 공유 영역]
- 공유 가능: 힙 (객체, 배열)
- 공유 불가: 스택 (지역 변수)
- 동기화 방법: synchronized, Lock, Atomic
- [Stack vs LinkedList vs List]
- Stack: LIFO
- LinkedList: 노드 연결
- List: 인터페이스 (ArrayList/LinkedList 구현체 포함)
- [병렬 작업 시 주의]
- 공유 자원 동기화 필수
- ThreadPool 적절 설정
- 데드락 방지 설계 필요
- [Heap vs Stack 메모리]
- Heap: 객체 저장, GC 대상
- Stack: 지역 변수 저장, 메서드 호출 시 사용
** 스프링 **
1) 스프링 IoC (Inversion of Control) 제어의 역전이란 객체의 생성 및 제어를 개발자가 직접 하지 않고, 스프링 컨테이너가 대신 관리하는 것
2) OOP와 AOP의 차이 OOP: 캡슐화, 상속, 다형성 등을 활용한 객체 중심 설계 AOP: 공통 관심사를 분리하여 모듈화 (로깅, 트랜잭션 등)
3) AOP의 장단점 장점: 중복 코드 제거, 유지보수성 향상, 핵심 로직과 부가 기능 분리 단점: 설정이 복잡하고 코드 흐름 파악이 어려울 수 있음
4) POJO (Plain Old Java Object) 특정 기술에 종속되지 않는 순수 자바 객체로, 재사용성과 테스트 용이성이 높음
5) MVC 패턴 흐름 클라이언트 요청 → DispatcherServlet 수신 → HandlerMapping으로 컨트롤러 찾기 → 컨트롤러 실행 → ModelAndView 반환 → ViewResolver를 통해 View 응답
6) 프레임워크 vs 라이브러리 프레임워크: 흐름 제어 (IoC) 중심, 개발자가 특정 부분만 작성 라이브러리: 개발자가 직접 호출하여 사용
7) DI (Dependency Injection) 스프링 컨테이너가 의존성을 관리하고 주입 사용 예: @Autowired, @Inject, @Bean 등
8) RESTful API REST 원칙을 따르는 API
- 자원은 URI로 표현
- HTTP 메서드로 동작 명시 (GET, POST, PUT, DELETE)
9) 디자인 패턴 3가지
- 싱글톤: 하나의 인스턴스만 유지
- 팩토리: 객체 생성 로직을 서브 클래스에 위임
- 템플릿: 공통 구조 제공 + 변경 부분은 하위 클래스가 정의r
- 빌더 패턴도 객체 생성 시 자주 활용
10) CORS (Cross-Origin Resource Sharing) 도메인 간 자원 공유 보안 정책 서버에서 Access-Control-Allow-Origin 설정 필요
11) OAuth 2.0 인증 흐름
- 클라이언트가 인증 요청
- 권한 서버에서 Authorization Code 발급
- Code로 Access Token 요청
- Access Token으로 보호 자원 요청
12) Call By Value vs Call By Reference
- Call By Value: 값 복사 → 원본 영향 없음
- Call By Reference: 참조 전달 → 원본 영향 있음
13) DAO vs DTO vs VO
- DAO: DB 접근 로직 처리
- DTO: 계층 간 데이터 전달 (getter/setter만 존재)
- VO: 불변 객체, 읽기 전용 데이터
14) MVC 패턴의 장점
- Model: 비즈니스 로직
- View: UI 처리
- Controller: 흐름 제어 → 역할 분리로 유지보수성 향상
15) 서블릿 컨테이너란? 서블릿의 생성/실행/소멸을 담당하는 환경 요청마다 쓰레드를 생성하여 처리 (멀티쓰레드) 예: Tomcat
16) 디스패처 서블릿(DispatcherServlet)이란? 모든 요청을 받아 적절한 컨트롤러에 전달하는 Front Controller Spring MVC의 핵심 요소
17) 웹소켓(WebSocket) HTTP와 달리 실시간 양방향 통신 지원 사용 예: 채팅, 주식 시스템, 게임 등
18) OAuth 2.0 흐름 정리
- 클라이언트 → 인증 요청
- 사용자 로그인 → Authorization Code 발급
- Code → Access Token 교환
- Access Token → 보호된 리소스 접근
19) OAuth란? 제3자 인증 방식 비밀번호 직접 제공 없이 인증 가능 소셜 로그인에 주로 사용 (Google, Naver 등)
20) Autowiring 과정 스프링이 자동으로 의존 객체를 주입 어노테이션: @Autowired, @Inject, @Resource → 일치하는 빈 검색, 없으면 예외 또는 @Qualifier/@Primary 사용
21) Spring 구동 시 메서드 실행 방법
- CommandLineRunner / ApplicationRunner 구현
- @PostConstruct
- ApplicationReadyEvent 리스너 등록
- InitializingBean.afterPropertiesSet()
- @Bean(initMethod = “initMethodName”)
22) 웹플럭스(WebFlux)와 Mono
- WebFlux: 비동기 논블로킹 웹 프레임워크
- Mono: 0 또는 1개의 데이터 처리
- Flux: 0개 이상의 스트림 처리 → 고성능 실시간 처리에 적합
23) AOP (Aspect-Oriented Programming) 공통 관심사를 핵심 로직과 분리하여 모듈화
주요 개념:
- Aspect: 관심사 정의 (예: 로깅)
- Advice: 실행 시점 코드 (Before, After 등)
- Pointcut: 대상 메서드 정의
- JoinPoint: 실행 지점
- Weaving: 적용 과정
예시: @Aspect @Component public class LoggingAspect { @Before(“execution(* com.example.service..(..))”) public void logBefore(JoinPoint joinPoint) { System.out.println(“Method 실행: “ + joinPoint.getSignature().getName()); } }
📘 데이터베이스 기술 면접 요약 정리
──────────────────────────────
- Connection Pool을 사용하는 이유
──────────────────────────────
- DB 연결 시 3-way, 4-way handshake 반복 → 리소스 소모
- 매번 새로운 연결 생성 시 성능 저하
- Connection Pool은 미리 연결을 생성하고 재사용 → 성능 향상
──────────────────────────────
- 데이터베이스 언어 (DDL, DML, DCL)
──────────────────────────────
- DDL (정의어): CREATE, ALTER, DROP
- DML (조작어): SELECT, INSERT, UPDATE, DELETE
- DCL (제어어): GRANT, REVOKE, COMMIT, ROLLBACK
──────────────────────────────
- Trigger란?
──────────────────────────────
- 테이블에 대한 INSERT, DELETE, UPDATE 시 자동 실행
- 로깅, 무결성 유지, 복잡한 검증 로직에 활용
──────────────────────────────
- LEFT OUTER JOIN
──────────────────────────────
- 왼쪽 테이블의 모든 행 유지, 일치하는 오른쪽 테이블의 값 병합
- 일치하지 않으면 NULL 반환
예시: SELECT A., B. FROM A LEFT OUTER JOIN B ON A.id = B.a_id;
──────────────────────────────
- RDBMS vs NoSQL
──────────────────────────────
[RDBMS]
- 스키마 존재, 정규화, JOIN 가능, ACID 보장
- 트랜잭션이 중요한 시스템에 적합
[NoSQL]
- 스키마 없음, 유연한 구조 (Document, Key-Value 등)
- 대용량 데이터 분산 처리, 수평 확장 용이
- 가용성 중시, 빅데이터/실시간 분석에 적합
──────────────────────────────
- Index 개념 및 장단점
──────────────────────────────
- 장점: 검색 속도 향상, WHERE/ORDER BY 성능 개선
- 단점: 삽입/수정/삭제 시 오버헤드 발생, 인덱스 과다 생성 시 성능 저하
──────────────────────────────
- SQL Injection
──────────────────────────────
- 사용자 입력으로 SQL이 조작되는 보안 취약점
예시 (취약 코드): SELECT * FROM users WHERE username = ‘admin’ AND password = ‘’ OR ‘1’ = ‘1’;
[예방 방법]
- Prepared Statement 사용
- ORM 사용 (JPA 등)
- 입력값 검증
──────────────────────────────
- ORM (Object-Relational Mapping)
──────────────────────────────
- 객체와 RDBMS 테이블 간 매핑
- SQL 없이 데이터 조작 가능
예시 (JPA): @Entity public class User { @Id @GeneratedValue private Long id; private String name; }
──────────────────────────────
- N+1 문제와 해결 방법
──────────────────────────────
- Lazy Loading으로 인해 N개의 추가 쿼리 발생
[해결책]
- Fetch Join 사용 (JOIN FETCH)
- @BatchSize 사용
- EntityGraph 활용
──────────────────────────────
- 트랜잭션(Transaction)
──────────────────────────────
- 데이터 변경의 논리적 단위
- 하나라도 실패 시 전체 롤백
──────────────────────────────
- ACID 원칙
──────────────────────────────
- Atomicity: 원자성 (전체 성공 or 전체 실패)
- Consistency: 일관성 유지
- Isolation: 고립성 보장
- Durability: 내구성 (시스템 장애 후에도 보존)
──────────────────────────────
- 트랜잭션 격리 수준 (Transaction Isolation)
──────────────────────────────
1) READ UNCOMMITTED
- 커밋되지 않은 데이터 읽기 가능
- Dirty Read 발생 가능 (성능↑)
2) READ COMMITTED
- 커밋된 데이터만 읽기 가능
- Non-repeatable Read 발생 가능
- 대부분 RDBMS 기본
3) REPEATABLE READ
- 조회한 데이터는 트랜잭션 내에서 고정
- Phantom Read 발생 가능
4) SERIALIZABLE
- 가장 높은 격리 수준
- 모든 현상 방지, 성능 ↓
──────────────────────────────
- 정규화 (Normalization)
──────────────────────────────
- 중복 최소화, 무결성 유지
1NF: 원자값으로 분해 2NF: 부분 함수 종속 제거 3NF: 이행 함수 종속 제거
──────────────────────────────
- UNION vs UNION ALL
──────────────────────────────
- UNION: 중복 제거, 성능 ↓
- UNION ALL: 중복 허용, 성능 ↑
예시: SELECT name FROM employees UNION SELECT name FROM managers;
SELECT name FROM employees UNION ALL SELECT name FROM managers;
**네트워크**
- TCP와 UDP의 차이
- TCP (Transmission Control Protocol) 연결형 프로토콜 (3-way Handshake) 데이터 전송의 신뢰성 보장 (순서 보장, 재전송, 흐름제어) 속도가 상대적으로 느림 예시: 파일 전송, 이메일, 웹 브라우징
- UDP (User Datagram Protocol) 비연결형 프로토콜 (Handshake 없음) 데이터 손실 가능성 있음 (순서 보장 없음, 재전송 없음) 속도가 빠름 예시: 실시간 스트리밍, 온라인 게임
- HTTP와 HTTPS 차이 및 HTTPS에서 S의 계층
- HTTP (HyperText Transfer Protocol): 평문 데이터 전송, 보안 취약
- HTTPS (HTTP Secure): SSL/TLS 암호화 적용, 보안 강화
- SSL/TLS 계층: 전송 계층과 응용 계층 사이에서 동작
- 쿠키와 세션의 차이
- 쿠키: 클라이언트(브라우저)에 저장, 서버의 부담이 적음
- 세션: 서버에 저장, 보안성 높지만 서버 자원 사용
- 3-Way Handshake & 4-Way Handshake
- 3-Way Handshake (TCP 연결 수립)
- 클라이언트 → 서버: SYN
- 서버 → 클라이언트: SYN + ACK
- 클라이언트 → 서버: ACK - 4-Way Handshake (TCP 연결 종료)
- 클라이언트 → 서버: FIN (데이터 전송 종료 요청)
- 서버 → 클라이언트: ACK (확인 응답)
- 서버 → 클라이언트: FIN (서버도 종료 요청)
- 클라이언트 → 서버: ACK (확인 응답 후 종료)
- GET vs POST & CRUD 개념
- GET: 데이터 조회, URL에 데이터 포함 (길이 제한), 빠름
- POST: 데이터 등록, 요청 본문(body)에 데이터 포함, 보안성 높음
- CRUD (Create, Read, Update, Delete) Create → POST Read → GET Update → PUT / PATCH Delete → DELETE
- TCP와 IP의 차이
- TCP: 4계층(전송 계층), 신뢰성 보장 (데이터 순서, 재전송 등)
- IP: 3계층(네트워크 계층), 데이터 전달만 담당 (신뢰성 보장 X)
- HTTP Methods 정리
- GET: 데이터 조회
- POST: 데이터 등록
- PUT: 데이터 전체 수정 (없으면 생성)
- PATCH: 데이터 일부 수정
- DELETE: 데이터 삭제
- Connection Timeout vs Read Timeout
- Connection Timeout: 서버 연결 시도 시간이 초과됨
- Read Timeout: 서버 응답이 지연되어 클라이언트가 대기 시간 초과
- OSI 7계층
- 물리 계층: 하드웨어 전송 (비트, 케이블, 허브)
- 데이터 링크 계층: MAC 주소 기반 통신 (프레임, 스위치)
- 네트워크 계층: IP 주소 기반 통신 (패킷, 라우터)
- 전송 계층: TCP/UDP 기반 통신 (세그먼트)
- 세션 계층: 연결 설정 및 유지 (세션)
- 표현 계층: 데이터 변환 (암호화, 압축)
- 응용 계층: 사용자와 직접 연결 (HTTP, FTP, DNS)
- 무중단 배포(Zero Downtime Deployment) 방법 무중단 배포는 시스템이 서비스 중단 없이 새로운 코드로 변경될 수 있도록 하는 배포 방식입니다.
대표적인 무중단 배포 전략 Blue-Green Deployment
기존(Blue)과 새로운(Green) 환경을 동시에 운영 배포 후 트래픽을 점진적으로 Green으로 전환 후 Blue 종료 빠른 롤백 가능 Canary Deployment
일부 트래픽(예: 10%)을 새로운 버전으로 유도 후 점진적 확대 A/B 테스트 및 성능 모니터링 가능 Rolling Deployment
기존 서버를 하나씩 교체하면서 점진적으로 새로운 버전 배포 트래픽 분배를 통해 시스템 부하 최소화 Feature Toggle
새로운 기능을 미리 배포한 후 설정값을 변경하여 활성화 ✅ 무중단 배포 고려 사항
로드 밸런서 설정: 트래픽을 분산하여 장애 방지 DB 마이그레이션 전략: 버전 간 데이터 구조 충돌 방지 Health Check: 배포된 서비스의 정상 동작 여부 확인
Java 코딩 테스트 및 기술 면접 요약
- List vs Set
- List: 중복 허용, 순서 보장
- Set: 중복 불가, 순서 보장 안함 (LinkedHashSet, TreeSet은 순서 보장)
- 배열 vs LinkedList
- 배열: 인덱스 접근 빠름, 크기 고정, 중간 삽입/삭제 비효율
- LinkedList: 중간 삽입/삭제 용이, 인덱스 접근 느림
- Stack vs Queue
- Stack: LIFO, 예) Undo, 웹 뒤로가기
- Queue: FIFO, 예) 프린터 대기열, 콜센터 대기열
- Object의 equals() vs hashCode()
- equals(): 논리적 동등성 비교
- hashCode(): 해시 기반 컬렉션에서 사용
- equals() == true → hashCode() 같아야 함
- StringBuilder vs StringBuffer
- StringBuilder: 비동기, 빠름 (싱글스레드에 적합)
- StringBuffer: 동기화 처리됨, 느림 (멀티스레드에 적합)
- System.out.println()의 단점
- synchronized + Blocking I/O → 성능 병목 발생 가능
- ArrayList 내부 구조
- 배열 기반, 동적 확장 (기존 배열의 1.5배 크기)
- 스레드의 장단점
- 장점: 동시 처리 가능
- 단점: 생성 비용, 컨텍스트 스위칭, 과도한 생성 → 성능 저하
- 동시성 문제: i++에서 값 불일치
- 이유: 읽기 → 증가 → 쓰기 간에 race condition 발생
- 해결: synchronized, AtomicInteger, Lock
- 동시성 키워드
- synchronized: 원자성 보장, 성능 저하
- volatile: 가시성 보장, 원자성 미보장
- Blocking I/O vs Non-Blocking I/O
- Blocking: I/O 완료까지 대기, CPU 낭비
- Non-Blocking: 이벤트 기반, 높은 동시성
- 예: Netty, Spring WebFlux
- Serializable (직렬화)
- 객체를 바이트 스트림으로 변환
- 사용처: 파일 저장, 네트워크 전송
- 방식: Serializable, Externalizable, JSON, Protobuf 등
Comments