블로그

내가 모르는 js기초 문법들(=>,reduce,foreach...)

이번에 강의를 들으면서 뭔가 당연히 알아야한다는 느낌으로 설명이 나오는데 완전히 처음보는 문법들이 있었다.일단은 그러려니 했었는데 js코테 문제를 풀어보고 다른 사람들 풀이를 보는데 그곳에서도 비슷한 문법들이 나오길래 이번 기회에 그냥 그 문법들을 정리해보기로 하였다.js 화살표 문법 (=>)일반적으로 함수를 만드는 방식을 간편하게 바꾼 것이 화살표 문법(arrow function)이다.사용 방식은 let func = (arg1, arg2, ...argN) => expression방식이다.let (함수명) = (매개변수's) => (함수 내용)의 방식이다.이렇게 설명만 한다면 감이 잘 오지 않을 수 있으니 간결한 사용 예시를 들어본다면let sum = (a, b) => a + b;이다. 만약 받는 인수가 없는 경우에는let sayHi = () => alert("안녕하세요!");방식으로 작성한 후sayHi();를 입력하면 된다.약간 더 활용을 추가하면 삼항연산자를 추가하여서let welcome = (age < 18) ? () => alert('안녕') : () => alert("안녕하세요!");방식으로 작성 할 수 있다.그리고 내용을 여러줄로 적어야 할 경우에는let sum = (a, b) => { let result = a + b; return result; };방식으로 적어야 한다.※주의점※화살표 함수에서는 this 사용 시 주의해야 한다.var name = "Global"; let user = { name: "Inpa", sayHi: function() { console.log(this.name); } }; user.sayHi(); // Inpa위 경우는 일반 함수라서 this.name이 Inpa로 나오지만var name = "Global"; let user = { name: "Inpa", sayHi: () => { console.log(this.name); } }; user.sayHi(); // Global위 경우는 화살표 함수라서 this.name이 Global로 나온다.js reducereduce의 일반적인 사용 방법은const arr = [1, 2, 3, 4, 5] arr.reduce(function (acc, cur, idx) { console.log(acc, cur, idx); return acc + cur; }, 0);이다.acc는 accumulator의 약자로 현재까지의 cur(=currentValue)의 누적 값들을 의미한다.cur은 currentValue의 약자로서 arr[index]의 값을 의미한다.idx는 index의 약자로 현재 값이 arr을 기준으로 몇번째(0~)인지를 의미한다.이게 일반적인 사용법중 하나인 배열 요소의 합산 예시이다.다른 활용방법으로는 map구현이 있다.const arr = [1, 2, 3, 4, 5] const result = arr.reduce(function (acc, cur) { acc.push(cur % 2 ? "홀수" : "짝수"); return acc; }, []); console.log(result); // [ '홀수', '짝수', '홀수', '짝수', '홀수' ] 위 방법은 arr의 값들은 순차적으로 집어넣은 후 홀수면 홀수,짝수면 짝수가 되도록 새로운 배열을 만든 것이다.마지막에 있는 []의 정체는 initialValue로 그냥 초기값이다.※알면 좋은 것들※1. 사실 단순 함수를 만들것이면 화살표가 더 "간결"하다.(무조건적으로 좋지는 않다.)2. 배열을 끝값부터 하고싶으면 reduceRight가 있다.js foreachforeach는 개념자체는 상당히 간단하다.var arr = ['가','나','다','라']; arr.forEach(function(item,index,arr2){ console.log(item,index,arr2[index+1]); })보다시피 arr의 값들을 안에 있는 함수에 순차적으로 집어넣는 구조이다.앞의 코드를 실행시키면가 0 나 나 1 다 다 2 라 라 3 undefined 가 출력된다.순서대로 (현재 들어간 값, 현재 들어간 값의 index값,현재 index+1의 값)번외-for in과 for offor in은 객체({key:value}의 형태)에 사용 할 수 있다.var obj = { a: '가', b: '나', c: '다' }; for (var key in obj) { console.log(key, obj[key]); // a 가, b 나, c 다 }key에다가 obj의 key값을 넣는 방식으로 작동된다. for of는 for in과는 유사하면서도 다른데 for of는 key가 아닌 값만을 순차적으로 집어넣는다.var iterable = [10, 20, 30]; for (var value of iterable) { console.log(value); // 10, 20, 30 }보다시피 value에 iterable의 값들이 순차적으로 들어가고 출력된것을 확인할 수 있다.py의 for문같은 느낌인 것 같다.

수희

[워밍업클럽] BE 1기 #과제5

우리는 <클린 코드>라는 개념을 배웠습니다. <클린 코드>에 대한 감각을 익히기 위해서는 어떤 코드가 좋은 코드이고, 어떤 코드가 좋지 않은 코드인지 이론적인 배경을 학습하는 것도 중요할 뿐 아니라, 다양한 코드를 읽어 보며 어떤 부분이 읽기 쉬웠는지, 어떤 부분이 읽기 어려웠는지, 읽기 어려운 부분은 어떻게 고치면 좋을지 경험해보는 과정이 필요합니다.이번 과제는 제시된 코드를 읽어보며, 코드를 더 좋은 코드로 고쳐나가는 과정입니다. 구글에 “클린 코드” 혹은 “클린 코드 정리”를 키워드로 검색해보면, 이론적인 배경을 충분히 찾아보실 수 있습니다. 🙂 그러한 내용들을 보며 제시된 코드를 더 좋은 코드로 바꿔보세요! (코드를 바꿀 때 왜 바뀐 코드가 더 좋은 코드인지 다른 사람에게 설명하신다고 생각해보시면 더욱 좋습니다.)[제시된 코드]여러 함수로 나누어도 좋습니다! 🙂여러 클래스로 나누어도 좋습니다! 🙂 최대한 클린하지 않게 작성된 아래 코드는 다음과 같이 동작합니다.주어진 숫자를 하나 받는다.해당 숫자만큼 주사위를 던져, 각 숫자가 몇 번 나왔는지 알려준다. import java.util.Scanner; public class Main { public static void main(String[] args) throws Exception{ System.out.print("숫자를 입력하세요 : "); Scanner scanner = new Scanner(System.in); int a = scanner.nextInt(); int r1 = 0, r2 = 0, r3 = 0, r4 = 0, r5 = 0, r6 = 0; for(int i = 0 ; i < a ; i++){ double b = Math.random() * 6; if(b >= 0 && b < 1) { r1++; }else if(b >= 1 && b < 2){ r2++; }else if(b >= 2 && b < 3){ r3++; }else if(b >= 3 && b < 4){ r4++; }else if(b >= 4 && b < 5){ r5++; }else if(b >= 5 && b < 6){ r6++; } } System.out.printf("1은 %d번 나왔습니다.\n",r1); System.out.printf("2은 %d번 나왔습니다.\n",r2); System.out.printf("3은 %d번 나왔습니다.\n",r3); System.out.printf("4은 %d번 나왔습니다.\n",r4); System.out.printf("5은 %d번 나왔습니다.\n",r5); System.out.printf("6은 %d번 나왔습니다.\n",r6); } } 풀이 > 위의 코드가 클린하지 않은 이유는 여러 역할을 수행하고 있으며, 의미를 알 수 없는 변수를 사용하고 있다. 또한 주사위눈의 수가 6개가 아닌경우 코드 수정(횟수를 저장하는 변수 추가, if문 수정, 결과 출력문 수정)이 필요하다. 해당 코드에서 수행하는 역할을 크게 3개로 나눠 각각을 함수로 분리하였다.System.out.print("숫자를 입력하세요 : "); Scanner scanner = new Scanner(System.in); int a = scanner.nextInt();int number = init(); public static int init(){ System.out.print("숫자를 입력하세요 : "); Scanner scanner = new Scanner(System.in); return scanner.nextInt(); }-> number를 받는 init함수를 구현하였다. int r1 = 0, r2 = 0, r3 = 0, r4 = 0, r5 = 0, r6 = 0; for(int i = 0 ; i < a ; i++){ double b = Math.random() * 6; if(b >= 0 && b < 1) { r1++; }else if(b >= 1 && b < 2){ r2++; }else if(b >= 2 && b < 3){ r3++; }else if(b >= 3 && b < 4){ r4++; }else if(b >= 4 && b < 5){ r5++; }else if(b >= 5 && b < 6){ r6++; } }-> 기존의 코드는 변수r1~r6을 사용해 결과를 저장할때 if문으로 b값이 어느 숫자인지 확인하는 부분이 있는데, 주사위눈의 수만큼 배열을 선언하여 b값만 구한후 해당 인덱스값에 합을 누적하여 if문과 r1~r6변수를 사용하지 않도록 수정하였다.int[] diceCountArr = getDiceCount(number); private static int[] getDiceCount(int number) { int dice[] = new int[6]; for(int i = 0 ; i < number ; i++){ dice[(int)Math.random() * 6]++; } return dice; } 코드 마지막부분에 결과를 출력하는데, 만약, 주사위눈의 개수가 변경되는 경우 System.out.printf문을 삭제하거나 추가해야한다. System.out.printf("1은 %d번 나왔습니다.\n",r1); System.out.printf("2은 %d번 나왔습니다.\n",r2); System.out.printf("3은 %d번 나왔습니다.\n",r3); System.out.printf("4은 %d번 나왔습니다.\n",r4); System.out.printf("5은 %d번 나왔습니다.\n",r5); System.out.printf("6은 %d번 나왔습니다.\n",r6); -> 결과값 출력 부분을 배열길이만큼 for문을 수행하여 System.out.printf문을 불필요하게 늘이거나 줄이지 않고 출력하도록 printResult함수를 구현하였다.printResult(diceCountArr); private static void printResult(int[] diceCountArr) { for(int i = 0 ; i < diceCountArr.length ; i++){ System.out.println((i + 1) + "은 " + diceCountArr[i] + "번 나왔습니다."); } } 만약 주사위눈의 개수가 6이아니라면 배열을 초기화하는 수와 랜덤값을 구할때 곱해주는 부분을 수정해야한다.static 변수 diceNumber로 주사위눈 개수를 초기화하도록 코드를 수정하였다.주사위눈 개수를 변경하려면 diceNumber값을 수정하면되고, dice배열 초기화때 길이값과 랜덤값 계산시 해당 변수를 사용하게된다.private static int diceNumber = 7;private static int[] getDiceCount(int number) { int dice[] = new int[diceNumber]; for(int i = 0 ; i < number ; i++){ dice[(int)(Math.random()*diceNumber)]++; } return dice; } 변경한 코드import java.util.Scanner; public class Main { private static int diceNumber = 7; public static int init(){ System.out.print("숫자를 입력하세요 : "); Scanner scanner = new Scanner(System.in); return scanner.nextInt(); } private static int[] getDiceCount(int number) { int dice[] = new int[diceNumber]; for(int i = 0 ; i < number ; i++){ dice[(int)(Math.random()*diceNumber)]++; } return dice; } private static void printResult(int[] diceCountArr) { for(int i = 0 ; i < diceCountArr.length ; i++){ System.out.println((i + 1) + "은 " + diceCountArr[i] + "번 나왔습니다."); } } public static void main(String[] args) throws Exception{ int number = init(); int[] diceCountArr = getDiceCount(number); printResult(diceCountArr); } }  강의- 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지], https://inf.run/XKQg출처https://mangkyu.tistory.com/132https://ittrue.tistory.com/336https://tasddc.tistory.com/84https://gyoogle.dev/blog/computer-science/software-engineering/Clean%20Code%20&%20Refactoring.html

