Map

배열을 순회하며 지정된 콜백 함수를 적용하여 각 요소를 변환하고, 그 변환된 값을 모아서 새로운 배열로 반환하는 역할을 수행합니다.

 

기본구문

arr.map(function(currentValue[, index[, array]]) {
    // 변환(mapping)할 로직: 변환된 결과를 반환해야 합니다.
}[, thisArg]);
function
각 배열 요소에 적용될 때 호출되는 콜백함수
  • currentValue (필수): 처리할 현재 요소. 이 매개변수를 통해 현재 요소에 접근할 수 있습니다.
  • index (옵션): 처리할 현재 요소의 인덱스. 이 매개변수를 사용하여 현재 요소의 인덱스에 접근할 수 있습니다.
  • array (옵션): map() 함수를 호출한 배열. 이 매개변수를 사용하여 원본 배열에 접근할 수 있습니다.
thisArg
function을 실행할 때 this로 사용할 객체. 이 매개변수는 필요에 따라 사용됩니다.

 

반환값

배열의 각 요소에 대해 실행한 function의 결과를 모은 새로운 배열을 반환합니다.

 

 

 


 

예제

해당 배열이 있을 때 각 요소에 곱하기 5를 해보자

let arr = [3, 4, 5, 6];

 

 

for문

for(let i = 0; i < arr.length; i++){
	arr[i] = arr[i]*3; 
}
console.log(arr); // [15, 20, 25, 30]

 

map()

각 배열에 있는 요소를 순회하며 매핑해준 값을 반환한다. 일반적으로 특정 숫자를 곱하거나, 애플리케이션에 필요한 다른 작업을 수행하는 등 요소에 어떤 변경 사항을 적용하는 데 사용된다고 한다.

let arr_map = arr.map((element, index) => element * 5 );

console.log(arr_map); // [ 15, 20, 25, 30 ]

 

 

 


 

map() 함수의 장점

  • 각 배열 요소를 변환하여 새로운 배열을 반환합니다.
  • 반환된 배열은 원본 배열과 길이가 같고, 각 요소는 변환된 값으로 구성됩니다.
  • 변환 작업을 통해 새로운 배열을 생성하기 때문에 원본 배열은 변경되지 않습니다.

 

map() 함수의 단점

  • 새로운 배열을 생성하는 과정에서 메모리를 사용하므로, 큰 크기의 배열에 대해서는 성능 이슈가 있을 수 있습니다.

 


 

 

✏️ 예제

function solution(arr, n) {
    var answer = [];
    
    if(arr.length % 2 === 1){
        return arr.map((element, index) => index % 2 == 0 ? element + n : element);
    }else{
        return arr.map((element, index) => index % 2 == 1 ? element + n : element);
    }
}

 

정수 배열 arr과 정수 n이 매개변수, arr의 길이가 홀수라면 arr의 모든 짝수 인덱스 위치에 n을 더한 배열을, 

arr의 길이가 짝수라면 arr의 모든 홀수 인덱스 위치에 n을 더한 배열을 return 하는 함수

 

코드를 자연어 그대로 나열하자면 아래와 같다.

if()문으로 배열의 길이가 홀수라면 / 반환한다 / 배열을 순회해서 / 인덱스가 짝수라면(홀수라면) / 각 요소에 + n / + n

 

//n = 27
//arr = [49, 12, 100, 276, 33]

입력값 〉[49, 12, 100, 276, 33], 27
기댓값 〉[76, 12, 127, 276, 60]

 

 


 

 

const myMap = new Map(); //맵 생성
myMap.set('one',1);
myMap.set('two',2);
myMap.set('three',3);

//반복을 위한 method -> keys, values, entries
for(const key of myMap.keys()){
    console.log(key);
}

// 결과
// one
// two
// three


for(const value of myMap.values()){
    console.log(value);
}

// 결과
// 1
// 2
// 3

for(const entries of myMap.entries()){
    console.log(entries);
}

