오늘 뭐했냐/함께했던 작업들 23

23.08.10 Error Handling

코드를 작성하다 보면 발생할 가능성인 높은 혹은 예상하지 못한 에러에 대해서 처리를 하는데 처음엔 모든 경우에 수에 if문을 달아서 처리를 했었다. 하지만 이렇게 하면 에러처리 하는 코드가 매우 길어지고 보기도 불편했다. // signup.controllers.js const { signupSchema } = require('../middlewares/validationMiddleware'); ... const { error } = signupSchema.validate(req.body); // ../middlewares/validationMiddleware const Joi = require('joi'); const signupSchema = Joi.object().keys({ loginId: Joi...

23.08.08 passport-kakao

한 번 로컬로 만들었으니 카카오는 큰 문제없을 줄 알았으나 전혀 아니었다. Error: Login sessions require session support 패스포트가 세션을 기본적으로 사용하는 것을 기본값으로 해서 세션을 설치했다. TokenError: authorization code not found 카카오 로그인 요청 시 인가 코드를 받는데 이게 틀리면 에러가 생긴다. Error: secret option required for sessions 첫 번째 에러와 마찬가지로 세션에 대한 보안 설정이 필요했다. KOE006 Redirect URI이 등록되지 않은 경우 카카오 개발자 사이트에서 Redirect URI을 잘못 등록해서 이런 문제가 생겼다. KOE320 동일한 인가 코드 다시 사용됨 → 포스..

23.08.07 passport-local

카카오 로그인은 프론트에서 같이 작업이 필요하다고 생각을 해서 하기 전에 패스포트를 처음 사용해봐서 먼저 어떻게 작동되는지를 이해할 수 있게 로컬 로그인부터 패스포트로 다시 만들었다. 이거는 참고할 자료가 많았고 중간에 콘솔로 다 확인을 할 수 있기에 비교적 쉽게 접근할 수 있었다. usernameField: 'loginId', // req.body.loginId passwordField: 'password' // req.body.password 처음에 정보를 body의 정보를 어떻게 가져오지 했는데 위에 코드가 그 역할을 해준다. // localStrategy.js ... async (loginId, password, done) => { ... // done에서 결과를 처리한다. // done(erro..

23.08.06 쿠키 전달의 문제

