블로그

또니

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

[2주차 학습 내용]벌써 스터디를 시작한지 2주차가 되어간다.2주차에는 컨테이너가 무엇인지, 어떻게 동작하는지 JPA 사용해보기, 트랜잭션그리고 조금 더 객체지향 적으로 코드 리팩토링 하는 방법을 배워 보았다.[2주차 과제]이번 2주차에는 기존에 Controller에서 그대로 SQL을 작성했던 것을 Controller - Service - Repository로 분리해보았고,Repository에 SQL을 사용하는 것이 아닌 JPA를 사용하여 DB와 통신할 수 있도록 해보았다.6일차 과제 보기 - https://ddonydev.tistory.com/807일차 과제 보기 - https://ddonydev.tistory.com/81[느낀점]다른 스프링 강의를 들었을 땐 완벽하게 이해가 되지 않고 넘어 갔었고, 정확하게 어떤 일을 하는 지 어떻게 동작 하는지 와닿지 않았었다.하지만 이번 강의를 들으면서 정말 완벽하진 않더라도 어느정도 이해가 되었고, 미션과 병행하며 코드를 쳐보니 조금 더 이해가 수월 했던 것 같다. 또, 그동안은 내가 A라고 알고 있던 것이 전혀 다르게 동작할때 또는 에러가 날때 등 그냥 넘어가거나 에러만 잡기 급급했는데왜 에러가 났는지, 또 왜 전혀 다르게 동작 했는지 이 메서드는 어떤 역할을 하는지 등등 어떻게 궁금해하고 어떻게 찾아가야하는지생각하는 능력이 성장한 것 같아 너무 기뻤다. 이번에 처음 써본 JPA는 너무 어려웠지만 조금 더 공부해본 뒤 미니프로젝트를 진행해 볼 예정이다.이번 주는 웹 개발의 전반적인 흐름과 생각하는 능력을 성장시킬 수 있어서 뜻깊은 한 주였다. 강의 링크 👉 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

백엔드백엔드0기인프런인프런워밍업스터디

Edun

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

