240423 TIL firebase, 배포, javascript

웅웅·2024년 4월 23일

TIL 웹개발

목록 보기
6/23

오늘은 웹개발 전반에 대한 기초 강의를 끝마치며 firebase를 다시 한 번 실습하고 배포까지 해보았다. 또 javascript 학습을 시작하였다.

1. firebase

지난 번과 마찬가지로 파이어베이스를 연결하고, 연결된 DB에서 데이터를 넣고 뺄 수 있도록 코드를 작성하였다. addDoc과 getDoc을 사용하여 데이터를 활용하였다. 아래는 파이어베이스 정보를 제외한 코드 전문이다.
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>내플릭스</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
    <style>
        @import url('https://fonts.googleapis.com/css2?family=Black+And+White+Picture&display=swap');

        * {
            font-family: "Black And White Picture", system-ui;
            font-style: normal;
            font-weight: 400;
        }

        .main {
            color: white;
            background-image: url('https://occ-0-1123-1217.1.nflxso.net/dnm/api/v6/6AYY37jfdO6hpXcMjf9Yu5cnmO0/AAAABeIfo7VL_VDyKnljV66IkR-4XLb6xpZqhpLSo3JUtbivnEW4s60PD27muH1mdaANM_8rGpgbm6L2oDgA_iELHZLZ2IQjG5lvp5d2.jpg?r=e6e.jpg');
            background-position: center;
            background-size: cover;
        }

        body {
            background-color: black;
        }

        .mycards {
            width: 1200px;
            margin: 20px auto 20px auto;
        }

        .mypostingbox {
            width: 500px;
            margin: 20px auto 20px auto;
            border: 1px solid white;
            padding: 20px;
            border-radius: 5px;
        }

        .form-floating>input {
            background-color: transparent;
            color: white;
        }

        .form-floating>label {
            color: white;
        }

        .input-group>label {
            background-color: transparent;
            color: white;
        }

        .mypostingbox>button {
            width: 100%;
        }
    </style>
    <script type="module">
        // Firebase SDK 라이브러리 가져오기
       

        // For Firebase JS SDK v7.20.0 and later, measurementId is optional
        
        // Firebase 인스턴스 초기화
        

        $("#hostingbtn").click(async function () {
            let image = $('#image').val();
            let title = $('#title').val();
            let star = $('#star').val();
            let comment = $('#comment').val();
            let doc = {
                'image': image,
                'title': title,
                'star': star,
                'comment': comment
            };
            await addDoc(collection(db, "movies"), doc);
            alert('저장 완료')
            window.location.reload()

        })

        $("#savebtn").click(async function () {
            $('#postingbox').toggle();
        })

        let url = "http://spartacodingclub.shop/sparta_api/weather/seoul";
        fetch(url).then(res => res.json()).then(data => {
            let temp = data['temp']
            if (temp > 20) {
                $('#msg_t').text('더워요')
            } else {
                $('#msg_t').text('추워요')
            }
        })

        let docs = await getDocs(collection(db, "movies"));
        docs.forEach((doc) => {
            let row = doc.data();

            let image = row['image']
            let title = row['title']
            let star = row['star']
            let comment = row['comment']

            let temp_html = `<div class="col">
                <div class="card h-100">
                    <img src="${image}"
                        class="card-img-top" alt="...">
                    <div class="card-body">
                        <h5 class="card-title">${title}</h5>
                        <p class="card-text">${star}</p>
                        <p class="card-text">${comment}</p>
                    </div>
                </div>
            </div>`;

            $('#card').append(temp_html);
        });
    </script>
</head>

