1. 객체 지향 설계 원칙인 SOLID 원칙에 대해서 설명해주세요. 예시를 들어주세요.
2. 트랜잭션 격리 수준별로 어떠한 문제가 발생할 수 있을까요?
3. 해쉬 테이블은 무엇인가요? 해쉬값이 충돌하면 어떻게 해결할 수 있을까요?
1. 객체 지향 설계 원칙인 SOLID 원칙에 대해서 설명해주세요. 예시를 들어주세요.
1. single responsibility
단일 책임 : 한 클래스는 하나의 책임만 가진다.
하나의 클래스는 하나의 책임만을 진다
말 어려움
class worker 요리하기() 테이블청소하기() 계산하기() 서빙하기() 재료준비() |
역할이 3개임 요리사 홀매니저 캐셔 |
- 테이블이 더럽다. 누구의 책임인가? - 패티가 덜 익혀진 상태로 나왔다면 누구의 책임인가? - 계산에 오류가 발생했다면 누구의 책임인가? - 식자재가 제시간에 들어오지 않았다면 누구의 책임인가? |
홀매니저 요리사 캐셔 |
this.food에 문제가 발생 this.food와 관련된 메서드는 요리하기(), 재료준비() |
Worker클래스가 많은 기능을 담당함 사실상 매장 전체의 책임을 맡고 있다. 예시는 메서드가 2개이므로 충분히 수정할 수 있지만 수백 개의 메서드들이 서너 개의 클래스 내부에 엉켜있다면 개발자는 야근해야 할 수밖에 없다. |
참고: https://webdoli.tistory.com/210
class 회원 가입 기능 아이디 있는지 확인한다() 회원가입시킨다() class 회원 탈퇴 기능 아이디 있는지 확인한다() 회원탈퇴시킨다() 공통적으로 있는 아이디 있는지 확인한다()를 분리한다. 어떻게?? |
이거 개소리 클래스가 무슨 회원가입과 회원 탈퇴로 나뉘냐 객체로 만들어야지 |
class 회원 이름 아이디 비밀번호 주소 회원가입 회원조회 회원탈퇴 회원수정 비밀번호 수정 |
이런식으로 클래스 == 객체 는 회원이다 |
2. Open close
개방 폐쇄 : 소프트웨어는 확장에는 열림, 변경에는 닫힘 -> 다형성, 인터페이스 사용
3.Liskov substitution
리스코브 치환 : 상위 인터페이스를 --> 하위 인스턴스로 바꿀 수 있다
인터페이스 자동차
엑셀()
를 했을때 엑셀()은 앞으로 가야지 뒤로 가면 안된다.
4. Interface sefregation
인터페이스 분리: 하나로 하지말고 인터페이스도 쪼개라
인터페이스도 분리해라
자동차 interface 운전 interface 정비 interface |
사용자 클라이언트 운전자 클라이언트 정비사 클라이언트 |
인터페이스가 명확 대체 가능성이 높아짐 |
5. Dipendency Indifendent
의존 역전 : 추상에 의존해야지 구체에 의존하지마라
2. 트랜잭션 격리 수준별로 어떠한 문제가 발생할 수 있을까요?
트랜잭션
원자성 | 하나의 작업처럼 모두 성공 또는 모두 실패 |
일관성 | 데이터베이스 상태를 유지해야한다. 데이터베이스에서 정한 무결성 제약조건을 항상 만족 무결성: 데이터를 정확하고 일관되게 유지하는 것을 의미합니다. https://iingang.github.io/posts/DB-Integrity-constraint/ 개체의 무결성 [학생] 릴레이션에서 ‘학번’을 기본키로 지정했다면 ‘학번’ 속성은 NULL이 되어서는 안된다 참조무결성 [수강] 릴레이션에서 ‘학번’ 속성에는 [학생] 릴레이션의 ‘학번’ 속성에 없는 값은 입력할 수 없다. 도메인 무결성 ‘성별’이라는 속성에서 ‘남’, ‘여’를 제외한 데이터는 제한되어야 한다. 고유 무결성 [학생] 릴레이션에서 ‘이름’, ‘나이’는 서로 같은 값을 가질 수 있지만 ‘학번’의 경우, 각 튜플은 서로 다른 값을 가져야 한다. Null 무결성 [학생] 릴레이션 정의 시 ‘과목’ 속성에 NULL 값이 올 수 없도록 제한했다면 ‘과목’ 속성에 NULL이 있어서는 안된다. 키 무결성 각 릴레이션은 최소한 한 개 이상의 키가 존재해야 합니다. |
격리성 | 동시에 실행되는 트랜잭션은 서로에게 영향 끼치지 않게 격리 동시에 데이터를 수정하지 못하게 만든다 격리 수준이 나타난다. |
지속성 | 트랜잭션 -> 성공 -> 결과를 기록해야한다 |
트랜잭션 격리 수준
커밋되지 않은 읽기 | 커밋되지 않은 데이터를 읽을 수 있다. 워니(총 재산 10만원)에게 멍지(총 재산 10만원)가 5만원을 보냈는데 멍지가 조회했을 때는 아직 5만원이 안들어온 것 처럼 조회가 될 수 있다. |
커밋된 읽기 | 위에 dirty read 문제를 해결했다. 그러나 조회하고 있는 데이터가 '멍지'였는데 다시 조회했을 때는 데이터가 '지유'로 보일 수 있다. 반복해서 같은 데이터를 읽을 수 없다 non-반복테이블 read 문제가 발생한다. |
반복 가능한 읽기 | 다시 조회했을때도 '멍지' 그대로 조회된다. 그러나 트랜잭션1: 10살 미만의 사람을 조회했을때 5명이었는데 트랜잭션2: 5살 데이터를 추가하면 트랜잭션1: 10살 미만의 사람을 조회했을때 6명으로 변경되어있다. 팬텀 read문제가 발생한다. |
직렬화 가능 | 동시 처리 성능이 급격하게 떨어질 수 있다. |
3. 해쉬 테이블은 무엇인가요? 해쉬값이 충돌하면 어떻게 해결할 수 있을까요?
해시테이블 무엇?
그전에는 무작위적인 빈 순서에 의한 주소값을 가졌다면
중간에 주소값을 해시함수를 통과하기 때문에 input 값에 따라 규칙적인 계산으로 정해진 주소값으로 배정 받는다. 빠르게 찾아갈 수 있다.
- (Key, Value)로 데이터를 저장하는 자료구조 중 하나
- 빠르게 데이터를 검색할 수 있다
해시 테이블이 빠른 검색속도를 제공하는 이유?
- 내부적으로 배열(버킷)을 사용하여 데이터를 저장하기 때문
- 버킷(bucket)이란?
- 해시 테이블은 각각의 Key값에 해시함수를 적용해 배열의 고유한 index를 생성하고, 이 index를 활용해 값을 저장하거나 검색하게 된다. 여기서 실제 값이 저장되는 장소를 버킷 또는 슬롯이라고 한다.(주소 값)
해시값이 충돌하면 어떻게 해결하냐?
충돌이 일어나는 경우는 서로 다른 키를 넣었는데
해시함수를 통과한 값이 동일한 값으로 나온것이다. (버킷, 슬롯, 주소)로 겹치게 되는 상황이다.
1. 분리 연결법
겹쳤어? 그럼 다른 메모리에 넣고 주소를 연결해서 리스트처럼 줄줄이 소세지!
단점: 몇개 없을때 줄줄이 소세지 괜찮지만, 많으면 데이터 찾을 때 느려지겠지.
2.개방 주소법
추가적인 메모리를 사용하는 Chaining 방식과 다르게 비어있는 해시 테이블의 공간을 활용하는 방법이다.
일정한 숫자 간격으로 비어있는 버킷에 저장한다.