블로그

역직렬화

[인프런 워밍업 스터디1기] 3일차 진도표

1.자바의 람다식은 왜 등장했을까?람다식에 대해 꼭 알아야 할 JAVA8과 람다의 영어원문이다 https://www.oracle.com/technical-resources/articles/java/architect-lambdas-part1.htmlJava 8에는 이러한 코드 블록을 더 쉽게 작성할 수 있도록 설계된 몇 가지 새로운 언어 기능이 도입되었습니다. 핵심 기능은 람다 표현식 (구어적으로 클로저 (이유는 나중에 논의할 예정임) 이라고도 함 ) 또는 익명 메서드 입니다 .[해당오라클 원문 발췌]Lambda expressions. Funda-men-tally, a lambda expression is just a shorter way of writing an implementation of a method for later execution. Thus, while we used to define a Runnable as shown in Listing 2, which uses the anonymous inner class syntax and clearly suffers from a “vertical problem” 람다식의 도입으로 인해, 자바는 객체지향언어인 동시에 함수형 언어가 되는 계기가 되었다! 람다식 의미와 문법특징1. 메서드와 달리 이름이 없다.2. 메서드와 달리 특정 클래스에 종속되지 않지만, 매개변수, 반환 타입, 본체를 가지며, 심지어 예외도 처리할 수 있다.3. 메서드의 인수로 전달될 수도 있고 변수에 대입될 수 있다.4. 익명 구현 객체와 달리 메서드의 핵심 부분만 포함한다.람다식의 규칙선언부의 타입은 추론할 수 있으므로 타입을 생략해도 된다.매개변수가 하나 있다면 괄호를 생략해도 된다.실행문이 하나 있다면 중괄호와 세미콜론을 생략할 수 있다. 단, 실행문이 하나의 return문이면 return 키워드도 생략해야 한다.Arrays.sort(strs, new Comparator <String>() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2) * -1; } }); System.out.prinln(Arrays.toString(strs)); 람다식을 사용하여 간결한 코드로 작성한 예제Arrays.sort(strs, (o1, o2) -> {return o1.compareTo(o2) * -1 }); System.out.println(Arrays.toString(strs));너무 간단해진 람다식 사용으로 인한 코드의 간결성!즉, 함수를 값으로 전달하는데, 어딘가에 구현하지 않고 그냥 간단하게 구현해서 넘기고 싶으면 람다식을 이용람다식은 “함수 값”으로 평가되며, 한 번만 사용된다. 2.람다식과 익명 클래스는 어떤 관계가 있을까? - 람다식의 문법은 어떻게 될까?위에 오라클 공식문서에도 나오지만 익명클래스의 긴코드를 람다식으로 간결하게 사용가능하며 여기서 함수형 인터페이스 개념도 알아두어야 한다!즉, 함수형 인터페이스의 특성으로 인해 익명클래스, 익명메소드의 뻔한 부분을 생략시킬 수 있게되고, 최종적으로 생략한 형태를 람다표현식이라고 부르게 되는 것이다. 함수형 인터페이스자바에서 모든 메서드는 클래스 내에 포함되어야 하는데, 람다식은 어떤 클래스냐고 진위를 묻는다면 지금까지 람다식이 메서드와 동등한 것처럼 설명해왔지만, 사실 람다식은 익명 클래스의 객체와 동등하다. 참조변수가 있어야 객체의 메서드를 호출 할 수 있으니까 일단 이 익명 객체의 주소를 f라는 참조변수에 저장해 보자.타입 f = (int a, int b) -> a > b ? a : b; //참조 변수의 타입은 뭐로 해야할까?참조형이기 때문에 클래스 또는 인터페이스가 가능하다. 람다식과 동등한 메서드가 정의되어 있어야함그래야만 참조변수로 익명 객체(람다식)의 메서드를 호출 예를 들어 아래와 같이 max()라는 메서드가 정의된 MyFunction 인터페이스가 정의되어 있다고 가정하자.interface MyFunction() { public abstract int max(int a, int b);그러면 이 인터페이스를 구현한 익명 클래스의 객체의 예MyFunction f = new MyFunction() { public int max(int a, int b) { return a > b ? a : b; } }; int big = f.max(5, 3); //익명 객체의 메서드를 호출가장 중요!결국 코드를 깔끔하게 작성하기 위해 함수형 인터페이스가 필요했고, 함수형 인터페이스의 특성으로 인해 익명클래스와 익명메소드의 뻔한 코드를 삭제하고 람다표현식으로 깔끔하게 표현

백엔드백엔드

코파

인프런 워밍업 클럽 1기 FE 6번 과제 (비밀번호 생성 앱)

6번 과제 (Day6)(비밀번호 생성 앱)깃허브 저장소 주소 :https://github.com/devellybutton/frontEnd_warmingUp_study/tree/master/06.%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8%EC%83%9D%EC%84%B1 과제 GIF:클릭한 종류의 문자열이 적어도 1개 이상 들어가도록 함. 모든 체크를 해제하고 'Generate'를 누르면 생성된 비밀번호가 초기화됨. 간단한 후기 :프론트엔드를 제대로 해본 적이 없어서 브라우저에서 클립보드를 조작하는 것을 처음 해보았습니다.구글 폰트 외에도 google material icon도 사용 가능하다는 것을 알게 되었습니다.이 정도 기능의 어플은 HTML 만들고 JS로 조작하는 것까지는 오래 걸리지 않지만, CSS까지 적용하니까 시간이 오래걸렸습니다. 항상 CSS가 문제인 것 같습니다.자바스크립트를 조작할 때는 각 옵션마다 적어도 1개 이상의 문자열이 랜덤으로 들어가야 하는 조건을 구현하는 것이 조금 까다로웠습니다. 처음에는 단순히 체크한 옵션의 문자열을 더해서 인덱스를 랜덤으로 생성되게 하였습니다. 하지만 그렇게 되면 선택한 옵션의 문자열이 들어가지 않는 경우가 발생해서(ex. 네 가지 다 선택하였음에도 Capital Letter는 하나도 들어가지 않은 경우) 로직을 변경하였습니다. 이미지 출처 :https://www.freepik.com/free-vector/padlock-security-safeguard-with-code-key-vector-locked-padlock-privacy-protect-tool-close-box-with-password-combination-system-lock-secure-equipment-template-realistic-3d-illustration_25191429.htm#query=lock%20png&position=7&from_view=keyword&track=ais&uuid=3024a5a2-6d85-4602-9058-ffaa8c44ee1dhttps://www.vecteezy.com/vector-art/23509276-gold-and-black-colors-bricks-wall-background-abstract-line-geometric-backdrop-minimal-design-style-stone-wall-texture-background-futuristic-art개발할 때 참고한 링크 :https://wooooooak.github.io/css%20challenge/2019/02/03/css_challenge_2/

웹 개발워밍업클럽FE과제

eus247

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

 강의 정리노션 링크로 대체합니다.https://synonymous-currant-9b2.notion.site/FE-Javascript-542dcc2333df4ef0a2fb9c478011d171?pvs=4미션가위 바위 보 앱컴퓨터가 랜덤으로 가위바위보를 출력하도록 하는 로직을 구성하는게 어려웠다. 랜덤으로 숫자를 생성하는 Math.random()을 이용하면 될 것 같은데 이 함수는 숫자만 랜덤으로 만든다. 가위바위보 결과는 string이다. 어떻게 랜덤으로 출력하도록 할까 검색을 해본결과 랜덤숫자를 배열의 인덱스로 하면 컴퓨터 결과값이 랜덤으로 출력될 수 있음을 알게되었다.비밀번호 생성비밀번호 문자들을 어떻게 변수에 담아야 할지 감이 잡히지 않았다. 배열 형태로 담는 것은 불편했고, 특히 문자열은 따옴표를 같이 입력해야 해서 조금 귀찮았다. 이에 더 간단한 방법이 없나 찾아봤다. charAt 메서드를 발견했다. 이를 이용하면 문자열에서 특정 위치의 문자를 반환할 수 있어서 변수를 배열 형태로 선언하지 않아도 되었다.1주차 후기타 사이트에서 자바스크립트 강의를 들은 적이 있어서 이번 워밍업 스터디는 기존에 배웠던 것을 한 번 다시 리마인드하는 기분으로 가볍게 생각해야지 했는데 이건 경기도 오산이였다. 배울 때는 겸손한 태도로 임해야 한다는 것과 지식을 아는 것과 그것을 활용하는 것은 다르다는 것을 다시 한 번 깨닫는 1주차였다.강의 들으면서 열심히 정리한다고 했는데 다음날 진도나가기 전에 복습으로 보는데 왜 적었지 하는게 있어서 강의를 집중하고 이해하는 것도 중요하지만 정리할 때도 미래의 나 자신을 위해 정확하게 적어야 하는것도 중요함을 알게되었다.

웹 개발워밍업클럽프론트엔드FE1주차발자국

슬프구나

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

