블로그

[인프런 워밍업 스터디 클럽 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 과제(4번, 5번, 6번 과제)

[4번 과제(Day5) - 책 리스트 나열 앱]따라하며 배우는 자바스크립트 A-Z학습 범위: Section 5 ~ 6https://github.com/helloleesul/inflearn-warmup-club-study/tree/main/book-list-app과제 이미지input 전체에 값의 유무에 따라 submit 버튼 활성화를 설정해줘서 정확한 제출 요청이 되도록 작업했다.setTimeout으로 추가, 삭제 알림이 3초 뒤에 사라지게 했다.리스트 그룹에 이벤트리스너를 설정해줘서 이벤트타겟의 태그가 버튼이라면 삭제버튼을 가진 부모요소를 삭제하도록 이벤트 위임으로 작업했다.[5번 과제(Day5) - Github Finder 앱]따라하며 배우는 자바스크립트 A-Z학습 범위: Section 5 ~ 6https://github.com/helloleesul/inflearn-warmup-club-study/tree/main/github-finder-app과제 이미지import { Octokit } from "https://esm.sh/@octokit/core";위 스크립트를 import를 작동시키기위해서 html에 작성한 script태그에 type을 module로 설정하였다.유저의 프로필 정보는 고정적이라 값만 제외하고 퍼블리싱했고, 레포지토리 리스트는 script에서 innerHTML으로 한번에 삽입했다. li 태그를 계속 create하는 것보다 효율적이라고 생각했다.!username && alert("유저 이름을 입력해주세요."); // 변경 전 if (!username) return alert("유저 이름을 입력해주세요."); // 변경 후둘 다 username가 비어있거나 존재하지않을 때에만 조건이 참이 된다. 변경 전 usename이 빈 칸일 경우 알림창이 뜨도록 조건식을 작성했는데, 알림창을 한번 나타나게하면 조건식이 끝나도 함수를 이어서 실행시켰다.내가 원하는 건 조건이 참이면 함수를 중지하는 로직을 원하기때문에 return문이 들어갈 수 있도록 조건식을 조건문으로 변경하였다.식과 문을 잘 구별해서 쓰자.[6번 과제(Day4) - 비밀번호 생성 앱]따라하며 배우는 자바스크립트 A-Z학습 범위: Section 7 ~ 8https://github.com/helloleesul/inflearn-warmup-club-study/tree/main/password-generator-app과제 이미지비밀번호를 생성하는 generator 객체를 활용해보았다.generator 안에 아래 작성된 최소, 최대 길이에 맞게 참이 될때만 실행하도록 while 조건문을 설정했다.navigator.clipboard로 복사하기 기능을 구현했다.generator를 이번 강의에서 처음 배우고 사용해봤는데 목적에 맞게 가독성이 좋아보여서 흥미로웠다. 하지만 generator로 구현하는 것과 일반 함수로 구현하는 것의 차이를 아직은 잘 모르겠다.

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

이슬

인프런 워밍업 클럽 스터디 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기

xicodey

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

문제주어지는숫자를 하나를 받고 해당 숫자만큼 주사위를 돌려, 각 숫자가 몇 번 나오는지 출력하는 문제 public class Main { public static void main(String[] args) { System.out.println("주사위 면의 수를 입력하세요:"); 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); } } 제시된 코드를 최대한 클린하게 만들어라 public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int rolls = inputDice(scanner); int sides = inputSide(scanner); int[] results = rollTheDice(rolls, sides); resultPrint(sides, results); } private static int inputSide(Scanner scanner) { System.out.print("주사위 면를 입력해주세요 :"); int sides = scanner.nextInt(); return sides; } private static int inputDice(Scanner scanner) { System.out.print("던질 횟수를 입력해주세요 :"); int rolls = scanner.nextInt(); return rolls; } private static int[] rollTheDice(int rolls, int sides) { int[] results = new int[sides + 1]; for (int i = 1; i <= rolls; i++) { int number = (int)(Math.random() * sides) + 1; results[number]++; } return results; } private static void resultPrint(int sides, int[] results) { for (int i = 1; i <= sides; i++) { System.out.printf("%d은 %d번 나왔습니다.\n", i, results[i]); } } }주사위 면을 받을 수 있는 inputSide함수와 몇번 주사위를 굴릴건지 입력을 받을 수 있는 inputDice 함수,주사위를 돌려 결과를 저장하는 rollTheDice함수와 결과를 출력하는 resultPrint 함수로 구성했다.각 변수는 의미있는 변수명으로 바꾸고 메서드명도 그에 맞게 바꾸었다.

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