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

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

Q1. Spring Bean 스코프

문제
Spring Bean 기본 스코프는 뭐고, singleton이랑 prototype 차이는?

  • 기본 스코프는 singleton
  • singleton: 컨테이너당 Bean 1개 공유
  • prototype: 가져올 때마다 새 객체 생성

singleton Service에 요청별 상태(currentUserId 필드 등)를 넣으면
여러 요청이 같은 인스턴스를 공유해서 위험하다.

Q2. Checked vs Unchecked Exception

문제
Checked Exception이랑 Unchecked Exception 차이?
@Transactional 기본 롤백이랑 어떻게 연결되는지?

  • Checked: IOException, SQLException 등 — 컴파일러가 처리 강제
  • Unchecked: RuntimeException 계열 — IllegalArgumentException, NPE, 보통의 BusinessException

@Transactional 기본:

  • unchecked → 롤백
  • checked → 롤백 안 함

checked도 롤백하려면
@Transactional(rollbackFor = Exception.class)
(@Rollback 아님)

Q3. MyBatis #{} vs ${}

문제
MyBatis에서 #{}이랑 ${} 차이? 왜 기본은 #{}를 쓰는지?

  • #{}: PreparedStatement 파라미터 바인딩 → SQL Injection 방어에 유리
  • ${}: 문자열 그대로 치환 → 위험

기본은 #{}.
${}는 테이블명·컬럼명·ORDER BY처럼 바인딩이 안 될 때만,
사용자 입력을 직접 넣지 말고 화이트리스트로 제한한다.

Q4. INNER JOIN vs LEFT JOIN

문제
INNER JOIN이랑 LEFT JOIN 차이? 매칭 안 되는 행 기준으로.

  • INNER JOIN: 양쪽 테이블에서 매칭되는 행만 (교집합)
  • LEFT JOIN: 왼쪽 테이블 전부 + 오른쪽이 없으면 NULL

Q5. accessToken / refreshToken

문제
JWT 로그인에서 accessToken이랑 refreshToken을 왜 나누는지?
access는 짧게, refresh는 길게 두는 이유는?


JWT는 탈취되면 만료 전까지 쓰일 수 있다.
그래서 API에 쓰는 accessToken은 짧게 두어 피해 구간을 줄이고,
만료 시 refreshToken으로 access를 재발급한다.

Q6. useEffect 의존성 배열

문제
React useEffect 의존성 배열이 [] / 없음 / [id]일 때 각각 언제 실행되나?

  1. []마운트 시 1번
  2. 없음 → 매 렌더마다
  3. [id] → 마운트 + id 변경 시

Q7. DB 중복 신청 방지

문제
같은 휴가/출퇴근이 동시에 두 번 신청되는 걸 막으려면
앱 클릭 방지 말고 DB에서 쓸 수 있는 방법은?


(user_id, 날짜) 같은 컬럼 조합에 UNIQUE 제약을 건다.
동시 요청이 와도 하나는 중복 키 에러로 막힌다.
(프론트 연속클릭 방지만으론 부족 — DB가 최종 방어선)

오늘 한 줄 암기

  1. Bean 기본 스코프 = singleton / prototype = 매번 새로
  2. @Transactional 기본 롤백 = unchecked만
  3. MyBatis #{} 바인딩 / ${} 치환
  4. access 짧게 + refresh로 재발급
  5. 중복 방지 = UNIQUE 제약