목록공부 (179)
저장을 습관화
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b779HP/btsr4KP8xQx/1Qi0jptDYvsvWbbm7kvZH1/img.png)
브라우저(Browser)란 사용자가 웹 브라우저를 통해 웹 서버에 웹 페이지를 요청하면 웹 서버는 웹 페이지 정보를 응답한다. 웹 브라우저는 웹 서버로부터 웹 페이지 정보(HTML, CSS, JavaScript)를 받아 해석하고, 사용자에게 보여준다. 브라우저의 기본 구조 브라우저의 주요 구성 요소는 다음과 같다. 1. 사용자 인터페이스: 사용자가 접근할 수 있는 영역이다. URI를 입력할 수 있는 주소 표시줄 - 이전/다음 버튼, 북마크 메뉴 등, 요청한 페이지를 보여주는 창을 제외한 나머지 모든 부분이다. 2. 브라우저 엔진: 사용자 인터페이스와 렌더링 엔진 사이의 동작을 제어한다. 3. 렌더링 엔진: 웹 서버에 요청한 컨텐츠를 표시한다. 예를 들어 HTML을 요청하면 HTML과 CSS를 파싱하여 화..
'Cross-origin resource sharing'의 줄임말로, 번역하면 교차 출처 리소스 공유라고 할 수 있다. 여기서 '교차 출처'라는 단어는 '서로 다른 출처'라는 의미를 가지고 있다. 즉, CORS는 출처가 다른 자원들을 공유한다는 개념이다. MDN에서는 '교차 출처 리소스 공유(CORS)는 추가 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선책한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제입니다. 웹 애플리케이션은 리소스가 자신의 출처(도메인, 프로토콜, 포트)와 다를 때 교차 출처 HTTP 요청을 실행합니다.' 라고 설명하고 있다. 출처란 https://exampleurl.com:443 이라는 URL이 있을때 프로토콜(https:/..
HTTP 메소드는 웹 서버와 클라이언트(사용자) 간에 데이터를 요청하거나(Request) 응답(Response)하는데 사용되는 명령어이다. 즉, 서버가 주어진 리소스에 반응하여 수행하길 원하는 행동, 서버가 수행해야 할 동작을 지정하는 요청을 방법이다. 가장 일반적으로 사용되는 HTTP 메소드는 5가지가 있다. 1. GET: 서버로부터 데이터를 읽어올 때 사용되는 메소드이다. 주로 정보를 조회하는 용도로 사용되며, 요청 본문(Body)에 데이터를 첨부하지도 않고, 데이터를 변경하지도 않는다. URL에 요청할 데이터의 식별자를 포함될 수 있다. (ex. dataId = req.params 이런 식으로 받아와 사용한다.) SQL문의 SELECT 쿼리에 해당된다. 2. POST: 서버로 데이터를 전송하도록 요..
기본키, 외래키라고도 부르며 이러한 키들은 테이블에서 행을 고유하게 식별하거나 관계를 정의하는데 사용된다. 기본키 테이블 내에서 각 행을 고유하게 식별하는데 사용된다. 기본키는 중복이 없어야 하며, NULL 값을 가질 수 없다. 기본키를 사용하여 특정 정보(행)을 빠르게 검색하고 구분할 수 있다. 외래키 한 테이블의 속성(컬럼)이 다른 테이블의 기본키를 참조하는 경우를 말한다. 외래키를 사용하여 테이블과 테이블 간의 관계를 설정하고 연결할 수 있다. 외래키는 해당 테이블에 있는 값이 참조하는 다른 테이블의 기본키와 일치해야 한다. 예시) '학생' 테이블 학번 이름 학과 2301001 김AA 컴퓨터 공학 2301002 이BB 전기 공학 '강의' 테이블 강의번호 강의명 담임 교수 le0101 컴퓨터 프로그래..
정규화(正規化, normalization)란 어떤 대상을 일정한 규칙이나 기준에 따르는 '정규적인' 상태로 바꾸거나, 비정상적인 대상을 정상적으로 되돌리는 과정을 뜻한다. RDBMS(관계형 데이터베이스 관리 시스템)에서의 정규화는 중복을 최소화하고 데이터의 일관성과 무결성을 유지하는 것이 목적이며, 주로 업데이트와 삭제의 이상 현상을 방지하고 효율적인 데이터 저장과 조회를 가능하게 한다. 정규화는 여섯 단계로 나뉜다. 제1정규화 - 각 속성(컬럼)이 원자값(atomic value, 하나의 값)을 갖도록 테이블을 분리한다. 예를 들어 '주문' 테이블에 데이터가 (orderId: 1 / Product: Laptop, Smartphone, Keyboard / Quantity: 2, 1, 3 / price: 8..
먼저 디자인 패턴이란 자주 발생하는 문제를 해결하는 일련의 솔루션들을 정형화하고 문서화한 것이다. MVC 패턴은 이 디자인 패턴 중 하나이며 Model-View-Controller의 약자이다. MVC 패턴은 모델, 뷰, 컨트롤러로 나뉜다. 모델은 데이터와 비즈니스 로직을 담당한다. 데이터의 상태와 조작 방법을 정의하며, 데이터의 변경이 발생하면 이를 통지하여 뷰와 컨트롤러에게 업데이트 사항을 알린다. 모델은 DB와의 상호 작용을 담당하며, 응용프로그램의 핵심 로직이 위치하는 곳이다. 뷰는 데이터의 시작적인 표현과 사용자와의 상호작용을 담당한다. 웹의 디자인과 레이아웃을 구성하며, 모델의 데이터를 가시적으로 표현하여 사용자에게 제공한다. HTML, CSS, JavaScript를 사용하여 웹 페이지를 구성하..
RDBMS는 관계형 데이터베이스 관리 시스템이라는 뜻을 가지고 있다. 엑셀의 형식과 유사한 2차원 테이블 형식으로 구성되며 속성(attribute)과 값(value)을 이용하여 데이터를 정의하고 저장, 관리한다. 데이터 구조가 명확하고 데이터의 분류, 정렬, 탐색 속도가 비교적 빨라 데이터의 UPDATE도 빠르다는 장점이 있다. 다만 이게 역으로 족쇄가 되어 데이터가 유연하지 못하다는 단점도 존재한다. 스키마가 변경 될 경우 번거롭고 어렵고, 테이블 간 관계를 맺고 있어 시스템이 커질 경우 쿼리문이 복잡해질 수 있다. RDBMS의 종류로는 MySQL, PostgreSQL, MariaDB 등이 있다. nosql은 Not only SQL이라는 의미를 가지고 있다. SQL만을 사용하지 않는 DBMS(데이터베이..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cwoogX/btsqMiGPrk1/aXngdhKGufoHzITCg4RQfK/img.png)
- 증상 로그인 API를 만들고, 정상적인 email과 password를 입력하니 코드의 실행은 정상적으로 진행되어 200코드가 나왔으나, 토큰값이 undefined로 생성됨 - 원인 userController.js const UserService = require('../services/user_service'); class UsersController { userService = new UserService(); // (생략) // 로그인 API logIn = async (req, res) => { const {email, password} = req.body; try { const {token} = await this.userService.login(email, password); // servic..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/6G3Tw/btsqD49O6u5/yiNig5iw9QOQET2modTQA0/img.png)
그 동안 헛짓을 했었다. 정리하자면 1. .env node.js위에서 sequelize를 쓸때, $ npx sequelize init을 입력하면 /config/config.json, /models/index.js, /migrations 파일들이 생성된다. 그리고 config.json에 DB의 HOST(나의 경우엔 AWS RDS 주소), DB사용자 정보와 패스워드 등 민감한 정보가 들아가기에 이를 숨기기 위해 .env를 사용한다. 2. 지금까지 어떻게 썼었나 2-1. /config/config.json 파일에 아래와 같이 정보를 넣고 { "development": { "username": (생략), "password": (생략), "database": (생략), "host": "express-databas..
- 증상 node.js와 sequelize로 회원가입 API를 만들고 있던 중 전달인자 email, password, confirm을 받아 password와 confirm이 일치하는지 검사하는 부분이 있었음 // ... createUser = async (email, password, confirm) => { // ... if (!confirm || password !== confirm) { throw new Error({ errorMessage: '패스워드가 일치하지 않습니다. 패스워드 재입력은 confirm 입니다.', }); } // ... } 에러를 발생시키기 위해 email과 password만 보냈더니 { "email":"test@gmail.com", "password":"1234" } "err..