오프라인 코드캠프 8일차 TIL

전은평·2023년 3월 23일
0

TIL

목록 보기
8/16

👨🏻‍💻 오늘의 알고리즘 공부

sort()

: 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환하는 매서드! 기본 정렬 순서는 문자열의 유니코드 코드 포인트를 따름
: 정렬하게 되면 복사본이 만들어지는 것이 아니라 기존의 원배열이 정렬된다는 점 유의!!
: 매개변수로는 compareFunction이 들어가는데 정렬 순서를 정의하는 역할을 한다. 생략하게 되면 앞서 언급한 바와 같이 각
요소의 문자열 변환에 따라 각 문자의 유니 코드 코드 포인트 값에 따라 정렬됨

< 유니 코드 코드 포인트 값의 간단한 예시 >

별다른 매개변수(compareFunction)가 들어오지 않는다면 배열 내 모든 요소를 문자열로 변환한 후 유키 코드 코드 포인트 값의 순서로 정렬이 됨

  • 한글 : ㄱ,ㄴ,ㄷ~ 기존의 순서 정렬
  • 숫자 : 문자열로 반환되기 때문에 주의해야 함! 100 이 9 앞으로 정렬됨.
  • 영문 : a,b,c~ 기존의 순서 정렬

숫자를 정렬하고 싶다! 면 매개변수에 compare 함수를 사용해주어야 함~~

const arr = [1000,80,9]

arr.sort()  // [1000,80,9]
			// 문자열로 반환 후 정렬하는 것이기 때문에 위와 같이 출력됨
            // 이해가 어려우신 분들은 사전식이라 생각하면 됨
     
arr.sort(function compareFunction(a,b){return a-b})
이렇게 하면 숫자로 인식해서 정렬가능

arr.sort((a,b)=>{a-b})
화살표 함수를 통해 위와 같이 간단하게 표현 가능!

compareFunction이 제공되면 배열 요소는 compare 함수의 반환 값에 따라 정렬됨!

a와 b가 비교되는 두 요소(a-b) 라면, 오름차순 정렬

  • compareFunction(a, b)이 0보다 작은 경우 a를 b보다 낮은 색인으로 정렬. 즉, a가 먼저 옴
    return 값 -1

  • compareFunction(a, b)이 0을 반환하면 a와 b를 서로에 대해 변경하지 않고 모든 다른 요소에 대해 정렬.
    return 값 0

  • compareFunction(a, b)이 0보다 큰 경우, b를 a보다 낮은 인덱스로 정렬.
    return 값 1

  • compareFunction(a, b)은 요소 a와 b의 특정 쌍이 두 개의 인수로 주어질 때 항상 동일한 값을 반환. 일치하지 않는 결과가 반환되면 정렬 순서는 정의되지 않는다.

split()

문자열을 특정 문자를 기준으로 잘라 배열 형태로 생성해주는 함수

let a = "try hello world"
a.split(" ") // ["try","hello","world"]
a.split("")  //	["t","r","y"," ","h","e","l","l","o"," ","w","o","r","l","d"]

👨🏻‍💻 오늘의 강의 내용

프론트엔드 & 백엔드 전반적인 구조

브라우저(클라이언트)에서 프론트서버(html,css,js)나 백엔드 서버(json)로 요청

프론트서버는 사실상 여러개가 될 수 있다.

브라우저에는 관리자 페이지가 있다 ex) 직원전용브라우저/ 배민 사장님 전용 브라우저.[ 일반적인 페이지(=유저 페이지)]

프론트엔드는 여러개 나눠져있어도 데이터베이스는 하나로 관리/공유한다! 보통 백엔드도 하난데 여러개 가능


데이터 베이스 SQL & NOSQL

: 데이터베이스 = SQL 데이터 베이스 + NO SQL데이터 베이스가 대표적
: 사실 SQL과 NoSQL은 데이터베이스 자체를 나타내는 것이 아니고 특정 유형의 데이터베이스와 상호 작용하기 위해 사용되는 프로그래밍 언어를 의미
: 백엔드에서 명령어를 입력해서 데이터베이스에 저장

  • SQL
    : 진짜 엑셀처럼 sheet처럼 생긴 테이블에 보관
    : RDB 관계형데이터 베이스라고도 함 => 테이블 간의 연관관계가 생김 ex) ID로 연결해서 확인하는 것
    : 행 = row, 열=column, 표(sheet) = table(테이블)
    : oracle , mysql, postgres… 등 있음

  • NoSQL

    : 1장에 1명분의 데이터를 저장
    : user봉투에 A4용지를 보관하는 느낌
    : 데이터 덩어리 = A4
    : 서류 봉투 = collection, A4=document, A4내 각각의 항목 = field(필드)
    : mongodb, firebase, redis 등 있음

