반응형

 

📖 배운 내용

1. 자바스크립트 로그인 창 구현

<!DOCTYPE html>
<html lang="ko">

<head>
    <title>이벤트 감지</title>
    <script>
        function checkValidation() {
            const email = document.getElementById("email").value;
            const password1 = document.getElementById("password1").value;
            const password2 = document.getElementById("password2").value;

            if (email !== "" && password1 !== "" && password2 !== "") {
                document
                    .getElementById("mybutton")
                    .setAttribute("style", "background-color: yellow");
            } else {
                document
                    .getElementById("mybutton")
                    .setAttribute("style", "background-color: none");
            }
        }
    </script>
</head>

<body>
    <input id="email" type="text" placeholder="이메일을 입력해주세요." oninput="checkValidation()"/><br>
    <input id="password1" type="password" placeholder="비밀번호를 입력해주세요." oninput="checkValidation()"/><br>
    <input id="password2" type="password" placeholder="비밀번호를 확인해주세요." oninput="checkValidation()"/><br>
    <button id="mybutton">회원가입</button>
</body>

</html>

비밀번호 확인 칸에 문자열이 쓰였을 때  oninput 속성을 통해 함수를 실행하고 setAttribute로 회원가입 버튼 background-color를 노란색으로 표시할 수 있도록 하였다.

 

 

2. 자바스크립트 휴대폰 번호 입력창 구현

<!DOCTYPE html>
<html lang="ko">
<head>
    <title>휴대폰 포커스</title>
    <script>
        function changePhone1(){
            const phone1 = document.getElementById("phone1").value // 010
            if(phone1.length === 3){
                document.getElementById("phone2").focus();
            }
        }
        function changePhone2(){
            const phone2 = document.getElementById("phone2").value // 010
            if(phone2.length === 4){
                document.getElementById("phone3").focus();
            }
        }
        function changePhone3(){
            const phone3 = document.getElementById("phone3").value // 010
            if(phone3.length === 4){
                document.getElementById("phone3").blur();
            }
        }
    </script>
</head>
<body>
    <input id="phone1" type="text" size="3" maxlength="3" oninput="changePhone1()"> - 
    <input id="phone2" type="text" size="4" maxlength="4" oninput="changePhone2()"> - 
    <input id="phone3" type="text" size="4" maxlength="4" oninput="changePhone3()">
</body>
</html>

첫 번째 칸에 숫자 3자리가 적히면 다음 칸으로 커서가 자동적으로 이동할 수 있도록 하였다.
두 번째 칸도 마찬가지로 4자리가 적히면 다음칸에 커서를 focos() 하게 된다.
(의외로 이러한 기능이 없는 웹사이트들이 많은데 생각보다 쉽게 구현이 가능해서 신기했다.)

 

 

3. 싸이월드 주크박스 탭, 내비게이션 바 완성

<코드 github 주소>

cyworld-mento

 

GitHub - K-Junyyy/CYWORLD-Clone-Coding

Contribute to K-Junyyy/CYWORLD-Clone-Coding development by creating an account on GitHub.

github.com

 

 

4. Final 과제(회원가입 창 만들기)

 

🔨 구현한 기능 

✔️ 초기 disabled 속성을 주어 인증번호 전송, 인증 확인, 가입하기 버튼 클릭 방지
✔️ 지역 선택란에서 초기값은 "지역을 선택하세요"로 하며, 초기값은 선택 불가
✔️ 성별은 둘 중 하나만 선택 가능
✔️ 휴대폰 번호 입력 시 3, 4, 4자리로 입력할 수 있도록 구현
✔️ 첫째 칸 3자리 입력 시 둘째 칸으로 포커스 이동
✔️ 둘째 칸 4자리 입력 시 셋째 칸으로 포커스 이동
✔️ 셋째 칸 4자리 입력 시 인증번호 전송 버튼 활성화
✔️ 인증번호 전송 버튼 클릭 시 토큰 생성 및 타이머 실행, 인증 확인 버튼 활성화
✔️ 3분 이내 인증 확인 버튼 클릭 시 "인증이 완료되었습니다" 메시지 띄우기
✔️ 3분 동안 버튼을 누르지 않는 경우 인증번호 전송 버튼과 인증 확인 버튼 비활성화
✔️ 그리고 토큰 정보를 "000000", 시간을 "03:00"으로 초기화
✔️ 인증 확인 시 인증 확인 버튼을 "인증 완료"로 변경, 가입하기 버튼 활성화
✔️ 가입하기 버튼 클릭 시 이메일, 이름, 비밀번호, 비밀번호 확인, 지역, 성별 확인
✔️ 조건에 맞지 않는다면 입력창 아랫부분에 빨간 글씨로 에러 표시
✔️ 조건을 모두 만족시키고 가입하기 버튼  클릭 시 에러 메시지 제거 후 가입 확인 메시지

