TIL_20.07.28(화)~31(금)

nRecode·2020년 7월 28일
1

TodayILearned

목록 보기
72/95
post-thumbnail

20.07.28(화)

세션과 쿠키가 아닌 토큰을 사용하는 이유

세션/쿠키는 세션 저장소를 서버에서 관리하기 때문에 사용자가 많아지면 많아질수록 서버에 걸리는 부하가 증가한다.

그러나 JWT는 발급한 후 검증만 하면 되기 때문에 추가 저장소가 필다. -> Stateless 한 서버. 서버를 확장하거나 유지,보수하는데 유리하다.

그러나 발급된 JWT는 삭제가 불가능하다.
세션 같은 경우에는 악의정으로 사용된다면 해당 세션을 삭제하면 된다.
토큰은 탈취당하게 되면 유효 시간이 종료되기 전까지는 탈취자가 얼마든지 악의적으로 사용이 가능하다.
그래서 Refresh Token이라는 것을 이용해 피해를 조금이라도 줄일 수 있다.

Reference
https://velopert.com/2350
https://tansfil.tistory.com/58

20.07.29(수)

PM2 사용하기

터미널 종료시에도 계속 서버를 유지하기 위해 pm2를 적용 시켰다. 설치하고 바로 pm2로 실행시키는 것은 어렵지 않았으나 api 콜을 보내면 연결이 계속 없다고 에러가 와서,,, 포트가 안 잡혀있나 생각했는데 node app.js로 실행을 하면 이미 포트가 실행 중이라는 충돌에러가 발생했다.

써치를 해봐도 별 내용이 없어서 pm2 커맨드를 찾아서 입력해 봤는데, pm2 log 커맨드를 입력하니 연결이 잘 되었다.

reference

20.07.30(목)

trasaction 적용

아이템을 insert 할 때, 여러 테이블에 접근을 하게 될 텐데 한 테이블에는 데이터가 들어가고 다른 테이블에는 데이터가 들어가지 못하는 상황이 존재할 텐데 이를 어떻게 방지 할 수 있을까 싶었고, 이를 트랜잭션을 적용하여 진행하였다.

시퀄라이즈에서 트랜잭션 적용하는 부분은 어렵지는 않았다.

기본적으로 아래와 같이 설정하고

await sequelize.transaction(async(t) => {
// 기존에 작성했던 코드

})

find와 같은 db 조회에 사용될 때는 아래와 같이,

await Seasons.findOne({
   where: {
      season: i,
   },
   transaction: t
})
                      

create같이 db에 데이터를 저장할 때에는 아래와 같이 추가해준다.

await Items.create({
                    image: image,
                    category: category,
                    type: type,
                    buydate: buydate,
                    price: price,
                    brand: brand,
                    storage: storage,
                    UserId: req.decoded.id // token을 헤더에 넣어 보내면, decoded에 id가 같이 적힘.
                }, { transaction: t })

20.07.31(금)

회원 탈퇴 시 데이터 처리

회원이 가입을 진행하듯 탈퇴를 할 수 있는데 탈퇴 시 기존에 db에 등록했던 아이템은 어떤식으로 처리해야 할지 생각을 못했었고 팀원분들과 합의하여 데이터 역시 모두 다 지워지도록 처리를 진행하였다.

items_seasons테이블과 Items 테이블을 조인하여 탈퇴한 유저가 등록했던 데이터를 모두 조회하고 삭제하는 순서로 처리했다.

let season_itemId = [];

        await items_seasons.findAll({
            attributes: ['items_seasons.id'],
            include: [{
                model: Items,
                where: {UserId : id}
            }],
            raw:true
        }).then((result) => {
            if(result.length){
                result.map((acc) => {
                    season_itemId.push(acc.id);
                })
                console.log(season_itemId)
            }
        })

그 과정에서 다대다 관계 테이블이 sequelize 관계 설정이 되어있지 않아서 아래와 같이 추가적으로 관계 설정을 해주었다.

db.Items.belongsToMany(db.Seasons, { through: 'items_seasons', foreignKey: 'ItemsId' });
db.Seasons.belongsToMany(db.Items, { through: 'items_seasons', foreignKey: 'SeasonsId' });

// join을 위한 관계 설정
db.items_seasons.belongsTo(db.Items, {foreignKey: 'ItemsId'});
db.items_seasons.belongsTo(db.Seasons, {foreignKey: 'SeasonsId'});
profile
안정성, 확장성 있는 서버를 구축하고 가꾸는 개발자를 목표로 공부하고 있습니다. 🤔🤔🤔🤔 부족하기에 맞지 않는 내용이 있을 수 있습니다. 가감없이 피드백 해주시면 정말 감사하겠습니다..🙏

0개의 댓글