// 결과
// ['one', 1]
// ['two', 2]
// ['three', 3]

 

반복을 위한 메소드로는 keys, values, entries가 있다.

Map 을 순회할 때는 for .. of 를 쓰거나 forEach문을 쓰면된다.

forEach 구문을 사용할 때에는 Key와 Value의 순서가 반대라는 것만 기억하면 된다.

for (let [key, val] of testmap.entries()) {
  console.log(key, ':', val); // 1:123, 2:345, 3: 789
}

for (let [key, val] of testmap) {
  console.log(key, ':', val);
}

testmap.forEach((val, key) => {
  console.log(key, ':', val);
})

 

 

Set

고유한 값을 저장하는 자료구조로 값만 저장하며 Key값은 저장되지 않는다.

값이 중복되지 않는 유일한 요소이다.

const mySet = new Set();
mySet.add('value1'); //key X value O
mySet.add('value2');
mySet.add('value2');

console.log(mySet);

 

중복되는 값은 저장되지 않으므로 결과로는 Set(2) { 'value1', 'value2' } 이 출력된다.

 

 

 

 


🚩 영화 검색 사이트 구현

 

Getting Started

Welcome to version 3 of The Movie Database (TMDB) API. This is where you will find the definitive list of currently available methods for our movie, tv, actor and image API.

developer.themoviedb.org


 

✅  필수 사항

1. jQuery 라이브러리 사용없이 순수 바닐라 자바스크립트 사용하기

2. TMDB 오픈 API를 이용하여 인기영화 데이터 가져오기

3. 영화정보 카드 리스트 UI 구현

- 카드에는 title(제목), overview(내용 요약), poster_path(포스터 이미지 경로), vote_average(평점) 이렇게 4가지 정보가 필수

- 카드 클릭 시에는 클릭한 영화 id 를 나타내는 alert 창을 띄우기

 

4. 영화 검색 UI 구현

5. Javascript 문법 요소를 이용하여 구현

- const와 let만을 이용한 변수 선언 필수

- 화살표 함수

- 배열 메소드 : 하기 예시 중 2개 이상 사용

  • forEach
  • map
  • filter
  • reduce
  • find

- DOM 제어하기 : 아래 api 목록 중 2개 이상 사용하기

document.createElement(tagName) //새로운 HTML 요소를 생성합니다.
document.getElementById(id) //id 속성을 기준으로 요소를 선택합니다.
document.getElementsByTagName(name) //태그 이름을 기준으로 요소를 선택합니다.
document.getElementsByClassName(name) //클래스 이름을 기준으로 요소를 선택합니다.
document.querySelector(selector) //CSS 선택자를 이용하여 요소를 선택합니다.
document.querySelectorAll(selector) //CSS 선택자를 이용하여 모든 요소를 선택합니다.
element.innerHTML //해당 요소 내부의 HTML 코드를 변경합니다.
element.textContent //해당 요소 내부의 텍스트를 변경합니다.
element.setAttribute(attr, value) //해당 요소의 속성 값을 변경합니다.
element.getAttribute(attr) //해당 요소의 속성 값을 가져옵니다.
element.style.property //해당 요소의 스타일 값을 변경합니다.
element.appendChild(child) //해당 요소의 하위 요소로 child를 추가합니다.
element.removeChild(child) //해당 요소의 하위 요소 중 child를 삭제합니다.
element.classList.add(class) //해당 요소의 클래스에 새로운 클래스를 추가합니다.
element.classList.remove(class) //해당 요소의 클래스 중에서 특정 클래스를 제거합니다.
element.classList.toggle(class) //해당 요소의 클래스 중에서 특정 클래스를 추가 또는 제거합니다.
element.addEventListener(type, listener) //해당 요소에서 이벤트가 발생했을 때 호출할 함수를 등록합니다.
element.removeEventListener(type, listener) //해당 요소에서 등록된 함수를 제거합니다.
event.preventDefault() //이벤트가 발생했을 때 기본 동작을 취소합니다.
event.stopPropagation() //이벤트의 버블링을 방지하기 위해 이벤트 전파를 중지합니다.
window.location.href //현재 페이지의 URL을 가져옵니다.
window.alert(message) //경고 메시지를 출력합니다.
window.confirm(message) //확인 메시지를 출력하고 사용자의 답변에 따라 Boolean 값을 반환합니다.

 


 

 

 