로그인을 통해 생성된 쿠키 안에 있는 토큰이 다른 API요청에선 사용하지 못하는 문제가 발생했다. 이를 해결하기 위해서 처음엔 https와 http의 문제라고 생각하고 시도 해봤지만 이건 아니었고, 다음으로 JSON으로 토큰을 전달해 주고 받는 방법을 생각했는데 이는 보안상 좋지 않았기에 이것도 해결할 수는 없었다. 그렇게 고민하던 중 팀원 분 중에 한 분이 해결책을 주셨다. 그래서 이를 통해서 코드를 수정하고 한편으로는 각 옵션들이 무슨 기능을 하는지 알아봤다. res.cookie("MM", `Bearer ${accessToken}`, { secure: true, // https만 허용 httpOnly: true, // true로 설정되면, 쿠키는 JavaScript를 통해 접근할 수 없습니다. sam..

23.08.05 끝 없는 기획

예비 혹은 신입 디자이너님까지 함께하면서 시간이 프로젝트를 시작하고 시간도 기존 미니 프로젝트보다 시간이 조금 더 넉넉하게 주어진 다른 프로젝트를 시작하고 처음에 주제를 선정하고 이런 저런 필요한 것들에 대해서 이야기를 하는데 사람들의 생각이 다 다르다는 것을 크게 느꼈다. 오랜 시간 회의를 하고 마쳐서 다시 기획을 구체화 시키기 위해서 문서화를 하다보면 다시 각자 이해하고 있는 생각들이 달랐고 이게 매번 반복되었다. 생각을 일치화하기가 매우 어려웠다. 모두가 같은 결과물을 생각하고 작업하는 게 굉장히 어려웠고 각자 다시 생각을 정리하고 만나서 이야기 하면 이야기가 길어지면서 기획이 길어지는데 왜 기획팀이 따로 있는지 이해가 되기도 했다. 그렇게 이번 프로젝트는 아직 진행 중이지만 나에게 여러 사람들과 ..

23.07.24 클론 코딩(오늘의집) - 트랜잭션(Transaction) 적용

프로젝트를 하면서 기존처럼 하나의 DB만을 접근하는 게 아니라 연관된 DB도 같이 접근해서 데이터를 생성하는 작업이 있었다. 이때 에러가 발생하였고 그 원인을 찾으니 연관된 DB에 필요한 값이나 로직이 잘못되어 처음에 접근한 하나의 데이터가 생성되었고 다른 하나의 데이터가 생성되지 않아서 오류가 발생기는 문제가 있었다. 문제는 먼저 처리된 데이터는 문제가 없이 생성되어 데이터의 무결성에 문제가 생기고 불필요한 데이터가 쌓인다는 것이었다. 이에 대한 해결 방법으로 트랜젝션을 사용해서 처리하였다. // detail.service.js // 집사진 생성 createDetail = async (userId, content, imgUrl, itemData) => { const t = await sequelize...

23.07.22 클론 코딩 - 데이터 관계 설정

오늘의 집을 클론 코딩을 하기로 했는데 주어진 시간이 짧기에 다 만들 수는 없고 스코프를 줄여서 만들기로 했다. 이때 내가 담당하게 된 부분은 이미지와 글 그리고 상품 정보가 있는 페이지이다. 같은 상품 정보가 각 글마다 들어갈 수도 있어서 글이랑 상품 정보를 같이 저장하면서 유저에 대한 정보도 필요하기에 하나하나의 데이터가 너무 커질 것 같았기에 먼저 관계형 DB를 선택하고 ERD를 만들었다. 내가 가장 먼저 하게된 일은 DetailPages에서 정보를 가져오면서 그 글에 있는 상품태그에 상품에 브랜드명, 상품명, 이미지, 가격을 가져오는 것이다. 그리고 그 글의 사진에 태그 된 상품의 좌표값과 유저의 프로필사진, 닉네임, 가입날짜까지 가져와야 했는데 이를 관리하기 위해서 위와 같이 WritePacks..

23.07.21 협업과 소통

주특기를 배우고 첫 프로젝트가 끝났다. 백엔드와 프론트엔드 역할이 나누어지고 각자의 역할을 하면서 작업을 했던 것은 처음이었기에 어떻게 규칙을 정하고 함께 작업을 해야할지 몰랐다. 그리고 CICD와 HTTPS 적용이라는 과제를 받고 그것에만 몰두하다보니 소통 보단 내게 주어진 일에만 집중을 했는데 나중에 어느정도 마치고 나서 돌아보니 이게 가장 큰 실수 인 것 같다. 서로 처음이니까 에러가 나와도 내가 처리한 부분에서 에러가 나오는데 원인을 파악하지 못하고 서로 데이터를 어떻게 넘겨 받을지 무엇이 필요한지 몰랐다. 나는 만들어진 서버를 알려주며 이걸로 만들면 된다고 했는데 아니었다. 물론 나중에 일이 적응이 되면 알아서 이렇게 저렇게 데이터를 주고 받는 것을 어느정도 암묵적으로 정해진 룰에 따라 진행할 ..

23.07.17 HTTPS로 변경하기

그 동안에 배포에서 http로만 배포를 하고 확인을 했었다. 하지만 곧 하게될 실전 프로젝트에서는 https가 필요하다. 그래서 지금 하는 미니 프로젝트에서 https를 할 줄 알아야 나중에 시간을 아낄 수 있다. 사실 내가 만드는 것들이 얼마나 많이 이용하고 이게 뭐 문제가 되겠어 하지만 나중에 내가 최종 프로젝트에서 만든 어떤 서비스를 가지고 피드백을 받는데 누군가가 보려고 왔다가 주소에 주의하란 표시가 나온다면 거부감부터 들 것이다. 그리고 결구 취업을 위해 준비하는 과정에서 회사에서 봤을 때 얘네 프로젝트에 이것도 없네 하면서 마찬가지로 좋지 않은 인상을 줄 수 있기에 중요한 부분이라 생각이 되었다. 요즘은 http는 오히려 찾아보기 힘들기에 더더욱 이건 깔고 가야한다. 나는 일단 letsencr..

23.07.15 CICD 구축하기 2

오늘은 성공은 했다. 같이 하는 분들이 어떻게 성공했는지에 대해서 많은 공유와 조언 그리고 지도를 해줘서 완료할 수 있었고 AWS에 관해서도 잘 정리된 블로그를 볼 수 있었다. 사실 어제도 봤었는데 스프링이라 나에게 적용을 못할 것이라고 생각해서 넘어갔었다. 하지만 오늘 자세히 보니까 aws에 관해서는 공통된 부분이라서 잘 넘길 수 있었고 워크 플로우도 먼저 하신 분이 공유를 해줘서 쉽게 할 수 있었다. 물론 각각에 내용들이 뭔 역할을 하는지는 알아야 나중에 내가 변형을 주고 사용할 수 있기에 그 부분에 대해서 이번만 넘기면 된다는 마인드로 가면 안된다는 것을 알고 있다. 그래도 계속 된 시도로 해결은 했다. 오늘의 배운 점 지나친 글이나 정보라도 해결이 안되는 문제라면 다시 돌아가서 천천히 다 뒤져보자.