1주차 회고록 작성.<강의>- 따라하며 배우는 자바스크립트 A-Z (Section0~1)<과제>- 음식 메뉴 App 만들기 [버거킹 메뉴 앱]: Javascript의 html 속성을 통해 각 노드의 요소마다 Button별로 Filtering된 Data를 넣어주기.<느낀점>1) 내게는 너무 낯선 Javascript2) 자유분방-예측불가-코드리뷰가 막막한 녀석. . .3) 어떻게든 돌아가도록 프로그램을 만들기 위해 탄생한 JavaScript라니. . .4) 이 녀석을 재밌게 만들어준 동료들(뀨님,꼉님, 쏘님) 사랑합니다 핫투.[JavaScript 기초]Console 객체IDE 설치VS codeWebStormVS code - Live Server 설치웹 프로젝트를 미리 볼 수 있도록 로컬 서버를 호스팅하는 확장 프로그램script.js - console.log크롬 개발도구(F12) Console 창에 출력됨개발시 어떠한 식으로 진행되는지 Console로 출력해서 알아보면 용이함어디서, 어떻게 에러가 났는지 출력을 할때 log사용함console.log('Hello,World'); console.log('1243'); console.log(true); var greeting = 'hello!'; console.log(greeting); console.log({a: "a", b: "b"}); console.table({a: "a", b: "b"}); console.error('Error!'); console.warn('Warning!!'); console.time('Hello'); console.time(1); console.time(2); console.time(3); console.time(4); console.time(5); console.time(6); console.time(7); console.timeEnd('Hello'); 변수 선언 : var, let, const자바스크립트 코드 작성브라우저 - 개발도구에서 바로 사용 가능IDE - VSCode 활용변수 선언 방식 / 참조범위 / 호이스팅호이스팅 : 인터프리터 언어 특성상, 호이스팅이 제공됨 (변수 끌어올려서 사용하는 것)| 변수 | 중복 | 재할당 | 유효한 참조 범위 (Scope) | 호이스팅 (변수 끌어올림) | | --- | --- | --- | --- | --- | | var | O | O | 함수 레벨 | 선언 : undefined 자동 할당 (초기화 전) 할당 : 값 할당 | | let(ES6) | X | O | 블록 레벨 | 선언 : undefined 할당 X (TDZ : Temporal Dead Zone) | | const(ES6) | X | X | 블록 레벨 | 선언 : undefined 할당 X (TDZ : Temporal Dead Zone) |// var type : 선언 및 할당 여러번 가능 (자유도 높음) // : 유지보수 하기 힘듦. var A = 1; console.log(A); var greeting = 'hello'; console.log(greeting); var greeting = 'hi'; console.log(greeting); greeting = 'how are you?'; console.log(greeting); // let type : 중복선언 X, 할당 가능 let ttt = 'hi, halo'; console.log(ttt); //let ttt 'haha'; // error. ttt = 'papapapa'; console.log(ttt); // const type : 중복 && 할당 X // : constant (상수) 약자 const damn = 'yess'; console.log(damn); //const damn = 'ttt'; //error. //damn = 'yesfds'; //console.log(damn); //error. //------------- 02. Scope //------------- 01) var 함수 레벨 스코프 function func() { if(true) { var a = 'a'; console.log(a); } console.log(a); } func(); //------------- 02) let,const 블록 레벨 스코프 function func2() { if(true) { let a = 'a_let'; console.log(a); } } func2(); //------------- 03. 호이스팅 //------------- 01) var 호이스팅 : undefined //------------- 02) let, const 호이스팅 : error. console.log(seelping); var seelping = '자고싶다'; // undefined let seelping = '자고싶다'; //error. //------------- 03) 함수 호이스팅 : 정상출력. func3(); function func3() { console.log('hosting test'); } 자바스크립트 타입원시타입 : Boolean, String, Numeric, Null, undefined, Symbol불변성에 저장됨고정 크기로 Call Stack에 저장됨실제 데이터가 변수에 할당됨참조타입 : Object, Array, Class, Functions실제 데이터는 Heep에 저장됨데이터 크기가 정해지지 않고 주소값이 Call Stack에 저장됨자바스크립트 = 동적 타입느슨한 타입동적 언어변수는 타입과 연결되지 않음모든 타입의 값으로 할당(및 재할당) 가능string → boolean → numeric 가능한 것//------------------------ 원시 타입 // 문자열 String const name = 'Edun'; // Number const age = 38; // Boolean const hasJob = true; // null const car = null; // undefined let anything; // Symbol const sym = Symbol(); //------------------------ 참조 타입 // Array 배열 : 객체의 하나의 형태 const hobbies = ['wailing', 'books']; // Object 객체 const addr = { province : '부산광역시', city : '남구' } console.log(typeof hobbies); console.log(Array.isArray(hobbies)); 자바스크립트 타입변환자바스크립트 함수 사용 변환let val; // Nuber to String val = String(111); val = String(8 + 4); // Boolean to String val = String(false); // Date to String val = String(new Date()); // Array to String val = String([1,2,3,4,5]); // toString() val = (5).toString(); // String to number val = Number('1'); val = Number(true); val = Number(false); val = Number(null); val = Number([1,2,3]); // NaN = Not a Number val = parseInt('111.40'); val = parseFloat('111.40'); console.log(val); console.log(typeof val); console.log(val.length); 자바스크립트 자체에 의해 자동 변환const val1 = 2; const val2 = String(3); const sum = val1 + val2; console.log(sum); // string으로 자동변환. console.log(typeof sum); 자바스크립트 연산 및 Math Objectconst num1 = 20; const num2 = 10; let val; // 산수 연산 val = num1 + num2; val = num1 * num2; val = num1 - num2; val = num1 / num2; val = num1 % num2; // 나머지 연산자 // Math Object //--------------------------------- 속성 val = Math.E; // 속성 val = Math.PI; // 속성 //--------------------------------- 메서드 val = Math.round(2.4); // 가까운 정수로 리턴 val = Math.ceil(2.4); // 무조건 올림 val = Math.floor(2.8); // 무조건 내림 val = Math.abs(-2); // 절댓값 val = Math.min(2,3,4,5,6,7,8,-1); val = Math.max(2,3,4,5,6,7,8,-1); val = Math.random(); // 0~1 사이에서 return. // 1~20 사이 랜덤 숫자 val = Math.floor(Math.random() * 20 + 1); //+1 필수. console.log(val); Template LiteralsTemlate Literals : javascript에서 backtick() 문자를 사용하여 문자열을 표현한 템플릿쉬운 줄바꿈‘\n’ → 실제 Enter 적용문자열 내부에 표현식을 포함할 수 있음‘+{a+b}+’ → 보간법 ${a+b}백틱(backtick) ⇒ ‘ ` '로 사용Loopsfor 코드 블록을 여러 번 반복 for/in 객체의 속성을 따라 반복 while 지정된 조건이 true 인 동안 코드 블록을 반복 do/while while 루프의 변형 조건이 true인지 검사하기 전에, 코드 블록 한 번 실행 후 조건이 true인 동안 루프 반복for vs forEachfor forEach 원래 사용되었던 접근 방식 배열 요소를 반복하는 새로운 접근 방식 breack 사용 가능 breack 사용 불가능 빠름 for보다 느림 비동기 await 작동 비동기 await 작동 애매함// for문 for(let i=0; i < 10; i++){ if(i === 3){ console.log('It is 3'); continue; } if(i === 5){ console.log('5 Stop the loop.'); break; } console.log('Number ' + i); } // for/in 문 const user = { name: 'Edun', province: '부산광역시', city: '남구' } for(let x in user){ console.log(`${x} : ${user[x]}`); } // while 문 let i = 0; while(i < 10){ console.log('Numer ' + i); i++; } // do/while 문 let i = 0; do { console.log('Number ' + i); i++; } while(i < 10); //배열을 Loop로 이용해서 컨트롤 해주기 const locations = ['서울', '부산', '경기도', '대구']; for(let i = 0; i < locations.length; i++){ console.log(locations[i]); } locations.forEach(function (location, index, array){ console.log(`${index} : ${location}`); console.log(array); }); // console.log(locations);   

