일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- programmers
- 포너블
- hackctf
- docker
- node.js
- 파이썬
- nodejs
- 백준
- Batch
- 네트워크
- 회고
- Python
- 웹해킹
- cloud run
- 웹보안
- spring Batch
- webhacking.kr
- 프로그래머스
- sequelize
- 스프링 배치
- Baekjoon
- 보안
- 사이버보안
- gcp cloud build
- 시스템 해킹
- gcp
- gcp ci/cd
- pwnable.xyz
- kotest
- 리버싱
목록Node (22)
uju's Tech
이슈 TypeORM 에서 여러 개의 row가 업데이트 되거나 생성될 때 save 메서드를 사용할 수 있다. 변경되는 여러 개의 row에서 unique한 칼럼이 업데이트되거나 생성되는 경우도 있을 것이다. 여기서 unique constraint violate 에러가 발생할 수 있다. 이 에러는 어떤 경우에, 왜 발생하는 것일까? 그리고 어떻게 해결할 수 있을까? 예제 예를 들어서 설명해보겠다. Post가 있고 Post를 저장할 때 Label을 지정할 수 있다고 하자. 그리고 Label이라는 테이블은 id, name, post_id로 구성되어 있으며 name에는 unique constraint가 걸려있다고 하자. 현재 하나의 Post가 저장되어 있고 그에 대한 Label은 다음과 같이 저장되어 있다. Pos..
이번 포스팅에서는 TypeORM의 Replication 적용 부터 Master , Slaves를 지정하는 것을 다뤄보고자 한다. 개발을 하다보면 다양한 쿼리, 그리고 여러 쿼리들로 구성된 하나의 동작을 구현하게 되는데 어떤 동작인지, 어떤 쿼리인지에 따라 Master에 수행해야만 하는 작업이 있을 수도 있고, Read Replica에서 수행할 수 있는 작업이 있을 수도 있다. TypeORM도 replication이 적용된 데이터베이스에 대한 쿼리를 지원하는데, 그렇다면 TypeORM은 어떤 경우에 어떤 데이터베이스로 연결되는지 알아보자. TypeORM 은 Read, Write Replication이 있을 때 기본적으로 다음과 같이 데이터베이스를 선택한다. update, insert는 Master DB f..
최근 회사 내에서 alpine linux와 debian 에서 cp가 다르게 동작하는 이슈가 있었는데 이유가 궁금해서 혼자 디깅해보았다. cp 이슈를 통해 여러가지 디깅해본 과정 및 관점을 기록 차원에서 남긴다. ( 찾아봤던 시간이 아깝기도 해서 ㅎㅎ주륵..,,,) 서론, 본론, 결론으로 이루어져있고 리눅스에 대해 조예가 깊지 않다는 점 감안하고 읽어주시면 좋을 듯 합니다. 잘못된 설명이 있다면 댓글 부탁드립니다. 서론 회사 내 프로젝트에서 Alpine Linux와 Debian 의 cp 명령어 동작 차이가 발생으로 인한 이슈가 있었다. 어떤 이슈인지는 인프랩 개발 블로그에 올라올 듯 하다. 어떠한 차이가 있었는지 간단하게 설명해보겠다. Alpine 파일 a: 1 , b:2 , c: -> a 파일 c에 a를..
흔히 데이터를 삽입이 필요한 API 를 구현할 때 아래와 같은 흐름으로 많이 구현한다. 1. 존재 여부 check 2. 존재하지 않으면 error 3. 존재하면 insert 이런 로직이 당연하다고 생각하였는데 구현하고있는 대상에 따라 다른 로직을 고려해볼 수 있을 것 같다. 예를 들어 좋아요 생성 API 를 구현한다고 해보자. 위와 같은 로직으로 작성했을 때 생기는 엣지 케이스를 생각해보자. - 네트워크 지연으로 인해 API 호출이 쌓여 동시에 찌르는 경우 - 창을 동시에 띄우고 하나의 창에 좋아요 누른 후 다른 창에도 요청하는 경우 등이 있는데 이런 경우 critical 한 부분이 아닌데도 에러를 보내는 것은 비효율적이다. 실제로 동시에 api를 호출하면 db 에서 duplicated 에러가 발생하는데..
sequelize 에서 데이터베이스 마이그레이션 시 ERROR: Cannot read property 'toString' of undefined 에러가 발생할 때가 있는데 changeColumn 등 을 이용할 때 해당 칼럼의 타입을 꼭 명시해주어야한다. type을 명시해주지 않고 마이그레이션하면 위와 같은 에러 발생한다. - 에러 상황 await queryInterface.changeColumn('users', 'serviceId', { allowNull: true, }, { transaction }); - 해결 await queryInterface.changeColumn('users', 'serviceId', { type: Sequelize.UUID, allowNull: true, }, { transa..
데이터 반환을 할 때 utc 날짜로 반환되는 것을 "mm 월 - d일- 요일" 로 반환을 해주었으면 좋겠다는 요청이 있었다. 리스트에 있는 모든 date 형태를 원하는 형태로 바꾸어주었어야 했기 때문에 forEach를 사용해주었다. const list = []; data.forEach((d) => { const utcDate = new Date(d.dataValues.date).toUTCString(); d.dataValues.date = moment(utcDate).locale('ko').format('M월 D일 dddd'); list.push(toDo); }); toUTCString을 사용하여 utc 객체를 문자열로 변환해준다. 이를 사용하여 원하는 포맷으로 만들어주기 위해 moment 객체를 사용해..
데이터베이스의 여러 테이블의 정보를 반영시킬 때 transaction 을 걸지 않고 구현하게 되면 정상적으로 반영이 이루어지지 않는다. 여러 테이블의 정보를 변경할 때 아래와 같이 transaction을 선언해주고 transaction을 걸어준다. const transaction = await db.sequelize.transaction(); 그 후 커밋을 하고 에러가 발생할 경우 롤백을 진행해준다. { await User.create(data, transaction); ... await transaction.commit(); } catch (err) { await transaction?.rollback(); } 가끔 위에서 transaction을 선언하고 커밋 전에 다른 에러가 발생하여 throw 될 ..
애플로 회원가입 시 사용자가 기기 내에서 앱 연결 끊기 를 할 수 있다. 이 경우 앱 연결을 끊게 되면 어떠한 action을 할 것인지 api를 등록하여 지정할 수 있다. apple developer의 identifiers에서 App IDs를 들어간다. 소셜 로그인이 설정되어있는 app id에 들어가보자. Sign in with Apple에서 Edit을 누르면 아래와 같이 나오는데 여기서 url을 설정해주면 해당 url로 웹훅이 호출된다. 해당 url에 POST 방식으로 호출되므로 POST 로 요청되도록 구현해주어야한다. 그리고 apple이 api로 payload 라는 body값을 주는데 이는 JWT 형식이다. 해당 값을 decode 해보면 아래와 같이 나온다고 한다. 아래 공식 문서를 참고해보자. ht..