인프런 워밍업 클럽이 스터디 1기 FE 를 시작한지 어느덧 1주차현재 과제 1~7까지 완료를 해놓은 상태다.음식 메뉴 앱가위 바위 보퀴즈책 리스트 나열Github Finder비밀번호 생성타이핑 테스트 과제들을 진행하면서, DOM API 에 대한 복기를 할 수 있어서 좋았다. 그리고 퀴즈 및 타이핑은 이런저런 로직을 고민하게 해줘서 좋았다. 퀴즈는 처음에 뭔가 가상의 데이터를 통해서 처리를 해야하는줄 알았다.(실제 현업에서는 DB에 문제은행식으로 관리하는걸로 알고 있다.)이걸 Math 객체를 생성하여 랜덤하게 문제와 정답을 생성하는 방식으로 처리하였다.Math.random() 함수는 0~1 사이의 난수를 발생 시킨다.(1은 포함하지 않는다)Math.random() * 10; 을 하게된다면 0~9까지의 난수를 얻을 수 있다. 이때 소수점 이하를 버려주면 정수값을 추출하는거다.그러면, 1~10까지를 얻고싶다면 어떻게 해야할까? 간단하다.min = 1;max = 10;(Math.random() * (max - min + 1) + min);max - min + 1 = 100 ~ 9 까지 난수를 얻을 수 있다. 그럼 여기에, 소수점 버린 정수에 min 을 더해주면?1~10 까지가 되는거다. 그리고 반복되는 UI 는 template 요소를 활용하여 처리 하였다.<template id="myTemplate"> <p>This is a template. It will not be rendered.</p> </template>template 요소는 렌더링 되지 않는다. 렌더링 하려면, JS로 무조건 조작을 해줘야 한다.물론 DOM Node 를 조작할 때, 원본 Node 에 영향을 끼치지 않으려면 cloneNode 또는 importNode 등으로 조작을 해줘야 한다. 마무리하며변수와 데이터 타입: 자바스크립트의 기본적인 변수 선언부터 시작하여, 다양한 데이터 타입(문자열, 숫자, 객체 등)을 배웠습니다.함수: 함수의 기본적인 선언 방법과 화살표 함수 등 최신 문법에 대해서도 배웠습니다.DOM 조작: HTML 요소를 자바스크립트를 통해 조작하는 방법을 배우고, 실제로 몇 가지 프로젝트를 통해 연습했습니다.비동기 처리: Promise, async/await를 통해 비동기 처리 방법을 배웠습니다. API 호출과 같은 작업을 처리하는 방법을 실습했습니다. null 과 undefined: 둘다 원시타입이다. 하지만 typeof 로 null 을 출력해보면 object 를 출력한다. 이는 JS 초기 설계 오류가 지금까지 이어져온것이며 웹 호환성을 위해 수정을 하지 않았다. 그러니 null 은 체크할때 이 특성을 기억해야 한다.자바스크립트 공부를 통해, 단순히 코드를 작성하는 것 이상의 귀중한 경험을 하였다. 문제 해결 능력, 창의적 사고, 그리고 끊임없는 학습의 중요성을 깨닫게 되었으며, 앞으로도 지속적으로 새로운 기술을 배우며 성장해 나갈 것이다.

웹 개발인프런워밍업클럽FE1기회고

송세연

[인프런 워밍업 스터디 클럽 1기 프론트엔드] 1주차 발자국

학습 내용호이스팅이번에 강의를 통해 호이스팅이라는 걸 처음 알게 됐는데, 꽤 흥미로운 개념이었다. 그런데 실제 예제를 찾아보니 내가 제대로 이해하고 있지 않은 것 같다는 생각이 들어서, 관련 내용을 좀 더 찾아보게 되었다.// 1. let a; console.log(a); a = 3; // 2. console.log(a); let a = 3; // 3. console.log(a); var a = 3; 1, 3번의 경우 undefined가 출력되고, 2번의 경우 참조 에러가 발생한다. 왜 이런 결과가 나오는지를 이해하고 설명할 수 있다면 당신은 호이스팅에 대해 제대로 이해한 것이다.자바스크립트를 실행시키는 인터프리터는 변수를 생성하는 단계를 선언단계와 할당 단계로 분할한다. 코드를 실행하기 전 변수의 선언 부분은 현재 범위의 맨 위로 호이스팅 된다.  이 때, 호이스팅된 var 변수는 undefined 값이 할당된다. 이것이 3번 예제 코드가 undefined를 출력하는 이유이다. 반면, 호이스팅된 let, const 변수는 값을 할당받지 않고, TDZ 상태에 있게 된다. TDZ(Temporal Dead Zone)란 일시적 데드 존으로, 변수를 사용할 수 없는 일시적인 비활성 상태를 의미한다. 이 상태에서 변수에 접근하게 되면 참조 에러를 발생시킨다. 이것이 2번 예제 코드에서 참조 에러가 발생하는 이유이다.클래스도 let, const 변수와 동일한 메커니즘이 적용된다.마지막으로 함수의 경우에도 동일하게 호이스팅 개념이 적용된다.hello(); function hello(){ console.log("hello"); } 위와 같은 함수 선언문의 경우, 선언문 자체가 호이스팅되므로 함수 선언 전에 함수를 호출해도 정상적으로 함수를 호출할 수 있다.hello(); var hello = ()=> { console.log("hello"); } 반면 위와 같은 함수 표현식의 경우, 선언문(var hello;)만 호이스팅되므로 함수 선언 전에 함수를 호출하면 참조 에러가 발생하게 된다.CRP섹션 2에서 잠시 언급되었던 CRP(Critical Rendering Path)라는 개념이 흥미로워서 개인 블로그에 따로 정리해보았다. 게시글 링크학습 회고이번에 인프런 워밍업 클럽 스터디에 참여하면서, 내가 앞으로 공부해야 할 개념들을 많이 접할 수 있어 좋았다. 지금까지 알게된 내용을 다 정리하기엔 아직 시간이 더 필요할 것 같지만, 지금은 내게 이 과정이 계속해서 동기부여가 되어준단 것으로 충분한 것 같다.미션 중 고민했던 것5일차 미션인 Github Finder 앱을 구현하면서 한 가지 고민했던 요소가 있다. Github API를 사용할 때 사용되는 Github Token의 경우 내 명의나 다름이 없어서 남들에게 유출되면 곤란한 정보인데, 이걸 js 코드에 직접적으로 드러내지 않으면서 Live Server로 띄울 수 있게 하는 방법을 찾고 싶었다. 토큰을 .env 파일에 저장하니 Live Server로 앱을 띄웠을 때 .env 파일의 경로를 찾지 못했다.며칠간 방법을 고민해보았는데, 사실 아직도 뾰족한 수는 찾지 못했다. Live Server로 띄우려면 어쩔 수 없는 걸까…7일차 미션인 타이핑 테스트 앱을 구현하면서 가장 머리를 싸맸던 부분은 타자 입력 결과를 출력할 때 맞게 입력한 문자와 오타 문자에 각각의 스타일을 적용하는 것이었다.이 사진처럼, 예제 문자열을 사용자가 입력한 문자열과 비교하고 맞게 입력한 문자는 초록색, 오타 문자는 빨간색으로 스타일을 지정해주어야 했다.문자 하나하나를 <span> 태그로 묶는 것은 너무 투박한 방식인 것 같아서, 같은 상태의 연속된 문자를 하나의 태그에 묶는 방식으로 구현하기로 했다.이 방식대로라면 위의 입력 결과는 다음과 같은 html element로 표현되어야 한다.<span class="correct">he realized what </span> <span class="wrong">was happenin</span> <span class="correct">g and told the </span> <span>others.</span> 연속해서 같은 상태의 문자가 나타나는 경우와 그렇지 않는 경우로 나누어 로직을 처리했다.for (let i = 0; i < data[currentPhase].length; i++) { let currentState = compareLetter(e.target.value, i); if (previousState !== currentState) { screen.appendChild(currentNode); currentNode = document.createElement("span"); currentNode.setAttribute("class", currentState); previousState = currentState; } currentNode.textContent += data[currentPhase][i]; if (i === data[currentPhase].length - 1) { screen.appendChild(currentNode); } } 이 문제를 해결하고 나니 이런 동적인 로직을 잘 구현하려면 DOM 요소를 처리하는 과정을 머릿속으로 잘 그릴 수 있어야겠다는 생각이 들었다.주차 회고학교 생활과 병행하려니 생각보다 커리큘럼이 많이 벅차서, 시간관리에 좀더 신경을 써야할 것 같다. 그럼에도 첫 주차를 잘 마무리한 나 자신을 칭찬하고 싶다.마지막으로 프론트엔드를 공부했던 게 제작년 겨울이었는데, 그 사이 잊어버렸던 자바스크립트 개념들이 강의를 들으며 새록새록 떠올라서 좋았다.부족한 기본기를 채우고자 시작한 활동이었는데, 강의 컨텐츠도 매우 만족스럽고 기존에 몰랐던 새로운 내용을 배워 나가는 게 즐겁다.남은 기간동안에도 끝까지 포기하지 않고 잘 마무리지을수 있도록 열심히 해야겠다.

프론트엔드

손예지

[인프런 워밍업 클럽 스터기 1기] BE 1주차 <첫 번째 회고록>

