Welcome | My Portfolio

FRONTEND
DEVEL

ABOUT
1994.02.09

개발자는 평생 배우는 직업이라고 생각합니다. 하루가 다르게 발전하는 IT 환경에 적응해야 하기 때문입니다. 그리고 저에게는 배움에 대한 열정이 있습니다. “현실과 디지털을 연결”이라는 자사의 이념은 IT 지식을 같은 분야 뿐이 아닌 다양한 산업 분야와 접목하여 발전시키자 라는 저의 목표와 같다고 생각 하였습니다.

저는 IT직 사원으로서 항상 겸손한 자세로 사용자를 먼저 생각하는 것은 물론이며 불편하지 않고 편리한 시스템의 개발 및 보수와 웹, 앱 기능을 제공하고 싶습니다. 모든 사용자에게 긍정적인 평가를 들을 수 있는 프로그래밍 전문가로 성장하고 싶습니다.

INTRO

전공으로 스마트 IT 학과를 나오고 하드웨어와 관련된 회사로 첫 취업을 하였습니다. 1년이 넘는 시간 근무를 하며 적성에 맞지 않고 코딩 쪽으로 관심이 가게 되어 이젠 컴퓨터 학원과 에이콘 아카데미에서 웹 퍼블리셔 및 빅데이터 과정을 배우며 여러 기술들을 배울 수 있었습니다.공부와 프로젝트를 진행하면서 이해하기 힘든 부분을 학습하며 제것으로 만들 수 있었습니다. 많은 고민과 반복을 통하여 만들어진 작업물들이기에 좋은 감상이 되시길 바랍니다.

Site Work
Creative Websites

NO1. Standards Web

웹 표준과 웹 접근성을 준수하여 제작한 웹 사이트입니다. 웹을 사용하는 모든 사람에 있어서 제약을 주지 않고 이용할 수 있게 제작되었으며, 시각 장애를 가진 사용자를 고려하여 IR 효과를 사용하였습니다. 스크린 리더기를 통한 설명도 가능하여 제약 없이 모든 정보를 열람할 수 있도록 제작하였습니다.

NO2. Responsive Web

미디어 쿼리를 이용하여 PC, Tablet, Mobile 등의 디바이스에서도 유연하게 이용할 수 있도록 반응형으로 제작하였습니다. 이로써 대부분의 디바이스에서 PC에서 이용하는 것과 같이 여러 정보를 열람할 수 있으며 어떤 곳에서든 편리하게 이용할 수 있도록 제작하였습니다.

NO3. Mega Box

기존 메가박스 웹 사이트를 리뉴얼한 작업물입니다. Swiper Slide, TabMenu, Media Query등을 사용하여 편의성을 높였으며 480PX 해상도를 기준으로 대부분의 디바이스에서 편리하게 이용할 수 있게 제작하였습니다. 배너에 Swiper Slide를 사용하여 여러 종류의 정보를 나열하였습니다

Site Work
Creative Websites

Script Work
Creative javascript

01. Music Player

A = A ? false : true 삼항 연산자와 Math메서드 ()=>화살표 함수와 addEventListener() 메서드, #`${}` 템플릿을 활용하여 Music Player를 만들어 보았습니다. 듣고 싶은 노래의 위치를 선정하여 감상할 수 있으며, 한곡 반복 플레이, 한곡 감상 후 종료, 랜덤 플레이가 가능하게 제작되었으며 리스트를 만들어 듣고 싶은 노래를 감상할 수 있는 음악 플레이어입니다.

02. Card Game

addEventListener()로 카드에 이벤트를 부여해 주고 같은 카드가 매칭되면 removeEventListener()을 선언하여 해당 카드들의 이벤트를 지워주어 더 이상 클릭 이벤트를 실행하여도 카드가 반응하지 못하도록 해주었습니다. sort()를 사용하고 삼 항 연산자를 선언 함으로서 게임을 시작하면 카드가 섞이도록 하였으며 모든 카드를 매칭 시키면 종료되는 게임입니다.

03. Typing

Axios 플러그인을 사용하고 Get방식으로 오픈 API를 서버로부터 전달받아 단어들을 생성하여 제공하는 방식으로 게임을 만들어 보았습니다. Math.random()로 제공받은 단어들은 랜덤하게 나타내게 하였고 실수를 제거하기 위해서 Math.floor()을 선언하였으며 대문자 구분을 없애기 위해서 toLowerCase()을 선언해 소문자로 타이핑 하여도 문제없이 진행되게 하였습니다.