TMDB api key 생성

 

2. pick a language 에서 javascript 선택 후 토큰 입력하기

 

3.  코드에 내 토큰을 적용하고 Try it! (꼭 Success 를 확인하고 내 코드로 옮겨주세요!)

 

+ 아차 인기 영화 데이터를 가져와야하니까 Top Rated 선택!  

 

 

 

 

📌 동기와 비동기

동기(synchronous)란, 어떤 작업을 실행할 때 그 작업이 끝나기를 기다리는 방식을 의미한다. 
즉, 작업이 완료될 때까지 다음 코드의 실행을 멈추고 기다리는 것이다. 이러한 방식은 작업의 순서를 보장하고, 
작업이 끝날 때까지 결과를 기다리는 것이 가능하다.
비동기(asynchronous)란, 어떤 작업을 실행할 때 그 작업이 완료되지 않더라도 다음 코드를 실행하는 방식을 의미한다.
즉, 작업이 완료되지 않았더라도 결과를 기다리지 않고 다음 코드를 실행하는 것이다. 
이러한 방식은 작업이 오래 걸리는 경우 시간을 절약하고, 병렬적인 작업 처리가 가능하다. 
동기 방식으로 파일을 읽는다면 파일을 읽기 시작한 이후에 다음 코드를 실행하지 않고 파일이 읽혀지기를 기다린다. 
반면에 비동기 방식으로 파일을 읽는다면 파일을 읽는 작업이 실행되는 동안 다른 작업을 수행할 수 있다.

 

 

 

✅  비동기 처리가 필요한 이유

1. 웹페이지의 기능성 향상

- 사용자가 요청한 작업이 완료될 때까지 기다리는 것은 사용자 경험을 저해 시킨다.

따라서, 비동기 처리를 통해 사용자 경험을 빠르게 처리해야한다.

 

2. 네트워크 통신

- 동기적인 처리를 하게 되면 응답을 기다리는 동안 다른 작업을 수행할 수 없기 때문에 웹 페이지의 반응성이 떨어질 수 있다.

따라서, 비동기적으로 데이터를 받아오는 것이 웹 페이지의 성능을 향상시키는데 도움이 된다.

 

3. 병렬 처리

- 비동기 처리를 통해 여러 작업을 동시에 처리할 수 있다. 이를 통해 시간이 오래 걸리는 작업을 병렬적으로 처리할 수 있으며, 결과적으로 전체 작업 시간을 단축시킨다.

 

4. 에러 처리

- 비동기적으로 처리할 때 에러가 발생하면, 해당 에러를 쉽게 처리할 수 있다. 에러 발생 시, 에러를 처리할 수 있는 콜백 함수를 실행하거나, 에러를 캐치하여 처리할 수 있어 프로그램의 안정성을 높일 수 있다.

 

 

 


 

 

📌 async 와 await

async와 await는 ES2017(ECMAScript 8)부터 추가된 자바스크립트의 비동기 처리 방식 중 하나이다. 
async와 await를 사용하면 비동기 코드를 동기 코드처럼 작성할 수 있어, 가독성이 좋아지고 에러 처리가 간단해진다.

 

 

async는 함수의 앞에 붙여서 해당 함수가 비동기 함수임을 나타내며, await는 비동기 함수의 실행 결과를 기다리는 키워드이다.

async 함수 안에서 await 키워드를 사용하면, 해당 비동기 작업이 완료될 때까지 코드 실행을 일시 중지하고 결과를 기다린 다음,

해당 결과를 반환한다.

 

 

