블로그

Rach

[인프런 워밍업 스터디 클럽 4기_FE] 1주차 발자국

🎯 지원 동기개인적으로 GYM코딩의 강의를 선호해왔습니다. 그 이유는 공식 문서를 기반으로 강의가 구성되어 있어서, 강의를 수강하면 마치 공식 문서를 한 번 훑은 듯한 느낌을 받을 수 있기 때문입니다. 부족한 부분은 공식 문서 링크를 통해 추가 실습이 가능해, 이해에 큰 도움이 되었습니다.마침 기다리던 Next.js 강의가 출시되었고, 혼자보다는 함께 공부하는 환경이 더 잘 맞는 저에게 인프런 스터디는 좋은 기회였습니다. 예전에 1기를 신청했지만 흐지부지 끝난 경험이 있었기에, 이번만큼은 꼭 완강하고 싶다는 다짐으로 참여하게 되었습니다. 📚 1주차 학습 내용✔ 웹 렌더링 방식CSR (Client Side Rendering)SSR (Server Side Rendering)SSG (Static Site Generation)ISR (Incremental Static Regeneration)SPA (Single Page Application)Next.js 강의를 이전에도 들어본 적이 있었지만, ISR에 대해 명확히 이해하지 못했었습니다. 이번 강의를 통해 Next.js의 장점과 인기 이유를 다시금 체감할 수 있었고, 각 렌더링 방식의 특징과 장단점을 정리하는 데 큰 도움이 되었습니다.프로젝트에서 기술 스택을 선택할 때 “무조건 Next.js”보다는, “어떤 상황에서 Next.js가 적합한지”를 설명할 수 있는 시야가 생겼습니다. 짐코딩의 정리 사이트도 굉장히 유용했습니다. ✔ Cursor AI 소개Cursor AI는파일 기반 질문버그 설명 및 수정 제안테스트 코드 자동 작성커밋 메시지 및 PR 요약 생성등 다양한 기능을 지원합니다. 고민 시간을 확 줄여주는 훌륭한 도구였고, 환경 설정에 대한 이해도 함께 깊어졌습니다.회사 동료의 추천으로 처음에는 ChatGPT를 사용했지만, 이후 Cursor AI의 2주 체험을 통해 정말 편리하다는 걸 체감했습니다.“이렇게까지 잘되면 앞으로 신입 개발자가 필요할까?” 하는 생각이 들 만큼 강력했습니다.하지만 오히려 신입 입장에서 Cursor는 선임처럼 함께 하며 코드 피드백을 받고 질문할 수 있는 좋은 파트너가 될 수도 있다는 생각도 들었습니다. 앞으로도 적극적으로 활용할 예정입니다. ✔ Next.js 프로젝트 구성이번 주말엔 결혼식과 개인 약속들로 강의를 완전히 소화하지 못했습니다. 내일은 꼭 칼퇴 후 수강하고 미션을 마무리 지으려 합니다.비록 6월은 가장 바쁜 달이지만, “조금이라도 공부하자”는 마음으로 신청했기에 초심을 잃지 않도록 스스로 다잡고 있습니다. 다행히 다음 주엔 공휴일도 있으니, 시간을 잘 활용해서 진도를 최대한 앞당기고 밀리지 않도록 해야겠습니다. 🔄 회고 (Keep / Problem / Try)Keep: 퇴근 후 책상에 앉기, 단 30분이라도 시작하는 습관 들이기Problem: 개인 일정이 많아 공부 시간이 부족했던 점Try: 할 일을 다 마치지 않았다면 침대에 눕지 말고 책상에 앉기  ✍ 마무리이번 주는 모든 과제를 완료하지 못했지만, 다음 주에는 반드시 모든 미션을 수행하고 2주차를 잘 마무리하겠습니다.강의를 들으면서 생긴 궁금점이나 추가 학습이 필요한 부분은 메모해두었다가 주말에 정리하며 복습할 예정입니다. 마지막 주차엔 꼭 완강하기!스스로를 응원하며, 화이팅!