강호연

[인프런 워밍업 스터디 클럽 1기_FE] 스터디 5조 Deboune and Throttle

Debouncing and Throttling들어가며웹 애플리케이션을 개발할 때, 이벤트을 처리하는 것은 중요한 과제 중 하나입니다. 특히, 사용자의 이벤트에 반응하여 적절한 작업을 수행하는 것은 좋은 사용자 경험을 제공하기 위해 필수적입니다. 이때 debounce와 throttle은 이벤트 효율적으로 핸들링하는 데에 큰 도움이 됩니다. 또한, 이벤트 횟수를 조절하는 것으로 서버 자원을 아낄 수도 있습니다. 이번 스터디에서는 debounce와 throttle의 개념과 활용 방법에 대해 알아보겠습니다.DebounceDebounce는 반복적으로 발생하는 이벤트를 일정 시간 동안 딜레이시켜 마지막 이벤트만을 처리하는 방식입니다. 자동문을 생각하면 이해하기 쉽습니다. 사람이 지나가면 일정 시간 동안 열려있다가, 일정 시간 동안 사람이 지나지 않으면 문이 닫히죠? 이러한 특징을 살려 주로 검색이나 자동완성 기능을 구현할 때 사용됩니다. 사용자가 타이핑하는 동안 실시간으로 검색을 실행하는 것이 아니라, 사용자가 일정 시간 동안 입력을 멈출 때에만 검색을 실행하여 서버 부하를 줄일 수 있습니다. 특히 한글은 조합언어의 특성이 있어 입력에 경우 input 이벤트가 영어에 비해 더 잦은 빈도로 발생하므로 이에 대한 처리를 해주는 것이 좋습니다.구현//debounce let timer; function debounce(fn, delay) { //timer가 있다면 제거 if (timer) { clearTimeout(timer); } //개로운 타이머 생성 timer = setTimeout(() => { fn(); }, delay); }구현은 간단합니다. 단순히 호출 될 때마다 setTimeout을 갱신해주면 됩니다. 참고로, _(lodash)에서는 painting 성능을 위해 requestAnimationFrame()을 이용해 구현하고 있습니다. ThrottleThrottle은 일정 시간 동안 한 번의 이벤트만 처리하는 방식입니다. scroll이나 resize 같은 빈번한 이벤트의 처리를 제한하여 성능을 향상시키는 데 사용됩니다. 스크롤 이벤트의 경우, 사용자가 스크롤할 때마다 이벤트가 발생하지만, throttle을 적용하면 일정 주기마다 한 번씩만 이벤트를 처리하여 부하를 줄일 수 있습니다.구현//throttle let throttled = true; function throttle(fn, delay) { if (throttled) { throttled = false; setTimeout(() => { fn(); throttled = true; }, delay); } }첫 함수만 통과후 throttled 값을 false로 만들고, delay 후에 다시 함수가 호출 될 수 있도록 설계했습니다. 결론debounce와 throttle은 이벤트를 효율적으로 핸들링 하는데 유용한 방법입니다. 이러한 기술을 활용하여 웹 애플리케이션의 성능을 향상시키고 사용자 경험을 개선할 수 있습니다. 이번 스터디를 통해 debounce와 throttle의 개념과 활용 방법에 대해 잘 이해하고, 실제 프로젝트에 적용하여 보다 나은 웹 애플리케이션을 만들어 보시기를 바랍니다.이미지 출처 : https://medium.com/fantageek/throttle-vs-debounce-in-rxswift-86f8b303d5d4

프론트엔드워밍업클럽스터디5조throttledebounce

[인프런 워밍업 스터디 클럽 1기_FE] 7번째 데이터 타입 Symbol [5조 스터디]