<final.html>

<!DOCTYPE html>
<html lang="ko">

<head>
    <title>회원가입 페이지</title>

    <link href="final.css" rel="stylesheet" />
    <script src="final.js"></script>

</head>

<body>
    <div class="wrapper">
        <div class="title"><h1 style="font-size: 21px;">코드캠프 회원가입</h1></div>
        <div class="email">
            <input id="email" type="text" placeholder="이메일을 입력해 주세요.">
            <div id="emailError" class="error"></div>
        </div>
        <div class="name">
            <input id="name"  type="text" placeholder="이름을 입력해 주세요.">
            <div id="nameError" class="error"></div>
        </div>
        <div class="password">
            <input id="password" type="password" placeholder="비밀번호를 입력해 주세요.">
            <div id="passwordError" class="error"></div>
        </div>
        <div class="passwordCheck">
            <input id="passwordCheck" type="password" placeholder="비밀번호를 다시 입력해 주세요.">
            <div id="passwordCheckError" class="error"></div>
        </div>
        <div class="phone">
            <input id="phone1" type="text" size="1" maxlength="3" oninput="changePhone1()"> -
            <input id="phone2" type="text" size="3" maxlength="4" oninput="changePhone2()"> -
            <input id="phone3" type="text" size="3" maxlength="4" oninput="changePhone3()">

        </div>
        <div class="auth">
            <div id="certificationNumber">000000</div>
            <button disabled id="sendMessage" onclick="getToken()">인증번호 전송</button>
        </div>

        <div class="timer">
            <div id="timeLimit">03:00</div>
            <button disabled id="completion" onclick="checkCompletion()">인증확인</button>
        </div>
        <div class="area">
            <select id="area">
                <option selected disabled>지역을 선택하세요.</option>
                <option>서울</option>
                <option>인천</option>
                <option>경기</option>
            </select>
            <div id="areaError" class="error"></div>
        </div>
        <div class="gender">
            <input id="gender_man" type="radio" name="gender">남성  
            <input id="gender_woman" type="radio" name="gender">여성
            <div id="genderError" class="error"></div>
        </div>
        <div class="line">
            <hr>
        </div>
        <div class="signUp">
            <button id="signUpButton" disabled onclick="signUpCheck()">가입하기</button>
        </div>
    </div>

</body>

</html>

<final.css>

* {
    margin: 0px;
    box-sizing: border-box;
    font-size: 11px;
}

html {
    width: 100%;
    display: flex;
    justify-content: center;
    padding-top: 20px;
    padding-bottom: 20px;
}

body {
    width: 45%;
    border: 1px solid black;
}

input{
    border: 1px solid black;
    border-radius: 3px;
    line-height: 35px;
    font-size: 12px;
    padding-left: 10px;
    padding-right: 10px;
}


.wrapper {
    padding: 10px;
}

div {
    padding-top: 3px;
    padding-bottom: 8px;
}

.title {
    text-align: center;
    font-weight: 700;
}

.email input {
    width: 100%;
}

.name input {
    width: 100%;
}

.password input {
    width: 100%;
}

.passwordCheck input {
    width: 100%;
}

.phone {
    display: flex;
    justify-content: space-between;
    line-height: 35px;
}

#phone1 {
    width: 18%;
}

#phone2 {
    width: 30%;
}

#phone3 {
    width: 30%;
}

.auth {
    display: flex;
    justify-content: space-between;
}

.timer {
    display: flex;
    justify-content: space-between;
}

.auth div {
    width: 30%;
    text-align: center;
    font-weight: 700;
    font-size: 15px;
}

.auth button {
    width: 70%;
}

.timer div {
    width: 30%;
    text-align: center;
    font-weight: 700;
    font-size: 15px;
}

.timer button {
    width: 70%;
}

.area select {
    width: 100%;
    height: 40px;
}