백엔드서버에서 데이터베이스로 명령어 예시!

  • SQL:
    Select 아이디, 이메일 , 이름 from User 테이블 where 아이디 = U01 : user테이블에서 아이디가 U01인 사람 , 이메일 , 이름 조회해줘
  • NoSQL:
    db.user.find({id:’U01’})

복잡해 보이는 명령어 대신 백엔드서버에서 데이터베이스로 접근/명령항 수 있는 라이브러리가 있다 (ORM / ODM)

예를 들면
User.find({id:U01})
위 처럼만 입력해도 다음과 같이 입력 됨
=> SQL : Select 아이디, 이메일 , 이름 from User 테이블 where 아이디 = U01
=> NoSQL : 마찬가지 db.user.find({id:’U01’})


Mongodb

: 문서지향(Document-Oriented) 저장소를 제공하는 NoSQL 데이터베이스 시스템
: 스키마 제약 없이 자유롭고, BSON(Binary JSON) 형태로 각 문서가 저장되며 배열(Array)이나 날짜(Date) 등 기존 RDMS에서 지원하지 않던 형태로도 저장할 수 있기 때문에 관계를 연결하는 JOIN이 필요 없이 한 문서에 좀 더 이해하기 쉬운 형태 그대로 정보를 저장할 수 있다는 것이 특징

명령어

brew services start mongodb-community : 몽고db 켜기
✍🏻 mongodb 켠 후 mongo 입력
mongo : mongodb CLI 접속(= 터미널 접속)
brew services stop mongodb-community : 몽고db 끄기
show databases; : 데이터베이스에 뭐가 들어가 있는지 조회 (admin, config, local)
Use local; : local (해당) 데이터베이스 사용하겠다 명령 = > 앞으로 입력하는 데이터는 로컬데이터베이스에 저장됨
Show collections; : (로컬/해당 데이터베이스)안에 어떤 서류봉투들이 있니?
db.startup_log.find(); : 봉투(=collection) 내용 조회 startuplog 는 봉투명
컨트롤C or exit
: CLI 터미널 접속 끊기 /. shell 종료
brew services list : 켜져 있는지 꺼져 있는지 리스트 확인

Mongodb compass

: mongodb에서 collection 즉 봉투 안의 테이터들은 객체로 구성 되어 있다.

터미널을 통해 접속한 mongodb에서는 보기가 어려울 수도 있는데, 이를 보기 좋게 만들어 줄 수 있는 라이브러리로 mongodb compass 가 있다.

: mongodb를 효율적으로 관리할 수 있도록 도와주는 프로그램일 뿐
: compass에서 connect의 의미는 해당 주소의 몽고 db에 접속한다는 의미 => A4 용지 조회 및
새로운 컬렉션 만들기 가능
: 몽고 db compass에서 데이터 등록도 가능

!! 주의 로컬이 켜져 있으면 docker 가상환경보다 로컬을 우선 인식 => compass에 docker는 안보임!!
로컬 실행중인 것 종료하기 brew services stop mongodb-community


Docker-compose

Docker-compose란 복수 개의 컨테이너를 실행키시는 도커 애플리케이션이 정의를 하기 위한 툴

또 다른 의미로는 docker로 만들어진 각자의 다른 컴퓨터들의 포트포워딩을 위해 그룹핑하는 것

: 도커를 통해 내 컴퓨터를 여러개 만들어 놓을 수 있기 때문에 각각의 컴퓨터 안에 중복적으로 데이터베이스 연결가능
: 이를 수행하기 위해선 각각의 docker 이미지를 생성시키고 실행시키면 됨!
: 하지만 여러개의 컴퓨터를 실행시키려고 하는데 매번 각각의 파일을 만들어서 각각 실행시키는 건 비효율적
: Docker-compose를 하면 위의 문제 해결할 수 있다!
: Docker-compose는 쉽게 이야기해서 docker 모음/묶음 이다

  • Docker-compose 실습
    : 기존의 express로 서버를 띄우는 docker파일과 데이터베이스 mongodb docker 파일을 동시에 실행
    : 실행하기 위해선 .yaml or .yml 파일 생성(여기에는 여러 개의 docker 내부 속성을 설정)
    : .yaml 파일은 띄어쓰기가 중요한 파일이기 때문에 조심! why? 띄어쓰기로 부모자식관계 구분
    : .json key 값이 중요한 파일

    : build는 아래의 세부사항을 가진 하나의 이미지를 생성하겠다는 의미!
    : context는 해당 docker파일이 어디에 존재하냐는 의미! '.' 은 현위치에 같이 있다는 의미
    : mongodb도 포트포워딩 필요하기(compass를 통해 데이터베이스 접속) 때문에 꼭 저런 형식으로 적어야 함! 안그러면 실행 안됨
    : mongodb 기본 port값:27017