저는 모던 자바스크립트 Deep Dive 책을 기반으로 스터디 발표를 준비하였습니다. 자바스크립트가 ECMAScript로 표준화된 이래로 자바스크립트에는 6개의 타입 즉, 문자열, 숫자, boolean, undefined, null, 객체 타입이 있었습니다.여기에서 ECMAScript에 대해 찾아본 바를 설명하자면, ECMA 인터내셔널은 정보 통신에 대한 표준을 제정하는 비영리 표준화 기구라고 합니다. ECMA는 표준을 제정하는데, 대표적으로는 CD롬 볼륨과 파일 구조, C# 언어 규격, JSON 포맷처럼 일부 정보 통신 기술에 대한 표준을 이 단체에서 관리하고 있다고 합니다. ECMA-262는 ECMA 인터내셔널에 의해 제정된 하나의 기술 규격의 이름으로, 범용 목적의 스크립트 언어에 대한 명세를 담고 있습니다. 스크립트 언어는 독립된 시스템에서 작동하도록 특별히 설계된 프로그래밍 언어입니다. 스크립트 언어의 특징으로는 응용 프로그램과는 독립적이고, 사용자가 직접 프로그램을 의도에 따라 동작시킬 수 있다는 것입니다. 스크립트 언어를 이용한 명령어의 실행이, 시스템 내부에서 어떤 원리로 동작하는지는 전혀 상관하지 않습니다. ECMAScript는 ECMA 인터내셔널에 의해 제정된 ECMA-262 기술 규격에 의해 정의된 범용 스크립트 언어입니다. 동의어로는 ECMAScript 사양이 있습니다. ECMA-262는 표준의 이름이지만, ECMAScript는 ECMA-262에서 정의된 하나의 사양을 의미합니다. ECMAScript는 스크립트 언어가 준수해야 하는 규칙, 세부사항 및 지침을 제공합니다. 조금 더 쉽게 말해서, ECMA-262는 ECMA 인터내셔널에서 관리를 하고, ECMAScript와 같은 규칙을 따른다고 이해하면 됩니다. JavaScript와 ECMAScript와의 차이점은 아래의 링크를 들어가보면 잘 이해가 됩니다.https://wormwlrm.github.io/2018/10/03/What-is-the-difference-between-javascript-and-ecmascript.htmlSymbol은 ES6에서 도입된 7번째 데이터 타입으로 변경 불가능한 원시 타입의 값입니다. Symbol값은 다른 값과 중복되지 않는 유일무이한 값입니다. 따라서 주로 이름의 충돌 위험이 없는 유일한 프로퍼티 키를 만들기 위해 사용합니다. 프로퍼티 키로 사용할 수 있는 값은 빈 문자열을 포함하는 모든 문자열 또는 Symbol값입니다. Symbol값은 Symbol 함수를 호출하여 생성합니다. 다른 원시값, 즉 문자열, 숫자, 불리언, undefined, null 타입의 값은 리터럴 표기법을 통해 값을 생성할 수 있지만, Symbol값은 Symbol 함수를 호출해서 생성해야 합니다. 이때 생성된 Symbol값은 외부로 노출되지 않아 확인 할 수 없습니다.// Symbol 함수를 호출하여 유일무이한 심벌 값을 생성한다. const mySymbol = Symbol(); console.log(typeof mySymbol); // symbol // 심벌 값은 외부로 노출되지 않아 확인할 수 없다. console.log(mySymbol); // symbol() 언뜻 보면 생성자 함수로 객체를 생성하는 것처럼 보이지만, Symbol 함수는 String, Number, Boolean 생성자 함수와는 달리 new 연산자와 함께 생성하지 않습니다. new 연산자와 함께 생성자 함수 또는 클래스를 호출하면 객체(인스턴스)가 생성되지만, 심벌 값은 변경 불가능한 원시 값입니다.new Symbol(); // TypeError : Symbol is not a constructor Symbol 함수에는 선택적으로 문자열을 인수로 전달할 수 있습니다. 이 문자열은 생성된 심벌 값에 대한 설명으로 디버깅 용도로만 사용되며, 심벌 값 생성에 어떠한 영향도 주지 않습니다. 즉, 심벌 값에 대한 설명이 같더라도 생성된 심벌 값은 유일무이합니다.// 심벌 값에 대한 설명이 같더라도 유일무이한 심벌 값을 생성한다. const mySymbol1 = Symbol('mySymbol'); const mySymbol2 = Symbol('mySymbol'); console.log(mySymbol1 === mySymbol2); // false 심벌 값은 암묵적으로 문자열이나 숫자 타입으로 변환되지 않습니다.const mySymbol = Symbol(); // 심벌 값은 암묵적으로 문자열이나 숫자 타입으로 변환되지 않는다. console.log(mySymbol + ''); // TypeError: Cannot convert a Symbol value to a string console.log(+mySymbol); // TypeError: Cannot convert a Symbol value to a number 단, 불리언 타입으로는 암묵적으로 타입 변환이 됩니다. 이를 통해 if문 등에서 존재확인이 가능합니다.const mySymbol = Symbol(); // 불리언 타입으로는 암묵적으로 타입 변환된다. console.log(!!mySymbol); // true // if 문 등에서 존재 확인을 위해 사용할 수 있다. if (mySymbol) console.log('mySymbol is not empty.'); Symbol.for 메서드는 인수로 전달받은 문자열을 키로 사용하여 키와 심벌 값의 쌍들이 저장되어 있는 전역심벌 레지스트리에서 해당 키와 일치하는 심벌 값을 검색합니다. 검색에 성공하면 새로운 심벌 값을 생성하지 않고 검색된 심벌 값을 반환합니다.검색에 실패하면 새로운 심벌 값을 생성하여 Symbol.for 메서드의 인수로 전달된 키로 전역 심벌 레지스트리에 저장한 후, 생성된 심벌 값을 반환합니다.  // 전역 심벌 레지스트리에 mySymbol이라는 키로 저장된 심벌 값이 없으면 새로운 심벌 값을 생성 const s1 = Symbol.for('mySymbol'); // 전역 심벌 레지스트리에 mySymbol이라는 키로 저장된 심벌 값이 있으면 해당 심벌 값을 반환 const s2 = Symbol.for('mySymbol'); console.log(s1 === s2); // true  Symbol 함수는 호출될 때마다 유일무이한 심벌 값을 생성합니다. 이때 자바스크립트 엔진이 관리하는 심벌 값 저장소인 전역 심벌 레지스트리에서 심벌 값을 검색할 수 있는 키를 지정할 수 없으므로 전역 심벌 레지스트리에 등록되어 관리되지 않습니다. 하지만 Symbol.for 메서드를 사용하면 애플리케이션 전역에서 중복되지 않는 유일무이한 상수인 심벌 값을 단 하나만 생성하여 전역 심벌 레지스트리를 통해 공유할 수 있습니다. Symbol.keyFor 메서드를 사용하면 전역 심벌 레지스트리에 저장된 심벌 값의 키를 추출할 수 있습니다.// 전역 심벌 레지스트리에 mySymbol이라는 키로 저장된 심벌 값이 없으면 새로운 심벌 값을 생성 const s1 = Symbol.for('mySymbol'); // 전역 심벌 레지스트리에 저장된 심벌 값의 키를 추출 Symbol.keyFor(s1); // -> mySymbol // Symbol 함수를 호출하여 생성한 심벌 값은 전역 심벌 레지스트리에 등록되어 관리되지 않는다. const s2 = Symbol('foo'); // 전역 심벌 레지스트리에 저장된 심벌 값의 키를 추출 Symbol.keyFor(s2); // -> undefined 예를 들어, 위, 아래, 왼쪽, 오른쪽을 나타내는 상수를 정의한다고 생각해보면// 위, 아래, 왼쪽, 오른쪽을 나타내는 상수를 정의한다. // 이때 값 1, 2, 3, 4에는 특별한 의미가 없고 상수 이름에 의미가 있다. const Direction = { UP: 1, DOWN: 2, LEFT: 3, RIGHT: 4 }; // 변수에 상수를 할당 const myDirection = Direction.UP; if (myDirection === Direction.UP) { console.log('You are going UP.'); } 위 예제처럼 값에는 특별한 의미가 없고 상수 이름 자체에 의미가 있는 경우가 있습니다. 이때 문제는 상수 값 1,2,3,4가 변경 될 수 있으며, 다른 변수값과 중복 될수도 있다는 것입니다. 이러한 경우 변경/중복될 가능성이 있는 무의미한 상수 대신 중복될 가능성이 없는 심벌 값을 사용할 수 있습니다. // 위, 아래, 왼쪽, 오른쪽을 나타내는 상수를 정의한다. // 중복될 가능성이 없는 심벌 값으로 상수 값을 생성한다. const Direction = { UP: Symbol('up'), DOWN: Symbol('down'), LEFT: Symbol('left'), RIGHT: Symbol('right') }; const myDirection = Direction.UP; if (myDirection === Direction.UP) { console.log('You are going UP.'); } 그리고 자바스크립트에서는 enum을 지원하지 않지만, C, 자바, 파이썬 등 여러 프로그래밍 언어와 자바스크립트의 상위 확장인 타입스크립트에서는 enum을 지원합니다. 그렇기 때문에 자바스크립트에서 enum을 흉내내어 사용하려면 아래의 예시와 같이 객체의 변경을 방지하기 위해 객체를 동결하는 Object.freeze 메서드와 심벌값을 사용합니다.// JavaScript enum // Direction 객체는 불변 객체이며 프로퍼티는 유일무이한 값이다. const Direction = Object.freeze({ UP: Symbol('up'), DOWN: Symbol('down'), LEFT: Symbol('left'), RIGHT: Symbol('right') }); const myDirection = Direction.UP; if (myDirection === Direction.UP) { console.log('You are going UP.'); } 객체의 프로퍼티 키는 빈 문자열을 포함하는 모든 문자열 또는 심벌 값으로 만들 수 있으며, 동적으로 생성 할 수도 있습니다. 심벌 값을 프로퍼티 키로 사용하려면 프로퍼티 키로 사용할 심벌 값에 대괄호를 사용해야 합니다. 프로퍼티에 접근할 때에도 대괄호를 사용해야 합니다.const obj = { // 심벌 값으로 프로퍼티 키를 생성 [Symbol.for('mySymbol')]: 1 }; obj[Symbol.for('mySymbol')]; // -> 1 심벌 값으로 프로퍼티 키를 만들면 다른 프로퍼티 키와 절대 충돌하지 않고, 미래에 추가될 어떤 프로퍼티 키와도 충돌할 위험이 없습니다. 심벌 값을 프로퍼티 키로 사용하여 생성한 프로퍼티는 for ... in문이나 Object.keys, Object.getOwnPropertyNames 메서드로 찾을 수 없습니다. 이를 사용함으로써 외부에 노출할 필요가 없는 프로퍼티를 은닉할 수 있습니다.const obj = { // 심벌 값으로 프로퍼티 키를 생성 [Symbol('mySymbol')]: 1 }; for (const key in obj) { console.log(key); // 아무것도 출력되지 않는다. } console.log(Object.keys(obj)); // [] console.log(Object.getOwnPropertyNames(obj)); // []  하지만, 프로퍼티를 완전하게 숨길 수 있는 것은 아닙니다. ES6에서 도입된 Object.getOwnPropertySymbols 메서드를 사용하면 심벌 값을 프로퍼티 키로 사용하여 생성한 프로퍼티를 찾을 수 있습니다.const obj = { // 심벌 값으로 프로퍼티 키를 생성 [Symbol('mySymbol')]: 1 }; // getOwnPropertySymbols 메서드는 인수로 전달한 객체의 심벌 프로퍼티 키를 배열로 반환한다. console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(mySymbol)] // getOwnPropertySymbols 메서드로 심벌 값도 찾을 수 있다. const symbolKey1 = Object.getOwnPropertySymbols(obj)[0]; console.log(obj[symbolKey1]); // 1  개발자가 직접 추가한 메서드와 미래에 표준 사양으로 추가될 메서드의 이름이 중복될 수 있기 때문에 일반적으로 표준 빌트인 객체에 사용자 정의 메서드를 직접 추가하여 확장하는 것은 권장하지 않습니다. 중복될 가능성이 없는 심벌 값으로 프로퍼티 키를 생성하면 어떤 프로퍼티 키와도 충돌할 위험이 없어 안전하게 표준 빌트인 객체를 확장 할 수 있습니다.// 표준 빌트인 객체를 확장하는 것은 권장하지 않는다. Array.prototype.sum = function () { return this.reduce((acc, cur) => acc + cur, 0); }; [1, 2].sum(); // -> 3  // 심벌 값으로 프로퍼티 키를 동적 생성하면 다른 프로퍼티 키와 절대 충돌하지 않아 안전하다. Array.prototype[Symbol.for('sum')] = function () { return this.reduce((acc, cur) => acc + cur, 0); }; [1, 2][Symbol.for('sum')](); // -> 3 자바스크립트가 기본 제공하는 빌트인 심벌 값을 ECMAScript 사양에서는 Well-known Symbol이라고 부릅니다.예를 들어, Array, String, Map, Set, TypedArray, arguments, NodeList, HTMLCollection과 같이 for ... of문으로 순회 가능한 빌트인 이터러블은 Well-known Symbol인 Symbol.iterator를 키로 갖는 메서드를 가지며, Symbol.iterator 메서드를 호출하면 이터레이터를 반환하도록 ECMAScript 사양에 규정되어 있습니다. 빌트인 이터러블은 이터레이션 프로토콜을 준수합니다. 만약 빌트인 이터러블이 아닌 일반 객체를 이터러블처럼 동작하도록 구현하고 싶다면 이터레이션 프로토콜을 따르면 됩니다. Well-known Symbol인 Symbol.iterator를 키로 갖는 메서드를 객체에 추가하고 이터레이터를 반환하도록 구현하면 그 객체는 이터러블이 됩니다.// 1 ~ 5 범위의 정수로 이루어진 이터러블 const iterable = { // Symbol.iterator 메서드를 구현하여 이터러블 프로토콜을 준수 [Symbol.iterator]() { let cur = 1; const max = 5; // Symbol.iterator 메서드는 next 메서드를 소유한 이터레이터를 반환 return { next() { return { value: cur++, done: cur > max + 1 }; } }; } }; for (const num of iterable) { console.log(num); // 1 2 3 4 5 } 이때 이터레이션 프로토콜을 준수하기 위해 일반 객체에 추가해야 하는 메서드의 키 Symbol.iterator는 기존 프로퍼티 키 또는 미래에 추가될 프로퍼티 키와 절대로 중복되지 않을 것 입니다. 이처럼 심벌은 중복되지 않는 상수 값을 생성하는 것은 물론 기존에 작성된 코드에 영향을 주지 않고 새로운 프로퍼티를 추가하기 위해, 즉 하위 호환성을 보장하기 위해 도입되었습니다.

