장고 프레임워크의 경우에는 raise Exception만 하면 알아서 오류코드를 넘겨줬었다. 근데 express는 그런 공통 에러처리가 없어서 controller단에서 전부 오류를 처리해줘야하는 문제가 있었다. 이런식으로 모든 오류에 대해 catch한다음 status와 메시지를 전부 따로따로 처리해줘야 한다. 이런 경우, 두 가지 문제가 생긴다. 1. 예상치 못한 경우, 에러처리를 해줄 수 없다. => 이런 경우, 처리됐다고 response는 전송되지만 제대로 적용되지 않는 문제가 발생할 수 있음 2. res.status(상태코드).json(어쩌구...)하기 너무 귀찮음... 공통 에러 처리하기 https://expressjs.com/ko/guide/error-handling.html Express 오류..
Backend/문제해결기
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테이블에서 찾아보고, 없으면 새로 생성하..
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'),..
SOLID Single Responsibility Principle(SRP) 가장 핵심이며, 가장 지키기 어렵다. ⇒ 클래스는 단 한가지의 변화만 가진다. 즉, 단 하나의 책임만 가진다. 행동(책임) 하나에 연관된 속성들을 엮어 클래스로 만든다. 별개의 행동은 별개의 클래스로 분리한다. 책임을 제대로 만든다는 것은 행동 단위의 명세를 만드는 것과 비슷하다 ⇒ interface를 잘 설계하는 것 여기서 중요한 것은 하나의 책임 뿐만 아니라, 분리된 두 클래스간의 관계 복잡도 역시 줄이도록 설계하는 것이다. Open-Closed Principle(OCP) 소프트웨어는 변경에는 닫혀있되, 확장에는 열려있어야 한다. 추상화를 얼마나 잘하냐에 따라서 갈리게된다. → 추상클래스를 통해 구현 OCP를 위한 조언 모든..