async function 함수명() {
  await 비동기_처리_메서드_명();
}

 

먼저 함수의 앞에 async 라는 예약어를 붙인다. 그러고 나서 함수의 내부 로직 중 HTTP 통신을 하는 비동기 처리 코드 앞에 await를 붙인다. 여기서 주의해야 할 점은 비동기 처리 메서드가 꼭 프로미스 객체를 반환해야 await가 의도한 대로 동작한다는 것이다.

일반적으로 await의 대상이 되는 비동기 처리 코드는 Axios 등 프로미스를 반환하는 API 호출 함수이다.

 

 

🦴 와이어 프레임이란?

간단한 모양만으로 인터페이스를 시각적으로 묘사한 것이다.

와이어프레임은 페이지 요소의 구성방식, 페이지에 표시될 내용, 인터페이스의 작동 방식 을 설명하는데 사용된다.

 


 

 

와이어 프레임은 프로젝트 개발에서 매우 중요한 과정 중 하나이다. 어떤 레이아웃에 따라 구성할 것인지 

포함되는 주요 기능은 무엇인지 등을 최대한 단순하게 확인하고 의견을 나눌 수 있는 기준이 된다.

 

회사에 다닐 때는 웹 디자이너분이 피그마로 와이어 프레임 + 디자인까지 전달해주셔서 직접하는 일은 없었는데

캠프를 시작하면서 팀플 첫 작업이 와이어 프레임이었다. 나름 찾아보면서 작업했는데 매 프로젝트를 진행하면서

더 섬세하고 구체화할 수 있을 것 같다.

 

 


 

 

 

✅ 와이어 프레임 기본 양식

 

1. 타이틀

화면의 제목과 url, id를 입력한다. 그리고 버전이 달라지면 구분하기 위해 버전을 기재한다.

 

2. 시각화

콘텐츠, 버튼과 같이 실제 화면에 필요한 구성 요소를 그린다. 

 

3. 설명

정적 화면으로 버튼인지 단순 텍스트인지 확인하기 어렵다. 때문에 설명을 상세히 적어야 하는데 화면에 번호를 표시하거나

표시한 번호에 화면에 대한 설명을 적는 것이 필요하다.

 

 


 

 

🧚🏻 팀 프로젝트 : '개발참십조' 팀원 소개

https://www.figma.com/file/ErtFcnwvxa2B0cvEdN28RG/Untitled?type=design&node-id=0%3A1&mode=design&t=BUIlltmifYRaz2ZW-1

 

Figma

Created with Figma

www.figma.com

 

 

☝🏻 와이어 프레임 작성

팀원 소개 웹페이지는 인스타그램 레이아웃과 유사하게 작업했다. 메인페이지에는 팀별 목표와 우리 팀만의 특징이 프로필 텍스트로 들어가도록하고, 소통하는 방법은 하이라이트 스토리 디자인으로 작업해서 넣었다

 

피드에는 팀원들 사진을 넣고 사진 마다 해당하는 팀원의 상세페이지로 이동하도록 구상해봤다.

상세 페이지에 팀원의 설명과 블로그 주소, 깃허브, 이메일 주소 자신에 대한 설명과 TMI(?) 내용을 넣기로 했다.

 

또, CRUD가 들어가도 된다고해서 방명록 기능을 추가했다

각 팀원 상세페이지 하단에 고정된 섹션으로 배치하기로 했다 팀원들과 이야기하며 프레임을 짰는데

역시 집단 지성이 좋다..👍

 

 

 

 

팀원을 소개하는 미니 프로젝트 중 좋아요 기능을 도맡아(?) 나름 머리 굴려가며 구현 중이다.

하트를 눌렀을 때 색이 채워지고 아래 카운트가 증가한다.

 

 

 


✏️ 구현하고 싶은 기능

  • 하트 클릭시 색 채워지기
  • 동시에 카운트 증가
  • 하트를 다시한번 누르면 디폴트로 돌아가고 카운트 감소
  • 카운트 누적 ❎

 