04. Puzzle

createElement(), preventDefault(), submit(), Math.random() 메서드들을 사용하여 puzzle게임을 만들어 보았습니다. 뒤섞인 그림의 순서를 맞추어 하나의 완성된 그림을 나타내면 게임을 클리어 하게되며 정해진 시간은 없지만 완성하기 까지의 시간은 나타나게 해주었습니다. 다시 스타트 버튼을 클릭하면 퍼즐을 시작할 수 있으며, 그림이나 사진은 랜덤하게 나타나게 됩니다.

Script Work
Creative javascript


mainAudio.addEventListener("timeupdate", (e)=>{
    const currentTime = e.target.currentTime;
    const duration = e.target.duration;
    let progressWidth = (currentTime / duration) * 100;
    progressBar.style.width = `${progressWidth}%`;

    let musicCurrenTime = wrapper.querySelector(".current"),
    musicDuration = wrapper.querySelector(".duration");

    mainAudio.addEventListener("loadeddata",()=>{
        let audioDuration = mainAudio.duration;
        let totalMin = Math.floor(audioDuration / 60);
        let totalSec = Math.floor(audioDuration % 60);
        if(totalSec < 10){totalSec = `0${totalSec}`;
        }
        musicDuration.innerText = `${totalMin} : ${totalSec}`;
    });

    let currentMin = Math.floor(currentTime / 60);
    let currentsec = Math.floor(currentTime % 60);
    if(currentsec < 10){currentsec = `0${currentsec}`;
    }
    musicCurrenTime.innerText = `${currentMin} : ${currentsec}`;
});

function loadMusic(indexNumb) {
    musicName.innerText = allMusic[indexNumb - 1].name;
    musicArtist.innerText = allMusic[indexNumb - 1].artist;
    musicImg.src = `images/${allMusic[indexNumb - 1].img}.jpg`;
    mainAudio.src = `Music/${allMusic[indexNumb - 1].src}.mp3`;
}

let allMusic = [
  {
    artist: "Good Bye",
    name: "박효신",
    img: "music-1",
    src: "music-1"
  },
  {
    artist: "First Love",
    name: "Hisaishi-Joe",
    img: "music-2",
    src: "music-2"
  },
  {
    artist: "야생화",
    name: "박효신",
    img: "music-3",
    src: "music-3"
  },
  {
    artist: "Summer",
    name: "Hisaishi-Joe",
    img: "music-4",
    src: "music-4"
  },
  {
    artist: "겨울잠",
    name: "IU",
    img: "music-5",
    src: "music-5"
  },
];

01. Music Player

playPauseBtn, nextMusic, pauseMusic 버튼에 삼 항 연산자를 사용하여 정지, 이전 곡, 다음 곡을 들을 수 있는 기능을 만들었습니다. 페이지가 새로이 로드될 때마다 랜덤하게 곡들이 재생될 수 있게 하였고, 원하는 곡을 선택하여 감상할 수 있게 리스트를 만들었으며, 한 곡 반복, 랜덤 플레이, 기능까지 추가적으로 작업하여 제작하였습니다.

Player의 대부분의 클릭 이벤트를 사용하기 위하여 addEventListener() 메서드를 사용하였고 해당 버튼을 클릭할 때마다 함수를 호출하게 하였습니다. Math.floor함수를 사용하여 음악의 길이를 계산하고 반환하여 시간을 나타냈습니다. 템플릿 문자열( `${}` )과 화살표 함수( ()=> )를 사용하여 코드의 간결함을 나타냄으로써 코드의 가독성을 높였습니다

html이나 css보다 javascript 코드를 작성할 때에는 더욱이 가독성을 높이거나 정리하는 습관이 중하다는 걸 비로소 느끼게 된 작업이었습니다. 이번 작업을 하면서 단 한자의 오타로 인해서 프로그램 자체가 무너지는 경험을 하고 오랜 시간 동안 오류를 찾기 위해 고군분투한 후로는 코드 정리는 필수라는 걸 가슴 깊이 새기게 되었습니다.

#A = A ? false : true
#Math.floor
#()=>
#addEventListener()
#`${}`


function flipCard(e){
    let clickedCard = e.target;// 이벤트(카드)를 클릭할때 clickedCard에 이벤트를 담는다
    if(clickedCard !== cardOne && !disableDeck){
        clickedCard.classList.add("flip")
        // 한번 클릭한 카드는 일정 시간이 지나기 전까지 같은 카드를 이벤트할 수 없다.
        if(!cardOne){
            return cardOne = clickedCard;
        }
        cardTwo = clickedCard;
        disableDeck = true;
        let cardOneImg = cardOne.querySelector("img").src,
        cardTwoImg = cardTwo.querySelector("img").src;
        matchCards(cardOneImg,cardTwoImg);
    }
}