프론트엔드인프런워밍업클럽워밍업클럽프론트엔드워밍업발자국워밍업스터디클럽

[인프런 워밍업 스터디 클럽 3기 FE] 2주차 발자국

React의 등장 배경 React는 상태(state) 기반으로 UI를 효율적으로 관리하도록 설계된 라이브러리 기존 자바스크립트의 문제점- DOM을 조작하는 방식이 비효율적 - 변경이 필요할때마다 전체 DOM을 다시 그려야 함 - 전체가 아닌 일부 DOM만 변경시키고 싶으면 복잡한 로직이 필요- 상태 관리의 어려움 - 복잡한 UI에서는 DOM과 데이터의 일관성을 유지하기 어려움 - 데이터와 UI가 양방향으로 상호작용하며 예측하기 어려운 상태가 됨➡ 결과적으로 유지보수가 어렵고, 재사용성이 낮음 React의 해결책- 상태(state) 기반 UI 관리 - useState를 통해 UI가 변경될 때만 렌더링 - batching : 상태를 한번에 모아서 처리- 가상 DOM을 사용한 최소한의 업데이트 - 이전 가상돔과 현재 가상돔을 비교해 필요한 부분만 업데이트 (diff) - 불필요한 DOM 조작을 최소화하여 성능 향상- 컴포넌트 단위 개발 - UI를 작은 단위로 분리하여 재사용 가능 - 각 컴포넌트의 생명주기를 관리할 수 있음 리액트 컴포넌트 생명주기컴포넌트가 생성되고 사용되고 소멸될때까지의 일련의 과정- 마운트 -> 업데이트 -> 언마운트 - 마운트: 컴포넌트를 DOM에 삽입 - 업데이트: 컴포넌트의 props나 state가 변경될 때 발생 - 언마운트: 컴포넌트를 DOM에서 제거 클래스형 컴포넌트 - React.Component를 상속받아 사용- 생명주기별로 메서드가 있으며, 각 메서드를 오버라이드 할 수 있음 함수형 컴포넌트 - 생명주기 메서드를 직접 제공하지 않음.- 훅을 사용하여 생명주기와 유사한 기능 구현 훅(Hook)은 함수형 컴포넌트에서 상태(state)와 생명주기(lifecycle) 기능을 사용할 수 있도록 해주는 React 내장 함수훅의 종류 : useEffect, useState, useMemo, useCallback특히 생명주기에 가장 직접적인 영향을 미치는 훅은 useEffect- useEffect(() => {...}, []) : componentDidMount- useEffect(() => {...}, [state]) : componentDidUpdate- useEffect(() => {{return ()=>{...};}, [state]) : componentWillUnmount  리액트 훅 useState컴포넌트의 상태(state)를 관리하는 Hook- 함수형 컴포넌트에서 상태를 관리할 수 있도록 함- 상태가 변경되면 해당 컴포넌트가 리렌더링됨- useState로 관리하는 값은 **React 내부에서 관리됨- setState를 호출하면 비동기적으로 업데이트(batch 처리) 됨 - batch 처리란? : 리액트 랜더링 최적화 기법중 하나로, 여러번의 setState()호출이 있을때, 각각 개별적으로 랜더링을 발생시키지 않고 한번만 렌더링 되도록 묶어서 처리 상태란 무엇인가?- 사용자의 응답, api 응답 등에 의해 변경되며, ui를 동적으로 변경시키는 핵심 데이터- 리액트는 useState로 상태를 내부적으로 저장하고, 이 상태가 바뀔때 컴포넌트를 리랜더링한다.  상태의 종류- 로컬상태 : 개별 컴포넌트 내부에서 관리되는 상태- 전역상태 : 여러 컴포넌트가 공유하는 상태- 서버상태 : 서버에서 가져오는 상태- UI상태 : UI관련상태 (모달이 열렸는지, 토글이 열렸는지)  useState와 리액트 생명주기- 초기 렌더링 (mounting) → useState의 초기값 설정- 업데이트 (updating) → setState 호출 시 리렌더링됨- 언마운트 (unmounting) → 상태 해제  useEffect컴포넌트의 부수 효과(side effect)를 관리하는 Hook- 함수형 컴포넌트에서 컴포넌트 생명주기를 관리할때 사용됨- API 호출, 이벤트 리스너 등록, DOM 조작 등 비동기 작업을 처리할 때 사용- useEffect는 렌더링 후 실행되며, 의존성 배열(`deps`)을 통해 실행 조건을 제어 가능- 함수를 리턴할 경우, 언마운트 이후 실행됨useEffect(() => {...}); // 매 렌더링마다 실행 useEffect(() => {...}, []); // 마운트 시 1회 실행 useEffect(() => {...}, [count]); // count가 변경될 때만 실행 useEffect(() => { return () => {...}; }, []); // 언마운트 시 실행  useCallback> 함수를 메모이제이션하여 불필요한 리렌더링을 방지하는 Hook- 함수가 매번 새로 생성되는 것을 방지- React.memo()와 함께 사용하여 최적화 가능 - 상태가 변경되거나 props가 변경되면 리랜더링 발생 - 이때 props로 객체나 함수(참조형)을 넘기게 되는 경우 props는 얕은 복사를 진행하기에 매번 리랜더링을 할 수밖에 없음 이때 메모이제이션을 사용하면 불필요한 랜더링 방지 가능 useCallback과 리액트 생명주기- 컴포넌트가 마운트될 때 초기화됨- 의존성 배열이 변경되면 새로운 함수로 업데이트됨 useRef> DOM 요소에 직접 접근하거나, 값이 유지되지만 리렌더링을 유발하지 않는 변수를 관리하는 Hook- DOM 요소를 직접 조작하는 데 사용- 렌더링 간 유지되는 값을 저장할 때도 사용- 값이 변경되어도 컴포넌트가 리렌더링되지 않음 useRef와 리액트 생명주기- 컴포넌트가 마운트될 때 초기화됨- 리렌더링과 무관하게 값을 유지   

프론트엔드워밍업스터디클럽워밍업스터디클럽리액트

[인프런 워밍업 스터디 클럽 3기 FE] 1주차 발자국

1주차 학습 정리명시적 형변환• Number() - 전달된 값을 숫자로 변환합니다. 정수, 실수 모두 지원하며, 불리언, null, 공백 등도 처리합니다. - 숫자로 변환할 수 없는 문자열(예: "123abc")은 NaN을 반환합니다.• parseInt() - 문자열을 정수로 해석합니다. 문자열의 앞부분부터 숫자를 읽어 정수로 변환합니다. - 두 번째 인수로 진법(보통 10)을 명시하는 것이 좋으며, 변환 불가능한 경우 NaN을 반환합니다.• parseFloat() - 문자열을 부동 소수점 숫자로 해석합니다. - 숫자 앞의 공백은 무시하지만, 숫자 형식이 깨지는 시점에서 파싱을 중단합니다.• String() - 전달된 값을 문자열로 변환합니다. - 객체의 경우 내부적으로 toString()을 호출하며, null과 undefined는 각각 "null", "undefined"로 변환됩니다.• Boolean() - 전달된 값을 불리언(true/false)으로 변환합니다. - 0, NaN, 빈 문자열(""), null, undefined는 false로, 그 외의 값은 true로 변환됩니다.  암시적 형변환• 문자열 결합: + 연산자가 문자열과 다른 타입의 값을 만나면 다른 타입이 문자열로 변환됩니다. (예시: "5" + 5 → "55")• 동등 비교 (==) : 비교하는 두 값의 타입이 다르면 자바스크립트가 암묵적으로 타입을 변환하여 비교합니다. • === (일치비교)는 두 값의 타입이 동일한 경우에만 true를 반환(암묵적 타입 변환 없음) • == (동등비교)는 두 값의 타입이 다르면 암묵적인 형변환을 수행• 불리언 컨텍스트: 조건문이나 논리 연산에서 값이 불리언으로 평가되어 암묵적으로 형변환됩니다.• 산술 연산: - 연산자가 숫자와 다른 타입의 값을 만나면 다른 타입이 숫자로 변환됩니다. (예시: "10" - 2 → 8)  배열, 유사 배열 객체, 이터러블배열 (Array) - Array 생성자나 배열 리터럴([])을 통해 생성된 객체 - 내장 메서드(push, pop, map, filter 등)를 사용할 수 있음 - 프로토타입 체인을 통해 다양한 기능이 제공유사 배열 객체 (Array-like Object) - 인덱스와 length 프로퍼티를 가지고 있지만, Array.prototype에 정의된 메서드를 직접 사용할 수 없는 객체 - 함수 내의 arguments 객체, DOM에서 반환되는 NodeList 등 - Array.from()이나 전개 연산자(...) 등을 사용해 실제 배열로 변환 가능이터러블 (Iterable) - [Symbol.iterator] 메서드를 가지고 있는 객체입니다. - 배열, 문자열, Map, Set 등이 이터러블이며, for...of 문 등으로 순회할 수 있습니다. - for...of 문은 [Symbol.iterator] 메서드 내 next 함수를 호출 const arrayLike = { 0: "a", 1: "b", 2: "c", length: 3 }; const realArray = Array.from(arrayLike); console.log(realArray) // 출력: ["a", "b", "c"] const iterable = { maxData: 5, [Symbol.iterator]: function() { let index = 0; const max = this.maxData; return { next: function() { return index < max ? { value: index++, done: false } : { done: true }; } }; } }; for (const value of iterable) { console.log(value); // 0, 1, 2, 3, 4 출력 } DOM, window, Node• 자바스크립트는 다양한 환경에서 동작하며, 이때 플랫폼을 호스트라고 부름• 브라우저에서는 모든 객체의 최상위에 존재하는 window라는 루트 객체가 있음• 새로운 탭이나 창이 열릴 때 내부적으로 자동 생성됩니다.• window 객체는 DOM, BOM, JS로 구성됩니다. - DOM (문서 객체 모델) • 웹 페이지 내의 모든 콘텐츠를 객체로 나타냅니다. • 최상위 객체는 document이며, DOM의 엔트리 포인트 역할을 합니다. • document의 메서드를 통해 DOM을 선택, 추가, 삭제할 수 있습니다. - BOM (브라우저 객체 모델) • DOM과 JS를 제외하고 호스트가 제공하는 추가 객체들을 나타냅니다 (비표준). - JS (ECMAScript Core) • ECMAScript에 정의된 내장 객체와 함수들이 전역 객체(window)의 프로퍼티로 등록되어 접근 가능합니다.• 전역 변수와 함수는 window 객체의 프로퍼티로 등록되어 전역 스코프를 형성합니다. window ├── document (DOM) ├── documentElement () ├── head (document.head) └── body (document.body) └── ... (노드, 메서드 등) ├── BOM (Browser Object Model) ├── location ├── navigator ├── history ├── screen └── ... (타이머, cookies 등) ├── JavaScript (ECMAScript Core) ├── 기본 객체들 (Object, Array, Function 등) └── 내장 함수 및 프로토타입 └── 기타 Web API ├── fetch, XMLHttpRequest ├── WebSockets ├── Canvas, WebGL 등 └── ... (여러 브라우저 제공 API) 노드 타입 (총 12가지 중 자주 사용되는 4가지)• Document Node: DOM의 진입점 (document)• Element Node: HTML 태그를 나타내며, DOM 트리를 구성함• Text Node: 텍스트(새 줄, 공백 포함)를 나타냄• Comment Node: 주석을 나타내며, 화면에 표시되지는 않지만 정보 기록 및 DOM 조작 시 활용 가능  1주차 과제day1 음식 메뉴 앱day2 가위바위보 앱day3 퀴즈 앱day4 책 리스트 앱day5 깃허브 파인더 앱 

워밍업스터디클럽발자국

공존

[인프런 워밍업 스터디 클럽 1기 BE] 3주차 발자국

학습 내용강의 내용JPA 연관관계1 : 1 관계의 @OneToOneN : 1 관계 - @ManyToOne과 @OneToMany@ManyToOne을 단방향으로만 사용@JoinColumnN : M 관계 - @ManyToMany 연관관계 사용하면 좋은 점각자의 역할에 집중 (= 응집성)새로운 개발자가 코드를 읽을 때 이해하기 쉬워짐.테스트 코드 작성이 쉬워짐. 배포최종 사용자에게 SW를 전달하는 과정  Profile똑같은 서버 코드를 실행시키지만, 실행될 때 설정을 다르게 하고 싶을때 사용 git코드를 쉽게 관리할 수 있도록 해주는 버전 관리 프로그램 githubgit으로 관리되는 프로젝트의 코드가 저장되는 저장소 AWS 리눅스 명령어 정리mkdir : 폴더를 만드는 명령어 mkdir folder1 ls : 현재 위치에서 폴더나 파일을 확인하는 명령어 ls –l : 조금 더 자세한 정보를 확인할 수 있다! cd : 폴더 안으로 들어가는 명령어 cd folder2 cd .. : 상위 폴더로 올라가는 명령어 pwd : 현재 위치를 확인하는 명령어 mdir : 비어 있는 폴더(디렉토리)를 제거하는 명령어 rmdir folder3 관리자의 권한으로 설치되어 있는 여러 프로그램을 최신화한다. sudo yum update 관리자의 권한으로 프로그램을 설치한다. sudo yum install 프로그램이름 sudo systemctl status 프로그램 : 프로그램의 상태를 확인한다. sudo systemctl status mysqld sudo systemctl restart 프로그램 : 프로그램를 재시작한다. sudo systemctl restart mysqld chmod : 파일이나 폴더의 권한을 변경한다. gradlew를 사용하기 위해 실행할 수 있도록 설정한다. chmod +x ./gradlew foreground로 실행중인 프로그램을 중단하는 신호 ctrl + c 명령어를 background로 실행시킨다. nohup [명령어] & rm : 파일을 제거하는 명령어 rm nohup.out vi : 리눅스 편집기인 vim을 사용하여 파일을 연다. vi nohup.out cat : 파일에 있는 내용물을 모두 출력하는 명령어 cat nohup.out tail : 현재 파일의 끝 부분을 출력하는 명령어 tail nohup.out tail –f : 현재 파일의 끝 부분을 실시간을 출력해준다! tail –f nohup.out ps aux : 현재 실행중인 프로그램 목록을 확인할 수 있다. 현재 실행중인 프로그램 중 java가 들어가는 프로그램을 확인한다. ps aux | grep java kill -9 프로그램번호 : 해당 프로그램을 종료시킨다. ./gradlew build : 프로젝트를 빌드한다. ./gradlew build –x test : 프로젝트를 빌드하는데, 테스트는 생략한다. ./gradlew clean : 현재 빌드된 결과물을 제거한다.회고록드디어 진도는 완강했다~ 요번 강의 중에서 리눅스 명령어랑 AWS가 유익했다.전에 다른 무료 배포사이트를 써보긴 했는데 AWS보다 그냥 파일자체를 넣으면 배포가 되는 시스템이여서직접 깃허브 연결해서 배포해보는건 첨인거 같다. 전에 다른 프로젝트에서 마리아DB 사용해서 MySQL를 또 설치하면 충돌날까봐 프로젝트 자체를 마리아DB로 진행하는데리눅스로 마리아DB 설치하는 과정에서 엄청 버벅거림.. 폭풍 구글링 후에 겨우 AWS에 설치완료  미션막상 수업한거 참고로 하면 금방 끝날줄 알았는데 역시.. 하나 잘못걸리면 거기서 오래걸리는거 같다!~그래도 어떻게 7까지 완료했는데 이제 미션 과제 하나 남았다~~ㅎㅎ 마지막까지 열심히해서 완료 찍기.

백엔드워밍업백엔드워밍업1기스터디클럽

채널톡 아이콘