프론트엔드Symbol프론트엔드스터디

코파

웹, 웹 서버 및 WAS, SPA, SSR과 CSR, SSL/TLS

목차애플리케이션웹과 브라우저웹 표준서버와 클라이언트웹 서버와 웹 애플리케이션 서버 (WAS)Static Site GeneratorSingle Page Application (SPA)Server Side Rendering (SSR)와 Client Side Rendering (CSR)SSL(Secure Sockets Layer)과TLS(Transport Layer Security)TLS 핸드셰이크 애플리케이션운영체제(OS, Operating System) 위에 설치되어 운영체제의 도움을 받아 실행되는 응용 소프트웨어 웹과 브라우저웹(Web)World Wide Web의 줄임말인터넷을 통해 전 세계적으로 연결된 문서들의 집합을 의미함.이러한 웹 문서들은 HTML, CSS, JavaScript 등의 웹 기술로 작성되어 있음. 브라우저(Browser)웹을 사용자에게 표시해주는 소프트웨어브라우저는 사용자가 URL을 입력하거나 링크를 클릭하면 해당 웹페이지를 서버에서 가져와서 렌더링하고, 사용자가 읽을 수 있도록 화면에 표시함.사용자가 웹페이지와 상호작용할 수 있도록 링크를 클릭하거나 폼을 작성하는 등의 기능을 제공함.웹 개발자들이 작성한 코드를 서버로부터 받아오고, 그것을해석해서 모두가 이해할 수 있도록 시각화함.예) Google Chrome, Mozilla Firefox, Microsoft Edge, Apple Safari 등이렇게 웹과 브라우저는 매우 밀접한 관련이 있다. 웹 표준웹은 전 세계의 많은 사람들이 이용하기 때문에 사용자의 환경에 구애받지 않고 같은 내용을 보여주는 것이 중요함.이를 위해서 운영체제나 브라우저에 상관없이 웹 페이지의 내용을 일정하게 만들도록 하는 지침인 웹표준을 정해 웹 개발자들이 따르도록 해놓음. 서버와 클라이언트웹을 구성하는 주요 구성 요소 중 하나웹의 초기 형태는 정적인 웹 페이지를 제공하기 위한 서버-클라이언트 구조로 구상되었다.서버 : 웹 페이지를 저장하고, 클라이언트에게 요청에 따라 해당 페이지를 전송하는 역할을 수행클라이언트 : 웹 페이지를 요청하고 받아와서 웹 브라우저를 통해 표시함. 웹 서버와 웹 애플리케이션 서버 (WAS)WAS (Web Application Server) 등장 배경웹 페이지를 단순히 저장하고 제공하는 웹 서버가 개인화된 요구사항에 부합하기 어려운 상황(결제시스템, 쇼핑몰 등)에서, HTML을 동적으로 생성하고 사용자 요구에 따라 페이지를 구성하는 서버가 필요해졌음. 이를 웹 애플리케이션 서버(WAS)라고 함.WAS는 개인화된 요구사항을 충족시키기 위해 동적 콘텐츠 생성 및 제공, 데이터베이스와의 상호작용, 사용자 인증 및 세션 관리 등 다양한 기능을 수행함.이러한 기능 덕분에 WAS는 단순한 웹 서버와 구별되며, 사용자 요구에 맞게 동적으로 웹 페이지를 생성하고 제공할 수 있음.현재 WAS는 더 이상 단순히 웹 서버의 역할만을 수행하지 않고, 웹 서버의 기능까지 통합하여 더욱 효율적인 서비스를 제공함. 웹 서버와 웹 애플리케이션 서버 비교이미지 출처 : https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html 웹 서버와 웹 애플리케이션 서버를 분리해야 하는 이유서버 부하 방지: 웹 애플리케이션 서버(WAS)와 웹 서버를 분리하여 서버 부하를 줄여야 함. WAS는 데이터베이스 조회 및 복잡한 로직 처리와 같은 작업에 집중하고, 간단한 정적 컨텐츠는 웹 서버에서 처리하는 것이 효율적임. WAS가 정적 컨텐츠까지 처리하면 서버 부하가 증가하고 응답 속도가 저하될 수 있음.보안 강화: SSL 암호화 및 복호화 처리를 위해 웹 서버를 활용할 수 있음. 웹 서버를 통해 SSL 인증서를 관리하고 암호화 트래픽을 처리하여 보안을 강화할 수 있음.여러 대의 WAS 연결 가능: 클라이언트의 요청을 여러 WAS로 분산하여 부하를 고르게 분배하고, WAS를 웹 서버로 연결함(로드밸런싱). 여러 대의 WAS를 연결하여 대용량 웹 어플리케이션을 운영하면서 무중단 운영과 장애 극복을 보다 효과적으로 처리할 수 있음.여러 웹 어플리케이션 서비스 가능: 하나의 서버에서 PHP, JAVA 등 다양한 언어의 애플리케이션을 함께 호스팅할 수 있음. 웹 서버를 통해 다양한 웹 어플리케이션을 효율적으로 관리하고 제공할 수 있음.→ 웹 서버를 WAS 앞에 배치하고 필요에 따라 웹 서버에 WAS를 플러그인 형태로 설정함으로써 효율적인 분산 처리를 할 수 있음.Static Site Generator정적인 사이트는 사용자의 요청에 따라 즉시 생성되는 것이 아니라, 미리 만들어진 페이지를 보여줌. 이를 위해 정적 사이트 생성기(static site generator)가 사용됨.정적 사이트 생성기는 웹 사이트의 구성 요소를 미리 만들고, 이를 템플릿화하여 고정된 형태의 페이지로 저장함. 이후에는 사용자의 요청에 따라 이러한 미리 생성된 페이지를 제공함.예: Jekyll (Ruby, GitHub Pages), Hugo (Go), Gatsby (React) 등 Server Side Rendering (SSR)SPA 등장 이전에 사용되던 방식으로, 서버에서 페이지를 요청할 때마다 완성된 페이지를 생성하여 보여주는 형식이를 통해 사용자가 해당 페이지에 접속할 때 완성된 페이지를 즉시 보여줌으로써 검색 엔진에서 사이트의 컨텐츠를 인식하는데 문제가 없음.최근에는 SPA에서도 SEO 문제를 해결하기 위해 SSR 방식을 지원하는 프론트엔드 프레임워크들(React, Vue, Angular 등 )이 등장함. Client Side Rendering (CSR)Ajax 등의 기술(XML HTTP Request), 자바스크립트 프레임워크를 활용하여, 데이터를 받아 자바스크립트로 페이지를 동적으로 만들 수 있게 됨.데이터는 XML, JSON 형태로 클라이언트에 전송. 이미지 출처 : https://velog.io/@namezin/CSR-SSR Single Page Application (SPA)기존에 페이지를 요청할 때마다 서버로부터 새로운 페이지를 받아와 보여주는 방식과는 달리, 페이지의 전체적인 렌더링이 한 번만 이루어지고 이후에는 필요한 데이터만 비동기적으로 요청하여 업데이트하는 방식임.SPA는 모바일 환경과 같이 통신 트래픽이 많고 성능이 낮은 환경에서 최적화되어 있음. 그러나 SPA에는 초기 로딩 시에 모든 페이지를 내려받아야 하기 때문에 초기 로딩 속도가 느린 단점이 있습니다.이를 개선하기 위해 Lazy Loading 방식이 도입됨. Lazy Loading은 SPA의 영역을 나누어 각 영역에 접근할 때 해당 페이지를 구성하도록 분리하는 방식임. 또한, SPA는 페이지 구성을 JavaScript로 동적으로 생성하기 때문에 검색 엔진 최적화(SEO)에 어려움을 겪을 수 있음. 이러한 문제를 해결하기 위해 Server Side Rendering (SSR)이 도입됨.SSR은 웹 사이트의 초기 로딩 시에 서버에서 페이지를 미리 렌더링하여 클라이언트에 전달함으로써 초기 구동 속도를 개선하고 SEO에도 더욱 유리한 환경을 제공함. SSG(Static Site Generation)CSR과 SSR의 단점들을 보완하기 위해 등장한 방식미리 서버에 화면을 저장해 두었다가 필요할 때 꺼내 사용하는 방식으로, 정적인 페이지를 생성하여 서비스함.초기 로딩 속도를 향상시키고 SEO(검색 엔진 최적화)를 개선할 수 있음. SSL과 TLSSSL보안 소켓 계층(Secure Sockets Layer, SSL)웹사이트와 브라우저 사이(또는 두 서버 사이)에 전송되는 데이터를 암호화하여 인터넷 연결을 보호하기 위한 표준 기술데이터를 암호화하여 보안을 강화하는 프로토콜로, 인터넷 통신에서 개인정보 보호와 데이터 무결성을 보장함.웹사이트의 URL에 "HTTPS"가 표시되는 것은 SSL/TLS를 사용하고 있음을 나타냄. TLS전송 계층 보안(Transport Layer Security)SSL의 후속 프로토콜로, SSL의 업데이트로 IETF에서 개발됨.HTTPS 작동의 근간을 이루는 TLS 핸드셰이크는 클라이언트와 서버 간의 인증 및 통신 보안을 담당함.TLS의 다양한 버전(TLS 1.0, 1.2, 1.3 등)은 보안 강화와 호환성을 위해 지속적으로 업데이트되고 있음. SSL/TLS 핸드셰이크TLS 핸드셰이크클라이언트와 서버 간의 통신을 안전하게 하는 인증 프로세스서로의 신원을 확인하고 암호화 알고리즘과 세션 키를 합의함.이를 통해 사용자의 개인 정보가 안전하게 전송되며, 특정 유형의 사이버 공격을 방지할 수 있음. TLS 핸드셰이크는 언제 발생할까?TLS 핸드셰이크는 사용자가 HTTPS를 통해 웹 사이트를 탐색하고 브라우저가 처음 해당 웹 사이트의 원본 서버를 쿼리하기 시작할 때마다 발생함.다른 통신이 API 호출 및 HTTPS를 통한 DNS 쿼리를 포함하는 HTTPS를 사용할 때에도 매번 TLS 핸드셰이크가 발생함.TLS 핸드셰이크는 TCP 연결이 TCP 핸드셰이크를 통해 열린 후에 발생함. 요약HTTPS는 HTTP 프로토콜 위에 SSL/TLS를 사용하여 보안을 강화한 것SSL은 데이터 통신을 보호하기 위한 암호화 프로토콜TLS는 SSL의 후속 프로토콜로, 이름이 바뀐 이유는 소유권 변경을 나타내기 위한 것이지 기능적 차이는 크게 없음.즉, HTTPS는 SSL/TLS를 사용하여 안전한 통신을 제공하는 웹 사이트를 지칭하는 용어참고 링크https://aws.amazon.com/ko/compare/the-difference-between-web-server-and-application-server/https://yozm.wishket.com/magazine/detail/1780/https://code-lab1.tistory.com/199https://www.cloudflare.com/ko-kr/learning/ssl/transport-layer-security-tls/https://velog.io/@namezin/CSR-SSRhttps://medium.com/@jayampathiadhikari/ssl-tls-simplified-c3c1f08051b2https://www.cloudflare.com/ko-kr/learning/ssl/what-happens-in-a-tls-handshake/https://www.digicert.com/kr/what-is-ssl-tls-and-https