index.html

<ul class="icon-tab">
    <li>
    <!--❤️ 하트 svg-->
        <button id="likebtn" class="feed-icon-btn" value="좋아요" onclick="like()">
            <svg xmlns="http://www.w3.org/2000/svg" fill="#ffffff" stroke="black" width="60px"
                height="50px" fill="currentColor" class="bi-heart-fill feed-icon like-default"
                viewBox="0 -0.5 17 17">
                <path fill-rule="evenodd"
                    d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314" />
            </svg>
        </button>
    </li>
    <li>
        <a href="#">
        <!--말풍선 svg-->
            <svg height="45px" width="45px" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg"
                xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 473 473" xml:space="preserve"
                transform="matrix(-1, 0, 0, 1, 0, 0)">
                <g id="SVGRepo_bgCarrier" stroke-width="0"></g>
                <g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g>
                <g id="SVGRepo_iconCarrier">
                    <g>
                        <g>
                            <path
                                d="M403.581,69.3c-44.7-44.7-104-69.3-167.2-69.3s-122.5,24.6-167.2,69.3c-86.4,86.4-92.4,224.7-14.9,318 c-7.6,15.3-19.8,33.1-37.9,42c-8.7,4.3-13.6,13.6-12.1,23.2s8.9,17.1,18.5,18.6c4.5,0.7,10.9,1.4,18.7,1.4 c20.9,0,51.7-4.9,83.2-27.6c35.1,18.9,73.5,28.1,111.6,28.1c61.2,0,121.8-23.7,167.4-69.3c44.7-44.7,69.3-104,69.3-167.2 S448.281,114,403.581,69.3z M384.481,384.6c-67.5,67.5-172,80.9-254.2,32.6c-5.4-3.2-12.1-2.2-16.4,2.1c-0.4,0.2-0.8,0.5-1.1,0.8 c-27.1,21-53.7,25.4-71.3,25.4h-0.1c20.3-14.8,33.1-36.8,40.6-53.9c1.2-2.9,1.4-5.9,0.7-8.7c-0.3-2.7-1.4-5.4-3.3-7.6 c-73.2-82.7-69.4-208.7,8.8-286.9c81.7-81.7,214.6-81.7,296.2,0C466.181,170.1,466.181,302.9,384.481,384.6z">
                            </path>
                        </g>
                    </g>
                </g>
            </svg>
        </a>
    </li>
    <li>
    <!--북마크 svg-->
        <svg fill="#000000" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
            <g id="SVGRepo_bgCarrier" stroke-width="0"></g>
            <g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g>
            <g id="SVGRepo_iconCarrier">
                <path d="M416,480,256,357.41,96,480V32H416Z">
                </path>
            </g>
        </svg>
    </li>
    <!--좋아요 수 카운트-->
    <li class="cboth"><b id="likeCount">0</b>명이 좋아합니다.</li>
</ul>

 

 

 

 

script.js

function like() {
    const likebtn = document.getElementById('likebtn');
    const likePath = likebtn.getElementsByTagName('path')[0];

    const likeCount = document.getElementById("likeCount");
    let num = likeCount.innerText; //화면에 표시된 좋아요 값

    console.log("Like Button Clicked.")
}

 

먼저 좋아요 버튼을 눌렀을 때 실행하는 함수 like()를 만들어

버튼을 눌렀을 때 정상적으로 작동하는지 콘솔에서 확인해 보았다

 

제대로 작동하는지 확인 완료

 

 

 