강의 요약Day 2 <서버 개발을 위한 환경 설정 및 네트워크 기초>새로운 스프링 프로젝트 시작 방법spring initializer 접속Project: 이 프로젝트에서 사용될 ‘빌드 툴’ → 최근에는 Gradle 많이 사용Language: 서버를 개발할 때 사용할 언어 → 최신 프로젝트에는 Kotlin을 사용하는 경향이 있지만 Java로 만들어진 기존 프로젝트가 많이 존재Spring Boot: 스프링 부트의 버전을 고르는 항목 → 알파벳이 붙어 있으면 개발 중이거나 오픈 베타라는 의미, 시간이 지나면서 계속 버전이 업그레이드 되기 때문에 강의를 보는 시점에 따라 다른 숫자가 나올 수 있음버전은 첫 번째 숫자(major), 두 번째 숫자(month), 마지막 숫자(버그 및 간단한 기능 추가)Project MetadataGroup: 프로젝트 그룹Artifact: 최종 결과물 이름Name: 프로젝트 이름Description: 프로젝트 설명Package name: 패키지 이름Packaging: Spring Boot 톰캣이 내장되어 있어 Jar을 선택하면 됨Java: 기존에 존재하는 프로젝트는 Java11이 가장 많고 그 다음은 Java8이 많음 → 최신 프로젝트는 최신 Java 버전을 사용할 수 있음Dependencies: 프로젝트에서 사용하는 라이브러리 / 프레임워크라이브러리: 프로그래밍을 개발할 때 미리 만들어져 있는 기능을 가져다 사용하는 것프레임워크: 프로그래밍을 개발할 때 미리 만들어져 있는 구조에 코드를 가져다 끼워 넣는 것@SpringBootApplication과 서버어노테이션: Java의 문법으로 @ 뒤에 이런저런 문자열을 붙이는 것, 스프링을 실행하기 위해 필요한 다양한 설정들을 모두 자동으로 해 줌Server: 어떠한 기능을 제공하는 프로그램 (컴퓨터)서버와 요청: 기능을 제공하기 위해서는 누군가의 요청 필요네트워크란 무엇인가택배 시스템 <-> 네트워크집 <-> 컴퓨터주소 <-> IP주소 별칭 <-> 도메인 이름택배를 받는 사람 <-> port / 3000HTTP와 API란 무엇인가HTTP(HyperText Transfer Protocol)Protocol: 표준, 약속웹을 통한 컴퓨터 간의 통신은 HTTP라는 표준화된 방식이 있음HTTP MethodHTTP 요청은 HTTP Method(GET, POST)와 Path(/portion)가 핵심GET: HTTP 요청을 받는 컴퓨터에게 요청하는 행위 → 데이터를 달라POST: HTTP 요청을 받는 컴퓨터에게 요청하는 행위 → 저장하라 GET: 데이터를 달라, 쿼리DELETE: 데이터를 삭제하라, 쿼리POST: 데이터를 저장하라, 바디PUT: 데이터를 수정하라, 바디API(Application Programming Interface)클라이언트와 서버는 HTTP를 주고받으며 기능을 동작하는데 이때 정해진 규칙을 API라고 함정해진 약속을 하여 특정 기능을 수행하는 것 URL(Uniform Resource Locator)<http://spring.com:3000/portion?color=red&count=2>HTTP Status CodeHTTP/1.1 200 OK Content-Type: application/json { "name":"A", "age":null } 200 → OK300 → Moved Permanently400 → NotFound500 → Internal Server Error요청에서 응답은 상태 코드가 핵심GET API 개발 및 테스트API를 이루고 있는 요소HTTP MethodHTTP Path쿼리 (Key & Value)API의 반환 결과덧셈 API 생성HTTP Method: GETHTTP Path: /add쿼리: int number1 / int number2API의 반환 결과 -> 숫자 (두 숫자의 덧셈 결과)@RestController: 주어진 Class를 Controller로 등록, API의 입구@GetMapping("/add"): 함수를 HTTP Method가 GET이고 HTTP Path가 /add인 API로 지정@RequestParam: 주어지는 쿼리를 함수 파라미터에 넣음Day 3 <첫 HTTP API 개발>POST API 개발 및 테스트GET API에서 데이터 받기: 쿼리 이용POST API에서 데이터 받기: HTTP Body 이용JSON(JavaScript Object Notation): 객체 표기법, 무언가를 표기하기 위한 형식으로 중괄호가 양쪽에 있음곱셈 API 생성HTTP Method : POSTHTTP Path: /multiplyHTTP Body (JSON)API 반환 결과: 숫자 (곱셈 결과)유저 생성 API 개발유저 등록 APIHTTP Method: POSTHTTP Path: /userHTTP Body (JSON)결과 반환 X유저 조회 APIHTTP Method: GETHTTP Path: /user쿼리: 없음결과 반환 (JSON)Day 4 <기본적인 데이터베이스 사용법>Database와 MySQLDatabase: 데이터를 구조화 시켜 저장RDB(Relational Database) - MySQL: 데이터를 표처럼 구조화 시켜 저장SQL(Structured Query Language): 표처럼 구조화된 데이터를 조회하는 언어MySQL 접근 방법 -> MySQL Command List Client (무료)MySQL에서 데이터베이스 생성데이터베이스 생성create database [데이터베이스 이름];데이터베이스 목록 조회show databases;데이터베이스 삭제drop database [데이터베이스 이름];데이터베이스 안으로 접속use [데이터베이스 이름];테이블 생성create table 테이블 이름 ( ... );테이블 제거drop table [테이름 이름];MySQL Type정수: tinyint, int, bigint실수: double, decimal(A,B)문자열: char(A), varchar(A)날짜, 시간 타입: date, time, datetime테이블 데이터 조작C.R.U.DCreate, Retrieve or Read, Update, Delete데이터 넣기INSERT INTO [테이블 이름] (항목) VALUES (값);데이터 조회SELECT * FROM [테이블 이름];데이터 수정UPDATE [테이블 이름] SET 항목 = 값;데이터 삭제DELETE FROM [테이블 이름] WHERE 항목 = 값;Spring에서 Database 사용Spring <-> MySQL 연동을 위한 yaml 파일 작성spring: datasource: url: "jdbc:mysql://localhost/library" username: "root" password: driver-class-name: com.mysql.cj.jdbc.Driver이후 유저 테이블 생성, jdbcTemplate를 이용하여 POST API 변경, GET API 변경, 데이터 입력 및 조회Day 5 <데이터베이스를 사용해 만드는 API>유저 업데이트 API, 삭제 API 개발과 테스트유저 이름 업데이트HTTP Method: PUTHTTP Path: /userHTTP Body (JSON)결과 반환 X (HTTP Stauts 200)유저 삭제HTTP Method: DELETEHTTP Path: /user쿼리 사용: 문자열 name결과 반환 X유저 업데이트 API, 삭제 API 예외 처리하기SELECT문으로 해당 id나 name을 가진 사용자를 조회한 다음 그 사용자가 없을 시 IllegalArgumentException()으로 예외 처리Day 6 <클린코드의 개념과 첫 리팩토링>좋은 코드(Clean Code)는 왜 중요한가코드: 요구사항을 표현하는 언어개발자: 요구사항을 구현하기 위해 코드를 읽고 작성Controller에서 모든 기능을 구현하면 안 되는 이유함수는 최대한 작게 한 가지 일만 수행하도록 하는 것이 좋음클래스는 작아야 하며 하나의 책임만을 가져야 함Controller를 3단 분리하기Controller의 함수 1개가 하고 있던 역할API가 진입 지점으로써 HTTP Body 객체 변환 -> Controller 역할현재 유저가 있는지 없는지 확인하고 예외 처리 -> Service 역할SQL을 사용해 실제 Database와의 통신 담당 -> Repository 역할회고부트캠프를 수료한 지 오래되어서 JAVA의 대부분을 까먹었다고 봐도 무방한데 실무에 필요한 부분을 먼저 배우고 기초 지식을 채워나가는 것도 효율적인 방법이라 판단되어 스터디를 시작하게 되었습니다. 아직 알아야 할 것이 더 많지만 애매하게 알고 있었던 부분에 대해 상당히 많이 이해가 되어 신기했고 앞으로의 방향성에 대해서도 고려해 볼 수 있는 1주차였습니다.

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

aabb

4-29 | 피그마 베리어블과 디자인 토큰/ 디자인 시스템 개념이해하기