웹 개발스터디네트워크

kacdoogi

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

시작4주 동안 잘 해보자.피그마의 기능/장점을 이애하지 못하고 '빠르게 제작/수정 여럿이서 공동작업이 용이한 툴' 정도로 사용하고 있었다. 그러다 이 강의를 신청하고 동료와 스터디를 하려고 하던 참에 인프런 워밍업 스터디 클럽이 진행된다고 해서 신청했다.무료버전만 사용하다 보니 variable을 안써봤는데 교육용으로 계정을 준다고 한다.네이밍 짓기 너무 어려운데 알려준다고 한다.4주 열심히 따라가다 보면 완강도 할 수 있을 거 같았다.이런 이유로 나는 워밍업 클럽을 신청하게 됐다.수업 노트 Libraries Color 만들기tailwind color palettes 를 이용해서 색을 만들어줍니다.color style guide를 이용해서 등록된 라이브러리 색을 가이드화 시켜줍니다.만들어진 스타일 가이드에서 필요한 색만 남기고 삭제 해주고 사용하세요. 컨버스에 있는 컬러팔레트와 스타일가이드는 지워주세요.플러그인 -> color style guide 를 실행시켜줍니다. variable collection 만드는 순서primitive Collection를 만들어서 hex 코드를 넣어주세요.semantic Collection 을 만들어서 libraries 에서 색상을 찾아서 연결 시켜주세요.primitiveblue, green, yellow, red, gray ...색의 원시값(Hex)을 저장해 놓은 디자인 언어의 기본 값blue 100/500, red 100 등 이렇게 등록 themebrand, success, danger, info, warning, neutral ...상황에 맞게 등록 함 semantictext, icon, bg, border의미에 맞게. Color Scoping: 색의 범위를 지정해 줌.bg : frame 선택icon: shape 선택text: text 선택border: stroke 선택 베리어블을 다 등록한 후에는 local에 있는 스타일은 지워주세요.Icons단색 아이콘은 vector->union 으로 합쳐주세요. 그러면 Fill로 색상을 바꾸기 좋아요. PluginAutometic Style Guides: Generate Swatches from Variables 베리어블에 만들어진 내용들을 스타일 가이드 형식으로 만들어줘요.Foundation color generator: ddTailwind Color Palettes: 색을 만들어준다. (필요 없는 색은 지워준다.)Color Style Guide : 등록된 라이브러리 색을 가이드화 시켜주자.typography style guide: 글자 스타일을 등록했다면 스타일 가이드를 만들자.Batch styler: 스타일 등록할 때 글자 지정을 잘 못했다면 일일이 바꾸지 말고 플러그인을 쓰자. GridFrame 에서 Auto Layout 적용 후 반응형 Min-width / Max-width 지정할 수 있어요.회고Variable 등록하기는 자면서 들었나봐요.미션1은 자면서 들었나 싶을 정도로 엉뚱하게 제출. 튜터 볼드님의 코멘트를 보고 수업 노트 적어가며 강의를 다시 들었다. 다른 학습자분들이 올려주신것도 보면서 미션을 수행하니 이해가 잘 됐다.토요일 저녁 8시 특강때 궁금했던 점 알려주시고 새로운 내용도 알게 되어 정말 좋았다. 네이밍 할 때 늘 고민되던 것들을 다른 사람들은 어떻게 사용하는지 어디서 찾아볼 수 있는지 팁도 알게되어 알찬 시간이였다.막 사용하던 피그마는 그만이미 피그마를 '막'사용하고 있어서 강의 내용이 쉬울거라 생각했었는데, 정말로 막 사용하고 있었다. ㅠ-ㅠ기초부터 차근차근 배워가고 있다. 프로젝트 진행 시 시스템 가이드를 만들어 '이거 수정 해주세요' 했을 때 파일들 다 열어서 수정하지 않고, 한번에 '수정-적용-배포' 할 수 있는 모습을 그리며, 남은 3주도 잘 따라가보자.

