블로그

강지원

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

따라하며 배우는 자바스크립트 A~Z (8~10강)따라하며 배우는 리액트 A-Z (1~6강) Day 6 (Iterator, Generator, Design Pattern)디자인 패턴* 프로그래머가 응용 프로그램이나 시스템을 디자인할 때 일반적인 문제를 해결하는데 사용할 수 있는 공식화된 모범 사례 * 최고의 솔루션 * 재사용성 * 풍부한 표현력 * 향상된 의사소통 * 코드 리팩토링 필요x * 코드 베이스 크기 감소Singleton* 클래스의 인스턴스화를 하나의 객체로 제한하는 디자인 패턴 * 시스템 전체에서 작업을 조정할 때 정확히 하나의 객체만 필요한 경우 유용Factory* 특수 함수인 팩토리 함수를 사용하여 비슷한 객체를 많이 만들 수 있는 패턴 * 비슷한 객체를 반복적으로 생성해야 하는 경우 사용 * 동일한 코드를 반복할 필요 없게 해줌Mediator* 객체 그룹에 대한 중앙 권한을 제공하는 패턴 * 대표 예시 : 채팅방 * 중재자한테 먼저 채팅을 보내고 원래 보내려던 사람에게 중재자가 전달 * 정크 메세지 등을 거를 수 있음 Observer* event-driven 시스템을 이용하는 패턴 * 특정 subject를 관찰하는 많은 observer가 있고, 해당 subject에 변경 사항이 있을 떄, 알림 받기를 원하기 때문에 스스로를 등록(Register)함 * 관심을 잃게 되면 등록을 취소 * 예시 : 유명 연예인을 팔로워한 대중들 Module* 코드를 더 작고 재사용 가능한 조각으로 분할하는 패턴 * <script type="module"></script> 로 표현 가능 * 특징 * 1. 항상 strict 모드로 실행됨 * 2. 지연 실행됨 (defer) * 3. 인라인 모듈 스크립트도 비동기 처리할 수 있음 * 4. 외부 origin에서 스크립트를 불러오려면 Cors 헤더가 있어야 함 * 5. 증복된 스크립트는 무시됨 * 모듈 레벨의 스코프 * 모듈 안에 자신만의 스코프가 만들어져서 모듈 내부에 정의된 변수나 함수는 * 다른 스크립트에서 접근할 수 없게 됨 * 모듈은 최초 호출시 한번만 실행됨 * 스크립트 안에서 정보를 가져오기 위해서는 * import.meta를 사용해야 함 * async * 일반 스크립트에서 async -> 외부 스크립트에만 해당 * 모듈 스크립트에서 async -> 외부, 인라인 스크립트 둘 다 해당 Day 7 (프로젝트 만들기)StopWatch App// 지정된 timeout ms가 지날 때마다 handler를 실행해주는 함수 setInterval(handler, timeout) // setInterval에서 실행한 내용을 reset시키는 함수 clearInterval()Todo App// child 요소를 맨 앞으로 넣어주는 함수 prepend() Spreadsheet App // csv 파일을 다운로드할 수 있는 버튼을 만드는 방법 const csvObj = new Blob([csv]); const csvUrl = URL.createObjectURL(csvObj); const a = document.createElement("a"); a.href = csvUrl; a.download = "Spreadsheet File Name.csv"; a.click();백한테 파일 형태로 요청을 보낼 때만 써봤던 Blob을 이용해서 파일 다운로드 버튼을 만들어보다니 신기했다. Day 8 (중간 점검)라이브러리를 잘 활용하는 것도 실력이라고 하신 점이 기억에 남았습니다.너무 어려운 기능이 있으면 막막해서 라이브러리를 써볼까 하다가도 과연 개발자로써 직접 만들지 않고 이미 있는 것을 가져다 사용하는 것이 옳은 걸까라는 생각을 많이 했었는데, 이 부분을 확실하게 꼬집어주시면서 해결책을 주셔서 좋았습니다.코치 님의 말씀을 들으면서 라이브러리 사용을 두려워하지 말고 적극적으로 활용하는 개발자가 되어야겠다고 생각했습니다.그리고 third party api라는 단어를 잘 모르겠어서 찾아봤는데, 기업들이 이윤 창출을 목적으로 개발한 API라는 것을 알게 되었습니다. 예를 들어 구글을 통해 로그인, 구글맵 등이 third party api에 해당합니다. 예시로 든 두 기능은 프로젝트를 개발할 때 사용해봤던 api였는데도 불구하고 정확한 용어를 몰랐다는 점이 부끄러웠습니다. 앞으로 잘 기억해둬야겠습니다. Day 9 (리액트 기본 및 Todo 앱 만들기)React는 UI를 만들기 위한 JS 라이브러리 즉, Renders UI and responds/reacts to eventsSPASPA : Single Page Application 사용자가 버튼을 클릭했을 때 다른 페이지를 보여주는 것이 아니라 한 페이지 내에서 어떤 건 숨기고 어떤 건 보여주면서 동작하는 방식 성능 개선 부분이 너무 어려워서 코드를 따라치는 수준으로 겨우 들었다.. 추가로 공부를 더 하면서 완전히 내 것으로 만들어야겠다. Day 10 (리액트로 Netflix 만들기)강의를 보면서 더 공부하고 싶었던 내용들* Styled Component * Modal * ReactRouter * useLocation * useDebounce * useParamsTMDB api는 처음 사용해봤는데 넷플릭스, 디즈니 플러스 등 영화 정보가 필요한 앱을 만들때 굉장히 유용할 것 같다.여러 훅을 사용해 볼 수 있어서 좋았지만 한번에 이해하기는 힘든 부분이라 더 공부가 필요할 것 같다. Styled Component 내용 정리 및 개인적인 장단점 정리* CSS-in-JS JS 코드 내에서 잘 스타일링 된 컴포넌트를 직접 만들어서 가져다가 쓰는 방식 * 장점 - css 파일을 왔다 갔다 하지 않고 사용할 수 있다. * 단점 - JS파일 내에서 동작하기 때문에 수정하고 빌드할 때마다 재 컴파일 되어서 성능이 안좋음 - 스타일링과 컴포넌트를 오가며 작성해야 하는 불편함이 있음 - 컴포넌트만 봤을 때 이게 stlyed된 컴포넌트 인지 그냥 컴포넌트인지 구분할 방법이 없음 일주일 회고저번 주는 약과다 싶을 정도로 많이 바쁜 일주일이었다. 그래도 이렇게 무엇인가에 열중하는 경험은 몸이 피곤하더라도 기분은 좋다. 다음 주가 벌써 마지막 주라니.. 시간이 정말 빠르다. 마지막 주까지 힘내서 강의도 완주하고 과제도 잘 만들어야겠다.저번 주 회고 때 너무 많은 내용을 담은 것 같아서 아쉽다고 했었는데 확실히 저번 주 보다는 꼭 기억하고 싶은 내용들만 적어서 그런지 간략하고 가독성 있게 쓴 것 같아서 만족한다. 강의 출처강의 주소(JS) : https://www.inflearn.com/course/따라하며-배우는-자바스크립트/강의 주소(React) : https://www.inflearn.com/course/따라하는-리액트/코치님 성함 : John Ahn

JSReact인프런스터디프론트엔드2주차

minme9055

[인프런 워밍업 클럽 2기 CS] 2주차 발자국