● 배리어블 과 스타일 배리어블은 하나의 변수만 저장 가능하며 참조할 수 있다. 따라서 기본 디자인 요소를 적용할 때 주로 사용된다.스타일은 다수의 변수까지도 저장이 가능하며 참조할 순 없다. 따라서 다수의 디자인 요소를 적용할 때 사용된다. ● 배리어블의 역할 배리어블은 디자인 토큰 및 프로토타이핑 기능을 한다. *디자인 토큰이란?디자인 시스템의 기본 구성 요소로서, 전자(Electrons)에 해당한다. /디자인 토큰이 필요한 이유많은 디자이너와 함께 작업할 때 일관성을 유지 할 수 있음다양한 플랫폼 환경(IOS, ANDROID등)에 공통된 디자인을 적용할 수 있음라이트 모드, 다크 모드 등 명확하게 색상을 구분해야 할 때 용이함 많은 하위 브랜드들이 존재할 때 디자인 에셋을 관리하기 용이함*디자인 시스템이란?재사용 가능한 컴포넌트와 패턴 등을 말하며,1) 디자인 원칙/철학 2) 스타일 가이드 3) 컴포넌트 라이브러리 4) 패턴라이브러리 5) 문서화 6) 시스템 관리 운영 으로 구성된다. *Atomic Design이란?디자인 시스템 방법론으로, 전자(Electorns) → 원자(Atom) → 분자(Molecules) → 유기체(Organisms) → 템플릿(Templates) → 페이지(pages)로 UI 시스템을 구성한다는 개념 이다. /전자(Electrons) ex. 색상, 타이포그래피, 테두리 , 그림자효과원자(Atom) ex. 라벨, 텍스트 필드, 버튼

UX/UI볼드UX워밍업클럽

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

 최수연 "라인 매각 압박 따를 이유 없다"일본 정부의 압박을 정면으로 돌파하겠다는 뜻을 밝힘IT 인프라 위탁 업무를 분리하라는 행정지도는 일부 수용하기로 함. 라인 야후에 제공한 IT 인프라 분리할 것2023년 11월 개인정보 유출 사건 빌미 다만 2차 행정지도로 지분 정리 요구는 전례가 없음라인야후 최대주주는 A 홀딩스(64.5%), A홀딩스는 네이버-소프트뱅크 50%씩 출자한 JV소프트뱅크가 1주라도 가져가면 네이버는 경영주도권 X "어른이들, 철들지마"... '만 18세 이상' 레고 쏟아진다저출생 직격탄 맞은 완구업계, 틈새시장 공략을 위해 사업 차별화키덜트족을 타겟으로 한 완구 제품군 확대영포티 40대 : 레고코리아이 키덜트 레고 시리즈, 애니메이션 및 영화 IP 를 활용한 제품군 등레고 판매량 가운데 성인 비중이 20% 이상, '철들지마 레고 팝업스토어' 성수 오픈친환경 , 해외시장 모색오로라 월드 : 친환경 인형 등 현지 맞춤형 제품. 폐페트병 활용하여 지구온난화 타격 생물을 캐릭터로.(친환경은 아님) 오로라 CC 개장(강원도 원주) 라면, 과자 용량 몰래 줄이면 '과태료'슈링크플레이션 : 양을 줄이는 '슈링크', 물가상승 '인플레이션 합성어. 제품값은 그대로, 용량을 줄여 가격 인상 효과를 내는 행위포장 표시, 홈페이지 게시, 판매 장소에 게시 . 중하나를 선택해 의무화. 단, 용량 변동 비율이 5% 미만이면 의무 제외 은행 임원 출신도 속아...노후자금 다 날렸다 '눈물'60대 이상 개인파산 사유 중 주식, 코인 등 투자 실패 비율이 3년사이 4.5배 급증 - 고령자 사기 범죄 노출 대책 시급60대 이상 사기 범죄 피해자 (2018년 2.7만명 -> 2022년 4.6만명)노인 금융 교육은 생존권 차원에서 필수임 10년 기다린 한국 타이어... M&A 로 미래차 '트리플악셀'세계 2위 자동차 공조 시스템 기업 '한온시스템' 최대 주주'가 됨 - 전기차 시대 대비 차원한국터이어 : 전기차용 고부가가치 타이어 + '아트라스' 배터리 제조 역량 + 한온시스템 '공조 시스템' = 전기차 기술 3가지 보유!전기차의 안정성을 위해 열관리는 필수. 고객사에 '토탈 패키지' 제공 가능 우리금융, 10년 만에 다시 증권업 재진출우리투자증권(2013년에 농협금융지주에 매각, 현 NH투자증권) 이 다시 진출!한국포스증권 + 우리종합금융 합병 - 국내 10위 투자은행으로 키우겠음포스증권 : 온라인 펀드 판매 서비스 플랫폼(펀드 슈퍼마켓). 한국증권금융이 지분 51.68%우리종금의 기업 금융 + 포스증권의 디지털 중심 리테일 기반 결합! -> 디지털 부문 최고 증권사로 성장할 것밴처 캐피탈 - 캐피탈 - 은행 - 증권 - 자산운용 - 사모투자사 - 부실채권 전문 투자사 로 이어지는 기업 생애주기별 금융 서비스 체제 완성! '테슬라가 하면 우리도 한다'... 현대차, 1조 3천억 승부수미국 자율주행 합작법인 모셔널(현차+앱티브) 지분 66% 확보, 독자적인 자율주행 생태계 구축 발판 마련유상증자, 지분매입으로 지분 확보. 관객이 없다 ... CJ, 롯데, 지방 영화관 줄폐업롯데컬처웍스, CJ CGV 등 멀티플렉스 영화관 운영사들, 재무주고 개선을 위해 지방 상영관 문을 닫고 있음극장 건물 소유주인 자산운용사들과 일반적으로 20년짜리 초장기 임대차 계약을 하는데 절반도 안되어서 파기하는 상황롯데컬처웍스 대전 둔산점 폐점을 위해 법적 공방CGV, 2034년까지 남아있는 임대차 계약 해지 협의 요청영화관 인테리어는 스크린, 음향시설, 좌석 등을 갖추고 있어 임차인이 나가면 일반음식점, 카페로 활용하기 어렵다2019년 회계 기준 변경으로, 장기임차한 영화관을 모두 '리스부채'로 계상, 부채 상승  

교양신문읽기

구르밍

인프런 워밍업 클럽 BE 1기 - 1주차 발자국