UX/UI워밍업클럽디자인시스템피그마Figma

개발자 경제신문 읽기 15일차

 '라인의 아버지'도 쫓겨났다... 일본, 네이버 지우기 속도신중호 라인야후 최고제품책임자(CPO) 가 라인야후 이사직에 물러났음라인야후, 네이버에 맡겨온 라인야후 IT 인프라 업무를 분리하고 있음  짠물이자에 정기예금 이탈... '주식, 부동산, 코인' 대기자금 1분기 30조 급증예테크족과 이자 생활자가 정기예금에서 이탈하고 있음. 마땅한 투자처를 찾지 못한 자금이 저원가성 예금에 몰렸다주식, 암호화폐, 부동산 등 자산시장의 부지한 흐름 -> 요구불예금에 예치해놓음. - 예수금이 풍부해서 순이자마진도 개선됨  인간이 새긴 '별자리'... 환경 식량 지구문제 '해결사'저궤도 군집 운성으로 전쟁의 양상을 바꿀 수 있을 것으로 에상아마존 '카이퍼' 상공 590~630km 에서 통신 서비스할 군집 위성. 최대 초당 1GB. 지상 기지국에 문제가 생겨도 사용할 수 있어 안보용으로 사용될 수 있음위성에 AI를 붙여 탄소배출량 관리 : 방대한 위성 데이터를 지상에서 다운로드 받지 않고 실시간으로 처리할 있음. 탄소발자국 모니터링, 불법 어선 탐지, 산림 해양 자원 관리 등스페이스 X가 올해 쏘아올린 위성은 562개, 스타링크 군집 위성은 1,2세대 총 5744개  초저궤도 선점 나선 중국.. '2.6만개 위성 군단' 띄운다중국위성네트워크그룹(CSNG, 중국 정부 출자 100%), 저궤도 1,3만개로 고속 통신망을 구축하는 '궈왕'프로젝트 운용 담당상하이시, '상하이원신위성과기'사 저궤도 위성 1.2만개 쏘는 사업 'G60 스타링크' 프로젝트 공개중국의 목표 : 저궤도 위성. 고도가 낮으면 위성 하나가 맡을 수 있는 면적이 좁아지지만 통신 품질, 속도는 개선 가능하다중국의 GNSS 베이더우(56개, GPS는 31개) 정확도 향상 가능지리그룹, 위성 11개 발사. 최종 240개 운용하여 고정밀 지도, 정밀 측위 기술을 위해차이나 모바일, 6세대 이동통신 시험을 위한 저궤도 위성 발사. 위성-기지국 커버 지역에서 통신 가능.화웨이 첫 폴더블 스마트폰 '포켓2', 샤오미 '14울트라' 에 위성통신기능 추가 전기차 주춤할 때... 일반 자동차, 하이브리드 몰고 판매 질주하이브리드카 선두주자 도요타, 엔저 가격 경쟁력 바탕으로 상당기간 호황을 누릴 것으로 예상됨. 1분기 미국 판매량 20.3% 증가GM-도요타-포드-스텔란티스-혼다-닛산(미쓰비시) 판매 순위. 일본 자동차회사, 엔저 현상에 환차익이 영업이익에 반영됨. 총알로 공격적 마케팅을 펼치면 더 약진할 것으로 예상현대-기아차, 하이브리드카 전략으로 TMED-2 개발, 인도에 신형 SUV 쏘넷 추가 투입, 팰리세이드 하이브리드 출시 앞당기기 검토 중 '글로벌 1000만대' 첫 돌파한 도요타... AI 등 미래 투자 확대도요타 2023년 영업이익 5.35억엔 - 최고기록(2021년)의 1.8배 높은 성과설비 투자, 연구개발비 투자로 '미래'를 준비하겠다테슬라, 자율주행 등을 위한 인공지능 개발에 100억달러 투입 예정, 8월에 로보택시 공개중국 샤오미 등 전기차 메이커가 '지능형 자동차'로 공세  명동에 유커 관광버스 수십대... 면세, 여행 업계 볕드나중국인 관광객 회복세, 중국발 제주도 크루즈/항공 증편(30%)한국, 가성비 여행국 됨 : 원화 가치가 위안화 대비 약세를 보임. 비교적 저렴하게 한국 여행 가능하다 '화웨이 굴기'에 미국, "인텔, 퀄컴 중국 수출 하지마"미국 정부, 화웨이에 반도체 수출하는 자국 일부 기업(인텔, 퀄컴)의 수출 면허 취소'화웨이 쇼크'로 인한 위기감 : 미국 제재에도 최첨단 노트북, 스마트폰 출시, 중국 파운드리 SMIC 7나노 첨단 반도체 출시 및 스마트폰 적용화웨이, 인공지능 노트북 '메이트북x 프로' 출시 CPU에 인텔 코어 울트라 9 이 들어갔음. 급성장 '아시아 AI시장' 눈독, 아마존, MS 데이터 센터 투자AWS : 싱가포르에 2028년까지 12조원 투자 인프라 구축. 데이터센터 건설, 재생에너지 인프라 개발, 현지 인력 육성 등도쿄, 오사카 클라우드 인프라 확장에 20조 투자, 인도에 20조원 투자, 사우디에 7조 투입 계획MS : 인도네시아, 말레이시아에 17억달러, 22억달러 투자 계획. 태국에 10억달러 이상 규모 투자 데이터센터 건설아시아 지역에 AI 수요가 빠르게 성장하고 있음. 데이터 저장 수요가 28년까지 25% 늘어날 것으로 전망.  알리 테무 공습에 쿠팡 영업이익 61% 감소, '어닝쇼크'영업이익 61%, 당기순이익 적자. 중국 e커머스 공세에 따른 마케팅 비용 지출로 이익이 감소했다배송, 상품 차별화로 중국e커머스에 맞서겠다 "로켓배송 지역 확대, 한국산 프리미엄 상품으로 승부, 와우 클럽 혜택 강화" 명품, 식품의 힘... 신세계 백화점 1분기 최대 매출백화점 매출 전년 동기 대비 7.9% 증가(1.8조)2023년 말부터 명품 수요 회복, F&B 디저트 전문관 '스위트파크' 로 식품 매출 1분기 12% 향상신세계까사, 센세계라이브쇼핑 등 자회사 흑자 전환신세계 유니버스 연회비 4900으로 인하하여 최대 가입자 갱신함 "귀국 축하금 쏜다" ... 판 커진 여행자보험카카오페이 손해보험, '보험메기' : 저렴한 여행자보험(3인 1.7만원, 3인 할인혜택 10%, 귀국 축하금 1700원)으로 디지털, 고객 맞춤형 전략으로 판을 흔들고 잇따사고가 나야 보상을 받는 기존 보험과 달리, 안전하게 귀국하면 10%를 돌려줌. MZ세대 중심 입소문 -> 출시 10개월만에 누적 가입자 100만, 월별 신계약 건수 1위삼성화재 : 여행자보험 동반 가입 고객 대상 최대 20% 할인KB손보 : 사고 여부와 상관 없이 보험료의 10%를 '귀국 축하금'으로 페이백한화손해보험의 디지털 보험 자회사 "캐롯손해보험" : 무사귀국 시, 보험료 10%를 포인트로 돌려줌해외 여행자보험 취급 손보사의 1분기 신계약 건수는 50만건, 전년동기 대비 2배 이상 급증보험사간 과당 경쟁을 보호하기 위해 예의주시 중인 금감원 : 페이백 제도가 애초에 보험료를 싸게 책정할 수 있는데 불필요하게 소비자를 현혹하지는 않는지?"여행자보험금을 위해 고의로 사고를 내는 경우가 있어 무사고 환급제는 오히려 좋아  