운영체제SJF (Shortest Job First)가장 짧은 실행 시간을 가진 작업을 먼저 처리하는 스케줄링 알고리즘평균 대기 시간을 최소화하는 효과가 있지만, 실행 시간을 정확히 예측하기 어려워 사용에 제한이 있음RR (Round Robin)각 프로세스에 고정된 시간 할당량(타임 슬라이스)을 부여하여 순환 방식으로 CPU를 할당하는 알고리즘공정성을 보장하지만, 타임 슬라이스 설정이 성능에 큰 영향을 미침MLFQ (Multi-Level Feedback Queue)다중 우선순위 큐를 사용하여 프로세스의 특성에 따라 동적으로 우선순위를 조정하는 스케줄링 알고리즘CPU Bound 프로세스는 장시간 CPU를 점유하여 우선순위가 낮은 큐로 이동I/O Bound 프로세스는 자주 I/O 작업을 수행하여 높은 우선순위 큐로 유지프로세스 간 통신 (Inter-Process Communication, IPC)프로세스들이 데이터를 교환하거나 동기화하기 위해 사용하는 메커니즘주요 방법: 파이프, 메시지 큐, 공유 메모리, 소켓효율적인 통신을 위해 다양한 기술이 사용됨공유 자원과 임계 구역 (Critical Section)여러 프로세스나 스레드가 동시에 접근할 수 있는 자원을 사용할 때 발생할 수 있는 문제를 방지자원 접근을 제한하는 코드 블록을 임계 구역이라고 함임계 구역을 효과적으로 관리하는 것이 중요함세마포어 (Semaphore)임계 구역을 제어하기 위한 동기화 도구로, 자원의 사용 가능 수를 추적하는 카운터 사용P (wait) 연산: 자원을 요청하고, 사용 가능할 때까지 대기V (signal) 연산: 자원을 해제하고, 대기 중인 프로세스에게 자원을 양도이를 통해 동시 접근 문제를 해결모니터 (Monitor)고수준의 동기화 메커니즘데이터 구조와 관련 연산을 하나의 단위로 묶어 상호 배제를 보장세마포어보다 구조화된 접근을 제공하여 동시성 문제를 쉽게 관리데드락이란? (feat. 식사하는 철학자)두 개 이상의 프로세스가 서로가 점유하고 있는 자원을 기다리며 무한히 대기하는 상태식사하는 철학자 문제는 이를 설명하는 대표적인 예제로, 철학자들이 포크를 공유하며 식사할 때 발생할 수 있는 교착상태를 보여줌데드락 해결 (feat. 은행원 알고리즘)교착상태를 방지하거나 해결하기 위한 방법 중 하나로 은행원 알고리즘을 사용시스템이 안전 상태(safe state)를 유지하도록 자원 할당을 사전에 검증하여 교착상태를 예방안전 상태란 모든 프로세스가 요청을 완료할 수 있는 상태를 의미함메모리 종류주기억장치(RAM): 휘발성 메모리로 프로그램 실행 중 데이터를 저장보조기억장치(HDD, SSD): 비휘발성 메모리로 영구적으로 데이터를 저장캐시 메모리: CPU와 주기억장치 간의 속도 차이를 줄이기 위해 사용되는 고속 메모리메모리와 주소메모리는 고유한 주소(address)를 통해 접근각 메모리 셀은 고유한 주소를 가지며, 프로그램은 이 주소를 사용하여 데이터를 읽거나 씀주소 체계는 메모리 관리와 프로세스 간의 통신에 중요한 역할을 함메모리 할당 방식정적 할당: 컴파일 시 메모리 크기가 결정되며, 프로그램 실행 중 변경되지 않음동적 할당: 프로그램 실행 중에 메모리를 할당하고 해제할 수 있음자료구조와 알고리즘재귀 (Recursion)함수가 자기 자신을 호출하여 문제를 해결하는 프로그래밍 기법문제를 더 작은 하위 문제로 분할하여 해결기저 조건을 정의하여 재귀 호출을 종료재귀적으로 생각하기문제를 자기 자신과 유사한 더 작은 문제로 분해하여 해결하는 접근 방식특히 데이터 구조의 트리 구조나 분할 정복 알고리즘에서 유용함재귀 - 하노이 탑 (Tower of Hanoi)재귀적 접근을 통해 해결할 수 있는 고전적인 문제n개의 원반을 시작 기둥에서 목표 기둥으로 옮기는 과정에서 재귀 호출을 이용하여 효율적으로 문제를 해결정렬 - 버블정렬 (Bubble Sort)인접한 요소를 비교하여 필요에 따라 교환하면서 리스트를 정렬하는 단순한 정렬 알고리즘구현이 쉽지만 시간 복잡도가 O(n²)으로 비효율적임정렬 - 선택정렬 (Selection Sort)리스트에서 가장 작은(또는 큰) 요소를 찾아 현재 위치에 교환하는 방식으로 정렬하는 알고리즘시간 복잡도는 O(n²)이며, 데이터 이동이 적은 편이지만 안정적이지 않음2주차 후기운영체제에서 처음 접하는 단어들이 난무하는 2주차였다. 잠시 정신이 혼미할 뻔 했지만 😵‍💫 내용을 차근히 따라가면서 조금씩 이해해 나갈 수 있었던 것 같다. 특히 개념 - 개념과 관련된 문제와 그 원인 - 해결의 관점에서 접근하니 나름 재밌게 공부했던 것 같다.알고리즘은 말은 많이 들어봤지만 실제로 잘 써본 경험은 없는 개념들에 대해 공부했다. 실제로 구현도 해 보면서 진행하니 이해하는 데 많은 도움이 되었다.이번 주는 '프론트엔드 개발자로 일을 할 때 이런 개념들까지도 알아야하나?'라는 생각이 들었던 것 같다. 뭔가 프론트보다는 서버에서 더 많이 접할 것 같은 느낌? 그래도 알아두면 나중에 도움이 될 테니 이해를 잘 해둬야겠다는 생각을 했다.

알고리즘 · 자료구조인프런인프런워밍업클럽CS운영체제자료구조알고리즘감자2주차

하얀종이개발자

인프런 워밍업 클럽 2기 - CS 전공지식 스터디 2주차 발자국