1강spring.io ⇒ springboot 프로젝트 만들기spring boot는 톰캣이 내장되어 있음 (Packaging - Jar)2강 @SpringBootApplication과 서버@ → 어노테이션@SpringBootApplication ⇒ 자동으로 설정서버란 ?: 기능을 제공하는 것, 어떠한 기능을 제공하는 프로그램, 그 프로그램을 실행시키고 있는 컴퓨터기능을 제공하기 위해서는 누군가의 요청이 있어야 한다.3강 네트워크란 무엇인가?각각의 PC에는 고유 IP 존재IP를 모두 외우기 어렵기 때문에 도메인 이름을 사용 (ex - naver.com / spring.com ) ⇒ DNS (Domain Name System)4강 HTTP와 API란 무엇인가?데이터를 주고 받는 표준이 존재HTTP (HyperText Transfer Protocol)GETPOSTPUTDELETEAPI (Application Programming Interface): 클라이언트와 서버는 HTTP를 주고 받으며 기능을 동작하는데 이때 정해진 규칙을 API라고 한다.URL (Uniform Resource Locator)HTTP 응답 코드2003004005005강 GET API 개발하고 테스트하기@RestController→ API의 진입지점 만들기@RestController를 사용하면 API의 진입지점인것을 알수 있다.6강 POST에서는 데이터를 어떻게 받을까 ?HTTP Body를 이용!10강 Database와 MySQL컴퓨터의 핵심 부품CPU : 연산RAM : 임시 기억장치DISK : 장기 기억장치DatabaseRDB (Relational Database)SQL (Structured Query Language)MySQL 접근intellij ultimateCLImysql -u root -p11강 MySQL에서 테이블 만들기 DDL (Data Definition Language)데이터베이스 만들기create database [데이터베이스 이름];데이터베이스 목록보기show databases;데이터베이스 지우기drop database [데이터베이스 이름];데이터베이스 안으로 들어가기use [데이터베이스 이름];테이블 목록 확인하기show tables;테이블 만들기create table [테이블 이름]([필드1 이름][타입][부가조건],[필드2 이름][타입][부가조건],…primary key ([필드이름]));create table fruit (id bigint auto_increment, name varchar(20), price int, stocked_date date, primary key (id)); 테이블 제거하기drop table [테이블 이름];MySQL 타입tinyint : 1바이트 정수int : 4바이트 정수bigint : 8바이트 정수 (21억건이상)double : 8바이트 정수decimal(A,B) : 소수점을 B개 가지고 있는 전체 A자릿수 실수char(A) : A글자가 들어갈 수 있는 문자열varchar(A) : 최대 A글자가 들어갈 수 있는 문자열date : 날짜, yyyy-MM-ddtime : 시간, HH:mm:ssdatetime : 날짜와 시간을 합친 타입, yyyy-MM-dd HH:mm:ss12강 DML (Data Manipulation Language)CRUD데이터 넣기INSERT INTO [테이블 이름] (필드1이름, 필드2이름,…) VALUES (값1, 값2,…)INSERT INTO fruit (name, price, stocked_date) values ('사과', 1000, '2023-05-01');데이터 조회, 업데이트, 삭제select * from [테이블명] where [조건]update [테이블 이름] set 필드1이름 = 값, 필드2 이름 = 값,… where [조건]delete From [테이블 이름] where [조건];13강 Spring에서 Database 사용spring 프로젝트 Resource폴더 아래에 application.yml 파일 생성spring: datasource: url: "jdbc:mysql://localhost/library" //jdbc를 이용해 Mysql에 접근 username : "root" password: "" driver-class-name: com.mysql.cj.jdbc.Driverapplication.yml @GetMapping("/user") public List<UserResponse> getUsers() { String sql = "SELECT * FROM user"; jdbcTemplate.query(sql, new RowMapper<UserResponse>() { @Override public UserResponse mapRow(ResultSet rs, int rowNum) throws SQLException { long id = rs.getLong("id"); String name = rs.getString("name"); int age = rs.getInt("age"); return new UserResponse(id, name, age); } }); }익명 클래스 사용 RowMapper@GetMapping("/user") public List<UserResponse> getUsers() { String sql = "SELECT * FROM user"; return jdbcTemplate.query(sql, (rs, rowNum) -> { long id = rs.getLong("id"); String name = rs.getString("name"); int age = rs.getInt("age"); return new UserResponse(id, name, age); }); }RowMapper에 option + enter ⇒ 람다식으로 변경14강 ~ 16강public void updateUser( UserUpdateRequest request) throws IllegalAccessException { boolean isUserNotExist = userRepository.isUserNotExist(request.getId()); if(isUserNotExist){ throw new IllegalAccessException(); } userRepository.updateNameUser(request.getName(), request.getId()); } public void deleteUser(String name) throws IllegalAccessException { boolean isUserNameNotExist = userRepository.isUserNameNotExist(name); if(isUserNameNotExist){ throw new IllegalAccessException(); } userRepository.deleteUser(name); }수정, 삭제 전 사용자가 DB에 존재하는 데이터인지 확인하기 위해 예외처리를 해주었다.jdbcTemplate.query ……. ⇒ List로 반환된다.isEmpty()를 붙여 boolean 타입인지 확인하도록 한 후 조건문 실행만약 존재 하지 않는 유저라면 IlleagalAccessException()이 호출된다.PostMan으로 확인한 결과홍합이란 유저가 없어서 500이 떴다!17강 좋은 코드란 무엇인가코드는 요구사항을 표현하는 언어개발자는 요구사항을 구현하기 위해 코드를 읽고 작성한다. 코드를 읽는 것은 필수적이고 피할 수 없다안좋은 코드가 쌓이면, 시간이 지날 수록 생산성이 낮아진다! Controller에서 모든 기능을 구현하면 왜 안될까?⇒ 함수는 최대한 작게 만들고 한 가지 일만 수행하는 것이 좋다.  18강. Controller를 3단 분리하기 - Service와 Repository기존 Controller의 함수 1개가 하고 있던 역할API의 진입 지점으로써 HTTP Body를 객체로 변환하고 있다. ⇒ Controller현재 유저가 있는지, 없는지 등을 확인하고 예외 처리를 해준다. ⇒ ServiceSQL을 사용해 실제 DB와의 통신을 담당한다. ⇒ RepositoryLayered ArchitectureController ← Service ← Repository미션 & 일주일 회고미션 (1 ~ 3번째 과제)https://charm-vise-f40.notion.site/016b87f39bbe4c31991ab1c51632bd73https://charm-vise-f40.notion.site/2-372b48a579674c988a990fa4b9a14ebb?pvs=4https://charm-vise-f40.notion.site/3-212dca4aeb81494c9d63f66689b90e4f?pvs=4워밍업 클럽이 벌써 시작한 지 일주일 정도가 흘렀다.진도표에 맞춰 강의를 듣고 과제를 진행하다 보니 시간이 금방 흐른 느낌이다!!강의를 보다 보면 내가 다 아는 것 같은 느낌이 들었는데 역시 과제를 하면 내가 어느 정도 까지 이해했는지 알수있었다 ㅎㅎ두 번째 과제를 할 때에는 출력값이 JSON으로 문제에는 나와 있지만 처음에 무작정 하다 보니 나는 그냥 단순 값으로 포스트맨에 출력되었다.뭐지? 뭐가 잘못된 거지 하면서 고민하다 보니까 객체로 반환을 하면 되는 것이었다 ㅜ세 번째 과제는 강의를 들으면서 익명, 람다식 등 잘 기억이 나지 않았는데 마침 강사님께서 과제로 내주셨다나도 코딩 님의 자바 강의에 들으면서 익명함수, 람다 식을 다시 공부했다. 좀 더 익숙해질 때까지 계속 사용해 봐야겠다.아직 초반이라 그런지 사실 강의는 매우 재밌었다. 그렇지만 스스로 자바개념이 아주 부족하다고 생각하기에주말을 활용하여 자바 개념과 강의 내용을 복습해 봐야겠다!

웹 개발인프런워밍업회고

miiro

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

첫 번째 발자국자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]를 수강하고인프런 워밍업 클럽에 참여하여 쓰는 첫 번째 회고록입니다. 학습 내용스프링 프로젝트를 시작하는 방법과 네트워크, HTTP, API에 대한 기본적인 개념에 대해 학습하였습니다.HTTP는 데이터를 주고 받는 표준이고, 행위와 자원은 HTTP 요청을 보내기 전에 약속을 해야합니다.HTTP Method는 GET, POST, PUT, DELETE 가 있습니다. 예시로 GET는 HTTP 요청을 받는 컴퓨터에게 요청하는 행위입니다.GET 요청의 경우 /portion 이라는 요청 받는 path와 ?의 구분기호로 세부 조건인 쿼리스트링 작성합니다.GET /portion?color=red&count=2POST 요청의 경우 데이터를 저장하는 것으로 바디를 사용합니다.POST /oak/leatherDELETE는 데이터를 삭제하기 위해 쿼리스트링을 사용하고, PUT은 데이터를 수정하기 위해 바디를 사용합니다. POST API는 HTTP Body를 활용해서 데이터를 받습니다.데이터를 보낼 때는 JSON(객체표기법)을 활용합니다.key : 'value' 형태로 Java 문법 상 Map<Object, Object> 형태와 유사합니다.@PostMapping("/multiply") public int multiplyTwoNumbers(@RequestBody CalculatorMultiplyRequest request){ return request.getNumber1()* request.getNumber2(); }위의 예시의 주요 어노테이션은 아래와 같습니다.@PostMapping : HTTP Method가 POST 이고, 요청 경로인 /path인 API를 생성합니다.@RequestBody : HTTP Body로 들어오는 JSON 파라미터로 데이터를 전달하는 객체인 DTO로 바꿔줍니다. DTO에는 JSON의 key 값이 명시되어야하며, 각 속성은 key 값과 동일하게 value도 타입에 맞게 작성합니다. Database는 데이터를 구조화시켜 저장합니다. 마치 엑셀과 비슷하게 표처럼 구조화하여 저장합니다.여기서 구조화된 데이터를 조회하는 언어를 SQL 이라고 합니다.SQL문의 예시는 아래와 같습니다.// DB 생성 create database [데이터베이스 이름]; // DB 조회 show databases; // DB 삭제 drop database [데이터베이스 이름]; // DB 사용 use [데이터베이스 이름]; // TABLE 조회 show tables; // TABLE 생성 create table [table 이름] ([필드 이름] [타입] [부가 조건], [필드 이름] [타입] [부가 조건], ... primary key([필드 이름]) ); // TABLE 삭제 drop table [table 이름];테이블 자체를 생성, 삭제, 변경, 초기화 하는 것을 DDL(Data Definition Language) 라고 합니다. 테이블의 데이터를 조작하는 것을 일명 C.R.U.D 라고 부릅니다.테이블 데이터를 조작하는 SQL문을 DML(Data Manipulation Language) 라고 합니다.데이터 삽입insert into [table 이름]([필드 이름1], [필드 이름2], ...) values (값1, 값2, ...);데이터 조회select * from [db 이름]; select [필드 이름1], [필드 이름2] from [db 이름];조건 데이터 조회select * from [db 이름] where [조건];데이터 업데이트update [table 이름] set 필드1=값, 필드2=값,... where [조건];❗ 조건문을 작성하지 않으면 모든 데이터가 바뀌니 항상 주의하자!데이터 삭제delete from [table 이름] where [조건];❗ 조건문을 작성하지 않으면 모든 데이터가 삭제되니 항상 주의하자!  과제 내용Day 1HTTP 요청을 보내기 위한 Method 중 하나인 GET API 를 만들기 위해서 어노테이션을 사용했었습니다.이를 통해 어노테이션을 사용하는 이유는 무엇인지, 또한 나만의 어노테이션을 만드는 방법에 대해 학습하게 되었습니다.처음에는 클래스 위에 붙은 @ 어노테이션은 의미를 생각하기보다는 레이어에 맞는 동작을 하기 위해서 알맞는 어노테이션을 사용할 수 있도록 암기하는 것으로만 생각하고 공부했었습니다. 자바에서 제공하는 표준 어노테이션을 다양하게 찾아봤으며, 코드가 작동되면서 reflection을 이용하여 코드를 직접적으로 호출하지 않고 코드를 제어할 수 있는 다양한 기술의 집합체라는 것을 알게 되었습니다.그리고, 유저가 직접 만드는 어노테이션을 구현해보면서 메타 어노테이션 즉, 내가 만드는 어노테이션의 유지 기간, 위치를 결정할 수 있도록 결정할 수 있는 사용자 친화적인 조작을 할 수 있다는 것을 알게 되었습니다.📋 1일차 미션 : 어노테이션의 개념과 특징 Day 2GET, POST API를 활용한 과제인데 일반적으로, GET을 사용할 때는 URL 뒤에 query를 사용하는 방식, POST를 사용할 때는 body를 사용하는 방식으로 볼 수 있습니다. 하지만 부득이하게 데이터의 양이 많이 복잡하다면 쿼리 파라미터로 받는 방식(GET)보다는 body 로 받는 방식(POST)로 변경하는 방향이 좋다는 것을 알았습니다.또한, LocalDate 타입을 string 형태로 받아 치환을 해줬는데, 스프링부트 2.x.x 버전에서 @DateTimeFormat을 활용하여 localDate를 바로 받을 수 있는 방법도 알게 되어, java 문법의 변수가 아닌 스프링에 친화적인 어노테이션을 활용하여 구현할 수 있도록 많이 접해보고 공부해야겠다는 생각이 들었습니다.📋 2일차 미션 : GET API와 POST API Day 3람다식의 등장한 이유와 람다식과 익명 클래스의 관계에 대한 내용을 중점적으로 공부하는 것이었습니다.위의 내용을 공부하면서 함수형 프로그래밍과 @FunctionalInterface, stream API와 메서드 레퍼런스에 대한 내용에 대한 연관성도 함께 예시를 만들어보면서 공부했습니다. 위의 내용은 코딩테스트를 해본 사람이면 한 번 쯤은 실습해봤을 내용이라서 쉽게 내용을 이해할 수 있을 것이라고 생각했습니다.하지만 필자의 경우 문법에 대한 내용보다는 코드를 구현할 줄만 알았습니다. 해당 내용을 공부하니 왜 만들어졌는지, 자바에서는 버전을 올라가면서 메서드를 쉽게 구현할 수 있도록 점차 단순화시키고 간결하게 표현할 수 있다는 것에 대해 면밀하게 알 수 있었습니다.📋 3일차 미션 : 익명 클래스와 람다식  회고기초 지식보다는 실제 프로젝트를 구현하기 위한 기술에 대한 내용에 중점을 두고 공부를 했었는데, 백엔드 개발을 하기 위한 서버 지식과 Java, Spring에 관한 내용을 다시 처음부터 하나씩 이해하면서 다시금 지식을 쌓을 수 있었던 거 같습니다.또한, 강의만 듣는 게 아닌 과제를 해결하면서 강의에 대한 이해와 구현할 수 있는 능력을 키우면서 나 자신의 부족한 점과 다른 방식으로 구현할 수 있을 수 있을까라는 여러 방법에 대해 골똘하게 생각할 수 있는 계기가 되었던 거 같습니다.

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