프론트엔드JavaScripthtmlcssinflearn인프런워밍업스터디

임형준

[인프런 워밍업 스터디 클럽] 0기 - 세번째 발자국

세번째 발자국이 글은 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]를 수강하고 인프런 워밍업 클럽에 참여하여 쓰는 두번째 회고록입니다.3주차 내용Day 11 객체지향과 JPA 연관관계(강의 33~36강)33강전체적으로 api를 개발할 때 어떤 순서로 짜야하는지 정리할 수 있었다. 그리고 처음부터 강의를 듣지 않고 내가 먼저 구현을 해보고 최태현님은 어떻게 구현을 하시는지 비교해봄으로써 좀 더 집중해서 들을 수 있는 강의였다.api 개발 순서요구사항 정확하게 분석API spec 정의머릿속으로 전체적인 이미지 구상테이블 설계 (4,5번 할 때 스펠링 틀리는 거 각별히 신경)엔티티(객체) 구현 & Repository 구현(둘이는 셋트라고 생각)API 스펙에 맞는 dto 만들기controller, service 도 마저 만들기책 생성 API최태현님과 나의 비교is_return 테이블을 설계할 때 tinyint(1)을 쓰셨다미리 낱개의 실험 데이터를 가정하고 그려보았다요구사항을 제대로 파악하고 주석을 쓴다생성자에 뭔가 고정값이 담긴다거나 파라미터가 너무 많아 보이면 리팩토링 함으로써 깔끔하게 해준다'그'의 요구사항 내용책 정보를 가져온다.대출 기록 정보를 확인해서 대출 중인지 확인한다.만약에 확인했는데 대출 중이라면 예외를 발생시킵니다.유저 정보를 가져온다.책과 유저 정보를 바탕으로 유저 대출 정보에 등록해준다.'나'의 요구사항 내용유저를 찾는다.책정보를 찾는다.만약 내가 빌려가려는 책이 이미 다른 사람이 빌렸다면 예외 처리요청한 책을 내 이름으로 등록한다34강JPA를 쓰는 이유 중에 패러다임을 객체지향적으로 하기 위해서 쓰는 것도 있었다. 그러나, 이전까지의 코드를 살펴보면 절차지향에 가까웠다. 객체들끼리 서로 협력을 하는 것이 아니라 각자의 객체가 스스로 처리했다. BookService에서 반납 기능은 User에서 정보를 가져오고 UserLoanHistroy에서 대출 정보를 가져와 반납으로 처리한다.이러한 패러다임을 객체지향적으로 바꾸려면 객체 간의 관계가 필요하다. 그 관계를 JPA에서 연관 관계로 표현할 수 있다.1:1 관계 - @OneToOnePerson이랑 Address 연관 관계 실험두 개의 테이블에 각각의 연관된 id를 만들어서 실험[결과]address가 주체일 때 address테이블에만 person_id가 저장person이 주체일 때 person테이블에만 address_id가 저장두 개의 엔티티에 전부 mappedBy를 입력해줬을 때다음과 같이 AnnotationException이 발생한다.@Transactional이 끝나기 전에 객체를 가져왔을 때 null이 안나오게 하는 해결책 setter로 한 번에 둘로 이어주게끔 하면 된다.N : 1 관계 - @ManyToOne@JoinColumn연관관계 주인(owner Entity)에게 쓰는 거@Column과 쓰임이 비슷, 필드의 이름을 정할 수 있다.N : M 관계 - @ManyToMany사용 Xcascade 옵션폭포수관계들이 쭉 폭포수처럼 이어져 있게 하는 개념orphanRemoval 옵션orpthan: 고아removal: 제거연결되어 있던 관계에서 한 엔티티가 없어지면 연결되있던 엔티티의 데이터도 사라지는 개념Day 12 기본적인 배포를 위한 준비api구현을 마무리하고 배포를 어떻게 하는지 배웠다. 새롭게 알게 된 내용만 간단하게 추려보았다.37강. 배포란 무엇인가배포란 쉽게 말해서 전용 컴퓨터로 코드(우리의 서버)를 옮긴다! 라고 한다. 최종 사용자에게 SW를 전달하는 과정이란걸 알았다.38강. profile과 H2 DB내 컴퓨터 로컬에 설치한 mysql을 쓰게 해줬던 것처럼 전용 컴퓨터로 내 코드를 옮겼을때도 똑같은 환경을 만들어 줘야 한다는 것을 알 수 있었다.그리고 데이터베이스는 데이터가 영구적이기 때문에 테스트로 활용하기엔 불편한 점이 있는데 이를 해결하기 위해 H2데이터베이스를 쓴다는 걸 알 수 있었다.39~40강. git github개발 처음 시작할 때 바로 깃과 깃허브부터 접했어서 생소한 개념이 있지는 않았다. 새로 배웠다거나 깨달은 건 두가지였다.git push --set-upstream origin main 여태까지 이걸 한번만 하면 다음부터는 git push만 쓰면된다는 걸 모르고 있었다..gitignore언제 생성시켜야 하는지 타이밍을 제대로 알 수 있었다.Day 13 AWS와 EC2 배포배포를 통해 localhost에서만 돌아가는 서버를 aws ec2에 배포해 보았다. 이 과정을 혼자 막연하게 부딪히면서 했다면 하루를 온전히 다 투자해야 됐을 것 같다.네트워크에 대해서 조금 찍먹해 볼 수 있는 경험을 가졌다. ssh, DNS, 인바운드 규칙, IP 같은 키워드를 궁금하게 하는 실습이었다.Day14, 15 Spring Boot 설정, 버전업 이해하기, 마무리 및 추가 꿀팁 영상gradle, .yml, 버전업 등을 통해 스프링 프로젝트를 구성하는 요소를 좀 더 이해할 수 있었다. 게다가 마무리에 추가 영상도 있었다. 질문자들에 대한 답을 영상으로 따로 만든 것이었다.최태현님은 항상 느끼는 거지만 질문에 대한 답을 너무 성실하게 해주신다. 볼 때마다 감탄한다.미니 프로젝트프로젝트 레파지토리: https://github.com/hyungjunn/employee-commute결국 머리에 제일 땀이 많이 나는 건 고민하면서 진행하는 프로젝트인 거 같다. 가장 의미있는 시간이었다. 진행하면서 그리고 다른 사람 코드리뷰를 보면서 느낀 점은 다음과 같다.서비스로직에서의 코드 분리 조금만 복잡한 비지니스 로직을 구현하려고 하면 서비스가 점점 뚱뚱해져서 스스로 느낄 때도 메서드가 여러 일을 하고 있어 알아보기가 힘들어 졌었다. 결국 기본으로 돌아가 객체 지향적인 개념이 너무 중요한 거 같다.연관 관계에 대한 것 JPA를 이 강의를 통해 처음 배웠었다. 또 결국 비판적 사고를 하지 않고 JPA는 연관관계를 무조건 써야 좋은지 알고 프로젝트 하면서 최대한 쓸려고 했었다. 피드백을 듣고 연관 관계가 단점이 많다는걸 이제서야 깨달았다. 연관관계 뿐만 아니라 어느걸 쓸 때 최대한 합당한 이유로 써야하는 습관을 길러야 겠다.일급 컬렉션, 그리고 상황에 따른 변수 선언 서비스 로직에서 코드를 분리할 때 어떤식으로 하는지 보여주셨는데 그게 일급 컬렉션이란 걸 말씀해주셨다. 그리고 도메인 로직에서는 어떠한 값을 담을 것이 필요하면 바로 변수를 새로 선언하는 걸 보여주셨다. 코드를 짤 때 유연해야 된다는걸 너무 크게 느꼈다.이 외에도 너무너무 많다. 결국 계속해서 고민하면서 코드를 만들고 고치는거 밖에 방법이 없다는걸 느꼈다.인프런 워밍업 클럽을 참여하지 않았다면 큰일날 뻔 했다. 마침 너무 이론만 배우고 있던 시기라 사이드 프로젝트를 하고 싶었는데 이 스터디를 통해 사이드 프로젝트를 혼자 만들 수 있을 거 같다는 자신감을 조금 높일 수 있어서 좋았다.

