서론
- 8.5(금) - 주특기 심화 주차 시작
- 아침 9시 ~ 저녁 9시까지 하루 총 12시간(+알파)
일정
- 7.29(금) : 주특기 숙련 주차 팀 배정 및 OT
- 7.29(금) ~ 8.4(목): Node.js 주특기 숙련 팀/개인 과제 진행
- 8.5(금) : 주특기 심화 주차 팀 배정 및 OT
- 8.5(금) ~ 8.6(토): JS언어 Node.js런타임, express 프레임워크, MySQL, Layerd Architecture Pattern, Test Code 팀 프로젝트 진행
주특기 숙련
- 개인 프로젝트 (JS언어로 Node.js와 express.js를 이용하여 회원가입/로그인/로그인 인증/ 글 작성/수정/삭제 기능 및 댓글 작성/수정/삭제 기능 구현)
- 팀 프로젝트 (ORM, ODM이 뭔지, IIFE와 require()의 관계, 라우터와 미들웨어는?)
- Node.js, express.js, DB(mongoDB,MySQL), Sequelize 로 서버를 구현하기 시작함
- JWT token 사용. header, payload, verify signiture / 토큰을 만들거나 인증함.
- mongoDB의 mongoose, Joi와 MySQL의 sequelize를 이용해서 각 DB에 정보를 넣고 로그인/회원가입 구현
- AWS에서 지원하는 RDS로 MySQL 서버 구축(매우 편함)
주특기 심화
- 숙련 주차에 진행했던 개인 프로젝트를 바탕으로 Layerd Architecture Pattern 구성
- Layerd Architecture Pattern : 서비스의 유지 보수를 쉽게 하기 위해 코드를 계층별로 나눈 것.
- 프레젠테이션 계층 > 비즈니스 로직 계층 > 데이터 엑세스 계층
( 프레젠테이션 계층 : API 통신 클라이언트에게 req 받기 및 res 전송
비즈니스 로직 계층 : 서비스의 로직 중점. 여기서 데이터 가공 및 처리
데이터 엑세스 계층 : DB와 접촉하는 계층 ) - Jest를 이용하여 테스트 코딩을 작성한다.
배운점
Javascript의 클래스
프로토타입 기반 비동기 논블럭 자바스크립트는 기존 객체지향 언어들하고 다른 차이점이 존재한다.
객체를 선언하고 정의하는 것, 또한 인스턴스를 생성하는 것은 같지만 JS는 함수를 사용하여 객체를 생성한다. 클래스 자체를 가지고 객체 인스턴스를 생성하는 자바와 달리 javascript는 생성자 함수 또는 객체리터럴을 통해 객체 인스턴스를 생성한다.
여기서 어떻게 함수로 객체 인스턴스를 생성하는 것일까?
- JS에서 함수는 constructor와 noncostructor로 나뉜다 : constructor는 객체를 생성할 수 있는 함수이고 nonconstructor는 객체를 생성하지 못하는 함수이다. Nonconstructor는 객체 안 메서드(객체안에 함수를 말함), 화살표 함수 등이 객체를 생성하지 못한다. 그 외 일반 함수들은 기존 함수로 사용할 수도 있고 객체를 생성하는 생성자 함수로도 가능하다.
- 생성자 함수로 사용하고자 할 때는 파스칼케이스로 사용한다. 카멜 케이스와 유사하나 첫 시작의 단어가 대문자로 시작한다.
- 생성자 함수는 코드를 평가할 때 생성자함수의 prototype을 만든다. 이 생성자 함수의 prototype이 인스턴스를 생성할 수 있게 해주는 객체이다. 즉 함수로 객체가 만들어지는 것이 아니라 생성자 함수의 프로토타입으로 객체를 만든다고 보면 된다.
- 예를 들어 function Person(){} 이 생성자 함수라면 Person.prototype이라는 객체가 자동적으로 만들어진다. 코드를 평가할 때 함수가 선언되었을 시점부터 프로토타입은 같이 생성되기에 쌍으로 다닌다고 생각하면 좋다.
- 또한 이 프로토타입( Person.prototype)은 객체이기 때문에 객체의 프로토타입을 상속받는다. 앞서 말한 것처럼 js는 프로토타입 기반 이기 때문에 객체를 생성하기 위해선 프로토타입이 필요하다. 생성자함수의 프로토타입도 객체이기 때문에 Object.prototype의 객체프로토타입으로 생성된 것이나 다름없다.
- Person.prototype 안에는 constructor라는 숨은 프로퍼티가 존재하는데 이 프로퍼티는 생성자 함수를 참조하고 있다. 또한 객체들은 __proto__라는 숨은 프로퍼티로 자신의 상위 객체를 참조하고 있는데, Person.prototype.__proto__는 Object.prototype을 참조하고 있다.
- 그렇다면 생성자 함수로 생성된 인스턴스는 예를 들어 const me = new Person();으로 만든 me인스턴스는 객체이기 때문에 __proto__를 가지고 있고 이 프로퍼티는 Person.prototype을 가리킨다.
- 이를 프로토타입 체인이라 불르며 상위 객체의 프로퍼티를 가지고와서 쓸 수 있다.
JS에서의 클래스
- 다른 객체지향언어의 클래스와 다르게 JS에서의 클래스는 생성자 함수를 본 떠 만들었다.
- 기존에 JS는 클래스란 개념이 없었다. 그러나 객체지향언어에서 넘어온 수많은 개발자들이 이 프로토타입으로 객체를 만든다는 것을 어려워했고 이를 계기로 태어난 것이 객체지향언어의 클래스를 따라한 JS의 클래스이다.
- JS의 클래스는 생성자함수를 토대로 만들었다. 즉 객체를 생성하기 위한 생성자 함수를 사람들이 편하게 쓰기 위해 객체지향언어의 클래스 형식으로 만들어 놓았다. 클래스도 생성자함수이기 때문에 생성자함수와 쌍을 이루는 생성자함수.prototype을 가지고 있으며 이 prototype의 constructor프로퍼티가 클래스(생성자함수)를 참조하고 있다.
- 클래스는 오직 객체를 생성하기위한 생성자 함수로만 사용되므로 new연산자 없이는 클래스는 사용할 수 없다.
- 클래스를 정의할 때 메서드는 생성자 메서드(constructor), 프로토타입 메서드, 정적 메서드로 나뉘며 생성자 메서드(이름은 constructor라고 하며 바꿀수 없음)는 인스턴스가 생성될 때 외부에서 들어오는 변수를 클래스 블록에서 쓸 수 있게 바꿔주는 역할을 한다. 만약 constructor 생성자 메서드가 없을 경우 클래스는 자동으로 빈 생성자 메서드를 만든다. 다음으로 프로토타입메서드는 인스턴스가 쓸 수 있는 메서드를 만드는 것이다. 클래스 블록에서 함수를 생성시 클래스.prototype 객체에 이 메서드가 정의되므로 프로토타입 체인을 이용하여 인스턴스가 이 메서드를 사용할 수 있게 되는 것이다. 정적 메서드는 클래스 내부에서 사용하는 메서드로 prototye에 들어가지 않고 클래스 즉 생성자 함수에만 생성되는 메서드이다. 이는 인스턴스에서 사용할 수 없고 오로지 생성자함수.메서드와 같은 키워드로 사용해야한다. 또한 클래스 내부의 프로퍼티를 사용할 수 없다. 즉 this를 사용할 수 없으므로 객체 내부의 프로퍼티를 사용하지 않을 때 사용된다.
- 객체지향언어에서 클래스의 강점은 상속이다. 클래스로 상속을 받아 이전 클래스에서 쓰던 변수나 메서드를 사용하는데 이는 코드의 효율성을 극도로 끌어올릴 수 있다. 자바스크립트는 클래스 기반 언어가 아니므로 생성자함수를 생성자함수로 상속하는 것은 할 수 없었다. 물론 흉내는 낼 수 있었으나 클래스가 나오면서 클래스 끼리의 상속을 가능하게 해주었다.
- 자바 언어처럼 클래스에서 extends키워드를 사용하여 부모클래스를 상속받으면 자식 클래스는 부모 클래스의 프로토타입을 상속받는다. 즉 부모클래스.프로토타입을 상속 받는 자식클래스.프로토타입이 또하나 생성된다. 이렇게 자식클래스로 인스턴스를 생성하면 프로토타입 체인에 의해 부모클래스의 프로퍼티까지 사용할 수 있게 되었다.
NoSQL vs SQL
- NoSQL : 비관계형 SQL
- 장점
- 스키마가 없어서 자유롭다. 프로젝트가 변경되어 DB를 빠르게 변경시킬 때 용이하다.(그래서 주력상품을 만들고 있는 스타트업이나, 중소기업에서 많이 쓴다.)
- 코드 상에 전송해준 방식으로 저장되서 읽거나 수정할 때 빠르다.
- 스키마가 없다보니 다양한 형태의 데이터를 저장 가능하다. 수직수평 확장에 용이
- 단점
- 데이터 무결성이 없다보니 데이터 중복이 발생한다.
- 데이터 구조가 없어서 서비스가 커질수록 관리가 어려워진다.
- 데이터가 여러 테이블에 중복되어 있기 때문에 수정할 때 수정에 포함되는 데이터 모두를 바꿔줘야한다.
- 장점
- SQL - 관계형 SQL
- 장점
- 정의된 스키마로 양식에 맞춰서 DB가 저장된다.
- 데이터 무결성을 보장한다.
- 관계설정을 하면 데이터의 중복 없이 저장됨
- 단점
- 스키마가 있다보니 DB 전체의 빠른 수정이 불가능하다.(주력 상품이 자리잡았을 때 많이씀)
- 연결관계가 있어서 복잡한 쿼리가 만들어질 수 있다.
- 컬럼을 추가하지 못하고 데이터만 추가 가능하다.
- 장점
나의 생각과 이야기
- 이번 주차 테스트 코드에 대해 감을 못잡겠다.
- Layerd Architecture Pattern에서 단위테스트는 안맞는 것인지. 뭌함수를 써서 다 쪼갤 수 있는지 조차 잘 모르겠다.
- 처음으로 어제 지각을 했다. 1년에 한번 있을까 말까한 일인데 피로가 축적된 듯 싶다.
- 팀운이 좋다. 잘하시는분들과 함께하다보니 매우 편하고 집단지성을 이용해 문제를 많이 해결한 듯 하다.
- 이렇게 팀운이 좋으면 마지막에 삑사리 나는데 조심해야돼...
'항해99 > WIL' 카테고리의 다른 글
[항해 99] WIL 6주차 - 첫 협업(잘 못했던 점...) (0) | 2022.08.21 |
---|---|
[항해 99] WIL 5주차 (0) | 2022.08.14 |
[항해 99] WIL 3주차 - 주특기 입문, 주특기 숙련 (후기) (0) | 2022.07.31 |
[항해 99] WIL 2주차 - 알고리즘, 주특기 입문 (후기) (0) | 2022.07.24 |
[항해 99] WIL 1주차 - 미니 프로젝트, 알고리즘 (후기) (0) | 2022.07.17 |
댓글