/* 좋아요 toggle */
function like() {
    const likebtn = document.getElementById('likebtn');
    const likePath = likebtn.getElementsByTagName('path')[0];

    const likeCount = document.getElementById("likeCount");
    let num = likeCount.innerText; //화면에 표시된 좋아요 값

    console.log("Like Button Clicked.")


    if (likebtn.classList.contains('like-default')) {
        likebtn.classList.remove('like-default');
        likebtn.classList.add('like-active');
        likePath.setAttribute('fill', '#ffffff');
        likePath.setAttribute('stroke', '#000000');

        /* 좋아요 카운트 취소 */
        num = Math.floor(num) - 1;
        likeCount.innerText = num;

    } else {
        likebtn.classList.remove('like-active');
        likebtn.classList.add('like-default');
        likePath.setAttribute('fill', 'rgb(217,57,73)');
        likePath.setAttribute('stroke', 'rgb(217,57,73)');

        /* 좋아요 카운트 누적 */
        num = Math.floor(num) + 1;
        likeCount.innerText = num;
    }
}

 

좋아요를 눌렀을 때 like-active 클래스를 추가해 svg에 fill이 채워지고 좋아요 카운트 +1 

다시 좋아요 버튼을 눌렀을 땐 fill이 default값으로 되돌아오도록 하고 카운트는 -1 되도록 구현했다.

 

 

 

 

우여곡절 끝에 기본 완성했지만 서버를 활용해 카운트가 누적되는 것은 아직 구현하지 못했다.

firebase를 사용해서 하려고 하는데 아직 데이터 감은 좀처럼 잡기가 힘들다.

좋아요 기능은 아묻따 꼭 만들어보고싶다. 다시한번 머리 굴리러 가보자..

 

📌 깃허브

깃허브는 소프트웨어 개발 프로젝트를 위한 소스코드 관리서비스(원격 저장소) 입니다.

함께 개발한 소스코드를 백업/공유/협업할 때 유용하게 쓰입니다.

 

[Git] : 코드 변경 기록점 (버전 관리 도구), 소프트웨어의 변경 사항을 체계적으로 추적하고 통제하는 것

[Github] : 백업, 공유, 협업 (온라인 코드 저장소)

 

 

 


 

 

🔗 https://github.com/

 

GitHub: Let’s build from here

GitHub is where over 100 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and fea...

github.com

 

 

 

 

 


 

✏️ Git 명령어 모음

> git init
코드 관리를 시작하는 명령어

init : initialize (초기화하다, 초기 세팅)
프로젝트 시작 전 딱 한번 실행, 각 프로젝트마다 실행
> git add .
> git commit -m "message"
코드를 저장하는 명령어

git add : 저장하기 전 저장할 파일 지정
git commit -m : 실제로 저장
>  git push origin <브랜치명>
코드를 git으로 내보내는 명령어
> git pull origin <브랜치명>
다른 사람이 변경한 코드를 가져오는 명령어

※ git push를 했는데 코드가 내보내지지 않고 ![rejected] ~~ 오류가 뜬다면 힌트를 확인해보자!

※ 3번째 hint에 git pull ~ 을 참고하면 된다
※ 내보내기전에 코드를 먼저 가져오쇼 라고한다

 

> git log
저장 내역을 확인하는 명령어

 

 


 

 

 

🤓 Github 사용해보자!

  1. 온라인 저장소 만들기
  2. 내 코드 저장소에 올리기
  3. 협업하기

 


 

 

