1. Java & Spring (동작 원리와 함정)






HashMap의 Key로 Member 객체를 사용하여 데이터를 넣었습니다. 이후 Member 객체의 필드 값을 변경했더니, map.get(member)로 조회해도 데이터가 null이 나옵니다.


Q1. 데이터가 삭제된 것도 아닌데 왜 조회가 안 되는 걸까요?






싱글톤인 OrderService 내부에서 @Scope("prototype")인 Cart 빈을 주입받아 사용 중입니다. 요청마다 새로운 장바구니가 생성되길 기대했으나, 실제로는 하나의 객체만 계속 공유되고 있습니다.


Q2. 프로토타입으로 설정했는데 왜 객체가 새로 생성되지 않을까요?






@Transactional 메서드 안에서 로직을 수행하다가 IOException(Checked Exception)이 발생했습니다. 그런데 DB 데이터는 롤백되지 않고 그대로 커밋되었습니다.


Q3. 예외가 터졌는데도 롤백되지 않은 기술적 이유는 무엇인가요?







Spring Security의 Filter 단계에서 인증 예외를 던졌는데, @RestControllerAdvice가 이 예외를 잡지 못하고 500 에러(혹은 톰캣 에러 페이지)가 떴습니다.


Q4. 전역 예외 처리기가 작동하지 않은 이유는 무엇인가요?





2. JPA & Database (성능 최적화)





JPA에서 @Modifying 쿼리로 '모든 회원의 나이를 +1' 업데이트했습니다. 직후 같은 트랜잭션에서 회원을 조회했더니 나이가 그대로였습니다.


Q5. DB는 업데이트되었는데 조회된 엔티티는 왜 그대로일까요?






대량의 데이터를 넣기 위해 JDBC Batch 설정을 켰습니다. 하지만 PK 전략이 IDENTITY(AU1TO_INCREMENT)인 엔티티는 배치가 작동하지 않고 한 건씩 INSERT 되었습니다.


Q6. IDENTITY 전략에서 Batch Insert가 안 되는 기술적 이유는 무엇인가요?





문자열(VARCHAR)로 된 phone_number 컬럼에 인덱스가 있습니다. 그런데 WHERE phone_number = 01012345678 (숫자)로 조회하니 풀 스캔(Full Scan)이 발생했습니다.


Q7. 인덱스를 타지 않은 결정적인 이유는 무엇인가요?





게시판 페이지가 뒤로 갈수록(10,000페이지) 조회 속도가 현저히 느려집니다. 쿼리는 LIMIT 100000, 10 입니다.


Q8. 속도 저하의 원인과 해결책인 'No-Offset' 방식의 원리는 무엇인가요?




3. 운영 & 아키텍처 (안정성)




디버깅을 위해 코드 곳곳에 System.out.println을 찍어서 배포했습니다. 트래픽이 몰리자 서버 CPU가 치솟고 멈춰버렸습니다.


Q9. 단순히 콘솔에 출력했을 뿐인데 왜 성능에 치명적인가요?





API 요청 로그를 남기기 위해 인터셉터에서 request.getInputStream()을 읽었습니다. 이후 컨트롤러에서 'Stream closed' 에러가 발생하며 본문을 읽을 수 없었습니다.


Q10. 이 문제를 해결하기 위해 어떤 처리가 필요한가요?