# 면접 CS 정리 Day 8 (풀스택 / Java·Spring·React)

면접 CS 정리 Day 8 (풀스택 / Java·Spring·React)

Q1. String / StringBuilder / StringBuffer

문제
String / StringBuilder / StringBuffer 차이?
루프에서 문자열을 +로 이어 붙이면 왜 안 좋은지?

  • String: 불변. 더하면 새 객체 생성
  • StringBuilder: 가변, 동기화 없음 → 일반 추천
  • StringBuffer: 가변, 동기화 있음 → 멀티스레드용

루프에서 str = str + "x"는 매번 새 String이 생겨 느리고 GC 부담이 크다.
반복 연결은 StringBuilder를 쓴다.

Q2. Bean 스코프 + singleton 위험

문제
Bean 기본 스코프는? singleton에 요청별 상태 필드를 두면 왜 위험한지?


기본 스코프는 singleton (컨테이너당 1개 공유).

모든 요청이 같은 인스턴스를 쓰므로 currentUserId 같은
요청별 상태를 필드에 두면 사용자 정보가 섞일 수 있다.

Q3. 생성자 주입

문제
생성자 주입을 필드 주입보다 선호하는 이유 2가지?

  1. 테스트 시 mock을 생성자로 넣기 쉬움
  2. final로 필수 의존성을 명시·불변 유지

의존성 누락 시 객체 생성이 실패해 문제를 빨리 발견한다.

Q4. EXPLAIN

문제
EXPLAIN에서 슬로우 쿼리일 때 먼저 볼 키워드 2개?

  1. type: ALL이면 full scan 의심
  2. key: 사용한 인덱스 (NULL이면 인덱스를 못 탐)

보너스: rows (예상 행 수)

Q5. XSS / CSRF

문제
XSS / CSRF 차이 한 줄씩 + 각각 막는 방법 하나씩?

  • XSS: 페이지에 악의적 스크립트 삽입·실행
    → 출력 Escape, Lucy 필터, 쿠키 HttpOnly
  • CSRF: 로그인된 사용자에게 원치 않는 요청을 보냄
    → CSRF 토큰, 쿠키 SameSite, Spring Security CSRF

Q6. useEffect 의존성

문제
useEffect 의존성 [] / 없음 / [id] 각각 언제 실행?

  • []: 마운트 시 1번
  • 없음: 매 렌더마다
  • [id]: 마운트 + id 변경 시

Q7. GET으로 상태 변경 금지

문제
GET으로 서버 상태를 바꾸면 안 되는 이유?


GETsafe해야 한다 → 조회만, 상태 변경 X.

브라우저 프리페치·크롤러·캐시가 GET을 자동 호출할 수 있고,
URL/로그에 남아 의도치 않은 변경이 생길 수 있다.

변경은 POST/PUT/PATCH/DELETE.
POST가 무조건 더 보안인 것은 아니고, 메서드 의미가 다르다.

오늘 한 줄 암기

  1. 반복 문자열 = StringBuilder
  2. singleton + 요청별 필드 = 위험
  3. EXPLAIN: type, key
  4. CSRF = 토큰 / SameSite
  5. GET = safe (조회만)

다음 목표

  • GET 금지 이유를 “POST가 더 보안”이 아니라 safe/프리페치로 말하기
  • StringBuilder vs StringBuffer (동기화 유무) 구분