<body>
    <header class="p-3 text-bg-dark">
        <div class="container">
            <div class="d-flex flex-wrap align-items-center justify-content-center justify-content-lg-start">
                <a href="/" class="d-flex align-items-center mb-2 mb-lg-0 text-white text-decoration-none">
                    <svg class="bi me-2" width="40" height="32" role="img" aria-label="Bootstrap">
                        <use xlink:href="#bootstrap"></use>
                    </svg>
                </a>

                <ul class="nav col-12 col-lg-auto me-lg-auto mb-2 justify-content-center mb-md-0">
                    <li><a href="#" class="nav-link px-2 text-danger">myflix</a></li>
                    <li><a href="#" class="nav-link px-2 text-white"></a></li>
                    <li><a href="#" class="nav-link px-2 text-white">시리즈</a></li>
                    <li><a href="#" class="nav-link px-2 text-white">영화</a></li>
                    <li><a href="#" class="nav-link px-2 text-white">내가 찜한 콘텐츠</a></li>
                    <li><a href="#" class="nav-link px-2 text-white">현재 기온 : <span id="msg_t"></span></a></li>
                </ul>

                <form class="col-12 col-lg-auto mb-3 mb-lg-0 me-lg-3" role="search">
                    <input type="search" class="form-control form-control-dark text-bg-dark" placeholder="Search..."
                        aria-label="Search">
                </form>

                <div class="text-end">
                    <button type="button" class="btn btn-outline-light me-2">Login</button>
                    <button type="button" class="btn btn-danger">Sign-up</button>
                </div>
            </div>
        </div>
    </header>
    <div class="main">
        <div class="p-5 mb-4 bg-body-tertiary rounded-3">
            <div class="container-fluid py-5">
                <h1 class="display-5 fw-bold">킹덤</h1>
                <p class="col-md-8 fs-4">병든 왕을 둘러싸고 흉흉한 소문이 떠돈다. 어둠에 뒤덮인 조선, 기이한 역병에 신음하는 산하. 정체 모를 악에 맞서 백성을 구원할 희망은 오직
                    세자뿐이다.</p>
                <button id="savebtn" class="btn btn-outline-light" type="button">영화 기록하기</button>
                <button class="btn btn-outline-light" type="button">상세정보</button>
            </div>
        </div>
    </div>
    <div class="mypostingbox" id="postingbox">
        <div class="form-floating mb-3">
            <input type="email" class="form-control" id="image" placeholder="앨범 이미지">
            <label for="floatingInput">영화 이미지 주소</label>
        </div>
        <div class="form-floating mb-3">
            <input type="email" class="form-control" id="title" placeholder="영화 제목">
            <label for="floatingInput">영화 제목</label>
        </div>
        <div class="input-group mb-3">
            <label class="input-group-text" for="inputGroupSelect01">별점</label>
            <select class="form-select" id="star">
                <option selected>별점 선택</option>
                <option value=""></option>
                <option value="⭐⭐">⭐⭐</option>
                <option value="⭐⭐⭐">⭐⭐⭐</option>
                <option value="⭐⭐⭐⭐">⭐⭐⭐⭐</option>
                <option value="⭐⭐⭐⭐⭐">⭐⭐⭐⭐⭐</option>
            </select>
        </div>
        <div class="form-floating mb-3">
            <input type="email" class="form-control" id="comment" placeholder="추천 이유">
            <label for="floatingInput">추천 이유</label>
        </div>
        <button id="hostingbtn" class="btn btn-danger" type="button">기록하기</button>
    </div>
    <div class="mycards">
        <div id="card" class="row row-cols-1 row-cols-md-4 g-4">
        </div>
    </div>

</body>

</html>

onClick을 click으로 대체하고 각 id를 부여하여 사용하였다. 실제로 입력 후 기록하기 버튼을 누르면 DB로 저장되고 로드되어 아래 카드에 추가된다.

2. 배포

위의 실습 결과물을 github의 Pages를 사용하여 배포해주었다.

영화 후기 기록 사이트

3. javascript 언어의 특징

개요와 같은 느낌으로 기본 문법을 시작하기 전에 js 언어의 특징을 정리해보았다.

(1) 객체 지향 프로그래밍
절차 지향이 아닌 객체 지향 프로그래밍 언어이다.

(2) 동적 타이핑
변수의 타입을 미리 할당하지 않고 런타임 시점에 변수의 타입을 할당한다.

(3) 함수형 프로그래밍
함수를 객체로 취금하고 고차 함수를 지원한다. 코드의 재사용성과 가독성을 높일 수 있다.

(4) 비동기 처리
작업을 병렬로 처리한다.

(5) 사용 가능 분야
백엔드, 프론트엔드, DB 웹 개발 전반에 걸쳐 활용할 수 있다.

0개의 댓글