.gender {
    text-align: center;
}

.signUp button {
    width: 100%;
    cursor:pointer;
}

button{
    cursor: pointer;
    height: 30px;
}

.error{
    font-size: 1px;
    height: 20px;
    color:red;
    font-weight: 700;
}

<final.js>

// 휴대폰 번호 입력 부분
function changePhone1(){
    const phone1 = document.getElementById("phone1").value // 010
    if(phone1.length === 3){
        document.getElementById("phone2").focus();
    }
}
function changePhone2(){
    const phone2 = document.getElementById("phone2").value // 010
    if(phone2.length === 4){
        document.getElementById("phone3").focus();
    }
}
function changePhone3(){
    const phone3 = document.getElementById("phone3").value // 010
    if(phone3.length === 4){
      document.getElementById("sendMessage").focus();
      document.getElementById("sendMessage").setAttribute("style","background-color:yellow;")
      document.getElementById("sendMessage").disabled = false;
    }
}

// 문자인증+타이머 부분
function initButton(){
  document.getElementById("sendMessage").disabled = true;
  document.getElementById("completion").disabled = true;
  document.getElementById("certificationNumber").innerHTML = "000000";
  document.getElementById("timeLimit").innerHTML = "03:00";
  document.getElementById("sendMessage").setAttribute("style","background-color:none;")
  document.getElementById("completion").setAttribute("style","background-color:none;")
}

let processID = -1;

const getToken = () => {

  // 인증확인 버튼 활성화
  document.getElementById("completion").setAttribute("style","background-color:yellow;")
  document.getElementById("completion").disabled = false;

  if (processID != -1) clearInterval(processID);
  const token = String(Math.floor(Math.random() * 1000000)).padStart(6, "0");
  document.getElementById("certificationNumber").innerText = token;
  let time = 180;
  processID = setInterval(function () {
    if (time < 0 || document.getElementById("sendMessage").disabled) {
      clearInterval(processID);
      initButton();
      return;
    }
    let mm = String(Math.floor(time / 60)).padStart(2, "0");
    let ss = String(time % 60).padStart(2, "0");
    let result = mm + ":" + ss;
    document.getElementById("timeLimit").innerText = result;
    time--;
  }, 50);
};

function checkCompletion(){
  alert("문자 인증이 완료되었습니다.")
  initButton();
  document.getElementById("completion").innerHTML="인증완료"
  document.getElementById("signUpButton").disabled = false;
  document.getElementById("signUpButton").setAttribute("style","background-color:yellow;")
}


// 가입부분 체크

function signUpCheck(){

  let email = document.getElementById("email").value
  let name = document.getElementById("name").value
  let password = document.getElementById("password").value
  let passwordCheck = document.getElementById("passwordCheck").value
  let area = document.getElementById("area").value
  let gender_man = document.getElementById("gender_man").checked
  let gender_woman = document.getElementById("gender_woman").checked
  let check = true;

  // 이메일확인
  if(email.includes('@')){
    let emailId = email.split('@')[0]
    let emailServer = email.split('@')[1]
    if(emailId === "" || emailServer === ""){
      document.getElementById("emailError").innerHTML="이메일이 올바르지 않습니다."
      check = false
    }
    else{
      document.getElementById("emailError").innerHTML=""
    }
  }else{
    document.getElementById("emailError").innerHTML="이메일이 올바르지 않습니다."
    check = false
  }


  // 이름확인
  if(name===""){
    document.getElementById("nameError").innerHTML="이름이 올바르지 않습니다."
    check = false
  }else{
    document.getElementById("nameError").innerHTML=""
  }


  // 비밀번호 확인
  if(password !== passwordCheck){
    document.getElementById("passwordError").innerHTML=""
    document.getElementById("passwordCheckError").innerHTML="비밀번호가 동일하지 않습니다."
    check = false
  }else{
    document.getElementById("passwordError").innerHTML=""
    document.getElementById("passwordCheckError").innerHTML=""
  }

  if(password===""){
    document.getElementById("passwordError").innerHTML="비밀번호를 입력해주세요."
    check = false
  }else{
    //document.getElementById("passwordError").innerHTML=""
  }
  if(passwordCheck===""){
    document.getElementById("passwordCheckError").innerHTML="비밀번호를 다시 입력해주세요."
    check = false
  }else{
    //document.getElementById("passwordCheckError").innerHTML=""
  }


  // 지역선택 확인
  if(area === "지역을 선택하세요."){
    document.getElementById("areaError").innerHTML="지역을 선택해주세요."
    check = false
  }else{
    document.getElementById("areaError").innerHTML=""
  }

  // 성별체크확인
  if(!gender_man && !gender_woman){
    document.getElementById("genderError").innerHTML="성별을 선택해주세요."
    check = false
  }else{
    document.getElementById("genderError").innerHTML=""
  }
  
  if(check){
    document.getElementById("emailError").innerHTML=""
    document.getElementById("nameError").innerHTML=""
    document.getElementById("passwordError").innerHTML=""
    document.getElementById("passwordCheckError").innerHTML=""
    document.getElementById("areaError").innerHTML=""
    document.getElementById("genderError").innerHTML=""
    
    //비동기 처리이벤트
    setTimeout(function() {
      alert("코드캠프 가입을 축하합니다.")
  },0);
  }
}