1. 깃허브에 로그인한 후(https://github.com/) New 를 눌러 Repository(저장소)를 생성해주세요.

 

 

2. 저장소 이름을 적고 아래 Create repository 클릭 후 저장소 생성 확인

 

 

3. ... or push ~ 명령어 복사 후 터미널에 붙여넣기

 

4.  터미널에 복사 붙여넣기

 

 

5. git push origin 브랜치명(main) 명령어로 저장소에 내 코드 업로드

 

 

6. 업로드된 코드 확인

'Git & Github' 카테고리의 다른 글

[Github] git Branch 이해하기  (0) 2024.05.07

오조오억년만에 더클라임에 방문했다!

작년 일산 더클이후로 처음이다 오늘은 강남점으로 갔는데 더클라임 중에서 제일 작다고 한다.

퇴사한 후로 평일 낮클이란걸 해봤는데 이거 뭐.. 사람도 없고.. 풀고싶은 문제도 쉽게 풀고.. 개꿀인걸..?

항상 퇴근 후에 무거운 몸 질질 끌며 운동갔던데 엊그제 같은데 평일 낮클이라니,, 행복 그자체다

 

더클라임에서 항상 파랑 문제만 풀었는데 오늘 처음으로 빨강을 풀었다!!

내 생애 첫 빨강이다! 테이프 색에 연연하지 말라고들 하지만 어쩔수 없이 .. 집착하게 되는걸 어떡해요 ㅠ

 

더클라임 강남점

 

소현님은 수빈이 크루분인데 어이없게도 수빈이랑은 안하고 나랑만 클라이밍 하신다..

각자 크루가 있는데 서로 지인의 지인끼리 하는게 넘 웃겨 ㅋㅋ

소현님을 알게된지는 얼마 안됐지만 뭔가.. 의지가 되고.. 나이스 한마디에 못풀던 문제도 다 깰 수 있을 것 같은 느낌..

그래서 소현님이랑 오래오래 하고 싶었는데.. 4월 중으로 호주로 어학연수를 떠나시게 됐다.. 흐엉

 

흐엉 가지마세요 ㅠ_ㅠ 다음 종로 피커스를 기약했지만.. 그래도 오래 보고 싶다규요 ㅜㅜ

 

 

 

내가 푼 첫 빨강이다!!

근데 이거 영상 올리기가 너무 힘들다.. 20mb는 넘 심한거 아니오..

매번 이렇게 올릴 수는 없고.. 좀 더 쉬운 방법을 강구해봐야겠다

 

 

 

이것을 먹기 위해 클라이밍을 한 건 아니지만.. 운동하고 먹는 맥주가 그르케 맛있자나요?

생맥 두잔 후딱 마시고 헤어졌다 ㅎㅎ

오늘은 성과가 있는 날! 무엇인가 바라던걸 이루면 그 뿌듯함과 짜릿함은 길고

그로 인해 원동력이 된다. 다치지말고 오래오래 보자 홀드들아🧗🏻

 

 

https://www.instagram.com/eeeclimb/

'클친놈이 되보자' 카테고리의 다른 글

파랑 정체기  (0) 2024.03.11

클라이밍을 시작한지 어언 1년이 지났다.

이렇게 한 운동을 길게하기는 또 처음이다. 

 

초반엔 기록을 꾸준히 해왔지만 파랑 정체기가 된 이후론 영상도 올리기 쉽지않다.

다이나믹 무브를 꿈꾸는 클린이에겐.. 파랑 무브는 너무.. 찌밥같다고..(?)

 

서울숲클라이밍 - 종로점

 

종로숲 처음 방문한날 ~~! 서울숲클라이밍장은 뚝섬이랑 영등포점밖에 안가봤는데 종로점도 괜찮은 것 같다

뚝섬이 젤 작은듯.. 종로숲도 영등포 못지하게 넘나 컸삼.. 트레이닝 존도 너무 잘되어있고

넓은 만큼 문제 수도 많아서 벽에 붙는게 크럭스일 일은 없을 것 같다!  오픈 이벤트때 못가서 티 못받은게 너무나 아쉽다..

 

 

대회문제 세팅이 아직 안바뀐 상태라서 새벽에만 거의 붙어있었다 근데 파랑밖에 못풀고 남색은.. 탑전에 떨어지기..

남색의 벽이 너무 높아.. 흐엉 ㅠㅠ

 

귀요미들

 

얼레벌레 학교 언니 오빠들이랑 연락이 닿아 클라이밍하기 위해 두번째 만남 🩵

선민언니가 강습받더니 무서운 속도로 치고 올라오고 있어서 긴장만(?)하는 중 

나도 얼른 성장해야하는데~~~~! 그게 쉽냐고요~~~~~~!

'클친놈이 되보자' 카테고리의 다른 글

소현님과 함께라면 난 빨클러🍎❤️🐙  (2) 2024.03.19

+ Recent posts