문제

\    /\
 )  ( ')
(  /  )
 \(__)|

 

고양이를 출력하자

 

 

과정

  • 출력문에 각 줄을 삽입해서 출력
  • 백슬래시는 이스케이프 시퀀스를 통해 출력

2025.02.22 - [개발 지식] - 이스케이프 시퀀스

 

이스케이프 시퀀스

이스케이프 시퀀스문자열 내에서 특수한 동작이나 문자를 나타내기 위해 사용하는 백슬래시(\)로 시작하는 문자 조합주로 출력하기 어려운 문자(예: 줄 바꿈, 탭, 따옴표 등)를 나타내거나 특수

go-getter1kim.tistory.com

 

 

결과물

 

이스케이프 시퀀스

문자열 내에서 특수한 동작이나 문자를 나타내기 위해 사용하는 백슬래시(\)로 시작하는 문자 조합

주로 출력하기 어려운 문자(예: 줄 바꿈, 탭, 따옴표 등)를 나타내거나 특수한 제어 동작을 지시할 때 사용

 

이스케이프 시퀀스 의미
`\n` 줄 바꿈 (Line Feed, LF)
`\t` 수평 탭
`\'` 작은 따옴표
`\"` 큰 따옴표
`\\` 백슬래시
`\r` 캐리지 리턴 ( `Hello\rWorld` -> WorldHello )
`\b` 백스페이스 ( `abc\b` -> ab )
`\f` 폼 피드 (프린터 명령에서 주로 사용)
`\v` 수직 탭 (거의 사용 X)
`\0` 널 문자 (문자열의 끝)

'TIL' 카테고리의 다른 글

웹서버 애플리케이션 관점에서의 Thread Pool  (0) 2025.03.21
NullPointerException(NPE) 런타임 에러  (1) 2025.03.11
JVM 메모리 구조  (0) 2025.02.25
NumberFormat 런타임 에러  (0) 2025.02.21
InputMismatch 런타임 에러  (0) 2025.02.21

부트스트랩 코드를 제외하고 다시 복기할만한 코드들을 작성해보자!

파일 구조

DotoriWebpage

  • css
    • dailyScrum.css
    • hobby.css
    • index.css
  • img
  • js
    • dailyScrum.js
    • hobby.js
    • index.js
  • dailyScrum.html
  • hobby.html
  • index.html
  • team-cj.html
  • team-gh.html
  • team-sy.html

코드 정리

📄 index.html

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/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">
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js"
    integrity="sha384-0pUGZvbkm6XF6gxjEnlmuGrJXVbNuzT9qBBavbLwCsOGabYfZo0T0to5eqruptLy"
    crossorigin="anonymous"></script>
  • jquery, bootstrap을 사용하기 위한 코드

 

  <link rel="stylesheet" href="./css/index.css">
  • `<link>`
    • HTML 문서에 외부 리소스(ex. CSS 파일, 폰트, 아이콘)를 연결할 때 사용
    • 이 태그는 빈 요소로, 닫는 태그가 필요 없음
    • 다른 페이지로 이동할 수 있는 <a> 태그와 혼동하지 않기
  • `rel="stylesheet"`
    • 연결된 파일이 스타일시트(CSS 파일)라는 것을 명시
  • `href="./css/index.css"`
    • 연결할 CSS 파일의 경로를 지정

 

 <script type="module" src="./js/index.js"></script>
  • 모듈(Module) 방식의 자바스크립트 파일을 HTML에 연결

 

<a class="nav-link" href="#">메인 페이지</a>
  • 다른 페이지로 이동하도록 연결해주는 `<a>`
  • `href="#"`로 설정하면 현재 페이지의 최상단으로 이동
    • 주로 임시 링크자바스크립트 이벤트 핸들러에 사용
  • 기본 동작을 방지하려면 속성에 `event.preventDefault()` 추가
    • 링크, 폼, 드래그 앤 드롭에서 주로 사용 (새로고침 방지, 입력폼 제출 방지, 드래그 방지)

📄 index.css

/* 헤더 네비바 */
a:link, a:visited {
    text-decoration: none;
    color: inherit;
}
  • 링크(`<a>`)의 기본 스타일을 제거하고, 텍스트 색상을 상속받도록 설정하는 역할
  • `a:link`
    • 아직 방문하지 않은 링크
  • `a:visited`
    • 이미 방문한 링크에 적용됩니다.
    • 기본적으로 방문한 링크는 보라색으로 표시되지만, 이 스타일을 사용하면 해당 색상을 제거

 

border-radius: 40px; /*요소의 모서리를 둥글게 만들어주는 코드*/
display: inline-block; /*요소의 크기가 콘텐츠(텍스트) 크기만큼만 확장*/
  • `border-radius: 0;` → 직사각형
  • `border-radius: 10px;` → 살짝 둥근 사각형
  • `border-radius: 50%;` → 완벽한 원 (가로, 세로 길이가 같을 때)

 

2025.02.18 - [트러블 슈팅] - [CSS] 요소 가운데 정렬 불가 이슈

 

[CSS] 요소 가운데 정렬 불가 이슈

목적위 사진과 같이 3개의 토글이 웹페이지 가운데에 정렬되는 것문제 상황부트스트랩을 통해 가져온 3개의 토글 버튼이 웹페이지 왼쪽에 붙은 상태로, 위치가 변경되지 않는 이슈 발생 시도1.

go-getter1kim.tistory.com

 


 

📄 index.js

$("#addCommentBtn").click(async function () {
    let name = $('#name').val();
    let content = $('#content').val();
    let customId = Date.now().toString();
    const docRef = doc(db, "Dotori", customId);
    await setDoc(docRef, {
        id: customId,
        name: name,
        coment: content
    });
    window.location.reload();
})
  • `doc(db, "collection", id);`
    • `doc()` : Firestore에서 문서를 참조하는 함수로, 세 가지 인자 존재
    • `db` : Firebase Firestore 데이터베이스 인스턴스
    • `"collection"` : 이 컬렉션에서 문서 조회
    • `id` : 해당 문서의 문서 ID

 

$(document).on("click", "#guestDelete", async function () {
    let id = $(this).parent().parent().attr("id");
    $(document).on("click", "#deleteCommentBtn", async function () {
        const docRef = doc(db, "Dotori", id);
        await deleteDoc(docRef);
        window.location.reload();
    })
})
  • `$(document).on("click", "#guestDelete", async function () {...})`
    • `#guestDelete` 버튼 클릭 시 실행되는 이벤트 리스너
    • 이벤트 위임 방식을 사용하고 있어서, 나중에 동적으로 추가된 `#guestDelete` 버튼에도 이벤트 바인딩 

 

2025.02.19 - [프로젝트/팀 프로젝트] - [팀 도토리#2] bootstrap을 활용하여 모달(Modal) 만들기

 

[팀 도토리#2] bootstrap을 활용하여 모달(Modal) 만들기

Step 1. bootstrap에서 원하는 모달 코드 가져오기 Step 1-1. 상단 Button trigger modal 코드에서 필요한 속성값 가져와서 태그에 삽입 data-bs-toggle="modal"토글이란 두 가지 상태를 번갈아가며 전환하는 동작m

go-getter1kim.tistory.com

 


 

📄 hobby.js

$(document).on("click", "#hobbyDelete", async function () {
    let id = $(this).parent().parent().data("value").toString();
    const docRef = doc(db, "Dotorihobby", id);
    await deleteDoc(docRef);
    window.location.reload();
})
  • `let id = $(this).parent().parent().data("value").toString();`
    • 데이터의 value값을 가져오는 과정에서 JS가 문자열로 저장되어있던 값을 정수로 변환하여 가져오는 상황 발생
    • `toString()` 함수로 값을 다시 문자열로 변환

 


 

📄 dailyScrum.js

fetch API로 데이터 요청

export async function fetchData() {
    // 1. 네트워크 요청 보내기
    const response = await fetch(`db_url`, {
        method: "GET",  // HTTP 메서드: GET 요청
        headers: {
            "Content-Type": "application/json"  // JSON 형식으로 데이터 요청
        }
    });

    // 2. 응답 상태 코드 검사
    if (!response.ok) {  // 응답이 성공적이지 않은 경우 (예: 404, 500 에러)
        throw new Error("데이터를 불러오는데 실패했습니다.");  // 에러 발생
    }

    // 3. JSON 데이터 파싱
    const data = await response.json();  // JSON 형식으로 변환
    return data;  // 데이터를 반환
}
  •  
  • `"Content-Type": "application/json"`
    • 클라이언트(브라우저)가 서버에 데이터를 보낼 때, "나는 이 데이터를 JSON 형식으로 보내겠다" 라고 명시
  • `const data = await response.json();`
    • 서버가 응답을 보낼 때, 그 응답의 본문(body)은 기본적으로 텍스트(String) 형태로 전달 됨
    • response.json()은 이 응답 본문을 JavaScript 객체로 변환
    • 이 작업을 하지 않으면 응답 데이터를 직접 처리할 수 없음

 

fetch API로 요청한 데이터 처리

const data = await fetchData();  // fetchData 호출로 비동기 데이터 요청

if (data.documents) {  // 문서가 존재하는지 확인
    data.documents.forEach(doc => {  // 각 문서에 대해 반복
        const fields = doc.fields;  // 해당 문서의 필드 추출

        // 각 필드의 값 추출
        let teamAim = fields.teamAim.stringValue;
        let ghGoal = fields.ghGoal.stringValue;
        let cjGoal = fields.cjGoal.stringValue;
        let syGoal = fields.syGoal.stringValue;

        // 문서 ID 추출 (Firestore에서 자동 생성된 문서 ID 가져오기)
        let id = doc.name.split("/").pop();

        // 날짜 값 (존재 여부에 따라 값 설정)
        let date = fields.date?.stringValue;

        // 체크 상태 값 추출
        let ghcheck = fields.ghcheck.stringValue;
        let cjcheck = fields.cjcheck.stringValue;
        let sycheck = fields.sycheck.stringValue;
    });
}
  • `fields.date?.stringValue`
    • 옵셔널 체이닝(?.)을 사용하면 date 필드가 없을 경우 에러가 발생하지 않고 undefined 반환
  • firestore의 응답 구조 👇
{
  "documents": [
    {
      "name": "projects/{project-id}/databases/(default)/documents/CollectionName/documentID",
      "fields": {
        "teamAim": { "stringValue": "팀 목표" },
        "ghGoal": { "stringValue": "GH의 목표" },
        "cjGoal": { "stringValue": "CJ의 목표" },
        "syGoal": { "stringValue": "SY의 목표" },
        "date": { "stringValue": "2025-02-23" },
        "ghcheck": { "stringValue": "완료" },
        "cjcheck": { "stringValue": "미완료" },
        "sycheck": { "stringValue": "완료" }
      }
    }
  ]
}

 

 

fetch API 로 데이터 추가(전송)

fetch("https://api.example.com/data", {
    method: "POST",
    headers: {
        "Content-Type": "application/json"
        "x-goog-api-key": "firestore apikey"
    },
    body: JSON.stringify({ 
    		teamAim: { stringValue: $('#teamAim').val() }, 
		ghGoal: { stringValue: $('#ghGoal').val() },
		cjGoal: { stringValue: $('#cjGoal').val() },
		syGoal: { stringValue: $('#syGoal').val() },
		id: { stringValue: Date.now().toString() }, //지정한 ID 값
		date: { stringValue: getTodayDate() },
		ghcheck: { stringValue: " " },
		cjcheck: { stringValue: " " },
		sycheck: { stringValue: " " }
    })
});

 

 

fetch API로 데이터 삭제

fetch(`db_url/${id}`, {
                method: "DELETE",
                headers: {
                    "x-goog-api-key": `firestore apikey`
                }
            })

 

 

fetch API로 데이터 수정(업데이트)

fetch(`db_url/${id}?` +
    `updateMask.fieldPaths=date&updateMask.fieldPaths=teamAim&updateMask.fieldPaths=ghGoal&` +
    `updateMask.fieldPaths=cjGoal&updateMask.fieldPaths=syGoal&updateMask.fieldPaths=ghcheck&` +
    `updateMask.fieldPaths=cjcheck&updateMask.fieldPaths=sycheck`,
    method: "PATCH",
    headers: {
        "x-goog-api-key": `firestore apikey`,
        "Content-Type": "application/json"
    }

)
  • `db_url/${id}`
    • Firestore 문서의 고유 URL
    • ${id}는 해당 문서의 고유 ID를 의미
  • `updateMask.fieldPaths`
    • 전체 문서를 덮어쓰지 않고, 명시한 필드만 업데이트하기 위해 사용
    • 예: updateMask.fieldPaths=ghGoal → ghGoal 필드만 업데이트
  • `method: "PATCH"`
    → Firestore에서 일부 필드만 업데이트할 때 사용하는 HTTP 메서드
    → PUT은 전체 데이터를 덮어쓰지만, PATCH는 변경된 부분만 업데이트

백준 11382번

 

문제

첫 번째 줄에 A, B, C (1 ≤ A, B, C ≤ 1012)이 공백을 사이에 두고 주어질 때, A+B+C의 값을 출력하자

 

입력

77 77 7777

 

출력

7931

 


과정

  • 런타임 에러 발생

2025.02.20 - [트러블 슈팅] - [Java] 런타임 에러(InputMismatch, NumberFormat) 이슈

 

[Java] 런타임 에러(InputMismatch, NumberFormat) 이슈

목적한 줄에 정수 3개를 공백을 두고 입력받아, 총 합 계산문제 vscode로 실행하면 결과물이 잘 출력되지만, 백준에 제출했을 때 런타임 에러 InputMismatch 발생 https://go-getter1kim.tistory.com/36 런타임

go-getter1kim.tistory.com

 

  • 결과적으로 사용한 해결 방법 
    1. 문자열 타입 변수에 한 줄로 입력받아 저장
    2. split() 함수를 사용하여 공백을 기준으로 입력값을 분리해서 배열에 저장
    3. for-each 반복문으로 배열의 크기만큼 반복 진행
      • 반복문 내부에서 배열의 각 인덱스 값을 long으로 형변환
      • 각 인덱스 값을 sum에 누적 합산
    4. 결과값 출력

 

결과

NumberFormat 런타임 에러 주요 원인

  • 주로 문자열을 숫자로 변경할 때 발생하는 에러

 

1. 숫자가 아닌 문자열 변환 시도

  • 숫자로 변환할 수 없는 문자열을 Integer.parseInt() 또는 Double.parseDouble()로 변환하려고 할 때 발생
String str = "abc";
int number = Integer.parseInt(str);  // NumberFormatException 발생

 

 

2. 빈 문자열 (Empty String) 변환 시도

  • 빈 문자열을 숫자로 변환하려고 하면 예외 발생
String str = "";
int number = Integer.parseInt(str);  // NumberFormatException 발생

 

 

3. 잘못된 형식의 숫자 문자열

  • 숫자 형식이 잘못된 경우 (공백, 특수문자, 잘못된 기호 등)
String str = "12.34";  // 실수형인데 정수로 변환 시도
int number = Integer.parseInt(str);  // NumberFormatException 발생

 

 

4. 숫자의 범위를 초과한 값

  • Integer나 Long 범위를 초과하는 값을 파싱할 때 발생
String str = "999999999999999999999";  // 너무 큰 숫자
int number = Integer.parseInt(str);  // NumberFormatException 발생

'TIL' 카테고리의 다른 글

웹서버 애플리케이션 관점에서의 Thread Pool  (0) 2025.03.21
NullPointerException(NPE) 런타임 에러  (1) 2025.03.11
JVM 메모리 구조  (0) 2025.02.25
이스케이프 시퀀스  (0) 2025.02.22
InputMismatch 런타임 에러  (0) 2025.02.21

InputMismatch 런타임 에러 주요 원인

1. 잘못된 데이터 형식 입력

  • 예: nextInt()로 정수를 기대하는데 사용자가 문자열 입력
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();  // 여기서 "abc" 입력 시 오류 발생

 

 

2. 입력 구분자 문제 (Delimiter Issue)

  • Scanner는 기본적으로 공백(스페이스, 탭, 줄바꿈) 기준으로 입력을 구분하지만, 다른 구분자를 사용하는 경우 이를 명시적으로 설정해야 함.
Scanner scanner = new Scanner(System.in);
scanner.useDelimiter(",");  // 쉼표(,)로 구분
int number = scanner.nextInt();  // 쉼표 없는 입력 시 오류

 

 

3. 줄바꿈 문자 처리 문제

  • nextLine()과 nextInt() 같은 메서드를 섞어 사용할 때, 입력 버퍼에 남아 있는 줄바꿈 문자가 처리되지 않아 문제가 발생할 수 있음.
int number = scanner.nextInt();
scanner.nextLine();  // 버퍼 비우기
String text = scanner.nextLine();  // 정상 입력 처리

 

4. 로케일 설정 문제 (Locale Issue)

  • 소수점 구분자가 ,(쉼표)인 경우 (일부 국가 설정에서는 쉼표 사용)
Scanner scanner = new Scanner(System.in);
scanner.useLocale(Locale.US);  // 소수점으로 '.' 사용
double number = scanner.nextDouble();

 

'TIL' 카테고리의 다른 글

웹서버 애플리케이션 관점에서의 Thread Pool  (0) 2025.03.21
NullPointerException(NPE) 런타임 에러  (1) 2025.03.11
JVM 메모리 구조  (0) 2025.02.25
이스케이프 시퀀스  (0) 2025.02.22
NumberFormat 런타임 에러  (0) 2025.02.21

목적

한 줄에 정수 3개를 공백을 두고 입력받아, 총 합 계산


문제

 

vscode로 실행하면 결과물이 잘 출력되지만, 백준에 제출했을 때 런타임 에러 InputMismatch 발생

 

https://go-getter1kim.tistory.com/36

 

런타임 에러 (InputMismatch)

InputMismatch 런타임 에러 주요 원인1. 잘못된 데이터 형식 입력예: nextInt()로 정수를 기대하는데 사용자가 문자열 입력Scanner scanner = new Scanner(System.in);int number = scanner.nextInt(); // 여기서 "abc" 입력 시

go-getter1kim.tistory.com


시도

1. InputMismatch 런타임 에러 발생 원인을 한 줄에 3개를 입력받는 과정에서 입력값들 사이의 공백으로 추정,

    반복문 안에서 스캐너로 값을 하나씩 입력받고 sum 변수에 누적합을 저장하자

 

-> 같은 InputMismatch 런타임 에러 발생

 

 

2. 공백 문제를 해결하기 위해 문자열로 정수 3개를 입력받고, split 함수를 이용해서 분리한 후 정수로 파싱하자

2-1. 초기 작성 코드

 

2-2. 불필요한 선언 제거, 반복문의 조건문도 개선

 

-> NumberFormat 런타임 에러 발생

 

https://help.acmicpc.net/judge/rte/NumberFormat

https://go-getter1kim.tistory.com/37

 

NumberFormat 런타임 에러

NumberFormat 런타임 에러 주요 원인주로 문자열을 숫자로 변경할 때 발생하는 에러 1. 숫자가 아닌 문자열 변환 시도숫자로 변환할 수 없는 문자열을 Integer.parseInt() 또는 Double.parseDouble()로 변환하

go-getter1kim.tistory.com

 

 

 

3. 수가 자료형에 맞지 않아 생기는 문제로, int를 long으로 변경

 

-> 문제 해결

 

 

정리

입력값이 최대 10^12인 문제여서 자료형 선언이 중요했다.

결국 문제를 이해하는 단계부터 오류가 있어 발생한 이슈였다..

문제를 잘 읽도록 하자

 

그간의 시도들..

🌰 DotoriWebpage 🌰
image

🎫 배포 사이트

✔️ https://sinyoung0403.github.io/DotoriWebpage/

  • 메인 페이지에서 방명록을 쓸 수 있습니다.
  • 상세 페이지에서는 각 팀원의 소개를 볼 수 있습니다.
  • 취미 페이지에서는 취미 등록 및 삭제가 가능합니다.
  • 스크럼 페이지에서는 목표를 추가, 삭제, 편집, 완료 여부를 저장할 수 있는 기능을 제공합니다.

⚒ 개발 팀 소개

역할 팀장 팀원 팀원
프로필 image image image
이름 박신영 김규현 김채진
GitHub sinyoung0403 0122-0 kmchaejin
기술블로그 신영tistory 규현velog 채진tistory



⚒ 프로젝트

✔️ 프로젝트 이름

  • " Dotori Webpage "

✔️ 프로젝트 소개

  • 저희의 Web application은 메인페이지(방명록), 취미페이지, 데일리 스크럼 페이지로 구성되어 있습니다.
  • 각 페이지에서는 직관적인 인터페이스를 통해 항목을 추가, 삭제, 및 편집을 할 수 있습니다.
  • Firebase의 JavaScript SDKFetch를 활용하여 real-time data storage를 구현했습니다.
  • HTML, CSS, Bootstrap 으로 디자인 하였으며, JSJqery를 활용하여 데이터의 실시간 반영, 동적관리 등을 통해 사용자와의 상호작용을 강화했습니다.

✔️ 프로젝트 WBS

image



🌟 주요 기능

1️⃣ 방명록 Create, Read, Delete 구현

2️⃣ 데일리 스크럼 Create, Read, Update, Delete 구현

3️⃣ 취미 Create, Read, Delete 구현



💡 구현된 기능

✔️ 메인 페이지

1️⃣ 조회

  • 방명록 조회

2️⃣ 추가

  • 방명록 버튼 클릭 시, 입력 폼 토글 동작
  • 입력폼 기록하기 버튼 클릭 시, 모달 동작
  • → 모달의 생성하기 버튼 클릭 시, 페이지 리로드 & 방명록 데이터 추가

3️⃣ 삭제

  • 방명록 삭제 버튼 클릭 시, 모달 동작
  • → 모달의 삭제하기 버튼 클릭 시, 페이지 리로드 & 방명록 데이터 삭제

4️⃣ 기타

  • Bootstrap의 carousel를 통해 팀 소개, 팀 목표, 팀 약속 조회
  • Fetch API 를 통해 날씨 API 제공

 

✔️ 상세 페이지

  • Bootstrap의 carousel 배치
  • Bootstrap의 collapse 배치
  • Bootstrap의 accordion 배치

 

✔️ 데일리 스크럼 페이지

1️⃣ 조회

  • 일자별 데일리 스크럼 목록 조회
  • 데일리 스크럼 버튼 클릭 시, 상세 정보 토글로 조회

2️⃣ 추가

  • 입력 폼에 팀 목표, 개별 목표 작성 후 기록하기 버튼 클릭 시, 모달 동작
  • → 모달의 추가하기 버튼 클릭 시, 페이지 리로드 & 방명록 데이터 추가

3️⃣ 삭제

  • 삭제하기 버튼 클릭 시, 모달 동작
  • → 모달의 삭제하기 버튼 클릭 시, 페이지 리로드 & 데이터 삭제

4️⃣ 수정

  • 각 스크럼 항목의 수정하기 버튼 클릭 시, 개별 수정 창 동적 동작
  • 수정완료 버튼 클릭 시, 모달 동작
  • → 모달의 완료하기 버튼 클릭 시, 페이지 리로드 & 데이터 수정 구현

 

✔️ 취미 페이지

1️⃣ 조회

  • '펼쳐보기' 버튼을 클릭 시, 토글로 취미 목록 조회

2️⃣ 추가

  • 기록하기 버튼 클릭 시, 페이지 리로드 & 취미 데이터 추가

3️⃣ 삭제

  • 삭제하기 버튼 클릭 시, 페이지 리로드 & 취미 데이터 삭제

4️⃣ 기타

  • Bootstrap의 carousel를 통해 팀원들의 취미 조회



🏷️ Data

✔️ 메인페이지 (방명록)

문서 ID 는 JavaScript SDK 를 이용하여 Custom id로 정했습니다.

  데이터 이름 데이터 형태 데이터 설명
1 id String 방명록을 작성한 시점을 밀리초로 환산하여 Id 값을 지정
2 name String 방명록 적은 사람의 닉네임
3 coment String 방명록 text
       

✔️ 데일리 스크럼 페이지

문서 ID 는 Firebase 에서 랜덤으로 주어진 값을 사용합니다.

  데이터 이름 데이터 형태 데이터 설명
1 id String 스크럼을 추가한 시점을 밀리초로 환산하여 Id 값을 지정
2 date String 스크럼을 추가한 날짜를 mm월 dd일 형태 저장
3 teamAim String 팀원 전체 목표
4 ghGoal String 규현님 개별 목표
5 cjGoal String 채진님 개별 목표
6 syGoal String 신영님 개별 목표
7 ghchek String 규현님 개별 목표 완료 여부
8 cjchek String 채진님 개별 목표 완료 여부
9 sychek String 신영님 개별 목표 완료 여부
       

✔️ 취미 페이지

문서 ID 는 JavaScript SDK 를 이용하여 Custom id로 정했습니다.

  데이터 이름 데이터 형태 데이터 설명
1 id String 취미를 등록한 시점을 밀리초로 환산하여 Id 값을 지정
2 name String 기록한 사용자의 이름
3 img String 기록한 사용자의 취미를 보여주는 사진 (이미지 주소)
4 hobby String 기록한 사용자의 취미의 이름



📚 Stacks

✔️ Environment

✔️ Front-End

✔️ Back-End

 

 


 

개발 과정을 담은 게시글

2025.02.18 - [트러블 슈팅] - [CSS] 요소 가운데 정렬 

 

[CSS] 요소 가운데 정렬

목적위 사진과 같이 3개의 토글이 웹페이지 가운데에 정렬되는 것트러블 원인부트스트랩을 통해 가져온 3개의 토글 버튼이 웹페이지 왼쪽에 붙은 상태로, 위치가 변경되지 않는 이슈 발생 구현

go-getter1kim.tistory.com

2025.02.18 - [프로젝트] - [HTML/CSS/JS] bootstrap을 활용하여 콜랩스(Collapse) 만들기

 

[HTML/CSS/JS] bootstrap을 활용하여 콜랩스(Collapse) 만들기

Step 1. bootstrap에서 원하는 요소 코드 가져오기Step 2. 원하는 부분에 배치하고 스타일 태그로 속성 변경하기부트스트랩을 사용할 경우, 기본적으로 적용된 스타일 속성이 있다.그러므로 원하는

go-getter1kim.tistory.com

2025.02.18 - [분류 전체보기] - [vscode] 라이브 서버

 

[vscode] 라이브 서버

라이브 서버프로그램을 재실행하지 않아도, 변경된 코드를 저장하면 반영된 결과물을 바로 볼 수 있다.라이브 서버 사용 방법 1. extension에서 live server 설치  2. 오른쪽 하단 GO LIVE 클릭 시 실행

go-getter1kim.tistory.com

2025.02.19 - [프로젝트] - [HTML/CSS/JS] bootstrap을 활용하여 모달(Modal) 만들기

 

[HTML/CSS/JS] bootstrap을 활용하여 모달(Modal) 만들기

Step 1. bootstrap에서 원하는 모달 코드 가져오기 Step 1-1. 상단 Button trigger modal 코드에서 필요한 속성값 가져와서 태그에 삽입 data-bs-toggle="modal"토글이란 두 가지 상태를 번갈아가며 전환하는 동작m

go-getter1kim.tistory.com

 

Step 1. bootstrap에서 원하는 모달 코드 가져오기

 

Step 1-1. 상단 Button trigger modal 코드에서 필요한 속성값 가져와서 태그에 삽입

 

data-bs-toggle="modal"

  • 토글이란 두 가지 상태를 번갈아가며 전환하는 동작
  • modal 타입의 토글로 지정
  • 즉, 위의 코드는 버튼을 클릭하면 모달 형태로 전환

data-bs-target="#delCommentModal"

  • delCommentModal이라는 id를 가지는 요소가 전환 대상

 

Step 1-2. 하단 modal 코드를 html 파일에 삽입

 

  • 코드의 최상위 태그 id를 통해, 이 요소가 step 1-1 버튼 태그의 전환 대상이 되는 것을 알 수 있다.
  • 최하단 버튼 태그 안에 id값을 지정해서, js 파일에서 이 버튼의 이벤트 핸들링이 가능하도록 한다.

Step 2. 모달의 버튼을 클릭했을 때, 해당 데이터가 삭제되도록 백엔드 코드 수정

 

이벤트 핸들러를 중첩해서 사용하면 모달을 거치더라도 삭제할 데이터의 id값을 삭제가 완료될 때까지 전달할 수 있다.

1차적으로 id="guestDelete"인 블록의 버튼을 클릭할 때 데이터를 전달받아, 삭제할 블록이 무엇인지 인식한다.

2차적으로 id="deleteCommentBtn"인 모달 버튼을 클릭할 때 내부 코드를 실행하여 해당 블록을 삭제한다.

 


결과물

삭제 버튼이 #guestDelete 에 해당하는 버튼이다
삭제하기 버튼이 #delCommentBtn 에 해당하는 버튼이다

라이브 서버

프로그램을 재실행하지 않아도, 변경된 코드를 저장하면 반영된 결과물을 바로 볼 수 있다.

 

사용 방법

1. extension에서 live server 설치

 

2. 오른쪽 하단 GO LIVE 클릭 시 실행

 

라이브 서버와 로컬 서버 비교하기

  라이브 서버 (Live Server) 로컬 서버 (Local Server)
설명 실시간으로 변경사항을 반영하는 개발용 서버 로컬에서 실행되는 웹 서버
사용 목적 HTML/CSS/JS 개발 시 빠른 미리보기 백엔드 개발, API 테스트, 서버 환경 모방
설치 및 실행 VS Code 확장 프로그램 (Live Server) 사용 Node.js, Apache, Python, PHP 등으로 실행
URL 형식 http://127.0.0.1:5500 등 http://localhost:8000 등
자동 새로고침 ✅ 지원 (파일 변경 시 자동 반영) ❌ 기본적으로 지원 안 함 (추가 설정 필요)
백엔드 연결 ❌ (주로 정적 파일용) ✅ (Express, Django 등과 함께 사용 가능)
보안 설정 개발용이라 보안 고려 없음 개발 및 배포 환경에 따라 보안 설정 가능
속도 가벼운 정적 서버로 빠름 백엔드 로직이 포함되면 상대적으로 무거울 수 있음
배포 가능 여부 ❌ (개발용, 인터넷에서 접근 불가) ✅ (서버를 설정하면 외부 접근 가능)

 

  • Live Server → HTML, CSS, JavaScript 정적 페이지 개발 시 유용
  • Local Server → 백엔드 개발, API 테스트, 데이터베이스 연동이 필요할 때 사용