운영체제 2주차 학습 요약 CPU 스케쥴링 알고리즘SJF (Shortest Job First)짧은 작업 시간을 가진 프로세스에 먼저 CPU를 할당하는 방식버스트 타임이 긴 프로세스는 계속 실행되지 않을 수 있고, 어떤 프로세스가 얼마나 실행될지 예측이 어려움RR (Round Robin)시간을 균등하게 분배하여 각 프로세스에 순차적으로 CPU를 할당하는 방식컨텍스트 스위칭으로 인해 처리량이 늘어남MLFQ (Multi Level Feedback Queue)프로세스의 우선순위를 동적으로 조절하여 CPU를 효율적으로 할당하는 방식오늘날 운영체제에서 가장 일반적으로 사용됨프로세스 동기화여러 프로세스가 공유 자원에 동시에 접근할 때 순서를 정하여 데이터의 일관성을 유지하는 것프로세스간 통신의 종류한 컴퓨터 내에서 프로세스간 통신하는 방법 : 파일 or 파이프를 이용한 프로세스 내에서 쓰레드간 통신하는 방법 : 데이터 or 힙영역을 이용네트워크를 이용하여 통신하는 방법 : 소켓통신, RPC공유자원과 임계영역공유자원은 프로세스 혹은 스레드간 통신할 때 공동으로 이용하는 변수나 파일 같은 것들공유자원은 여러 프로세스가 공유하고 있기 때문에 각 프로세스의 접근 순서에따라 결과가 달라질 수 있음임계영역은 프로세스 혹은 스레드가 동시에 사용하면 안되는 영역 (접근 순서등의 이유로 결과가 달라지는 영역)경쟁조건은 공유자원을 서로 사용하기 위해 경쟁하는 것임계구역 문제를 해결하기 위한 조건상호배체임계영역엔 하나의 프로세스만 접근해야 함한정대기기다리는 프로세스는 언제가는 임계영역에 접근 할 수 있어야함진행의 융통성한 프로세스가 다른 프로세스의 일을 방해해서는 안됨세마포어 & 모니터뮤텍스는 공유자원을 lock()과 unlock()을 이용하여 프로세스의 접근을 제어하는 메커니즘여러 프로세스의 접근을 관리할 수 있으면 세마포어 (뮤텍스는 동기화 대상이 오직 하나임)세마포어는 잘못된 사용으로 임계영역을 보호받지 못할 수 있음 (세마포어를 사용하지 않고 임계구역에 들어간 경우)이를 해결한 방식이 모니터모니터는 공유자원을 숨기고 접근에 대한 인터페이스만 제공하여 공유자원에 안전하게 접근하게 하는 메커니즘운영체제가 처리하는게 아니라 프로그래밍 언어차원에서 지원하는 방법임교착상태 (데드락)두개 이상의 프로세스들이 서로가 가진 자원을 기다리다 아무도 작업을 진행하지 못하는 상태데드락 필요조건상호배제비선점점유대기원형대기은행원 알고리즘총 자원의 양과 현재 할당한 자원의 양을 기준으로 안정 또는 불안정 상태로 나누고, 교착상태가 발생하지 않는 수준이 되도록 자원을 할당하는 알고리즘검출 & 회복교착상태는 어떻게 검출하지?가벼운 교착상태 검출 (타이머)일정시간마다 작업을 조작하고 교착상태가 발생하면 체크포인트로 롤백무거운 교착상태 검출 (순환구조)교착상태를 일으킨 프로세스를 강제 종료시키고 다시 실행 시킬때 체크포인트로 롤백오버헤드가 발생하지만 억울하게 종료되는 프로세스는 발생하지않음메모리레지스터 (32bit 또는 64bit)캐시CPU와 메인메모리 속도 차이 때문에 미리 데이터를 저장하는 임시공간메인메모리 (RAM)프로세스를 로드, 휘발성보조기억장치 (SSD, HDD)디스크 저장, 비휘발성물리 주소 - 물리적인 메모리 주소논리 주소 - 사용자 관점에서 본 상대적 주소, 사용자는 논리 주소를 통해 물리 주소로 접근메모리 할당방식가변분할방식메모리에 연속해서 프로세스를 할당단점으로 외부 단편화가 발생할 수 있음고정분할방식메모리를 정해진 크기로 나누어 프로세스를 할당단점으로 내부 단편화가 발생할 수 있음버디시스템메모리를 2의 제곱 수로 분할하여 할당하는 방식가변분할방식과 고정분할방식을 합친 방법 알고리즘 & 자료구조 2주차 학습 요약 재귀 & 재귀적으로 생각하기재귀는 자기 자신을 다시 호출하는 함수를 말함어떤 문제를 해결하기 위해 문제의 부분 문제를 같은방식으로 해결하는 과정하향식 풀이에서 활용됨 (하위 문제를 기반으로 해결)하노이탑 구현하기세개의 기둥과 서로 다른 크기의 원반들이 있을때 가장 큰 원반이 아래에 있고 위로 갈수록 작은 원반으로 이루어져있음하나의 기둥에 있는 원반들을 다른 기둥으로 옮겨야 함기둥 A에 있는 원반을 기둥 C로 옮기기 (하향식 접근으로 풀이)  처음 시작 그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편) 캡쳐  모두 옮김그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편) 캡쳐자바코드public class HanoiTop { void hanoi(int count, String from, String to, String temp){ if(count == 0) return; hanoi(count - 1, from, temp, to); System.out.printf("원반 %d를 %s에서 %s로 이동\n", count, from, to); hanoi(count - 1, temp, to, from); } public static void main(String[] args) { HanoiTop hanoiTop = new HanoiTop(); hanoiTop.hanoi(3, "A", "C", "B"); } } 버블정렬앞에 있는 숫자와 옆에 있는 숫자를 비교해서 자리를 바꾸는 알고리즘자바코드public class BubbleSort { void bubbleSort(int[] arr) { // 사이클 - 자리교체는 (배열의 갯수 - 1) 번 수행함 for (int i = 0; i < arr.length - 1; i++) { // 횟수 - 정렬이 된 원소의 이전 원소보다 하나 이전의 원소까지 순회 // 시작점이 (arr.length-i-1)번 임 for (int j = 0; j < (arr.length - i - 1); j++) { // 앞의 데이터가 뒤에 데이터보다 더 크다면? if (arr[j] > arr[j + 1]) { // 데이터 자리변경 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } public static void main(String[] args) { int[] arr = {2, 3, 1, 4}; // 정렬 전 - arr = [2, 3, 1, 4] System.out.println("정렬 전 - arr = " + Arrays.toString(arr)); BubbleSort bubbleSort = new BubbleSort(); bubbleSort.bubbleSort(arr); // 정렬 후 - arr = [1, 2, 3, 4] System.out.println("정렬 후 - arr = " + Arrays.toString(arr)); } } 선택정렬정렬되지 않은 배열의 첫번째 원소를 시작으로 마지막 원소까지 탐색하여 가장 작은 값을 정렬되지 않은 첫번째 배열로 가져오는 알고리즘자바코드public class SelectionSort { void selectionSort(int[] arr) { // 1 사이클의 순회는(배열의 갯수 - 1) 번 수행됨 for (int i = 0; i < arr.length - 1; i++) { int minValueIndex = i; // 가장 작은 값을 탐색하기위해 순회 for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[minValueIndex]) { // 작은값 저장 minValueIndex = j; } } // 자리 변경 int temp = arr[i]; arr[i] = arr[minValueIndex]; arr[minValueIndex] = temp; } } public static void main(String[] args) { int[] arr = {4, 2, 1, 3}; // 정렬 전 - arr = [4, 2, 1, 3] System.out.println("정렬 전 - arr = " + Arrays.toString(arr)); SelectionSort selectionSort = new SelectionSort(); selectionSort.selectionSort(arr); // 정렬 후 - arr = [1, 2, 3, 4] System.out.println("정렬 후 - arr = " + Arrays.toString(arr)); } }  회고2주차 스터디를 진행하면서 정해진 진도도 학습하면서, 스터디안에 발표스터디에 참여해서 복습도 하는 과정이었어요. 적어보였던 운영체제의 내용이 생각보다 많아서 정리하는데 은근 시간이 오래 걸리더라구요. 그래도 스터디안의 발표 스터디에 참여하여 정리내용을 발표하고 다른 스터디원들의 발표내용도 듣고 헷갈리는 부분도 토론해서 도움이 많이 되었던 한 주 였던것 같습니다.스터디 발표 정리 자료 캡쳐그리고 이번 알고리즘 강의에서는 항상 어렵게 느꼈던 재귀에 대해 조금은 이해한게 너무 좋았습니다.어떤 문제를 해결하기 위해 문제의 부분 문제를 같은 방식으로 분해하여 해결한다.!! 재귀함수 내에서 자기 자신을 호출할 때 이 함수가 벌써 구현이 되어있다고 가정하고 재귀함수를 구현한다.!! 많이 연습해봐야겠지만 그래도 재귀적으로 생각하는 방법을 느낄 수 있었던 것 같습니다.마지막 1주가 남았는데, 끝까지 열심히 해서 끝까지 완주해야겠네요. 화이팅

백엔드인프런워밍업클럽2기CS전공지식2주차발자국감자

minme9055

[인프런 워밍업 클럽 2기 CS] 2주차 미션

운영체제 (Operating Systems)1. FIFO 스케줄링의 장단점FIFO (First-In, First-Out) 스케줄링은 먼저 도착한 프로세스를 먼저 실행하는 방식입니다.장점:단순함: 구현이 매우 간단하고 이해하기 쉽습니다.공정성: 모든 프로세스가 도착한 순서대로 처리되어 순서에 대한 공정성을 보장합니다.단점:긴 대기 시간: 긴 실행 시간을 가진 프로세스가 먼저 도착하면, 뒤에 있는 짧은 프로세스들이 오랜 시간 대기해야 합니다.비효율성: 응답 시간이 중요한 시스템에서는 비효율적일 수 있습니다.2. SJF 사용의 어려움SJF (Shortest Job First)는 실행 시간이 가장 짧은 작업을 먼저 처리하는 스케줄링 알고리즘입니다.사용하기 어려운 이유:실행 시간 예측의 어려움: 실제 환경에서는 프로세스의 정확한 실행 시간을 사전에 알기 어렵습니다.스타베이션 문제: 긴 작업이 지속적으로 도착할 경우, 긴 작업들이 계속 뒤로 밀려 무기한 대기할 수 있습니다.동적 변화 대응의 어려움: 시스템 부하나 프로세스 특성이 변할 때 유연하게 대응하기 어렵습니다.3. RR 스케줄링에서 타임 슬라이스가 너무 작을 때 발생하는 문제RR (Round Robin) 스케줄링은 각 프로세스에 고정된 시간 할당량을 부여하여 순환 방식으로 CPU를 할당하는 알고리즘입니다.문제점:오버헤드 증가: 프로세스 간의 컨텍스트 스위칭이 빈번하게 발생하여 시스템 오버헤드가 증가합니다.실행 시간 비효율성: 짧은 타임 슬라이스로 인해 많은 스위칭이 필요하게 되어 실제 작업에 소요되는 시간이 늘어날 수 있습니다.캐시 효율 저하: 잦은 컨텍스트 스위칭으로 인해 캐시 히트율이 떨어지고, 캐시 미스가 증가할 수 있습니다.4. MLFQ에서 CPU Bound Process와 I/O Bound Process 구분 방법MLFQ (Multi-Level Feedback Queue)는 여러 개의 우선순위 큐를 사용하여 프로세스의 특성에 따라 동적으로 우선순위를 조정하는 스케줄링 알고리즘입니다.CPU Bound Process: 주로 CPU를 많이 사용하는 프로세스로, MLFQ에서는 장시간 CPU를 점유하는 경향이 있어 우선순위가 낮은 큐로 이동할 수 있습니다.I/O Bound Process: 자주 I/O 작업을 수행하고 CPU 사용 시간이 짧은 프로세스로, I/O 요청 시 우선순위가 상승하여 높은 우선순위 큐로 이동합니다.운영체제는 프로세스의 CPU 사용 패턴과 I/O 활동을 모니터링하여, 각 프로세스가 CPU Bound인지 I/O Bound인지를 판단하고 적절한 우선순위를 할당합니다.5. 공유 자원이란?공유 자원 (Shared Resource)은 여러 프로세스나 스레드가 동시에 접근하여 사용할 수 있는 자원을 말합니다. 예를 들어, 파일, 데이터베이스, 프린터, 메모리 공간 등이 있습니다.특징:동시 접근 가능성: 여러 프로세스가 동시에 접근할 수 있어 효율적인 자원 활용이 가능합니다.경합 상태: 동시에 접근하면 상호 배제(Mutual Exclusion)나 일관성 유지 문제 등이 발생할 수 있습니다.동기화 필요성: 공유 자원에 대한 올바른 접근을 보장하기 위해 동기화 메커니즘(예: 세마포어, 뮤텍스)을 사용해야 합니다.6. 교착상태 발생 조건교착상태 (Deadlock)는 두 개 이상의 프로세스가 서로가 점유하고 있는 자원을 기다리며 무한히 대기하는 상태를 말합니다. 교착상태가 발생하기 위해서는 다음 네 가지 조건이 모두 충족되어야 합니다:상호 배제 (Mutual Exclusion): 자원은 동시에 하나의 프로세스만 사용 가능해야 합니다.점유와 대기 (Hold and Wait): 한 프로세스가 자원을 점유하면서 추가적인 자원을 기다려야 합니다.비선점 (No Preemption): 이미 할당된 자원을 선점할 수 없어야 합니다.순환 대기 (Circular Wait): 프로세스들이 자원에 대해 순환적으로 대기하는 선형 경로가 존재해야 합니다.이 조건들을 모두 만족하면 교착상태가 발생할 수 있으므로, 이를 방지하거나 해결하기 위해서는 이 조건들 중 하나 이상을 위반해야 합니다.자료구조와 알고리즘 (Data Structures and Algorithms)1. 재귀함수에서 기저조건 미설정 시 발생 문제재귀 함수 (Recursive Function)에서 기저 조건 (Base Case)은 재귀 호출을 종료시키는 조건입니다. 기저 조건을 만들지 않거나 잘못 설정하면 다음과 같은 문제가 발생할 수 있습니다:무한 재귀 호출 (Infinite Recursion): 기저 조건이 없으면 함수가 자기 자신을 계속해서 호출하게 되어 종료되지 않고 무한히 실행됩니다.스택 오버플로우 (Stack Overflow): 재귀 호출이 계속해서 쌓이면서 호출 스택이 가득 차게 되어 프로그램이 충돌하거나 비정상 종료될 수 있습니다.논리적 오류: 기저 조건이 잘못 설정되면 함수가 의도한 대로 동작하지 않아 잘못된 결과를 반환할 수 있습니다.따라서 재귀함수를 구현할 때는 적절한 기저 조건을 설정하여 재귀 호출이 올바르게 종료되도록 해야 합니다.2. 0부터 입력 n까지 홀수의 합을 더하는 재귀 함수 구현function sumOdd(n) { // 기저 조건: n이 0보다 작거나 같을 때 if (n <= 0) { return 0; } // n이 홀수인 경우 if (n % 2 !== 0) { return n + sumOdd(n - 1); } // n이 짝수인 경우 return sumOdd(n - 1); } console.log(sumOdd(10)); // 출력: 25 console.log(sumOdd(15)); // 출력: 64기저 조건: n이 0보다 작거나 같을 때 0을 반환하여 재귀 호출을 종료합니다.홀수 처리: n이 홀수인 경우, n을 더하고 n - 1을 인자로 재귀 호출합니다.짝수 처리: n이 짝수인 경우, n을 더하지 않고 n - 1을 인자로 재귀 호출합니다.예제 실행:sumOdd(10)은 1 + 3 + 5 + 7 + 9 = 25를 반환합니다.sumOdd(15)는 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 = 64를 반환합니다.

알고리즘 · 자료구조인프런인프런워밍업클럽CS운영체제자료구조알고리즘감자2주차

miiro

[인프런 워밍업 스터디 클럽 1기] BE 2주차 회고록

두 번째 발자국자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]를 수강하고인프런 워밍업 클럽에 참여하여 쓰는 두 번째 회고록입니다.학습 내용static이 아닌 코드를 사용하려면 인스턴스화를 해야합니다.하지만, 학습에서 진행했던 UserController는 jdbcTemplate를 의존하여 사용하고 있습니다.이를 가능케 하는 것은 @RestController 어노테이션으로 의해 의존이 가능해지고 해당 클래스를 스프링 빈으로 등록시킵니다. 스프링 빈서버가 시작되면, 스프링 서버 내부에 거대한 컨테이너를 만듭니다.해당 컨테이너 안에는 클래스가 들어가게 되고, 다양한 정보(이름, 타입) 도 함께 들어가고, 인스턴스화도 이루어집니다.서버가 시작되면 코드의 구현 순서에 대해 살펴보겠습니다.스프링 컨테이너(즉, 클래스 저장소)가 시작됩니다.기본적으로 생성되어있는 스프링 빈들이 등록됩니다.사용자가 설정한 스프링 빈이 등록됩니다.필요한 의존성이 자동으로 설정이 됩니다. 여기서 스프링 컨테이너를 사용하는 이유를 살펴보면 2가지의 스프링 프레임워크의 특성 때문입니다.첫 번째는 제어의 역전(IOC) 이다. 말 그대로 메서드나 객체의 호출 작업을 개발자가 결정하는 것이 아닌, 외부(스프링 컨테이너)에서 결정되는 것을 의미입니다. 객체의 의존성을 역전시켜 객체간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 해서 가독성 및 코드 중복, 유지 보수를 편하게 할 수 있도록 도와줍니다.두 번째는 의존성 주입(DI) 로 객체를 직접 생성하는 것이 아닌 외부에서 생성할 후 주입시키는 방식을 의미한다.이를 통해 모듈 간의 결합도가 낮아지고 유연성을 높일 수 있습니다.  스프링 빈으로 등록하는 방법여기서 중점적으로 사용하는 어노테이션에 대해 살펴보겠습니다. @Configuration클래스에 붙이는 어노테이션@Bean을 사용할 때 함께 사용외부 라이브러리, 프레임워크에서 만든 클래스를 등록할 때 사용한다.@Bean메서드에 붙이는 어노테이션메서드에서 반환되는 객체를 스프링 빈에 등록한다.외부 라이브러리, 프레임워크에서 만든 클래스를 등록할 때 사용한다.@Service, @Repository개발자가 직접 만든 클래스를 스프링 빈으로 등록할 때 사용한다.@Component주어진 클래스를 컴포넌트로 간주한다.해당 클래스들은 스프링 서버가 뜰 때 자동으로 감지된다. @Component 사용컨트롤러, 서비스, 레포지토리 X개발자가 직접 작성한 클래스를 스프링 빈으로 등록 시에 사용되기도 한다. 스프링 빈 주입 방법생성자를 활용하여 주입하는 방법setter와 @Autowired를 사용하는 방법필드에 직접 @Autowired를 사용하는 방법 JPA(Java Persistence API)데이터를 영구적으로 보관하기 위해 Java 진영에서 정해진 규칙영속성 : 서버가 재시작되어도 데이터는 영구적으로 저장되는 속성 ORM(Object-Relational Mapping)객체와 관계형 DB의 테이블을 짝짓는 방법HibernateJPA를 구현(implement)해서 코드로 작성한 구현체내부적으로 JDBC를 사용한다   JPA 어노테이션@Entity : 스프링이 객체와 테이블을 같은 것으로 바라본다.Entity 뜻 : 저장되고, 관리되어야 하는 데이터@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;@Id : 위 필드를 primary key로 간주@GeneratedValue : primary key는 자동 생성되는 값GenerationType.IDENTITY : MySQL의 auto_increment 전략과 매칭JPA를 사용하기 위해서는 기본생성자가 꼭 필요하다 @Column(nullable = false, length = 20, name = "name") private String name;@Column : 객체의 필드와 Table의 필드를 매칭한다.null 여부, 길이 제한, DB Column 이름 등을 사용@Column 어노테이션을 생략할 수도 있다.  트랜잭션(Transaction)쪼갤 수 없는 업무의 최소 단위 모든 SQL 한번에 성공 or 하나라도 실패하면 모두 실패 트랜잭션 명령어start transaction; : 트랜잭션 시작하기commit; : 트랜잭션 정상 종료(SQL 반영)rollback; : 트랜잭션 실패 처리(SQL 미반영)   트랜잭션 적용 방법@Transactional public void saveUser(UserCreateRequest request) { userRepository.save(new User(request.getName(), request.getAge())); }SELECT 쿼리만 사용한다면 readOnly 옵션 사용 가능@Transactional(readOnly = true) public List<UserResponse> getUsers() { return userRepository.findAll().stream() .map(UserResponse::new) .collect(Collectors.toList()); } ❗ 주의사항IOException 과 같은 Checked Exception은 롤백이 일어나지 않는다. 영속성 컨텍스트테이블과 매핑된 Entity 객체를 관리/보관하는 역할스프링에서는 트랜잭션을 사용하면 영속성 컨텍스트가 생겨나고, 트랜잭션이 종료되면 영속성 컨텍스트가 종료특징변경 감지(Dirty Check)영속성 컨텍스트 안에 불러와진 Entity는 명시적으로 save 하지 않더라도, 변경을 감지해 자동으로 저장된다.@Transactional public void updateUser(UserUpdateRequest request) { User user = userRepository.findById(request.getId()) .orElseThrow(IllegalArgumentException::new); user.updateName(user.getName()); }쓰기 지연DB의 insert/update/delete SQL문을 바로 날리는 것이 아닌, 트랜잭션이 commit될때 모아서 1번만 날린다.1차 캐싱ID를 기준으로 Entity를 기억한다.캐싱된 객체는 완전히 동일하다.(객체 주소도 같다) JPA 연관관계ex) 사람(person)과 실거주 주소(address)사람 1명은 1개의 실거주 주소만을 가지고 있다.@OneToOne연관관계의 주인을 설정한다.(mappedBy 사용한다.)연관관계의 주인 효과상대 테이블을 참조하고 있으면 연관관계의 주인이다.연관관계 주인이 아니면 mappedBy 사용연관관계의 주인의 setter가 사용되어야만 테이블이 연결@Transactional public void savePerson() { Person person = personRepotiory.save(new Person()); Address address = addressRepotiory.save(new Address()); person.setAddress(address); } 연관 관계의 주의점트랜잭션이 끝나지 않았기에, 한 쪽만 연결해두면 반대쪽의 값은 알 수 없다. @Transactional public void savePerson() { Person person = personRepotiory.save(new Person()); Address address = addressRepotiory.save(new Address ()); person.setAddress(address); System.out.println(address.getPerson); //null 반환 }이를 방지하기 위해 setter 한 번에 둘을 같이 이어준다.public void setAddress(Address address) { this.address = address; this.address.setPerson(this); } 다대일,일대다관계@ManyToOne을 단방향으로 사용할 수 있다.@JoinColumn연관관계의 주인이 활용할 수 있는 어노테이션필드의 이름이나, null 여부, 유일성 여부, 업데이트 여부 등을 지정할 수 있다.다대다관계(N : M 관계)@ManyToMany구조가 복잡하고, 테이블이 직관적으로 매핑되지 않기 때문에 사용하지 않는 것을 지양한다.cascade 옵션한 객체가 저장되거나 삭제될 때, 그 변경이 폭포처럼 흘러서 연결되어 있는 객체도 함께 저장되거나 삭제되는 기능orphanRemoval 옵션객체간의 관계가 끊어진 데이터를 자동으로 제거하는 옵션 @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List<UserLoanHistory> userLoanHistories = new ArrayList<>();지연 로딩(Lazy Loading)연결되어 있는 객체를 꼭 필요한 순간에 데이터를 로딩한다. @OneToMany의 fetch() 옵션 연관관계의 장점각자의 역할에 집중하게 된다.새로운 개발자가 코드를 읽을 때 이해하기 쉬워진다.테스트 코드 작성이 쉬워진다.연관관계 사용 시 주의 사항지나치게 사용하면 성능 상의 문제가 발생할 수 있다.도메인 간의 복잡한 연결로 인해 시스템을 파악하기 어려워질 수 있다.요구 사항 등 여러 부분을 고민해서 연관 관계 사용을 선택해야한다. 과제 내용Day 4Day2에서 진행했던 GET API와 POST API를 구현했었는데, 그 당시에는 database를 사용하지 않은 방법으로 과제에서 주어진 조건에 맞게 답을 출력했었습니다. 이번 과제에서는 DB를 활용하여 정보를 저장하고, 수정할 수 있는 로직을 구현해야했습니다.Layer를 분리해서 진행을 할 수 있지만, 간단하게 문제의 답만 도출하기 위해서 Controller Class에 구현을 진행했었습니다.그렇기 때문에 Spring Data JPA가 아닌 JDBCTemplate를 활용하여 진행했습니다. JPA를 통한 DB 로직을 구현하는 것만 주구장창 했어서, 직접 쿼리문을 작성해서 진행하는 JDBCTemplate를 사용하는 방법에 대해 알 수 있었던 거 같습니다.📋 4일차 미션 : GET API와 POST API 구현 Day 5클린 코드는 코드를 아름답게 만드는 것이 아닌 코드의 질을 향상 시키는 데 중요하다는 것을 알았습니다.클린 코드를 구현하기 위해서 명확하고 간결하게 코드를 구현하여 버그를 줄이고, 그로 인한 개발 속도를 향상시킬 수 있습니다.또한, 잘 작성된 코드는 시간이 흘러도 이해하기 쉽기에, 유지 보수가 간편합니다. 이로 인해 개발자로서 팀 프로젝트를 진행할 시에팀 커뮤니케이션을 원활하게 진행할 수 있도록 도움을 줄 수 있다는 것을 알게 되었습니다.📋 5일차 미션 : 클린 코드 구현  회고스프링 프레임워크의 핵심 개념인 제어의 역전(IOC)과 의존성 주입(DI)을 통해 더 나은 코드 작성과 유지 보수의 용이섬에 대해 알게 되었습니다. 또한 어노테이션들을 활용하여 클래스를 스프링 빈으로 등록하고, 스프링 컨테이너가 이를 관리함으로써, 필요한 의존성을 자동으로 설정할 수 있다는 사실을 배웠습니다. JPA를 통한 데이터의 영속성 관리와 ORM을 통한 객체와 DB의 매핑에 대해 이론적으로 정립할 수 있는 계기되었던 거 같습니다.서비스를 구성하는 데 가장 중요한 @Transactional 어노테이션을 사용하여 데이터의 일관성을 유지하는 방법을 쉽게 공부하면서 더티 체크, 쓰기 지연 등 특성에 대해 알 수 있었던 거 같습니다.객체와 DB를 효과적으로 설계할 수 있도록 연관관계를 설계하는 방법을 배움으로써 사용할 때의 주의사항과 성능 문제를 방지하기 위한 전략에 대해 알게 되면서 이를 통해 효과적이고 용이한 애플리케이션 개발을 할 수 있는 토대를 마련할 수 있었던 거 같습니다.  

백엔드인프런워밍업스터디클럽2주차회고록

SK

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

2주차 학습 요약강의 1 - 따라하며 배우는 자바스크립트 A-Zhttps://www.inflearn.com/course/따라하며-배우는-자바스크립트 - John Ahn강의 2 - 따라하며 배우는 리액트 A-Zhttps://www.inflearn.com/course/따라하는-리액트 - John Ahn6일차 Iterator, Generator, Design PatternSymbol type, Iterator, GeneratorSymbol type이 타입의 목적은 유니크한 식별자를 만들기 위해 사용됨IteratorIterable : 배열은 반복 가능한 객체이며, 반복이 가능하다는 것을 iterable 이라고 부른다. for…in 을 사용할 수 있거나 Symbol.iterator() 값을 가지면 iterable 한 것iterrator : 반복자는 next() 를 호출해서 {value: , done:} 두개의 속성을 가지는 객체를 반환하는 객체Generator사용자의 요구에 따라 다른 시간 간격으로 여러 값을 반환할 수 있다.일반 함수 → 단 한번의 실행으로 함수 끝까지 실행된다.제너레이터 함수 → 사용자의 요구에 따라 일시적으로 정지될 수도 있고, 다시 시작될 수도 있다.자바스크립트 패턴프로그래머가 응용 프로그램이나 시스템을 디자인할 때 일반적인 문제를 해결하는데 사용할 수 있는 공식화된 모범 사례장점최고의 솔루션 : 여러번 수정 하면서 완성되었기 때문에 디자인 패턴은 이미 잘 작동한다는 것을 알고 있다.재사용 성 : 단일 문제에만 존재할 수 없으므로 여러 문제를 해결하기 위해 특정 상황에서 수정할 수 있는 재사용 가능한 솔루션을 나타냄풍부한 표현력 : 큰 문제를 부분적으로 효율적으로 설명할 수 있기 때무에 더 이상의 설명이 필요하지 않음.향상된 의사 소통 : 디자인 패턴에 익숙한 개발자는 문제에 대한 공통 목표를 설정하여 잠재적인 문제와 이러한 문제에 대한 솔루션에 대해 서로 의사 소통하는 데 도움이 된다.필요없는 코드 리팩토링 : 종종 다양한 문제에 대한 최적의 솔루션으로 불림.코드베이스 크기 감소 : 유일한 최적의 솔루션인 디자인 패턴은 공간을 거의 차지하지 않고 몇 줄의 코드로 필요한 솔루션을 구현하여 공간을 보존함.Singleton Pattern클래스의 인스턴스화를 하나의 객체로 제한하는 디자인 패턴. 클래스가 존재하지 않는 경우 클래스의 새 인스턴스를 생성하는 메서드로 클래스를 생성하여 구현할 수 있다. 인스턴스가 이미 존재하는 경우 해당 개체에 대한 참조를 반환한다.Factory Pattern특수 함수인 팩토리 함수를 사용하여 비슷한 객체를 많이 만들 수 있다. ⇒ 비슷한 객체를 반복적으로 생성해야 하는 경우 사용Mediator Pattern객체 그룹에 대한 중앙 권한을 제공한다.Observer Patternevent-drivent 시스템을 이용하는 것을 말함.특정 Subject를 관찰하는 많은 옵저버가 있다. 관찰자는 기본적으로 관심이 있고 해당 주제 내부에 변경 사항이 있을 때 알림을 받기 원한다. 그래서 그들은 그 주제에 스스로를 등록 한다. - youtube 의 구독 및 알림 설정 느낌Module Pattern코드를 더 작고 재사용 가능한 조각으로 분할하는 것을 도와준다. 더 큰 파일을 여러 개의 더 작고 재사용 가능한 조각으로 분할 하는 좋은 방법. 또한 모듈 내의 값은 기본적으로 모듈 내에서 비공개로 유지되고 수정할 수 없기 때문에 코드 캡슐화를 촉진한다. export 키워드를 사용하여 명시적으로 내보낸 값만 다른 파일에서 액세스 할 수 있다.사용하기 위해서 script 선언 할때 type=”module” 을 선언 하면 된다.엄격 모드 실행, 모듈 레벨 스코프, 한번만 실행,6번 과제 - 비밀번호 생성 앱https://pass-create-app.vercel.app/ - 완성 화면https://github.com/ygvbhy/pass-create-app - 코드빌드 도구 Vite CSS Bootstrap 5 (CDN) js Vanilla 배포도구 Vercel해결 과정체크박스를 기준으로 비밀번호를 생성 해야 하는 문제체크 박스가 없으면 비밀번호 생성이 안되므로 number의 체크박스는 강제 선택하게 진행form 으로 감싼 데이터는 기본적인 동작을 수행함. length 에 required 옵션을 넣으면 min 값과 max 값에 의하여 1차적으로 걸러지며 안내 메시지가 출력됨. 범위 사이 라면 event.preventDefault() 를 넣어줘서 기본 동작을 막는다.각 체크 박스 마다 비밀번호를 랜덤하게 생성 해줘야 함. 그래서 해당 체크 박스마다 String 값을 따로 설정 하여 문자열을 만들어 주고 생성하기 버튼을 클릭 했을때 체크된 항목을 찾아서 문자열을 만들어준다. ex) “abcdefghijklmnopqrstuvwxyz0123456789” 이런식이제 이걸 Math.random 함수를 이용해 length 의 길이에서 숫자를 뽑고 해당 숫자에 있는 문자열을 가져온다. → 이걸 입력한 length 만큼 반복출력 된 비밀번호를 복사 버튼을 클릭하면 클립보드로 복사가 된다. navigator.clipboard api 활용 → 복사에 성공하면 alert 창이 뜨며 복사된 항목이 출력됨.7일차 프로젝트 만들기 - Stop Watch, Todo App, SpeadSheet AppStop Watch appsetInterval의 사용법을 배움. setTimeout 과는 또 다른 사용 방식setTimeout : 설정한 시간 (ex - 1000 ⇒ 1초) 가 지나면 내부에 선언한 함수를 실행setInterval : 설정한 시간 (ex - 1000 ⇒ 1초) 마다 내부에 선언한 함수를 실행Todo ApplocalStorage 사용방법과 프론트엔드에서 사용할 수 있는 기능들이 함축적으로 담겨 있는 앱localStorage.setItem(’{사용할 아이디 (ex - todos)}’, {저장할 값})localStorage.getItem(’{설정한 아이디}’)Array 내용은 String 으로 바꿔주고 저장해야 한다.JSON.stringify(arr)이후 getItem 으로 가져온건 String 이 된 Array 이기 때문에 다시 Array 로 바꿔준다.JSON.parse(data)SpewadSheet App난이도가 난이도 인 만큼 제일 길었던 강의간단한 듯 하면서 간단하지 않는 프로젝트Blob(Binary Large Object, 블랍)이미지, 사운드, 비디오와 같은 멀티미디어 데이터를 다룰 때 사용할 수 있다.데이터의 크기(Byte) 및 MIME 타입을 알아내거나, 데이터를 송수신을 위한 작은 Blob 객체로 나누는 등의 작업에 사용한다.Blob 객체는 파일류의 불변하는 미가공 데이터를 나타냅니다. 텍스트와 이진 데이터의 형태로 읽을 수 있으며, ReadableStream으로 변환한 후 스트림 메서드를 사용해 데이터를 처리할 수도 있다.출처https://developer.mozilla.org/ko/docs/Web/API/Blob여기까지가 따라하며 배우는 자바스크립트 A-Z 강의의 마지막이다.강의를 다 듣고 이전 과제들의 코드를 살펴봤을때 정말 못했다는 느낌을 받았다. 이번 리액트까지 정규 과정이 끝나면 리팩토링을 한번 해볼 생각이다.7번 과제 - 타이핑 테스트 앱https://typing-test-henna.vercel.app/ - 완성 화면https://github.com/ygvbhy/typing_test - 코드빌드 도구 Vite CSS Bootstrap 5 (CDN)js Vanilla 배포도구 Vercel해결 과정여태까지의 과제중에 제일 생각을 많이 한 과제아래의 식을 참고함.WPM : (타이핑한 총 문자 수 / 5) / 경과 시간(분 단위) CPM : 타이핑한 총 문자 수 / 경과 시간(분 단위) ACC : (모든 글자수 - 틀린 글자수) / 모든 글자수 * 100 모든 식은 공백 포함 테스트 문자열은 html 공부 할때 많이 나오는 “Lorem ipsum dolor sit amet…” 이 문자열로 진행. html 에서 Lorem 을 치면 vsc 에서 자동완성을 제공. 얼마나 많이쓰면해당 문자열을 split 으로 자른 뒤 각 문자마다 span 으로 감싸고 진행함.textarea 에 input 이벤트를 넣고 입력 될때마다 정답과 비교 하여 정답이면 초록색 글씨, 오답이면 빨간 글씨로 변경8일차 중간 점검9일차 리액트 기본 및 Todo 앱 만들기여기서 부터 리액트 강의가 시작 된다.https://www.inflearn.com/course/따라하는-리액트/dashboard - John Ahn리액트란?리액트는 프레임워크가 아닌 라이브러리이다.프레임워크 vs 라이브러리프레임워크 : 어떠한 앱을 만들기 위해 필요한 대부분의 것을 가지고 있는 것.라이브러리 : 어떠한 특정 기능을 모듈화 해놓은 것리액트가 라이브러리인 이유는 리액트는 전적으로 UI 를 렌더링 하는 데 관여하기 때문.리액트를 도와주는 라이브러리라우팅 : react-router-dom상태 관리 : redux테스트 : jest리액트 컴포넌트컴포넌트 : 리액트로 만들어진 앱을 이루는 최소한의 단위클래스형과 함수형 두가지로 컴포넌트를 나눌 수 있다.리액트의 Hooks 가 나온 뒤론 클래스형 보다 함수형으로 개발이 많아짐npx create-react-app 이 오류가 나서 해결 했다.오류 내용중에 캐시문제가 있어서 캐시를 전부 삭제 한 뒤 다시 실행 했더니 오류 없이 설치가 되었다.sudo npm cache clean -f SPA ( Single Page Application )하나의 HTML 페이지로 구성된 웹 애플리케이션을 의미한다.장점빠른 사용자 경험더 나은 성능모바일 친화적클라이언트 측 라우팅JSX ( JavaScript extension )자바스크립트의 확장 문법. jsx 를 이용해서 ui 작업이 가능하다.React State리액트에서 데이터가 변할 때 화면을 다시 렌더링 해주기 위해서는 React State 를 사용해야 한다.컴포넌트의 렌더링 결과물에 영향을 주는 데이터를 갖고 있는 객체. State가 변경되면 컴포넌트는 리랜더링된다. 또한 State 는 컴포넌트 안에서 관리된다.React Hooksclass 없이 state 를 사용할 수 있는 새로운 기능State 와 Propsstate : 부모 컴포넌트에서 자녀 컴포넌트로 데이터를 보내는게 아닌 해당 컴포넌트 내부에서 데이터를 전달 하는 방식props: 부모 컴포넌트에서 자녀 컴포넌트로 데이터를 전달하는 방법React.memo강의에서 진행중인 Todo App 에서 컴포넌트들은 App, Lists, List, Form 이렇게 4개 존재 하는데 Form 에서 input에서의 input 이벤트를 받았을 경우 input 만 재랜더링 하면 되지만 현재 모든 컴포넌트가 렌더링 되고 있다. 이 문제를 해결 하기 위해선 적용해야 하는 컴포넌트에 React.memo 를 감싸주면 된다.useCallback위의 예시와 마찬가지로 App 컴포넌트에서 생성된 함수를 Lists 를 거쳐 List 까지 Props 로 내려온다면 App 컴포넌트가 재 렌더링 될때 마다 함수가 새롭게 선언 되고 그로인해 Props 로 받아가는 Lists 와 List 까지 재렌더링 된다. 그러므로 useCallback 을 감싸주고 타겟을 정한 뒤 선언 하면 타겟이 바뀌지 않는한 함수를 새로 생성되지 않는다.useMemo 를 이용한 결과 값 최적화메모이제이션(Memoization)은 비용이 많이 드는 함수 호춣의 결과를 저장하고 동일한 입력이 다시 발생할 때 캐시된 결과를 반환하여 프로그램의 속도를 높이는 데 줄로 사용되는 최적화 기술Component 내의 compute 함수가 만약 복잡한 연산을 수행하면 결과 값을 리턴하는데 오랜 시간이 걸리게 된다. 이럴 시에 컴포넌트가 계속 리 렌더린 된다면 계속 수행하는데 오랜 시간이 걸려서 성능 저하가 발생 한다. 이걸 해결 하는게 useMemo . compute 함수에 넘겨주는 값은 이전과 동일 하다면 리 렌더링이 되더라도 연산을 다시 하지 않는다.function Component({a, b}) { const result = useMemo(() => compute(a,b), [a, b]) return <div>{result}</div> } 8번 과제 - 예산 계산기 앱https://cal-app-vert.vercel.app/ - 완성 화면https://github.com/ygvbhy/cal-app - 코드빌드 도구 Vite CSS tailwind css js React 배포도구 Vercel Library izitoast, react-beautiful-dnd해결 과정강의인 Todo 만들기와 매우 흡사한 과제이며 방식이 비슷함.강의 에선 webpack 을 썻지만 과제는 vite를 사용해서 jsx 로 작업 해서 추가적으로 요구 하는 사항이 있다보니 거기서 시간이 오래 걸렸음 ( propTypes 등등 )총 지출 금액 계산에서 아직 배우진 않았지만 useEffect 기능을 사용함후기이번주는 특히 바쁜 주였다. 현업도 진행 중이고 스터디도 진행 하려 하다보니 몸이 힘들었는지 영 집중이 되질않고 잠을 많이 잤다.. ;몸 상태를 핑계로 미루고 미루다가 일요일에 허겁지겁 하는 결과를 낳았다. 다음주에는 빠릿빠릿하게 하고 싶긴 한데 앞으로 휴일이 없다 ㅎㅎ

프론트엔드워밍업클럽프론트엔트2주차발자국

SK 1개월 전

[워밍업 클럽 2기 - Clean Code & Test Code] 2주차 발자국

워밍업 클럽 2기: Clean Code & Test Code의 2주차 발자국 작성입니다.1주차 발자국 보러가기 ✍ 학습 내용 복습이전의 클린 코드에 대해 학습한 내용을 직접 코드에 적용해서 리팩토링하는 시간을 가졌습니다.메서드 추출 시 고려할 점중복 제거무조건적인 중복 제거 보다는 상황에 맞춰서(어설픈 중복 제거 보다는 사람들이 이해하기 쉬운 코드가 더 좋음!)주변의 추상화 레벨과 동떨어져 있는지 항상 확인 객체의 책임 파악 시 고려할 점책임은 상황에 따라서 변할 수 있음예시특정 주문의 할인 금액과 총 가격을 출력하는 기능이 있다고 가정하자. 할인 금액과 총 가격이 단순히 출력 용도로만 사용된다면 해당 가격 계산을 출력을 담당하는 클래스에서 정의할 수 있겠지만, 보통은 추후에 다른 곳에서도 사용될 가능성이 있기 때문에 주문 클래스의 책임으로 만드는 것이 더 좋은 설계일 가능성이 높다(물론 이것은 상황에 따라 언제든지 변할 수 있다) 🤔 회고처음부터 내가 설계한 코드를 리팩토링 하는 것과 남의 코드를 리팩토링 하는 것은 굉장히 다르다는 것을 체감했다남의 코드 리팩토링 하는 것이 더 어렵다 😭그냥 강의만 듣고 넘어가는 것 보다, 코드를 작성하고 강사님의 코드와 비교하는 것이 학습에 훨씬 도움이 된다!🔍 참고Readable Code: 읽기 좋은 코드를 작성하는 사고법

백엔드워밍업클럽2기백엔드클린코드-테스트코드발자국2주차

lar

[인프런 워밍업 클럽 스터디 1기] 두번째 발자국

1. 2주차 학습한 내용 [6일차 - 스프링 컨테이너의 의미와 사용 방법]1. UserController와 스프링 컨테이너스프링 빈이란?서버가 시작되면, 스프링 서버 내부에 컨테이너를 생성한다.컨테이너 안에 클래스가 들어간다.이때 다양한 정보도 들어있고, 인스턴스화도 이루어진다.들어간 클래스를 스프링 빈이라고 한다.JdbcTemplate 의존성 주입이 되어있다.JdbcTemplate을 스프링 빈으로 등록해주는 설정 코드가 있다.dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' } 서버 시작 시스프링 컨테이너 시작 -> 기본적으로 많은 스프링 빈 등록 -> 우리가 설정한 스프링 빈(UserController) 등록 -> 의존성 자동으로 설정스프링 빈으로 등록각 클래스가 JdbcTemplate을 가져오기 위해 스프링 빈으로 등록한다.어노테이션 추가한다.2. 스프링 컨테이너를 왜 사용할까?Interface 활용BookController는 BookService을 사용한다.BookService는 BookRepository 인터페이스 사용한다.또 다른 Repository(Repository1, Repository2)가 있다. BookService 코드를 변경하지 않고 BookRepository을 변경할 수 있는 방법이 스프링 컨테이너이다.스프링 컨테이너 사용시컨테이너가 Repository1 또는 Repository2 중 하나를 선택한 후 BookService를 생성해준다. 이러한 방식을 제어의 역전(IoC, Inversion of Control)이라고 한다.컨테이너가 BookService를 생성할 때, Repository1와 Repository2 중 하나를 선택해서 넣어준다. 이러한 과정을 의존성 주입(DI, Dependency Injection)이라도 한다.우선권을 부여하는 어노테이션 활용@Primary : 우선권을 결정하는 어노테이션을 의미한다.@Primary 어노테이션을 사용 시 Service 코드 변경없이 해당 Repository를 사용할 수 있다.3. 스프링 컨테이너를 다루는 방법빈을 등록하는 방법@Configuration클래스에 붙이는 어노테이션이다.@Bean을 사용할 때 함께 사용해야 한다.@Bean메서드에 붙이는 어노테이션이다.메서드에서 반환하는 객체를 스프링 빈에 등록한다.@Configuration과 @Bean 사용하는 경우외부 라이브러리, 프레임워크에서 만든 클래스를 등록할 때 사용한다.@Component주어진 클래스를 컴포넌트로 간주한다.이 클래스들은 스프링 서버를 시작할때 자동으로 감지된다.언제 @Component가 사용될까?Controller, Service, Repository가 아닌 추가적인 클래스를 스프링 빈으로 등록할 때 종종 사용된다.스프링 빈 주입 받는 방법생성자 사용(@Autowired 생략 가능) -> 가장 권장한다.@Setter와 @Autowired 사용 -> 누군가 Setter를 사용하면 오작동할 수 있다.필드에 직접 @Autowired 사용 -> 테스트를 어렵게 만드는 요인이다.@Qualifer("value") 사용여러가지 후보군이 있을 때 특정 하나를 가져오고 싶을때 사용한다.스프링 빈을 사용하는 쪽과 스프링 빈을 등록하는 쪽 모두 사용할 수 있다.적어준 값이 동일한 것끼리 연결된다.@Primary와 @Qualifer 함께 사용할 경우우선권을 결정해주는 @Primary와 @Qualifer을 함께 사용했을 때 누가 사용될까?@Qualifer을 사용한다.> 스프링 빈을 사용하는 쪽에서 특정 빈을 지정해준 것의 우선순위를 더 높게 간주한다.  [7일차 - Spring Data JPA를 사용한 데이터베이스 조작]1. 문자열 SQL을 직접 사용하면 좋지 않은 이유문자열을 작성하기 때문에 실수할 수 있고, 실수를 인지하는 시점이 느리다. 컴파일 시점에 발견되지 않고 런타임 시점에 발견된다.특정 데이터베이스에 종속적이게 된다. DB의 종류마다 문법이 조금씩 다르다.반복 작업이 많아진다. 테이블 하나 만들 때마다 CRUD 쿼리가 항상 필요하다.데이터베이스의 테이블과 객체는 패러다임이 다르다.2. JPA(Java persistence API)JPA란?자바 진영의 ORM(Object-Relational Mapping) 기술 표준을 의미한다.객체와 관계형 DB의 테이블을 매핑하여 데이터를 영구적으로 저장할 수 있도록 정해진 Java 진영의 규칙을 의미한다.Hibernate규칙을 구현한 구현체를 Hibernate(하이버네이트)라고 한다.Hibernate는 내부적으로 JDBC를 사용한다.3. 유저 테이블에 대응되는 Entity Class 만들기 - Java 객체와 MySQL Table 매핑하기JPA 어노테이션@Entity : 저장되고, 관리되어야 하는 데이터를 의미한다.@Id : 해당 필드를 primary key로 간주한다.@GeneratedValue : primary key는 자동 생성되는 값이다.@Column(생략 가능) : 객체의 필드와 Table의 필드를 매핑한다.기본 생성자 추가기본 생성자도 추가해야 한다.@Entity public class User { protected User() { } } application.yml - JPA 설정 옵션 추가spring: jpa: hibernate: ddl-auto: none properties: hibernate: show_sql: true format_sql: true dialect: org.hibernate.dialect.MySQL8Dialect 4. Spring Data JPA 사용 - 자동으로 쿼리 전송하기SQL을 작성하지 않고 유저 생성/조회/업데이트 기능 리팩토링하기유저 생성 기능 리팩토링하기Interface UserRepository인터페이스 UserRepository 생성 후 JpaRepository를 상속 받는다.UserServicesave() 메서드에 객체를 삽입하면 Insert SQL이 자동으로 전송된다.저장이 된 후 User에는 id가 들어간다. 유저 조회 기능 리팩토링하기UserResponse 생성자 추가코드를 더 깔끔하게 만들기 위해 생성자를 추가한다.UserServicefindAll 메서드를 사용하면 모두 유저의 데이터를 조회하는 SQL이 전송된다.그 결과, List가 반환되고, UserResponse로 변경해서 전달한다.유저 수정 기능 리팩토링하기UserfindById를 사용하면 id를 기준으로 1개의 데이터를 가져온다.Optional의 orElseThrow를 사용해 User가 없을 경우 예외처리한다.객체를 수정해주고, save 메서드를 호출한다.자동으로 UPDATE SQL이 전송된다.SQL을 작성하지 않아도 동작 하는 이유Spring Data JPA를 통해 SQL을 작성하지 않아도 동작한다.Spring Data JPA : 복잡한 JPA 코드를 스프링과 함께 쉽게 사용할 수 있도록 도와주는 라이브러리이다.5. Spring Data JPA 사용 - 다양한 쿼리 작성하기By 앞에 들어갈 수 있는 구절 정리find : 데이터 1건을 가져온다. 반환 타입은 객체, Optional<타입>이다.findAll : 쿼리의 결과물이 N개인 경우 사용한다. List<타입>을 반환한다.exists : 쿼리 결과가 존재하는지 확인한다. 반환 타입은 boolean이다.count : SQL의 결과 개수를 센다. 반환 타입은 long이다.각 구절은 and 또는 or로 조합할 수 있다.By 뒤에 들어갈 수 있는 구절 정리GreaterThan : 초과GreaterThanEqual : 이상LessThan : 미만LessThanEqual : 이하Between : 사이에StartsWith : ~로 시작하는EndsWith : ~로 끝나는 [8일차 - 트랜잭션과 영속성 컨텍스트]1. 트랜잭션(Transaction)트랜잭션이란?쪼갤 수 없는 업무의 최소 단위를 의미한다. (모두 성공하거나 실패하는 경우)트랜잭션 동작 명령어트랜잭션 시작하기 : start transaction;트랜잭션 정상 종료하기 (SQL 반영) : commit;트랜잭션 실패 처리하기 (SQL 미반영) : rollback;2. 트랜잭션 적용과 영속성 컨텍스트트랜잭션 적용하기@Transactional 어노테이션을 사용한다.@Service public class UserServiceV2 { //조회 - readOnly 옵션 사용 가능(SELECT 쿼리) @Transactional(readOnly = true) public List<UserResponse> getUsers() { return userRepository.findAll().stream().map(UserResponse::new).collect(Collectors.toList()); } } 메서드가 시작될때 Transactional 시작된다.메서드 로직이 정상적으로 성공하면 commit되고, 문제가 생길 경우 rollback된다.트랜잭션을 사용 하는 이유트랜잭션이 없으면 코드가 한줄 한줄 반영된다.오류가 생겨도 다른 코드는 반영된다.주의사항org.springframework.transaction.annotation.Transactional을 붙여야 한다.IOException과 같은 Checked Exception은 롤백이 일어나지 않는다.영속성 컨텍스트이란?테이블과 매핑된 Entity 객체를 관리 및 보관하는 역할을 의미한다.트랜잭션과 영속성 컨텍스트의 관계트랜잭션 사용 -> 영속성 컨텍스트 시작트랜잭션 종료 -> 영속성 컨텍스트 종료영속성 컨텍스트의 특징변경 감지(Dirty Check) : 영속성 컨텍스트 안에서 확인된 Entity는 명시적으로 save하지 않아도 변경을 감지해서 자동으로 저장한다.쓰기 지연 : DB의 INSERT/UPDATE/DELETE SQL을 바로 전송하지 않고, 트랜잭션이 commit될 때 SQL을 모아서 한번만 전송한다.1차 캐싱 : ID를 기준으로 Entity를 기억한다. 최초 1회만 쿼리가 전송되고, 나머지는 보관하고 있는 데이터를 활용한다. 이렇게 반환된 객체는 동일하다. [9일차 - 조금 더 복잡한 기능을 API로 구성하기]1. 책 생성/대출/반납 기능 API 개발하기book 테이블 및 객체 생성, DTO, Repository, Service, Controller 구현대출 기록에 대한 Table 추가, 대출 기록 Table에 대한 객체 생성, DTO, Repository, Service, Controller 구현생성한 테이블로 구현이 충분하지만, DTO를 새로 만드는 게 낫다.다른 기능들 중 한 기능에 변화가 생길 경우 더 유연하게 side-effect가 없이 대처가 가능하기 때문이다.2. 미션네 번째 과제(4일차)다섯 번째 과제(5일차)3. 회고1주차보다 학습한 내용이 많아진 만큼 정리를 잘하고 공부를 많이 해야겠다고 느꼈다. 금요일에 해주신 특강도 너무 도움이 되었다. 내용이 나한테는 아직 어려웠지만 다른 사람들의 코드를 보면서 나도 좀 더 고민해보고 코드를 짜고 과제도 해봐야겠다.

백엔드발자국회고워밍업2주차

lar 6개월 전
코파

인프런 워밍업 클럽 스터디 1기 FE | 2주차 발자국

목차React 세팅 Todo List 만들기 느낀점1. React 세팅Create-react-appnpm 또는 npx로 설치npm init react-app my-appnpx create-react-app my-appReact 애플리케이션을 만들기 위한 기본 파일 및 구조가 설정됨.npx 사용이 더 좋은 이유항상 최신 버전을 설치하므로 React를 설치한 후에도 다시 업데이트할 필요가 없음.프로젝트의 루트 디렉토리에 React를 설치하지 않고도 React 스크립트를 실행할 수 있음.프로젝트마다 React를 별도로 설치할 필요가 없음. 참고) 프로젝트 이름에 대문자 들어가면 오류 React 앱을 개발모드로 실행npm startsomething is already running on port 3000 에러Y를 누르면 다른 포트를 만들어서 동작하게 함. Vite 터미널에 해당 명령어를 입력해준다.npm create vite@latest프로젝트 이름을 지정해준다.Back-space 없이 그냥 입력하면 알아서 덮어 써진다.React를 선택한다.해당 명령어를 순서대로 입력하면 된다.SWC(Speedy Web Compiler)자바스크립트 프로젝트의 컴파일과 번들링 모두에 사용될 수 있는, Rust라는 언어로 제작된 빌드 툴말 그대로 매우 빠른 웹 컴파일러의 기능을 제공하는 툴  cd 입력하고 첫글자 누르고 tap 누르면 됨. 2. Todo List 만들기Todo List 만들 때 발생한 오류1) React에서 배열(리스트)를 렌더링할 때 각 항목에는 고유한 "key" prop이 있어야 함.해결 방법리스트로 렌더링되는 각 요소에 고유한 "key" prop을 추가하면 됨. 2) <input> 요소에 value prop을 썼지만 해당 요소에는 onChange 핸들러가 없음.이런 경우 사용자 입력에 대한 처리가 없는 상태로 값을 변경할 수 없다고 경고 문구를 띄움.해결 방법1) defaultValue prop 사용<input defaultValue={this.state.value} />2) onChange 핸들러 추가<input value={this.state.value} onChange={(e) => this.setState({ value: e.target.value })} /> 3) TypeScript에서 이벤트 핸들러의 매개변수 타입은 일반적으로 React.ChangeEvent를 사용함. import React, { ChangeEvent } from "react";  handleChange = (e: ChangeEvent<HTMLInputElement>) => { console.log(e); };3. 느낀점이번 한 주 동안 기록할 만한 일이 없었다.채용 공고를 깔짝이면서 둘러보는 데 쓸데없이 시간을 낭비하였고, 아무것도 하기 싫다는 생각으로 퍼질러서 정말 별 것도 하지 않았다. 하지만 이제는 강의를 열심히 듣고 과제를 완성해야겠다는 생각이 들었다. 현재의 상황에 집중하고 최선을 다해야하는 것이 맞는 것 같다.

