TIL 240126

hyeo71·2024년 1월 26일
0

2024 내배캠 AI 트랙

목록 보기
16/108

오늘 공부

  • 웹개발 종합반 4주차
  • SQL 101~105

Firebase

구글이 개발한 모바일 및 웹 애플리케이션 개발 플랫폼, 백엔드 인프라를 구축하거나 관리하는 복잡한 작업 없이 핵심 기능에 집중할 수 있도록 해줌

  1. 프로젝트 생성(약관 체크, 애널리틱스 사용 설정 해제)
  2. 웹 선택
  3. 앱 닉네임 입력, 앱 등록
  4. Firbase SDK script 태그 사용(복사) - 복사 안해도 나중에 확인 가능

해당 강의에선 Firebase의 Firestore DB 사용

Firestore

구글의 클라우드 기반 NoSQL DB

  • 컬렉션(Collection)
    여러 개의 문서(Doc)들이 특정한 주제 또는 유형으로 그룹화, RDB에 비교하면 Table?
  • 문서(Document)
    하나의 문서는 여러 개의 필드(Field)로 구성, RDB에 비교하면 row(record, tuple)과 비슷한 의미인 듯
  • 필드(Field)
    문서 안에 있는 데이터의 작은 부분, 정보의 한 조각, 데이터베이스 시스템에서 처리의 최소단위가 되는 것, key-value 쌍의 데이터, RDB의 용어와 동일
  1. 빌드-Firestore Database 항목 선택
  2. 데이터베이스 만들기
  3. 위치-서울-프로덕션 모드
  4. 규칙 항목 수정하기(allow read, write false->true로 변경, 게시)

사용할 html파일 script 태그에 코드 입력(script 태그에 type="module"입력)

type="module"을 사용하면 onclick 메소드가 작동하지 않는다.

// Firebase SDK 라이브러리 가져오기
import { initializeApp } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-app.js";
import { getFirestore } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-firestore.js";
import { collection, addDoc } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-firestore.js";
import { getDocs } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-firestore.js";

// Firebase 구성 정보 설정
const firebaseConfig = {
	(Firebase 4번에서 복사한 SDK) //프로젝트 설정에서 확인 가능
};

// Firebase 인스턴스 초기화
const app = initializeApp(firebaseConfig);
const db = getFirestore(app);

DB에 데이터 추가하기(addDoc)

$("#id").click(async function () {
    let doc = {};
    await addDoc(collection(db, "콜렉션이름"), doc);
})

화면 새로고침

  • window.location.reload()
    데이터를 추가하여 바로 화면에서 변화가 일어나도록 개발을 한다면 화면 새로고침을 통해 업데이트된 데이터를 가져올 수 있다.

DB에서 데이터 가져오기(getDocs)

let docs = await getDocs(collection(db, "콜렉션이름"));
docs.forEach((doc) => {
    let row = doc.data();
    console.log(row);
}); 

101번

SQL 101번은 문제오류가 있다고 생각한다.
해당 문제는 판매된 모든 제품의 첫 해 에 대한 제품 ID , 연도 , 수량 및 가격을 출력하는 것인데 각 제품은 동일 년도에 복수번의 tuple이 존재할 수 있다는 경우를 생각하지 않아 정답 코드가 첫 해에 대한 tuple들을 출력하기만 하면 되는 코드였다. 실제로는 아래 코드처럼 첫 해에 대한 수량과 가격의 합으로 출력이 되어야 한다고 생각한다.

with first_year as (
    select product_id, min(year)
    from sales
    group by product_id
)

select product_id, year first_year, sum(quantity) quantity, sum(price) price
from sales
where (product_id, year) in (select * from first_year)
group by 1, 2

104번

문제는 어렵지 않지만 null값에 대한 처리를 알 수 있는 문제였다.

select num
from mynumbers
group by 1
having count(1)=1
order by 1 desc
limit 1

단일 숫자가 없을 경우 null값을 출력해야 하는데 위의 코드는 단일 숫자가 없다면 select에서 선택할 값 자체가 없기 때문에 null값을 출력할 수 없다.(null값도 값이긴 함)

with single as (
    select num
    from mynumbers
    group by 1
    having count(1)=1   
)
select max(num) num
from single

따라서 위와 같이 코드를 수정하였는데 max함수는 계산값에 대한 결과가 있어야 하기 때문에 null값을 출력할 수 있다.


SQL 101~105

0개의 댓글