function matchCards(img1, img2){
    // 카드 16장을 생성해주는 로직
    if(img1 === img2){
        matchedCrad++;
        if(matchedCrad == 8){
            setTimeout(()=>{
                return shuffleCard();
            }, 1000);
        }
        //같은 카드가 매치되면 해당 카드의 이벤트를 끝내어 더 이상 해당 카드의 이벤트를 실행할 수 없다.
        cardOne.removeEventListener("click",flipCard);
        cardTwo.removeEventListener("click",flipCard);
        cardOne = cardTwo = ""; // 이벤트가 끝난 카드는 공백으로 처리
        return disableDeck = false;
    }

    setTimeout(()=>{ // 서로 다른 카드를 클릭 했을시 흔들림 이벤트 생성
        cardOne.classList.add("shake");
        cardTwo.classList.add("shake");
    }, 400);

    setTimeout(()=>{      
        cardOne.classList.remove("shake","flip");
        cardTwo.classList.remove("shake","flip");
        cardOne = cardTwo = ""; // 이벤트가 끝난 카드는 공백으로 처리
        disableDeck = false;
    }, 1200);
}

function shuffleCard() {
    //16개 항목의 배열을 만들고 각 항목을 두 번 반복하게 한다.
    matchedCrad = 0;
    cardOne = cardTwo = "";
    disableDeck = false;
    let arr = [1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8];
    // 임의적으로 배열 항목을 정렬하여 카트를 섞어 준다.
    arr.sort(()=>Math.random() > 0.5 ? 1 : -1);

    cards.forEach((card, index) => {
        card.classList.remove("flip");
        let ImgTag = card.querySelector("img");
        ImgTag.src = `img/img-${arr[index]}.png`
        card.addEventListener("click",flipCard);
    })
}

shuffleCard();

02. Card Game

게임을 만들면서 익숙한듯하지만 처음 접해 보았던 함수가 있었습니다. 같은 카드가 매치되었을 때 해당 카드의 게임을 더 이상 진행할 수 없게 하기 위해 removeEventListener()를 사용하였는데 앞서 만들어 보았던 게임들은 대부분이 addEventListener()를 했기 때문이었습니다. removeEventListener()를 알게 되었고 해당

메서드를 통해서 정확하게 같은 카드가 매치되었을 경우 선언됐던 이벤트를 지워주는 addEventListener()를 선언해 주어 더 이상 해당 카드를 클릭하지 못하게 해주었습니다. 16개 항목의 배열을 만들고 각 항목을 두 번 반복하게 하였으며, sort() 메서드를 통해서 임의적으로 배열 항목을 정렬하며 카트를 섞어 주었습니다.

정렬된 배열을 선언하고 sort() 선언하며 삼 항 연산자를 통해 조건을 선연하여 임의적으로 배열 항목을 정렬하게 하여 카드 위치를 뒤섞일 수 있도록 하였으며 모든 카드들이 같은 모양으로 매칭이 되면 게임이 종료됩니다 시간제한은 없으며 같은 카드가 매칭될 때까지 게임은 계속 진행됩니다.

#addEventListener()
#removeEventListener()
sort()


// 단어 불러오기
function getWords(){
  axios
    .get("https://random-word-api.herokuapp.com/word?number=100")
    .then(function (response){
      response.data.forEach((word) =>{
        if (word.length < 10){
          words.push(word);
        }
      });
      buttonChange("게임시작");
      console.log(words);
      // handle success
    })
    .catch(function (error){
      // handle error
      console.log(error);
    });
}

// 단어 일치 체크
function checkMatch(){
  if (wordInput.value.toLowerCase() === wordDisplay.innerText.toLowerCase()){
    wordInput.value = "";
    if (!isPlaying){
      return;
    }
    score++;
    scoreDisplay.innerText = score;
    time = GAME_TIME;
    const randomIndex = Math.floor(Math.random() * words.length);
    wordDisplay.innerText = words[randomIndex];
  }
}

03. Typing

이번 게임은 수많은 단어들을 제공 받아야 했습니다. 모듈화된 파일을 import하여 가져와 단어를 제공할 수 도 있었지만 플러그인중 Axios의 get 방식을 통하여 100여가지 단어들을 제공 받을수 있었고, random word api라는 곳에서 오픈API를 제공받아 적용할 수 있었습니다. 이를 통해 Axios로 서버와 통신할 수 있다라는 사실을 배우게 되었습니다.