수희

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

우리는 JdbcTemplate을 사용하는 과정에서 익명 클래스와 람다식이라는 자바 문법을 사용했습니다. 익명 클래스는 자바의 초창기부터 있던 기능이고, 람다식은 자바 8에서 등장한 기능입니다. 다음 키워드를 사용해 몇 가지 블로그 글을 찾아보세요! 아래 질문을 생각하며 공부해보면 좋습니다! 😊 [키워드]익명 클래스 / 람다 / 함수형 프로그래밍 / @FunctionalInterface / 스트림 API / 메소드 레퍼런스 [질문]자바의 람다식은 왜 등장했을까?람다식과 익명 클래스는 어떤 관계가 있을까? - 람다식의 문법은 어떻게 될까?익명 클래스란? 클래스 선언과 객체 생성을 동시에 하며 단 한번만 사용되는 일회용 클래스이다.클래스를 별도로 선언하지 않아도 되어 기존보다 간결하게 코드를 작성할 수 있게 되었지만, 그럼에도 작성해야할 부분이 많다는 불편함을 가지고 있다.람다식을 사용하여 익명 클래스보다 더욱 간결한 코드 작성이 가능해졌다.Collections.sort(words, new Comparator<String>() { public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } });Collections.sort(words, (s1, s2) -> Integer.compare(s1.length(), s2.length()));람다식이란? 메서드를 하나의 식으로 표현하는 것으로 메서드 이름과 반환값이 없으므로 익명 함수라고도 한다.람다식의 도입으로 기존의 자바를 거의 변경하지 않고도 함수형 언어의 장점을 접목시킬 수 있게되었다.함수형 프로그래밍이란? 선언형 프로그래밍의 일종으로 순수 함수를 조합하고 프로그래밍 패러다임이다. 순수 함수는 입력 파라미터에만 의존하며, 부수 효과를 일으키지 않는 함수를 뜻하며 정의된 API를 통해서만 외부 시스템과 상호작용하여 결과를 만들어내는데 이러한 부분이 객체지향 언어와는 다른 점이다.함수형 프로그래밍 장점테스트와 디버깅에 용이함간결한 코드 작성개발 생산성코드 가독성에 좋음함수 단위 코드 재사용 쉬움 람다식과 익명 클래스 둘 다 함수 객체를 만들 때 사용한다. (함수 객체란 추상 메서드를 하나만 담은 인터페이스의 인스턴스를 말한다. ) 하지만 람다식과 익명 클래스가 같다고 할 수 없다. 람다는 다음 3가지 한계점을 가지고 있다.추상클래스의 인스턴스를 만들 때는 람다 사용 불가능추상메서드가 여러개인 인터페이스의 인스턴스로 람다 활용 불가능람다는 자기자신을 참조하지못함 문법 >(매개변수목록) -> {함수몸체}1. 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략 가능함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략 가능 (이때 세미콜론(;)은 붙이지 않음)매개변수가 하나인 경우에는 괄호(())를 생략 가능4. 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략 불가능 예시 >int max(int a, int b) { return a > b ? a : b ; }(a,b) -> a > b ? a : b int sumArr(int[] arr) { int sum = 0; for(int i : arr) sum += i; return sum; }(int[] arr) -> { int sum = 0; for(int i: arr) sum += i; return sum; }강의- 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지], https://inf.run/XKQg출처자바의정석 14장 람다와 스트림https://code-lab1.tistory.com/245https://yozm.wishket.com/magazine/detail/2023/https://limkydev.tistory.com/226https://coder-in-war.tistory.com/entry/Java-24-%EC%9D%B5%EB%AA%85%ED%81%B4%EB%9E%98%EC%8A%A4%EB%B3%B4%EB%8B%A4%EB%8A%94-%EB%9E%8C%EB%8B%A4 

김동찬

인프런 워밍업 클럽 3일차 과

