[면접공부] - db (feat.gpt) (3)
- 국비지원 (스파르타)
- 2025. 4. 17. 23:55
오늘은 모의 면접 복기나 해보자.
1. MySQL에서 SQL 쿼리는 어떤 순서로 실행되나요?
2. 커버링 인덱스란 무엇인가요?
3. SQL Injection이란 무엇이고, 어떻게 방지하나요?
4.COUNT(*) vs COUNT(1) vs COUNT(컬럼) vs COUNT(DISTINCT 컬럼)의 차이는?
5. WHERE 컬럼 IS NULL 조건을 주면 인덱스를 탈 수 있을까요?
6. MySQL에서 트랜잭션 격리 수준의 종류와 차이를 설명해주세요.
이렇게 총 6가지 질문을 받았다.
일단 내가 준비한거에서 나오지 않아 굉장히 실망스러웠지만.. 뭐 어쩌겠나 이번에는 그래도 자신있게 말했던거 같다.
다만 횡설수설하게 말하는 경향이 있어서 아직은 조금 부족한감이 있는듯하다.
첫번째 질문같은 경우는
SELECT DISTICT o.state, COUNT(*)
FROM order o
INNER JOIN oder_item oi ON oi.order_id = o.id
WHERE o.created_at BETWEEN '2024-01-01' and '2024-12-31'
GROUP BY o.state
HAVING COUNT(*) > 1000
ORDER BY o.state DESC
LIMIT 1
요기서 어떤식으로 동작하는지 아는지 물어보는 문제였다.
내가 대답은 잘했지만 SELECT랑 Having절을 잘못말했다.ㅜㅜ
이번에 제대로 잡고 가자.크게 보면 FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
순서대로 진행이 된다고 한다. 이를 생각해보면 FROM은 어떤걸 실행을 시켜야 하는지 알아야 하고 JOIN은 조인을 걸었으니까
그다음에는 WHERE 이되겠지.. 그래야 테이블에서 데이터를 가져올수 있으니까 그 다음에는 SELECT문인가 생각할 수 있곘지만
얘네를 그룹화를 해야지. SELECT가 아닌 이유는 얘네가 어떻게 동작하는지도 모르는데 데이터를 조회할 수 없기 때문에 GROUP BY가 나와지게 되어진다. 그리고 생각해보면 이게 FROM절이랑 굉장히 유사하다 데이터 가져오고 조건문쓰고
이것도 똑같이 GROUP 그룹화하고 조건가져오고 이렇게 2번이 반복이 되고 그 다음에 SELECT가 나오게 된다 이렇게 해야 어떤것을 노출을 시킬지 그다음에 정할 수 있기 때문이다. 이건 여담인데 DISTICT 부분을 프로젝션이라고 부른다고 알고 있다. 아마 요기가 먼저 나올게 뻔하다. 그다음이 SELECT고 이제 어떻게 데이터가 나오는지 알았기 때문에 정렬을 하고 최솟값을 구하면 된다.
2번째 질문은 내가 커버링 인덱스가 무엇인지는 정확하게 알고는 있었다. 다만 커버링 인덱스가 복합인덱스라는걸 알고 있었고 이게 어떻게 동작하는지는 알고 있었는데 제대로 답변하지 못했다. 내가 답변한건 카널리티(행,튜플 갯수)가 많은 순서대로 하는거까지는 말했지만, 어느부분에 영향이 있는지는 답변을 못했다. 나는 ORDER BY로만 답변헀지만 곰곰히 생각해보니 WHERE문이랑, 프로젝션 부분도 포함이었다.
3번째 질문은 SQL인젝션의 공격방법에 대해 물어본 질문이었는데 요거 같은 경우 공격자가 개발자의 의도와 상관없이 SQL 쿼리문을 넣어서 공격하는 방식으로 방어 방법은 여러가지가 있지만, 그 중에서 PreparedStatement방법을 넣을 수 있다. 하지만 나는 두리뭉실하게 ORM을 사용하면 막을 수 있다고 했다. 나중에 요 용어가 생각이 안나서 어떤건지 생각이 안나 SQL구문을 바로 작성하는 방법이 아니라 바인딩을 통해 넣으면 SQL 인젝션 공격을 막을 수 있다고 설명했다.
4번째 질문은 COUNT(1)빼고 설명을 잘한 느낌이 든다. 하지만 이것도 횡설수설하게 말을 하는 경향이 있었는데
이번에 제대로 알고 간듯하다. COUNT(1)은 (*)와 효과가 같다고 한다.
마지막 질문은 면접 단골 질문이긴한데 요거는 외워야 한다고 한다.
- READ UNCOMMITTED: 다른 트랜잭션의 미커밋 데이터도 읽음 (Dirty Read 발생 가능)
- READ COMMITTED: 커밋된 데이터만 읽음 (Non-Repeatable Read 발생 가능)
- REPEATABLE READ (기본값): 같은 쿼리 반복 시 항상 같은 결과 (Phantom Read는 갭락으로 방지)
- SERIALIZABLE: 가장 엄격. SELECT 시에도 락 걸림
이렇게 존재하고 위가 가장널널하고 아래로 갈수록 강력해지는 특징을 가지고 있다.
그러면 이게 어떤것들인지 좀더 자세하게 공부해보자.
여기서 오는 이슈들은 다음과 같다.
Dirty Read: 어떤 트랜잭션에서 처리한 작업이 완료되지 않았음에도 다른 트랜잭션을 볼 수 있는 현상
Non-Repeatable Read: 하나의 트랜잭션 내에서 똑같은 select 쿼리를 실행시켰을때 서로 다른 결과를 가져오는 현상
Phantom Read: 다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다 안보였다 하는 현상 (가지고 오는 갯수가 바뀐다)
갭 락(Gap Lock) → 인덱스 사이 공간에 대한 삽입 방지 (팬텀 리드 방지)라고 한다.
'국비지원 (스파르타)' 카테고리의 다른 글
[면접공부] - java, spring (feat.gpt) (1) | 2025.04.23 |
---|---|
[면접공부] - db (feat.gpt) (4) (1) | 2025.04.18 |
[면접공부] - db (feat.gpt) (2) (1) | 2025.04.16 |
[면접공부] - db (feat.gpt) (1) (0) | 2025.04.15 |
[면접공부] 자바 - 면접질문(3) (feat.gpt) (1) | 2025.04.14 |