Axios로 제공된 파일을 랜덤하게 나타내기 위해서 Math.random() 메서드를 사용하였고 단어 배열의 곱하기를 해주면 실수로 값이 나타나기 때문에 Math.floor()해당 단어들을 정수로 변환을 해주어야 했습니다. 대소문자 구분없이 즐길수 있게 하기 위해서 toLowerCase() 메서드를 사용하여 대소 문자 구분없이 게임을 즐기실수 있습니다.

해당 게임을 작업하며 Axios 플러그인으로 외부 서버와 통신할 수 있다는 사실을 알게되어 매우 흥미로웠습니다. 모듈화를 통한 단어를 제공하여 게임을 제작 할수도 있었지만 Axios 플러그인으로 외부서버에서 제공받은 API로인해 Javascript의 파일 용량을 그만큼 줄일 수 있다는 장점을 알게 되었으며, 문서가 줄어들 수록 오류가 줄어든다는 장점도 알 수 있었습니다.

#Axios
#Get
#Math.random()
#Math.floor()
#toLowerCase()


function checkStatus() {
    const currenList = [...container.children];
    const unMatchedList = currenList.filter(
      //필터는 조건에 만족하는 el만을 리턴
      (child, index) => Number(child.getAttribute("data-index")) !== index
    );
    //매치가 다 되었다면 타일의 위치값이 원래 위치값과 같아지게 된다면 게임을 종료하게됨
    if (unMatchedList.length === 0) {
      gameText.style.display = "block";
      isPlaying = false;
      clearInterval(timeInterval);
    }
  }

function setGame() {
    isPlaying = true;
    time = 0;
    container.innerHTML = "";
    gameText.style.display = "none";
    clearInterval(timeInterval);
  
    tiles = creatImageTiles();
    // 매서드를 호출하면 함수가 실행되고 결과물이 리턴 되면서 해당값이 tiles에 담기게됨
    // 타일을 랜덤하게 생성하는 조건식
    tiles.forEach((tile) => container.appendChild(tile));
    setTimeout(() => {
      container.innerHTML = "";
      shuffle(tiles).forEach((tile) => container.appendChild(tile));
      timeInterval = setInterval(() => {
        playTime.innerText = time;
        time++;
      }, 1000);
    }, 5000);
    // 인자를 하나만 사용하면 괄호 또한 생략할 수 있으며 한줄인 경우에는 중괄호도 생략가능하다
}

function creatImageTiles() {
    const tempArray = [];
    Array(tileCount)
      .fill()
      .forEach((_, i) => {
        const li = document.createElement("li");
        //createElement를통해 li에 16개의 타일을 만들어 ul에 반환한다.
        li.setAttribute("data-index", i);
        li.setAttribute("draggable", "true"); //드래그를 계속할시 멈춤을 방지하는 조건
        li.classList.add(`list${i}`); //템플릿을 사용하면 문자열과 변수를 함께사용할 수 있다
  
        tempArray.push(li);
        // 생성된 li가 하나씩 tempArray배열 안에 담기도록 해준다
      });
    return tempArray;
    //배열을 반환하여 다시 담기도록 함수 생성
}

04. Puzzle

이번 퍼즐 게임을 통해서 자바스크립트의 createElement() 메서드를 사용하면 html에 요소를 반환할 수 있다는 사실을 알게 되었고 createElement() 메서드 의의 사용성에 대해서 배우게 되는 계기가 되었습니다. 또 이벤트가 발생하는 걸 막기 위해 preventDefault()

메서드를 사용하는 것을 보았고 해당 메서드가 궁금해서 공부를 하게 되었으며 preventDefault() 메서드를 사용하면 대표적으로 a 태그의 이벤트나 submit 태그를 클릭했을 때 새로고침 이벤트 발생을 차단할 수 있다는 걸 알게 되었습니다.

이번 게임도 마찬가지로 타일을 랜덤하게 뒤섞이게 하기위해 Math.random() 메서드를 사용하였으며 16개의 타일을 생성하기위해 createElement()사용하여 Html에 li태크 요소를 반환하였고, 타일의 순서를 섞기 위해서 2개의 배열 원소를 선택하여 순서를 바꾸어 주었습니다.

#createElement()
#preventDefault()
#submit
#Math.random()

CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT

CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT CONTACT