일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- js pattern
- 이벤트
- peerdependencies
- 자바스크립트 패턴
- 프론트엔드 성능 최적화 가이드
- Babel과 Webpack
- package management
- unique identifiers
- 자바스크립트 딥다이브
- 딥다이브
- 브라우저의 렌더링 과정
- 진행기록
- DOM
- 새 코드 받아오기
- pr review
- 자바스크립트
- 올림픽 통계 서비스 최적화
- middleware pattern
- 모던 자바스크립트 Deep Dive
- 학습내용정리
- 커리어
- const
- 블로그 서비스 최적화
- version management
- 제너레이터와 async/await
- mixin pattern
- 프로그래머스
- 스코프
- 이미지 갤러리 최적화
- js pattern
- Today
- Total
Dev Blog
11. Database 본문
1. 왜 database를 사용해야 하는가요?
등장배경: 데이터베이스가 있기 전엔 자료의 크지 않았기에 파일로 등록하였고 파일로만 저장하여도 충분한 결과를 얻을 수 있었습니다. 그러나 데이더가 거대 해짐에 따라 파일로 처리하는데 한계를 이르게 되었고 이러한 데이터를 구조화하여 데이터베이스에 저장하게 되었습니다. 여기에서 구조화란 방대한 데이터를 체계적으로 분류하여 보관할수 있는것 입니다.
Manages large amounts of data
A database stores and manages a large amount of data on a daily basis. This would not be possible using any other tool such as a spreadsheet as they would simply not work.
- Accurate
- A database is pretty accurate as it has all sorts of build in constraints, checks etc. This means that the information available in a database is guaranteed to be correct in most cases.
- Easy to update data
- In a database, it is easy to update data using various Data Manipulation languages (DML) available. One of these languages is SQL.
- Security of data
- Databases have various methods to ensure security of data. There are user logins required before accessing a database and various access specifiers. These allow only authorised users to access the database.
- Data integrity
- This is ensured in databases by using various constraints for data. Data integrity in databases makes sure that the data is accurate and consistent in a database.
- Easy to research data
- It is very easy to access and research data in a database. This is done using Data Query Languages (DQL) which allow searching of any data in the database and performing computations on it.
출처: www.tutorialspoint.com/Why-do-we-need-a-Database
2. SQL vs NoSQL 에 대해 설명해 주세요 어떤 목적으로 어떤 database type이 유리할까요?
1) SQL
'구조화 된 쿼리 언어 (Structured Query Language)'를 말합니다. 따라서 데이터베이스 자체를 나타내는 것이 아니라, 특정 유형의 데이터베이스와 상호 작용하는 데 사용 하는 쿼리 언어입니다.
SQL을 사용하면 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 저장, 수정, 삭제 및 검색 할 수 있습니다.
이러한 관계형 데이터베이스에는 두 가지 주요 특징이 있습니다.
- 데이터는 엄격한 데이터 *스키마(= structure)를 따라 데이터베이스 테이블에 저장됩니다.
- 데이터는 **관계를 통해서 연결된 여러 테이블에 분산됩니다.
*엄격한 스키마
데이터는 테이블(table)에 레코드(record)로 저장되며, 각 테이블에는 명확하게 정의된 구조(structure)-테이블에 들어갈 수있는 데이터와 그렇지 않을 수있는 데이터를 정의하는 필드 집합-가 있습니다. 구조는 필드의 이름과 데이터 유형으로 정의됩니다.
여기서는 스키마를 준수하지 않는 레코드는 추가할 수 없습니다. 더 많은 필드를 얻고 싶다구요? 죄송합니다만 다른 테이블을 선택하셔야 합니다. 일부 필드가 누락 되었다구요? 그래도 이 테이블은 안됩니다!
(예를 들어, 위 테이블에서 새로운 필드를 넣고 싶다면, 스키마를 뜯어고치지 않는한 필드를 추가 할 수 없다는 것을 말합니다.)
**관계
데이터의 중복을 피하기 위해, 데이터들을 여러 테이블로 나누어 저장합니다. 예를들어 Users(사용자), Products(상품), Orders(주문한 상품)의 여러테이블이 존재할 때, 각각의 테이블들은 서로 다른 테이블에 저장되지 않은 데이터 만을 가지고 있습니다.
이런 명확한 구조는 장점이 있습니다. 데이터가 항상 하나의 테이블에서만 관리되기 때문에 잘못된 데이터가 테이블 전체에 복제되어 발생하는 문제가 없습니다.
출처: https://devuna.tistory.com/25 [튜나 개발일기]
2) NoSQL
NoSQL 세계에서는 테이블(table)을 컬렉션(Collection)으로, 레코드(record)를 문서(documents)라고 부릅니다.
그러나 단순히 이름만 다른 것이 아니라, 핵심적인 차이가 있습니다. SQL 세계에서는 정해진 스키마를 따르지 않는다면 데이터를 추가 할 수 없었지만, NoSQL에서는 다른 구조의 데이터를 같은 컬렉션(= SQL에서의 table)에 추가할 수 있습니다.
문서는 약간 JSON 데이터와 비슷한 형태를 가지고 있습니다. 그리고 앞서 연급한것 처럼, 스키마에 대해서는 걱정할 필요가 없습니다.
또한 일반적으로 관련 데이터를 동일한 컬렉션에 넣습니다. 관계형데이터 베이스에서 사용했던 Users나 Products 정보 또한 Orders에 포함해서 한꺼번에 저장했던 것과 달리 주문한 상품이 있는 경우, 관련있는 데이터를 Orders 컬렉션에 저장합니다.
따라서 여러 테이블 / 컬렉션을 조인(join) 할 필요없이 이미 필요한 모든 것을 갖춘 문서를 만들게 됩니다.
실제로 NoSQL 데이터베이스에는 조인이라는 개념이 없습니다.
조인을 하고 싶다면, 수동으로 직접 외래키를 검색하여 사용할 수 있겠지만, 일반적이지 않습니다.
대신 컬렉션마다 데이터를 복제하여 각 컬렉션 일부분에 속하는 데이터를 생성합니다.
데이터 복제의 개념은 처음에는 혼란스러울 수 있습니다. 컬렉션 B에서는 데이터를 수정하지 않았는데, 컬렉션 A에서만 실수로 데이터를 수정하게 될 위험이 있습니다.
특정 데이터를 함께 사용하는 모든 컬렉션에서, 똑같은 데이터 업데이트가 수행되도록 하는 것이 우리의 임무입니다.
그럼에도 불구하고, NoSQL의 가장 큰 장점은 복잡한 조인문으로 작업할 필요가 없다는 것입니다.
필요한 모든 데이터가 이미 저장되어 있기 때문입니다.
NoSQL은 특히 자주 바뀌지 않는 데이터 일때 좋습니다.(데이터 수정작업이 필요없는)
3) [수직적(Vertical) & 수평적(Horizontal) 확장(Scaling)]
두 종류의 데이터베이스를 비교 할 때 살펴 봐야할 또 하나의 중요한 개념은 확장(Scaling)입니다.
데이터베이스를 어떤 방식으로 확장 시킬 수 있을까요? (데이터베이스의 서버의 확장성 말입니다.)
확장은 수직적(vertical) 확장과 수평적(horizontal) 확장으로 구별 할 수 있습니다.
수직적 확장이란 단순히 데이터베이스 서버의 성능을 향상시키는 것입니다. (예를 들어, CPU를 업그레이드 하는 방식으로 말이죠.)
반면에 수평적 확장은 더 많은 서버가 추가되고 데이터베이스가 전체적으로 분산됨을 의미합니다. 따라서 하나의 데이터베이스에서 작동하지만 여러 호스트에서 작동합니다.
데이터가 저장되는 방식 때문에 SQL 데이터베이스는 일반적으로 수직적 확장만을 지원합니다. 수평적 확장은 NoSQL 데이터베이스에서만 가능합니다.
SQL 데이터베이스는 '샤딩(Sharding)'의 개념을 알고 있지만 특정 제한이 있으며 구현하기가 대체로 어렵습니다. NoSQL 데이터베이스는 이를 기본적으로 지원하므로 여러 서버에서 데이터베이스를 쉽게 분리 할 수 있습니다.
[올바른 선택]
앞서서 설명한 것들과 함께 생각해봅시다. 어떤 데이터베이스 솔루션을 사용해야 할까요?
이 질문에 확실한 정답은 없습니다.
SQL과 NoSQL은 모두 훌륭한 솔루션입니다. 두 가지 중 하나의 솔류션을 선택해야 되는 문제에서는 어떤 데이터를 다루는지, 어떤 애플리케이션에서 사용되는지 고려해야합니다.
두 가지 접근 방식의 주요 장점을 요약 해 보겠습니다.
SQL의 장점
- 명확하게 정의 된 스키마, 데이터 무결성 보장
- 관계는 각 데이터를 중복없이 한번만 저장됩니다.
NoSQL의 장점
- 스키마가 없기때문에, 훨씬 더 유연합니다. 즉, 언제든지 저장된 데이터를 조정하고 새로운 "필드"를 추가 할 수 있습니다.
- 데이터는 애플리케이션이 필요로 하는 형식으로 저장됩니다. 이렇게 하면 데이터를 읽어오는 속도가 빨라집니다.
- 수직 및 수평 확장이 가능하므로 데이터베이스가 애플리케이션에서 발생시키는 모든 읽기 / 쓰기 요청을 처리 할 수 있습니다.
그리고 단점은 아래와 같습니다.
SQL의 단점
- 상대적으로 덜 유연합니다. 데이터 스키마는 사전에 계획되고 알려져야 합니다. (나중에 수정하기가 번거롭거나 불가능 할 수 도 있습니다.)
- 관계를 맺고 있기 때문에, JOIN문이 많은 매우 복잡한 쿼리가 만들어 질 수 있습니다.
- 수평적 확장이 어렵고, 대체로 수직적 확장만 가능합니다. 즉 어떤 시점에서 (처리 할 수 있는 처리량과 관련하여) 성장 한계에 직면하게 됩니다.
NoSQL의 단점
- 유연성 때문에, 데이터 구조 결정을 하지 못하고 미루게 될 수 있습니다.
- 데이터 중복은 여러 컬렉션과 문서가 (SQL 세계에서 처럼 하나의 테이블에 하나의 레코드가 아니라) 여러 개의 레코드가 변경된 경우 업데이트를 해야 합니다.
- 데이터가 여러 컬렉션에 중복되어 있기 때문에, 수정(update)를 해야 하는 경우 모든 컬렉션에서 수행해야 함을 의미합니다. (SQL 세계에서는 중복된 데이터가 없기 때문에 한번만 수행하면 됩니다.)
SQL은 언제 사용하는 것이 좋을까요?
- 관계를 맺고 있는 데이터가 자주 변경(수정)되는 애플리케이션일 경우 (NoSQL에서라면 여러 컬렉션을 모두 수정해줘야만 합니다.)
- 변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우
NoSQL은 언제 사용하는 것이 좋을까요?
- 정확한 데이터 구조를 알 수 없거나 변경 / 확장 될 수 있는 경우
- 읽기(read)처리를 자주하지만, 데이터를 자주 변경(update)하지 않는 경우 (즉, 한번의 변경으로 수십 개의 문서를 업데이트 할 필요가 없는 경우)
- 데이터베이스를 수평으로 확장해야 하는 경우 ( 즉, 막대한 양의 데이터를 다뤄야 하는 경우)
분명한 것은 데이터베이스는 다른 방식으로 설계 될 수 있다는 겁니다. NoSQL 데이터베이스를 쓰더라도 설계적으로 언급된 단점들을 완화시킬 수 있습니다. (예를들면 중복된 데이터를 줄이는 방법). SQL 데이터베이스도 마찬가지입니다. 요구사항을 만족시키고, 복잡한 JOIN문을 만들지 않도록 설계할 수 있습니다.
출처: https://devuna.tistory.com/25 [튜나 개발일기]
www.guru99.com/sql-vs-nosql.html(비교)
3. ORM 사용의 장점과 단점은?
ORM 이란?
ORM(Object-relational mapping)이란 객체(클래스)와 관계(관계형 데이터 베이스)와의 설정을 의미 합니다. 객체 지향 프로그래밍은 클래스를 사용하고 관계형 데이터 베이스는 테이블을 사용합니다. 여기서 객체 모델과 관계형 모델간에 불일치가 존재 하는데 이 객체간의 관계를 바탕으로 SQL을 자동 생성하여 불일치를 해결 하는 것이 ORM입니다.
Object <= 매핑 => DB데이터 에서 매핑의 역할을 하는 것이 ORM
😀ORM 장점
- 객체 지향적 코드로 인해 더 직관적이고 비즈니스 로직에 집중할 수 있도록 도와준다.
- CRUD을 위한 긴 SQL 문장을 작성할 필요가 없다. (여전히 쿼리작성은 필요하지만)
- 각 객체(Model)별로 코드를 작성하여 가독성을 높여 준다.
- SQL의 절차적 접근이 아닌 객체적인 접근으로 생산성을 높여 준다.
- 재사용 및 유지보수의 편리성이 증가한다.
- 매핑 정보가 명확하여, ERD를 보는 것에 대한 의존도를 낮출 수 있다.
- ORM은 독립적으로 작성이 되어 있고 해당 객체들은 재사용이 가능 하다.
- DBMS에 대한 종속성이 줄어든다.
- 대부분의 ORM은 DB에 종속적이지 않다.
- 개발자는 Object에 집중함으로 DBMS를 교체하는 극단적인 작업에도 비교적 적은 리스크와 시간이 소요된다.
- 종속적이지 않다는 것은 구현 방법 뿐만 아니라 많은 솔루션에서 자료형 타입까지 유효하다.
🤨ORM 단점
- 완벽한 ORM만으로는 구현하기가 어렵다.
- 사용하기에는 편하지만 설계에는 매우 신중해야 한다.
- 프로젝트의 복잡성이 높아질 경우 난이도 또한 올라갈 수 있다.
- 잘못 구현된 경우 속도 저하 및 심한 경우 일관성이 무너지는 문제점이 생길 수 있다.
- 프로시저가 많은 시스템에서는 ORM의 객체 지향적인 장점을 활용하기 어렵다.
- 이미 프로시저가 많은 시스템에서는 다시 객체로 바꿔하 하며, 그 과정에서 생산성 저하 혹은 리스크가 발생할 수 있다.
(*프로시저: 특정작업을 위한 프로그램의 일부. 함수와 같은 의미)
출처: velog.io/@alskt0419/ORM%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C...-iek4f0o3fg (ORM Framework 도 공부)
4. SQL database 설계에 있어 중요하게 생각하는 점은?
명확한 관계설정
What is good database design?
Certain principles guide the database design process. The first principle is that duplicate information (also called redundant data) is bad, because it wastes space and increases the likelihood of errors and inconsistencies. The second principle is that the correctness and completeness of information is important. If your database contains incorrect information, any reports that pull information from the database will also contain incorrect information. As a result, any decisions you make that are based on those reports will then be misinformed.
A good database design is, therefore, one that:
- Divides your information into subject-based tables to reduce redundant data.
- Provides Access with the information it requires to join the information in the tables together as needed.
- Helps support and ensure the accuracy and integrity of your information.
- Accommodates your data processing and reporting needs.
출처: support.microsoft.com/en-us/office/database-design-basics-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5
데이터베이스 설계 시 고려사항
1. 무결성 : 삽입, 삭제, 갱신 등의 연산 후에도 데이터베이스에 저장된 데이터가 정해진 제약조건을 항상 만족해야함
2. 일관성 : 데이터베이스에 저장된 데이터들 사이나, 특정 질의에 대한 응답이 처음부터 끝까지 변함없이 일정해야함
3. 회복 : 시스템에 장애가 발생했을 떄 장애 발생 직전의 상태로 복구할 수 있어야 함
4. 보안 : 불법적인 데이터의 노출 또는 변경이나 손실로부터 보호할 수 있어야 함
5. 효율성 : 응답시간의 단축, 시스템의 생산성, 저장 공간의 최적화 등이 가능해야함
6. 데이베이스 확장 : 데이터베이스 운영에 영향을 주지 않으면서 지속적으로 데이터를 추가할 수 있어야함
참고: coding-factory.tistory.com/219
5. database indexing이란 무엇이며 왜 하는가요?
Indexing is a way to optimize the performance of a database by minimizing the number of disk accesses required when a query is processed. It is a data structure technique which is used to quickly locate and access the data in a database.
Indexes are created using a few database columns.
- The first column is the Search key that contains a copy of the primary key or candidate key of the table. These values are stored in sorted order so that the corresponding data can be accessed quickly.
Note: The data may or may not be stored in sorted order. - The second column is the Data Reference or Pointer which contains a set of pointers holding the address of the disk block where that particular key value can be found.
출처: www.geeksforgeeks.org/indexing-in-databases-set-1/
6. transaction 이란 무엇이며 언제 사용하는가
트랜잭션(Transaction 이하 트랜잭션)이란, 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다.
데이터베이스의 상태를 변화시킨다는 것은 질의어(SQL)를 이용하여 데이터베이스를 접근 하는 것을 의미한다.
출처: https://mommoo.tistory.com/62 [개발자로 홀로 서기]
7. sql injection 이란 무엇이며 어떻게 막을 수 있을까요?
SQL Injection 이란 악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위 입니다. 인젝션 공격은 OWASP Top10 중 첫 번째에 속해 있으며, 공격이 비교적 쉬운 편이고 공격에 성공할 경우 큰 피해를 입힐 수 있는 공격입니다.
대응방안
1) 입력 값에 대한 검증
SQL Injection 에서 사용되는 기법과 키워드는 엄청나게 많습니다. 사용자의 입력 값에 대한 검증이 필요한데요. 서버 단에서 화이트리스트 기반으로 검증해야 합니다. 블랙리스트 기반으로 검증하게 되면 수많은 차단리스트를 등록해야 하고, 하나라도 빠지면 공격에 성공하게 되기 때문입니다. 공백으로 치환하는 방법도 많이 쓰이는데, 이 방법도 취약한 방법입니다. 예를 들어 공격자가 SESELECTLECT 라고 입력 시 중간의 SELECT가 공백으로 치환이 되면 SELECT 라는 키워드가 완성되게 됩니다. 공백 대신 공격 키워드와는 의미 없는 단어로 치환되어야 합니다.
2) Prepared Statement 구문사용
Prepared Statement 구문을 사용하게 되면, 사용자의 입력 값이 데이터베이스의 파라미터로 들어가기 전에DBMS가 미리 컴파일 하여 실행하지 않고 대기합니다. 그 후 사용자의 입력 값을 문자열로 인식하게 하여 공격쿼리가 들어간다고 하더라도, 사용자의 입력은 이미 의미 없는 단순 문자열 이기 때문에 전체 쿼리문도 공격자의 의도대로 작동하지 않습니다.
3) Error Message 노출 금지
공격자가 SQL Injection을 수행하기 위해서는 데이터베이스의 정보(테이블명, 컬럼명 등)가 필요합니다. 데이터베이스 에러 발생 시 따로 처리를 해주지 않았다면, 에러가 발생한 쿼리문과 함께 에러에 관한 내용을 반환헤 줍니다. 여기서 테이블명 및 컬럼명 그리고 쿼리문이 노출이 될 수 있기 때문에, 데이터 베이스에 대한 오류발생 시 사용자에게 보여줄 수 있는 페이지를 제작 혹은 메시지박스를 띄우도록 하여야 합니다.
4) 웹 방화벽 사용
웹 공격 방어에 특화되어있는 웹 방화벽을 사용하는 것도 하나의 방법입니다. 웹 방화벽은 소프트웨어 형, 하드웨어 형, 프록시 형 이렇게 세가지 종류로 나눌 수 있는데 소프트웨어 형은 서버 내에 직접 설치하는 방법이고, 하드웨어 형은 네트워크 상에서 서버 앞 단에 직접 하드웨어 장비로 구성하는 것이며 마지막으로 프록시 형은 DNS 서버 주소를 웹 방화벽으로 바꾸고 서버로 가는 트래픽이 웹 방화벽을 먼저 거치도록 하는 방법입니다.
8. 사용자의 비밀번호는 어떻게 저장하나요?
- javascript Crypto 라이브러리 활용
- 유저의 비밀번호 정보 유출을 막기 위해 단방향으로 암호화
'Learn then Key points > Tech Interview Questions' 카테고리의 다른 글
개발자 기술 핸드북(네트워크, 운영체제...알고리즘 등) (1) | 2024.12.08 |
---|---|
12. Frontend (0) | 2021.03.29 |
10. Backend (0) | 2021.03.29 |
8. Cloud Infra (0) | 2021.03.29 |
7. Network (0) | 2021.03.29 |