웹 개발워밍업클럽발자국FE2주차

이혜리

[인프런 워밍업 클럽 스터디1기] 백엔드 - 2주차 회고

2주차 정리 및 회고Section3. 역할의 분리와 스프링 컨테이너클린코드클린코드 : 함수는 최대한 작게 만들고 한 가지 일만 수행하는 것이 좋다. UserController.java 가api 진입점,현재 유저가 있는지 없는지 확인하고 예외처리,SQL을 사용해 실제 database와의 통신  을 담당하는 3가지 역할을 다 하고 있으므로, 클린코드가 아니다. 이러한 상태의 단점은 너무 큰 기능이기 때문에 테스트도 힘들다.종합적으로 유지보수성이 매우 떨어진다.따라서 Controller를 3단 분리하여 클린 코드로 작성하였다. 기존 api 진입점으로써 HTTP Body를 객체로 변환의 역할은 Controller 의 역할로 남겨두고,현재 유저가 있는지 없는지 확인하고 예외처리 의 역할은 Service가,SQL을 사용해 실제 database와의 통신 의 역할은 Repository가 담당한다. 스프링 컨테이너서버가 시작되면, 스프링 컨테이너(클래스 저장소)가 시작된다. 스프링 빈들(클래스들) 이 등록되고 - dependency 주입된, 사용자가 직접 설정해준 스프링 빈이 등록된다. 이때 필요한 의존성이 자동으로 설정된다.예를 들어, UserController에서 필요한 JdbcTemplate이 자동으로 생성자 내로 들어간다. 위와 같이 Book 관련 3단 분리 코드를 예시로 봤다.이때, 두 repository 중 어떤 것을 우선순위로 하는지는 @Primary @Qualifier 어노테이션을 사용하면 된다. Section4. 생애 최초 JPA 사용하기JPA 사용지금까지 작성한 코드를 살펴보면 아쉬운 몇 가지가 있다.repository 클래스 내에서 문자열로 쿼리를 작성하기 때문에 실수할 수 있고, 실수를 인지하는 시점이 느리다.특정 데이터베이스에 종속적이게 된다. 우리의 경우엔 MySql반복 작업이 많아진다.데이터베이스의 테이블과 객체의 매핑되는 패러다임이 다르다.따라서 JPA (Java Persistence API) 데이터를 영구적으로 보관하기 위해 java 진영에서 정해진 규칙을 사용한다.즉, 객체와 관계형 데이터베이스 테이블을 짝지어 데이터를 영구적으로 저장할 수 있도록 돕는다.이를 사용하기 위해서는 Hibernate 가 필요하다.직접 매핑해보자유저 테이블에 대응되는 entity class 인 User.java 를 만들면 다음과 같이 코드가 수정된다.package com.group.libraryapp.domain; import org.springframework.lang.Nullable; import javax.persistence.*; @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id = null; @Column(nullable = false, length = 20, name = "name" ) //name varchar(20) private String name; @Column(nullable = false) private Integer age; protected User() { } public User(String name, Integer age) { if (name == null || name.isBlank()){ throw new IllegalArgumentException(String.format("잘못된 name(%s)이 들어왔습니다.")); } this.name = name; this.age = age; } public String getName() { return name; } public Integer getAge() { return age; } public Long getId() { return id; } public void updateName(String name) { this.name = name; } } 또한 jpa 를 사용하기 위해서 application.yml 파일도 변경하자.hibernate 부분을 추가해준다.spring: datasource: url: "jdbc:mysql://localhost/library" username: "root" password: "1234" driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: none properties: hibernate: show_sql : true format_sql : true dialect : org.hibernate.dialect.MySQL8Dialect😀 spring.jpa.hibrenate.ddl-auto : none스프링이 시작할 때 DB에 있는 테이블을 어떻게 처리할지에 대한 옵션이다. 현재 DB에 테이블이 잘 만들어져 있고, 미리 넣어둔 데이터도 있으므로 별 다른 조치를 하지 않는다. 자동으로 쿼리 날리기 (기본)repository 폴더 내에 UserRepository interface를 만들어준 뒤,JpaRepository 를 상속받게 해준다.package com.group.libraryapp.repository.user; import com.group.libraryapp.domain.User; import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; public interface UserRepository extends JpaRepository<User, Long> { Optional<User> findByName(String name); }UserService.java에서save, findAll, delete 등의 기본적인 쿼리들은 sql 문자열을 타이핑할 필요없이 자동으로날릴 수 있게 되었다.package com.group.libraryapp.service.user; import com.group.libraryapp.domain.User; import com.group.libraryapp.repository.user.UserRepository; import com.group.libraryapp.dto.User.request.UserCreateRequest; import com.group.libraryapp.dto.User.request.UserUpdateRequest; import com.group.libraryapp.dto.User.response.UserResponse; import org.springframework.stereotype.Service; import java.util.List; import java.util.stream.Collectors; @Service public class UserServiceV2 { private final UserRepository userRepository; public UserServiceV2(UserRepository userRepository) { this.userRepository = userRepository; } public void saveUser(UserCreateRequest request){ userRepository.save(new User(request.getName(),request.getAge())); }// INSERT SQL 이 자동으로 날라감. public List<UserResponse> getUser(){ return userRepository.findAll().stream() .map(UserResponse::new ) .collect(Collectors.toList()); } public void updateUser(UserUpdateRequest request){ User user = userRepository.findById(request.getId()) .orElseThrow(IllegalArgumentException::new); user.updateName(request.getName()); userRepository.save(user); } public void deleteUser(String name){ User user = userRepository.findByName(name) .orElseThrow(IllegalArgumentException::new); userRepository.delete(user); } }JpaRepository<Entity, ID>를 구현 받는 Repository에 대해 자동으로 기본적인 메소드(save, findAll) 를 사용할 수 있는 SimpleJpaRepository 기능을 사용할 수 있게 해준다. 그렇다면 다른 다양한 쿼리는 어떻게 작성할까?위 코드에서 삭제 기능인 deleteUser 메소드는userRepository.findByName 메소드를 사용하고 있다.이 메소드는 SimpleJpaRepository 기능이 아니라, 추가로 interface에 추상(?) 함수 정의만 해놓은 findByName 을 사용한 것이다. By 앞에는 다음과 같은 구절이 들어갈 수 있다. findfindAllexistscountBy 뒤에는 필드 이름이 들어가는데, And나 Or 로 조합될 수 있다. 또한 동등조건 (=) 외에도 다양한 조건을 사용할 수 있다.회고벌써 워밍업 클럽 스터디의 반이나 지났다. 확실히 이렇게 약간의 강제성을 부여하는 스터디가 나랑 잘 맞는 것 같다. 나 혼자서 공부했으면, 금방 흐지부지 되었을텐데 스터디 코치님들이 디스코드에 종종 올려주시는 글들이나, 다른 분들이 과제한 부분들을 읽으면서 배우는 점도 많은 것 같고, 완주러너의 혜택도 욕심이 나서 더욱 공부를 하게 되는 것 같다.