<코드 github 주소>

https://github.com/K-Junyyy/CYWORLD-Clone-Coding/tree/main/class/final

 

GitHub - K-Junyyy/CYWORLD-Clone-Coding

Contribute to K-Junyyy/CYWORLD-Clone-Coding development by creating an account on GitHub.

github.com

 

 

5. git, github 사용법, 파일 생성부터 commit, push 그리고 잔디심기 까지

편집기로 vscode를 사용했습니다.

git config --global user.name "깃허브name" 
git config --global user.email "깃허브email"

여기에서 name은 아래와 같이 프로필 클릭 시 나타나는 로그인 아이디를 의미합니다.

 

git config --list

잘 적용됐는지 확인할 수 있습니다.

 

git remote add origin URL

URL부분은 아래와 같이 저장소의 코드 탭에서 복사해 갈 수 있습니다.

 

git init

현재 폴더 git 초기화

 

git status

현재 git 상태

 

git add .

수정한 파일을 staging 함 (. 은 모든 파일이라는 뜻!)

 

git commit -m "메시지"

스테이지에 올라올 파일을 커밋함

 

git push origin main

원격 저장소로 올리기

(git push origin 브랜치 이름)

 

git checkout -b main

git 브랜치 이동
저의 경우에는 처음의 브랜치가 master였으므로 main으로 옮겨주었습니다.

 

잔디가 심어졌습니다! ㅎㅎ

 

 

💎 후기

사실 처음에 인스타 광고를 보고 신청을 하게 되었고 커리큘럼을 살펴보니 별다른 생각 없이 그저 그랬지만 5일 동안 매일 구로로 가서 4시간 이상씩 강의를 듣고 실습을 진행해보면서 커리큘럼을 굉장히 잘 짰구나 라고 느꼈고 새로 알아가는 내용 또한 많았습니다. 오픈 기념 무료 코스이지만 멘토님들의 뜨거운 열정이 보였고 질 좋은 강의와 노션에 있는 자료들은 굉장한 가치가 있다고 느껴졌습니다. 노션에 있는 알고리즘 문제를 수업 쉬는 시간마다 짬 내서 다 풀어보았는데 혼자 풀어보면서 실력도 확실히 많이 늘었고 정답도 같이 주셔서 제가 못 풀었던 문제에서 어떠한 부분을 놓치고 있었는지 알 수 있었습니다.
또한 CSS display:flex, justify-content, align-items로 요소 정렬하는 것은 항상 헷갈리고 이해가 안 됐었는데 설명을 너무나도 잘해주셔서 확실하게 이해할 수 있었고 싸이월드 제작 실습이 프런트엔드의 개념에 큰 도움이 되었습니다. 마지막 날 수업 종료 직전에 알려주셨던 git과 github 그리고 명령어들로 commit, push 하고 잔디 심는 방법은 아주 유용한 정보였습니다. 다만 아쉬웠던 점은 노션에 git에 관한 정보나 사용 방법, 깃 기초 명령어, 파일 생성부터 잔디 심는 과정에 대한 내용이 없어서 쪼금 아쉬웠지만....! 수업방식, 오프라인 진행, 강의 내용, 배우는 내용 모두 잘 짜여졌다고 느꼈습니다. 멘토님들 항상 친절하게 질문 답변해주셔서 감사드렸고 고생하셨습니다!

 

 

반응형

+ Recent posts