교양신문읽기

[Spring Boot]6.AOP정리

※스프링 부트 시작하기 책에 있는 내용 정리1.AOP는 OOP(Object Oriented Programming:객체지향 프로그래밍)를 더욱 OOP답게 사용하도록 도와주는개념2.AOP는 관점지향 프로그래밍이라고 하는데 자신의 관점에서 보는것이 아닌 제3자가 보는 관점에서 바라본다고 생각하면 된다.3.AOP는 어떤 로직을 기준으로 핵심적인 관점,부가적인 관점으로 나눠서 보고 그 관점을 기준으로 각 모듈화를 하여 사용한다.※AOP에대한 용어를 정리관점(Aspect) : 공통적으로 적용될 기능을 의미한다. 횡단 관심사의 기능이라고 할수 있고, 한개이상의 pointcut과 advice의 조합으로 만들어진다.어드바이스(Advice) : 관점의 구현체로 조인 포인트에 삽입되어 동작하는 것을 의미한다. 스프링에서 사용하는 어드바이스는 동작하는 시점에 따라 다섯종류로 구분된다.조인포인트(joinpoint) : 어드바이스를 적용하는 지점을 의미한다. 스프링 프레임워크에서 조인포인트는 항상 메서드 실행 단계만 가능하다.포인트컷(pointcut) : 어드바이스를 적용할 조인포인트를 선별하는 과정이나 그 기능을 정의한 모듈을 의미 정규표현식이나 AspectJ의 문법을 이용해서 어떤 조인포인트를 사용할 것인지 결정타깃(Target) : 어드바이스를 받을 대상을 의미한다.위빙(weving) : 어드바이스를 적용하는 것을 의미한다. 즉, 공통 코드를 원하는 대상에 삽입하는 것을 뜻한다. ※어드바이스(Advice) 동작시점에 따른 다섯가지 종류Before Advice(@Before) : 대상 메서드가 실행되기 전에 적용할 어드바이스를 정의After returning Advice(@AfterReturning) : 대상 메서드가 성공적으로 실행되고 결과값을 반환한 후 적용할 어드바이스를 정의한다.After throwing Advice(@AfterThrowing) : 대상 메서드에서 예외가 발생 했을때 적용할 어드바이스를 정의한다. try/catch문의 catch와 비슷한 역할을 한다.After Advice(@After) : 대상 메서드의 정상적인 수행 여부와 상관없이 무조건 실행되는 어드바이스를 정의. 즉 예외가 발생하더라도 실행되기 때문에 자바의 finally와 비슷한 역할을 한다.Around Advice(@Around) : 대상 메서드의 호출 전후, 예외 발생등 모든 시점에 적용할수 있는 어드바이스를 정의한다. 가장 범용적으로 사용할 수 있는 어드바이스입니다.※PointCut(포인트컷)에 대한 명시자 정리excution : 가장 대표적이고 강력한 지시자로 접근 제어자, 리턴 타입 ,타입패턴 ,메서드,파라미터 타입,예외타입등을 조합해서 가장 정교한 포인트컷을 만든다.(예)select*)(..)은 0개이상의 파라미터,메서드,패키지등 모든것을 의미한다.사용예)excution(void select*(..))excution(* board.controller.*())excution(* board.controller.*(..))excution(* board..select*(*))excution(* board..select*(*,*))- 리턴타입이 void이면서 메서드 명이 select로 시작하며 파라미터가 0개 이상메서드- board패키지 밑에 파라미터가 없는 모든 메서드- board패키지 밑에 파라미터가 0개이상 모든 메서드- board패키지의 모든하위 패키지에 있는 select로 시작하고 파라미터가 한개인 모든 메소드- board패키지의 모든 하위 패키지에 있는 select로 시작하고 파라미터가 두개인 모든 메서드withub : 특정 타입에 속하는 메서드를 포인트컷으로 설정합니다.사용예)within(board.service.boardServiceImpl)within(board.service.*ServiceImpl)- board.service 패키지 밑에 있는 boardServiceImpl 클래스의 메서드가 호출 될때- board.service 패키지 밑에 있는 ServiceImpl이라는 이름으로 끝나는 메서드가 호출될때bean : 스프링의 빈 이름의 패턴으로 포인트 컷을 설정합니다.bean(boardServiceImpl)bean(*ServiceImpl)- boardServiceImpl이라는 이름을 가진 빈의 메서드가 호출 될때- ServiceImpl이라는 이름으로 끝나는 빈의 메서드가 호출 될때 1.아래와 같이 로그 출력시에 대한 AOP를 적용2.적용하면 아래와 같이 노출이 된다. 

