도커 데이터 또는 프로그램을 격리시키는 기능을 제공하는 소프트웨어 다양한 프로그램과 데이터를 각각 독립된 환경에서 격리시키는 기능을 제공함 도커는 리눅스 환경에서 동작하며, 컨테이너에서 동작하는 프로그램들도 리눅스용 프로그램임 컨테이너 서버, PC환경을 분할시켜 독립된 환경을 구성한 것 도커 컨테이너를 다루는 기능을 제공하는 소프트웨어 도커 엔진 도커를 사용하기 위한 본체 컨테이너를 만들거나 구동하는 역할 이미지 컨테이너를 만들기 위한 빵틀(class) MySQL이미지로는 MySQL컨테이너를 만들 수 있음 격리가 필요한 이유 각 프로그램은 실행환경이 필요함 1. 소프트웨어 하나하나가 단일 프로그램이 아니라 여러개의 프로그램으로 구성된 경우가 많은데, 하나를 업데이트 했다가 다른 서비스가 안돌아가는 경우가..
Backend
다들 AWS쓰다가 예상치 못하게 돈을 상납한 경험이 있을 것이다. 일 이천원이면 괜찮은데 이러면 정말 마음이 아프다. 그래서 준비했다. AWS Budgets 설정하기 AWS Budgets 홈으로 가보자 예산 생성을 눌러보자 프리티어 요금제 놀랍게도 제로 지출 예산을 지원한다! 이메일 수신자에 연락받을 메일을 입력하면, 지출이 생기는 경우 바로 메일이 오게된다. 10명까지 되니 관리하기가 좋다. 생성이 완료된 모습 알림 메일 비용이 발생하면 이렇게 알림이 오게 된다. 그래도 이제 우리는 언제, 어디서 내 돈이 삭제되는지는 알게되었다!
장고 프레임워크의 경우에는 raise Exception만 하면 알아서 오류코드를 넘겨줬었다. 근데 express는 그런 공통 에러처리가 없어서 controller단에서 전부 오류를 처리해줘야하는 문제가 있었다. 이런식으로 모든 오류에 대해 catch한다음 status와 메시지를 전부 따로따로 처리해줘야 한다. 이런 경우, 두 가지 문제가 생긴다. 1. 예상치 못한 경우, 에러처리를 해줄 수 없다. => 이런 경우, 처리됐다고 response는 전송되지만 제대로 적용되지 않는 문제가 발생할 수 있음 2. res.status(상태코드).json(어쩌구...)하기 너무 귀찮음... 공통 에러 처리하기 https://expressjs.com/ko/guide/error-handling.html Express 오류..
nodejs서버를 code Deploy를 활용하여 배포하려고 했으나 이 오류를 마주했다. 2023-05-21 01:58:44 INFO [codedeploy-agent(731)]: [Aws::CodeDeployCommand::Client 400 0.034523 0 retries] poll_host_command(host_identifier:"arn:aws:ec2:ap-northeast-2:634327468890:instance/i-123812e") Aws::CodeDeployCommand::Errors::AccessDeniedException 이 오류를 맞이했을때 체크해봐야 할 건 두가지다. IAM 권한 확인하기 EC2 IAM : S3, CodeDeploy에 대한 권한들 AmazonEC2RoleforAWS..
Friending서비스를 구현하기위해 해시태그 검색, 해시태그를 통한 유저 검색을 구현하게 되었다. DB는 MySQL이고, 서버는 nodejs, express환경이다. 삽질 이를 위해서 처음에는 User와 HashTag테이블에 각각 HashTags, Users라는 컬럼을 만들고 배열형태로 저장하려고 했다. 초기 로직 설계 추가만 생각하고 섣부르게 구현하지말자...라는걸 배웠다. 이렇게 하면 이 태그들을 어떤 순서로 보장할 것인지, 어떻게 삭제할 것인지가 어려워지고, 탐색을 위한 시간이 많이 필요해지게 된다. 해결 추가 테이블 생성 user테이블은 그대로 두고 hashTag와 hashTagRelation이라는 테이블을 새로 만든다. 해시태그가 추가될 때 hashTag테이블에서 찾아보고, 없으면 새로 생성하..
ORM이 뭐임 ORM은 Object Relational Mapping의 약자로 객체와 DB의 관계를 매핑해주는 도구다. 객체지향적 코드를 활용해 더 직관적이고 비즈니스 로직에 더 집중할 수 있게 해준다. SQL대신에 좀더 직관적인 코드와 메서드로 데이터를 조작할 수 있게 되는 것. 설치, 프로젝트 적용 npm i typeorm 기존 프로젝트에 적용하기 npx typeorminit --database mysql 나는 mysql을 쓸꺼니까 이렇게 해줄 것이다. 보통 구글링하다보면 createConnection함수나 ormconfig.json을 통해 설정하는데, 이건 0.2.45버전에 해당하는 세팅이고, 0.3부터는 createConnection, ormconfig.json이 없어졌으며 data-source...
jsonwebtoken이라는 라이브러리를 통해 node에서 jwt를 구현할 수 있다. npm i jsonwebtoken jwtMaker const jwt = require('jsonwebtoken'); const jwtMaker = (id) => { const payload = { id: id }; const secret = process.env.SECRET; const options = { expiresIn: '15m', }; const token = jwt.sign(payload, secret, options); return token; }; module.exports = jwtMaker; expiresIn을 통해 토큰의 만료시간을 설정해주었고, payload로 user_id를 기입해주었다. user..
왜 이런짓을 하는거지? 유저가 로그인을 하면, 인증이 된다. 근데 그 뒤에는? 클라이언트가 페이지를 이동하면? 어떻게 그 인증정보를 유지할 수 있을까? HTTP요청은 Stateless이다. 즉, 이전 통신 내용을 기억하지 못한다. 그래서 100번 통신을 하면 100번 모두 0422임을 증명해줘야 한다. 그럼 100번 통신하면 100번 다 로그인할꺼냐? 그건 좀 아닌 것 같다. 이를 위한 방법으로는 세가지가 있는데 쿠키만사용, 세션/쿠키, JWT가 있다. 쿠키 사용자가 로그인을 하면 서버에서는 사용자 정보를 담은 쿠키를 생성해서 응답값으로 던져준다. 클라이언트는 이를 받아서 브라우저 쿠키형태로 저장을 해두고, 요청시마다 header에 담아서 서버로 날려준다. 근데인증을 위해서는 계정정보를 쿠키에 담고 있어..
보안 회원가입시에 pw를 받는데 이걸 DB에 그냥 저장해서는 안된다. 그래서 이를 해시하여 저장을 한다. 이러면 DB가 해킹을 당한다고 해도 원문 비밀번호를 모르므로 인증, 인가에 문제가 생길 확률이 낮아지게 된다. 하지만 해시 함수의 특성상 1이라는 값을 넣으면 항상 고정된 값이 나오므로 이걸 저장한 레인보우 테이블이라는게 존재한다. 예를들어 비밀번호가 'password'라면, 이걸 그냥 해시하게되면 항상 sdkflknut23h17이라는 값이나오게 된다. 항상 sdkflknut23h17이기 때문에 결국 sdkflknut23h17을 보면 password라고 유추해낼 수 있게 되는 것이다. salt 이런 문제를 해결하기 위해 회원가입시에 랜덤한 문자열 값인 salt를 입력으로 들어온 pw에 덧붙여서 해시하..
express 구성 routes라는 폴더를 만들고 라우터를 연결해주었다. const express = require('express'); const cors = require('cors'); const morgan = require('morgan'); const dotenv = require('dotenv'); const app = express(); dotenv.config(); app.set('port', 8080); app.use( cors({ origin: '*', }) ); app.use(morgan('dev')); app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.listen(app.get('port'),..