위 사진에선 mogonddb dockerfile이 다운받아오는 역할 밖에 안하니 굳이 파일 만들 필요 없이 yaml에 image: mongo:5 하면 됨

명령어

docker-compose build: 한 번에 여러 개의 docker파일 빌드시키기
(Sudo) docker-compose up : docker 실행하는 것
docker exec -it 컨데이너 id /bin/bash : 몽고디비 안으로 들어가는 것도 기존 도커와 동일! docker를 통해 들어간 mongodb는 docker안의 새로운 db이다. 그렇기 때문에 내 로컬엔 mongodb가 실제로 없더라도 docker 내에서 실행가능하다.
docker-compose stop : docker 종료


ORM & ODM

백엔드 서버에서 데이터베이스에 쉽게 접근할 수 있게 도와주는 라이브러리

  • ORM(object relation mapping) : 객체를 가지고서 관계형 데이터베이스에서 쉽게 명령할 수 있는 라이브러리
    ex) sequalize typeorm prisma….

    -  가장 유명한 js ORM : sexualize 
    - typescript기반에서는 typeorm가 가장유명한 ORM
  • ODM(objcet document mapping?) : 문서형 데이터에 쉽게 접근해서 수정, 변경하게 해주는 라이브러리
    ex) mongoose…
    => 둘 다 백엔드에서 설치


ODM Mongoose

Mongoose란 Node.js와 MongoDB를 위한 ODM(Object Data Mapping) library.

호환성이 없는 JavaScript와 MongoDB의 데이터를 Mapping하여 간편한 CRUD를 가능하게 해 줌
다시 말해 , mongoose를 이용해서 백엔드에서 명령을 데이터베이스로 보내줌 & 데이터베이스 접속 가능
=> express를 이용한 서버에서 mongodb 데이터베이스로 접속 가능

사용법

  1. mongoose 설치
yarn add mongoose
  1. db를 이용할 파일에 import해주기
import mongoose from 'mongoose'
  1. import해온 mongoose 연결해주기
// 하나의 데이터베이스만 사용하는 경우
mongoose.connect('mongodb://localhost:27017/데이터베이스입력가능’) -> 

데이터베이스 파일 없더라도 생성하면서 접속 됨

// 추가 연결을 생성해야 하는 경우
mongoose.createConnection(~)

주의 및 중요사항!!

위와 같이 mongoose.connect를 하게 되면 접속에 실패한다.

내 로컬 컴퓨터 내에 docker 컴퓨터 2개를 실행한다고 예를 들어보자!

도커 컴퓨터 하나는 express로 실행한 서버, 다른 하나는 Mongodb 데이터베이스 서버를 생성 및 실행했을 때 포트포워딩으로 express 서버는 4000번 (포스트맨으로 접속), mongodb 서버는 27017번 (mongodb compass에서 접속)걸어둔 상황.

express 도커 컴퓨터 기준으로 로컬호스트는 본인 도커컴퓨터임! 하지만 해당 도커컴퓨터엔 27017번 없음

1) 도커컴퓨터 외부로 나와서 다른 몽고 도커컴퓨터로 들어가던지
2) 도커컴포즈(그룹핑)를 통해 접속 가능 (입력하고자하는 컴퓨터 이름을 로컬호스트 대신에 입력하면 됨 - http://my-database:27017)

오늘 강의에서 배운 해결방법은 2)번으로 "name resolution" 방법이다. 이는 docker compose가 해주는 기능
=> 포트포워딩 할 필요 없음 => 하지만 포트포워딩 안하면 mongodb compass에서 접속은 안됨

  • 추가 사항
    만약 Docker compose yaml 수정하더라도 도커 컴포즈 빌드 다시 안해도 됨!!

오늘 겪은 오류
1. 위 처럼 포트넘버에서 - 다음에 공백을 입력하지 않으면 실행되지 않는다..

profile
`아는 만큼 보인다` 라는 명언을 좋아합니다. 많이 배워서 많은 걸 볼 수 있는 개발자가 되고 싶습니다.

0개의 댓글