Q1- 람다식의 등장이유Stream 연산들은 매개변수로 함수형 인터페이스(Functional Interface)를 받도록 되어있다. 그리고 람다식은 반환값으로 함수형 인터페이스를 반환하고 있다. 그렇기 때문에 우리는 Stream API를 정확히 이해하기 위해 람다식과 함수형 인터페이스에 대해 알고 있는것이 좋다. 익명함수(Anonymous Function)란 함수의 이름이 없는 함수로, 익명함수들은 모두 일급 객체이다. 일급 객체인 함수는 변수처럼 사용가능하며 매개 변수로 전달이 가능하는 등의 특징을 가지고 있다.   기존의 방식에서는 함수를 선언할 때 다음과 같이 선언하였다. // 기존의 방식 반환티입 메소드명 (매개변수, ...) { 실행문 } // 예시 public String hello() { return "Hello World!"; } 하지만 람다 방식으로는 위와 같이 메소드 명이 불필요하며, 다음과 같이 괄호() 와 화살표-> 를 이용해 함수를 선언하게 된다. // 람다 방식 (매개변수, ... ) -> { 실행문 ... } // 예시 () -> "Hello World!"; 이렇게 람다식이 등장하게 된 이유는 불필요한 코드를 줄이고, 가독성을 높이기 위함이다. 그렇기 때문에 함수형 인터페이스의 인스턴스를 생성하여 함수를 변수처럼 선언하는 람다식에서는 메소드의 이름이 불필요하다고 여겨져서 이를 사용하지 않는다. 대신 컴파일러가 문맥을 살펴 타입을 추론한다. 또한 람다식으로 선언된 함수는 1급 객체이기 때문에 Stream API의 매개변수로 전달이 가능해진다.   람다식(Lambda Expression) 의 특징 람다식 내에서 사용되는 지역변수는 final이 붙지 않아도 상수로 간주된다. 람다식으로 선언된 변수명은 다른 변수명과 중복될 수 없다. 람다식(Lambda Expression) 의 장점 코드를 간결하게 만들 수 있다. 식에 개발자의 의도가 명확히 드러나 가독성이 높아진다. 함수를 만드는 과정없이 한번에 처리할 수 있어 생산성이 높아진다. 병렬프로그래밍이 용이하다. 람다식(Lambda Expression) 의 단점 람다를 사용하면서 만든 무명함수는 재사용이 불가능하다. 디버깅이 어렵다. 람다를 남발하면 비슷한 함수가 중복 생성되어 코드가 지저분해질 수 있다. 재귀로 만들경우에 부적합하다. ☞ 람다라고 무조건 좋은건 아니다. 상황에 맞게 적절하게 사용하자:) Q2 람다식과 익명 클래스의 관계 익명클래스가 필요한 상황1. 프로그램 내에서 일시적으로(단발성으로) 한번만 사용되어야 하는 객체일 경우-> UI 이벤트처리, 스레드 객체 등 (단발성 이벤트 처리)2. 재사용성이 없고, 확장성을 활용하는 것이 유지보수에서 더 불리할 때-> 비즈니스 로직이 정말 재각각이며, 재사용성이 전혀없어 매번 클래스를 생성해야하는 비용이 더 많을 때정리하자면 클래스를 별도로 만들 필요없이 코드에서 익명객체를 생성/정의하여 단 한번의 쓰임을 다하고 소멸한다.그래서 만일 어느 메소드에서 부모 클래스의 자원을 상속받아 재정의하여 사용할 자식 클래스가 한번만 사용되고 버려질 자료형이면, 굳이 상단에 클래스를 정의하기보다는, 지역 변수처럼 익명 클래스로 정의하고 스택이 끝나면 삭제되도록 하는 것이 유지보수면에서나 프로그램 메모리면에서나 이점을 얻을 수 있다. 다만 주의해야 할 점이 있다.기존의 부모 클래스를 상속한 자식 클래스에서는 부모 클래스의 메서드를 재정의 할뿐만 아니라 새로운 메소드를 만들어 사용할수 도 있다는 점은 다들 알고 있을 것이다.하지만 익명 클래스 방식으로 선언한다면 오버라이딩 한 메소드 사용만 가능하고, 새로 정의한 메소드는 외부에서 사용이 불가능 하다.이런 익명클래스중 익명클래스 중에서 한 가지 메소드만 구현하는 경우, 람다식으로 변경할 수 있다.둘 다 함수적 프로그래밍을 구현하는 방식이지만 람다식는 앞서 말했듯이 익명 클래스의 단점을 보완하기 위해 등장했음. 람다식은 익명 클래스보다 간결하고, 가독성이 높으며, 함수적 프로그래밍 적용이 쉽고, 스코프 개념으로 감싸고 있는 변수를 직접 참조가 가능하며 마지막으로 직렬화도 가능함. 출처: https://itkjspo56.tistory.com/289 [로춘남의 IT이야기:티스토리]

백엔드

준섭

인프런 워밍업 클럽 스터디 1기 BE 3번째 과제

람다 표현식이란?람다 표현식 줄여서 람다식이란 메서드를 간결한 함수식으로 표현한 것이다.그리고 함수형 프로그래밍을 구성하기 위한 함수식이라고 하는데람다식이 나오게 된 이유는 객체 지향 프로그래밍 언어인 자바에서함수형 프로그래밍을 사용하기 위해서 Java 8버전 부터 추가되었다.자바에서 메서드를 사용하려면 클래스를 정의하고 메서드를 작성해야 하지만람다식으로 표현하면 메서드의 이름과 반환타입을 생략할 수 있다.int add(int x, int y) { return x + y; } // 람다식으로 표현 // 메서드명과 반환타입 생략 가능 (int x, int y) -> { return x + y; } // 매개변수 타입도 생략 가능 (x, y) -> x + y; 람다식과 익명 클래스어떻게 클래스를 만들지 않고 메서드를 작성할 수 있는 걸까?자바에는 이름이 없는 클래스인 익명 클래스가 있는데익명 클래스는 클래스를 따로 정의하지 않고 바로 객체로 생성해 한번만 사용할 수 있다.이 익명 클래스를 짧게 표현하면 람다식이 되는 것이다.interface Add { int add(int x, int y); } // 익명 클래스 Add a = new Add() { public int add(int x, int y) { return x + y; } }; // 람다식 Add a = (x, y) -> {return x + y;}; 여기서 익명 클래스와 람다식을 대입 받는 변수가 필요한데이 변수는 인터페이스를 사용해야 하고이 인터페이스를 함수형 인터페이스라고 한다.함수형 인터페이스(functional interface)단 하나의 추상 메서드가 선언된 인터페이스를 함수형 인터페이스라고 한다.그리고 람다식은 함수형 인터페이스의 추상 메서드의 구현 부분을 짧게 표현한 것이 함수형 인터페이스의 추상 메서드를 통해서 타입을 추론할 수 있기 때문에 타입의 생략이 가능하다.@FunctionalInterface이 어노테이션을 인터페이스에 붙여주면 두 개 이상의 추상 메서드가 선언되지 않도록 컴파일러가 체크해줘서 실수를 줄일 수 있다.  참고https://inpa.tistory.com/entry/%E2%98%95-Lambda-Expression#

백엔드

한국취업센터