AOP

이용수

[인프런 워밍업 클럽 1기] BE 5일차

[인프런 워밍업 클럽 1기] BE 5일차본 게시글은 다음 강의 내용을 진행하고 있습니다.자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지] - https://inf.run/XKQg문제 1 풀이 과정, 한 걸음 더사용자로부터 입력을 받는 부분, 주사위를 던지고 계산하는 부분, 결과를 출력하는 부분으로 메소드를 분리하여 구현했다.숫자 범위가 달라지더라도 동작하도록 코드를 수정했다.DiceRoller.javapackage com.group.libraryapp.controller.assignment3; import java.util.Scanner; public class DiceRoller { public static void main(String[] args) { int numOfFaces = getNumOfFaces(); // 주사위 면의 수를 입력 받음 int[] faceCounts = rollDice(numOfFaces); // 주사위를 던져 각 숫자의 출현 횟수를 계산 printResult(faceCounts); // 결과 출력 } // 사용자로부터 주사위 면의 수를 입력받는 메소드 private static int getNumOfFaces() { System.out.println("주사위 면의 수를 입력하세요:"); Scanner scanner = new Scanner(System.in); return scanner.nextInt(); } // 주사위를 던져 각 숫자의 출현 횟수를 계산하는 메소드 private static int[] rollDice(int numOfFaces) { int[] faceCounts = new int[numOfFaces]; for (int i = 0; i < numOfFaces; i++) { double randomValue = Math.random() * numOfFaces; int face = (int) randomValue; faceCounts[face]++; } return faceCounts; } // 결과를 출력하는 메소드 private static void printResult(int[] faceCounts) { for (int i = 0; i < faceCounts.length; i++) { System.out.printf("%d은(는) %d번 나왔습니다.\n", i + 1, faceCounts[i]); } } }결과 - 6 입력결과 - 20 입력

백엔드백엔드인프런워밍업

이슬

인프런 워밍업 클럽 스터디 1기 FE 과제(1번, 2번, 3번 과제)

[1번 과제(Day2) - 음식 메뉴 앱]따라하며 배우는 자바스크립트 A-Z학습 범위: Section 1 ~ 3https://github.com/helloleesul/inflearn-warmup-club-study/tree/main/food-menu-app과제 이미지데이터를 json파일로 만들어놓고 처음 로드할 때, 불러와서 작업했다.강의에서 배운 이벤트위임을 활용해서 버튼 그룹에 이벤트리스너를 설정해주고 이벤트타겟의 태그가 버튼일 때에만 메뉴를 필터링할 수 있는 함수를 실행하게 했다.[2번 과제(Day3) - 가위 바위 보 앱]따라하며 배우는 자바스크립트 A-Z학습 범위: Section 4(1~8)https://github.com/helloleesul/inflearn-warmup-club-study/tree/main/rock-scissors-paper-app과제 이미지남은 횟수가 끝나면 결과를 알려주는 부분을 잊고 완성했다가 다시 이어서 작업했다.다시 도전하기를 누를때 화면을 초기화하는 함수를 만들었다.[3번 과제(Day4) - 퀴즈 앱]따라하며 배우는 자바스크립트 A-Z학습 범위: Section 4(9~17)https://github.com/helloleesul/inflearn-warmup-club-study/tree/main/js-quiz-app과제 이미지1번 처럼 데이터를 json파일로 만들어놓고 처음 로드할 때, fetch로 불러와서 작업했는데 데이터 객체 안에 문제와 옵션들, 그리고 answer(정답) 키값을 넣었었다. 하지만 브라우저 네트워크에 답까지 노출이 되는 게 문제라고 생각됐다.그래서 answer(정답) 키값을 없애고, 문제와 옵션들만 데이터로 구성하고 script 안에서 정답 유무를 가릴 수 있게 바꿨다. 풀이는 문제를 배열로 해체하고 ×를 *으로, ÷를 /으로 바꾼 후(-,+는 그대로) eval()함수를 쓰지않고 new Function() 새로운 함수를 생성해서 풀이하게 했다. 

웹 개발인프런워밍업클럽FE1기과제

mingle

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

늦었지만 올려보는 첫 번째 발자국참여 계기취업 한지 벌써 2년이 되어간다. 일을 할수록 부족한 나를 마주하는 순간이 많았다. 그래서 항상 공부하겠다고 다짐했지만, 퇴근 후 공부는 생각보다 쉽지 않았고…. ㅎㅎ.. 그런 와중에 인프런에 들어왔다가 워밍업 클럽 스터디 배너를 보고 관심이 갔다. BE 강의 커리큘럼을 보니 회사에서 사용하지 않는 기술도 있어 더 흥미가 갔고 공부하기 좋은 기회라고 생각해서 지원하게 됐다. 배운 내용환경 세팅, HTTPHTTP Method(GET, POST, PUT, DELETE)를 활용한 간단한 API 개발MySQL과 DDL, DMLSpring과 DB 연결. CRUD API 개발.관심사의 분리 가장 인상 깊은 강의는 리팩토링이다. 회사 일을 하다가 내가 짠 코드에 대해 다른 직원분으로부터 문의를 받은 적이 있다. 시간에 쫓겨 작성한 부분이었고.. 강의를 들으면서 매우 많이 찔렸다. 아무리 바빠도 이후에 내 코드를 읽을 동료, 나를 위한 개발을 해야겠다고 생각했다. 화이팅~스터디에서 가장 만족하는 점은 과제다. 과제를 하다 보면 관련된 다른 궁금한 점이 생기고, 계속 샛길로 빠지게 된다. 한 과제를 하는데 하루 종일 걸린다ㅎㅎ.. 기한이 2일이라서 다행이다. 과제 덕분에 더 많이 배울 수 있었고 재밌었다. 이번 주에 배울 내용과 할 과제도 기대가 된다. 과제

백엔드BE워밍업1기