백엔드백엔드3단분리JPA2주차발자국

나무님

인프런 워밍업 클럽 - BE 0기, 회고 #2

인프런 워밍업 클럽 2주 차 학습이 종료되었다. 강의 수강지난주 강의까지는 비교적 수월하게 따라갈 수 있었지만 이번 주에는 JPA를 배우면서 강의를 따라가는 데 약간의 어려움이 있었다.강의를 들을 때는 이해를 하고 넘어간 것 같은데 과제를 하면서 직접 코딩을 시작하니 내가 짠 코드가 맞는지 의문이 생겼다.특히 쿼리를 사용하지 않고 Spring Data JPA 쿼리 네이밍 룰에 맞게 이름을 작성하는 게 어려웠다.검색과 자동완성을 통해 네이밍 룰을 작성하다 보니 조금 감을 잡긴 했지만, 아직 익숙하지 않고 원하는 결과를 얻으려면 어떤 네이밍 룰을 맞춰줘야 하는지 알 수 없어서 더 오래 걸린 것 같다.익숙해지면 훨씬 쉽게 사용할 수 있을 것 같다.Entity에서 각 객체끼리 연관관계를 맺는 것도 아직은 조금 어려운 것 같다.개념은 이해했는데 어느 테이블이 N이고 어느 테이블이 1인지 파악하는 것도 헷갈리고, 매핑을 해서 데이터를 가져오는 것도 헷갈린다.이제까지 사용해보지 않은 JPA를 배우면서 처음에는 많이 헤맸지만 강의를 다시 한번 보고 아직 이해되지 않는 부분을 해결하기 위해 다른 자료를 찾아보며 지식을 채워 넣으니 약간은 뿌듯한 마음이 들었다.한 단계 더 성장한 느낌이 든다.과제6일차 과제7일차 과제미니프로젝트(진행중)  이번 주에 느낀점.1. Spring Data JPA 쿼리 네이밍 룰 공부2.연관관계 매핑 공부 다음주도 화이팅!!!🙌

백엔드인프런워밍업클럽인프런워밍업클럽BE0기회고2주차

채널톡 아이콘