[호남권] ICT이노베이션스퀘어 온라인 코딩스터디 백엔드+인공지능 부트캠프 교육생 모집

 *호남권(전남/전북/광주 등 호남권 모두) 거주자 및 소재 대학생 모두 참여 가능합니다.   ○ 행사(교육)소개   - 안녕하세요.     한국취업센터입니다.     2024년도 전남ICT이노베이션스퀘어 백엔드 및 인공지능 부트캠프     참여자 모집 공고를 아래와 같이 안내 드리오니, 많은 참여바랍니다.     ※ 100% 온라인 무료교육 및 자격증 응시     비용이 지원 되기에 많은 지원 바랍니다.   ○ 기간 및 일정   - 교육명: 전남ICT 이노베이션스퀘어 부트캠프 [백엔드, 인공지능 전문교육]   - 모집인원: 20명 (39세 미만 참여 가능)   - 모집기간: 2024. 05. 01(월) ~ 05. 10(화) 까지   - 모집대상: 호남권(전남/전북/광주) 거주자 및 소재 대학생들     (주민등록등본 표기 기준)   - 수료기준 : 교육 전체 시수의 70% 수강 or 50% 수강 후     취업하시면 수료로 인정됨   - 교육기간: 2024. 05 ~ 10. 23(수) / 콘텐츠 수강 자율,     실시간 화상교육 화목금 오후7시~오후10시 등   - 진행방식: 100% 온라인으로 실시   - 교육내용: 웹기초 및 자바 프로그래밍, 스프링 프레임워크,      파이썬 프로그래밍, 데이터 분석 시각화, 머 신러닝 모델 학습 등 자세한 내용○ 참가자격   - 호남권(전남/전북/광주) 거주자 및 소재 대학생들     (주민등록등본 표기 기준)○ 접수방법   - [ 바로가기 ] 해당 신청페이지 링크를 접속한다.   - 접속한 사이트 하단에 지금 "바로 부트캠프 지원하기" 버튼을 클릭   - 간단한 설문과 함께 교육 신청 진행   - 신청 완료 후에 원활한 등록처리를 위하여     오픈카톡 문의처( https://open.kakao.com/o/shk0R9hg )나     메일( info@k-jobc.co.kr )로      꼭 본인 성함과 연락처를 기재하여 회신바랍니다.○ 혜택내역   - 교육비 전액 무료   - 자격증 응시 비용 지원   - 전문 수료증 제공 등   - 교육 수료 후, 6개월 간 취업서비스 및 기업연계 실시     (사후관리 시스템)○ 문의   - 오픈카톡 문의 : https://open.kakao.com/o/shk0R9hg   - 운영본부 [ Tel. 02-6956-5981, 02-6956-5980 ]   - 메일 문의 [ info@k-jobc.co.kr ]   - 홈페이지 [ 한국취업센터 (k-jobc.co.kr) ]

웹 개발개발국비교육무료온라인전남광주전북백엔드인공지능

xicodey

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

자바의 람다식은 왜 등장했을까? 자바는 람다식 함수형 프로그램밍이 사용한 이유는 불필요한 코드를 줄이고, 가독성을 높이기 위해서다 .그리고 함수 만드는 과정없이 한번에 처리 할 수 있기 때문에 생산성이 높아진다.병령 프로그램밍에 용이하다. 람다식과 익명 클래스는 어떤 관계가 있을까? 함수형 프로그래밍이란 함수를 정의하고 이 함수를 데이터 처리부로 보내 데이터를 처리하는 기법이다.데이터 처리부는 데이터만 가지고 있을 뿐, 처리 방법이 정해져 있지 않아 외부에서 제공져 있지 않아 외부에서 제공된 함수에 의존한다.데이터 처리부는 제공된 함수의 입력값으로 데이터를 넣어 함수에 정의된 처리 내용을 실행하고, 동일한 데이터라도 함수 A를 제공한 결과 값과 함수 B를 제공하여 처리된 결과 값은 다를 수 있다 이것이 함수형 프로그램의 특징인 데이터 처이의 다형성이다.람다식은 함수를 하나의 식으로 표현하여 익명 함수를 반환한다.익명 클래스는 선언된 클래스 내에서만 한 번만사용될 경우 별도로 변수에 담을 필요가 없다.람다식을 쓰면 함수형 인터페이스로 인스턴스를 만들 수 있으며 코드를 줄 일 수 있다.메서드 매개변수와 리턴 타입, ㅌ변수로 만들어 사용도 가능하다. 람다식의 문법은 어떻게 될까? 데이터 처리부에 제공되는 함수 역활 하는 매개변수를 가진 중괄호 블록이다.{매개변수, ...} -> {처리 내용};  인터페이스가 단 하나의 추상 메소드를 가질 경우 이를 함수형 인터페이스라고 한다.public interface Runnable { void run(); }람다식() -> { ...}; @FunctionalInterface public interface Calculable { void calculate(int x, int y); }람다식(x, y ) -> { ...}@FunctionalInterface 어노테이션을 사용한 이유는 인터페이스가 함수형 인터페이스를 보장하기 위해서다.붙이는 것은 선택사항이지만, 컴파일 과정에서 추상 메소드가 하나인 검사하기 때문에 정확한 함수형 인터페이스를 작성하게 도와주는 역활을 해준다.매 매개변수가 없는 람다식실행문이 하나일 경우 중괄호를 생략 가능하고 두개 이상일 경우는 생략할 수 없다.() -> 실행문; () -> { 실행문; 실행문; } 매개변수가 있는 람다식매개변수를 선언할 때 타입은 생략할 수 있고, 구체적인 타입 대신에 var를 사용할 수 있다.(타입, 매변수, ... ) -> { 실행문; 실행문; }(타입, 매변수, ... ) -> 실행문;(var 매개변수, ...) -> { 실행문; 실행문; }(var 매개변수, ...) -> 실행문;(매개변수, ...) -> { 실행문; 실행문; }(매개변수, ...) ->실행문;매개변수 -> { 실행문; 실행문 };매개변수 -> 실행문; 리턴값이 있는 람다식return 문 하나만 있는 경우에는 중괄호와 함께 return 키워드를 생략가능하다.(매개변수, ...) -> { 실행문; return 값 )(매개변수, ...) -> 값 메소드 참조메소드를 참조하여 매개변수의 정보 및 리턴 타입을 알아내 람다식에서 불필요한 매개변수를 제거한다. (left, right) -> Math.max(left, right);Math.max() 메소드의 매개값은 전달하는 역활만 하기 때문에 다음과 같이 생략이 가능하다.Math :: max;정적 메소드를 참조할 경우에는 클래스 이름 뒤에 :: 기호를 붙이고 메소드 이름을 기술한다.클래스 :: 메서드참조변수 :: 메소드 매개변수의 메소드 참조(a, b) -> {a.instaceMethod(b);}메소드 참조는 a 클래스 이름 뒤에 :: 기호를 붙이고 매소드 이름을 기술한다.작성 방법은 메소드 참조와 동일하지만, a의 인스턴스 메소드가 사용된다는 점이 다르다.클래스 :: instaceMethod Reference이것은 자바다(책)

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

xicodey

[인프런 워밍업 스터디 클럽] 1기 백엔드 2일차 과제

어노테이션 사용하는 이유어노테이션은 사용 용도로 3가지가 있습니다.1. 컴파일 시 사용하는 정보 전달2. 빌드 툴이 코드를 자동으로 생성할 때 사용하는 정보 전달3.실행 시 특정 기능을 처리할 때 사용하는 정보 전달컴파일 시 사용하는 정보 전달의 대표적인 예는 @Override 어노테이션입니다.컴파일러가 메소드 재정의 검사를하도록 설정합니다. 재정의되지 않았다면 컴파일러는 에러를 발생시킵니다.웹 개발에 많이 사용하는 Spring Framework 또는 Spring Boot는 다양한 종류의 어노테이션을 사용해서 웹 애플리케이션을 설정하는데 사용합니다.나만의 어노테이션은 어떻게 만들 수 있을까? 어노테이션을 정의하는 방법은 인터페이스를 정의하는것과 유사합니다.@interface 뒤에 사용할 어노테이션을 이름을 정의합니다.오노테이션은 속성을 가질 수 있으며, 속성은 타입과 이름으로 구성됩니다. 속성은 기본값 default 키워드로 지정할 수 있습니다.어떤 대상에 설정 정보를 적용할 것인지, 적용대상을 정의 해야 합니다.클래스 명위에 @Target 어노테이션을 붙어 정의 합니다.적용할 수 있는 대상의 종류는 ElememtType 열거 상수로 정의되어 있습니다.TYPE : 클래스, 인터페이스 열거타입ANOTATION_TYPE: 어노테이션FIELD: 필드CONSTERUCTOR: 생성자METHOD: 메서드LOCAL_VARIABLE: 로컬 변수 예시어노테이션 정의@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface PrintAnnotation { String value() default "-"; int number() default 15; } 서비스 어노테이션 적용public class Service { @PrintAnnotation public void method1() { System.out.println("실행 내용1"); } @PrintAnnotation("*") public void method2() { System.out.println("실행 내용2"); } @PrintAnnotation(value = "#", number = 20) public void method3() { System.out.println("실행 내용3"); } } 실행 코드public class PrintAnnotationExample { public static void main(String[] args) throws InvocationTargetException, IllegalAccessException { Method[] declaredMethods = Service.class.getDeclaredMethods(); for (Method method : declaredMethods) { PrintAnnotation printAnnotation = method.getAnnotation(PrintAnnotation.class); printList(printAnnotation); method.invoke(new Service()); printList(printAnnotation); } } public static void printList(PrintAnnotation printAnnotation) { if (printAnnotation != null) { int number = printAnnotation.number(); for (int i = 0; i < number; i++) { String value = printAnnotation.value(); System.out.print(value); } System.out.println(); } } } 출력 내용

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

xicodey

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

문제 1두 수를 입력하면, 다음과 같은 결과가 나오는 GET API만들기@GetMapping("api/v1/calc") public ResponseEntity<?> calc(Calculator request){ CalculatorResponse response = calculatorService.calc(request); return ResponseEntity.ok(response); }CalculatorController에 Post 요청 메서드로 외부 파라미터를 받기 위해 응답 객체로 Calculator 를 정의했습니다. @Getter @AllArgsConstructor public class Calculator { private final int num1; private final int num2; } calulatorService 정의하여 비지니스 로직을 작성했습니다.@Service public class CalculatorService { public CalculatorResponse calc(Calculator request) { return new CalculatorResponse( add(request), minus(request), multiply(request)); } private static int add(Calculator request) { return request.getNum1() + request.getNum2(); } private static int minus(Calculator request) { return request.getNum1() - request.getNum2(); } private static int multiply(Calculator request) { return request.getNum1() * request.getNum2(); } }응답용 객체로 CalculatorResponse를 정의를 했습니다.@Data @NoArgsConstructor @AllArgsConstructor public class CalculatorResponse { private int add; private int minus; private int multiply; }그리하여 calulatorService에 요청 받은 두 데이터를 처리하여 CalculatorResponse로 ResponseEntity에 담아 200 응답으로 JSON 반환값으로 보냅니다.문제 2날짜를 입력하면, 몇 요일인지 알려주는 GET API 만들기@RestController @RequestMapping("/api/v1") public class DateController { @GetMapping("/getDayOfWeek") public ResponseEntity<?> getDayOfWeek(@RequestParam String date) { try { LocalDate localDate = LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd")); String dayOfTheWeek = localDate.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.ENGLISH).toUpperCase(); return ResponseEntity.ok(Collections.singletonMap("dayOfTheWeek", dayOfTheWeek)); } catch (DateTimeException e) { return ResponseEntity.badRequest().body("Invalid date format"); } } }클라이언트 요청을 처리하고 응답을 반환하기 위해 @RestController 어노테이션을 씁니다.@GetMapping("/getDayOfWeek") 어노테이션을 써서 GET 요청이 오면 메소드가 호출됩니다.@RequestParam을 써서 date 파리미터를 받습니다.받은 날짜 문자열을 'LocalDate' 객체로 반환하기 위해 'DateTimeForrmatter'를 사용하여 날짜 형식을 지정합니다. 그리고 LocalDate 객체의 getDayofWeek() 메서드를 사용하여 요일을 구할 수 있습니다.마지막으로 JSON 형식으로 반환하기 위해 Collections.singletonMap을 사용하여 간단하게 키-값 쌍을 만들어 JSON형식으로 반환할 수 있습니다.문제3여러 수를 받아 총 합을 반환하는 POST API 만들기 @Data public class CalculatorRequest { private List<Integer> numbers; }클라이언트로 부터 받기 위해 숫자 배열릉 받기 위해 List<Integer> 필드를 가진 클래스를 만듭니다. @PostMapping("/sum") public int calculateSum(@RequestBody CalculatorRequest request) { return request.getNumbers().stream() .mapToInt(Integer::intValue) .sum(); }CalculatorController에 Post요청을 처리하기 위해 @PostMapping 어노테이션을 사용합니다.@@RequestBody를 사용하여 JSON 데이터를 CalculatorRequest 객체로 변환됩니다.stream을 돌려 합계를 계산한 다음, 그 결과를 반환합니다.

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