백엔드백엔드인프런워밍업스터디

또니

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

[1주차 회고]벌써 스터디를 진행한지 1주차가 되었다. 스터디 방식은 하루에 정해진 양의 강의를 듣고 주어진 과제를 정리하고 공부하는 것이다.강의는 굉장히 쉽게 풀어서 설명해주셨고 이해가 쏙쏙 되었다.하지만 막상 과제를 보고 정리하려고 하니 이해가 된 것은 맞는지..머리 속은 엉망이 되었고 정리를 하다보면 2~3시간은 훌쩍 가 있었다. 그동안 다른 강의들을 들으면 다양한 방면으로 생각해보지 못하고 아 그렇구나~ 그런거구나하며 넘어갔던 적이 많았다.하지만 강의를 듣고 과제를 하면서 "이건 왜 이런거지?", "이럴 땐 이렇게 되나? 이게 있으면 다른게 있지 않을까?" 등 생각의 넓이가 달라졌고,다른 러너분들이 과제를 수행하신 것을 보고 "이런 방법도 있구나", "이런 생각도 하시는구나" 라며 다양한 의견을 볼 수 있었다. 그동안 혼자 공부하면서 남들과는 실력차이가 나 많이 좌절도 했고 어떻게 해야할지 많은 고민이 있었는데,이번 기회로 다른 러너분들의 다양한 풀이 방법을 보고 최대한 습득하고 고민해보고 질문해보아야 겠다는 생각이 들었다. 좋은 강의를 제공해주신 최태현 강사님과 다른 분들과 소통할 수 있는 기회를 만들어주신 인프런 분들께 감사드립니다.좋은 기회를 주신 만큼 열심히 공부하고 많은 것을 얻어가겠습니다..! 다음 한 주도 화이팅💪

백엔드0기인프런인프런워밍업스터디