Javasciprt 9

[TypeORM] Migration으로 DB 변경하기

어쩌다 시작하게 되었는가? 서비스 중인 웹 서비스에 백엔드 관련 추가 개발 기능을 배포할 일이 생겼다. 추가 개발과 관련해서 DB 테이블에 스키마 변경이 있었다. 이전에 DB 스키마를 변경할 때, TypeORM 옵션에서 synchronize 옵션을 true로 바꿔 변경했다가 데이터가 날아간 경험이 있었다. TypeORM에서도 해당 방법으로 프로덕션 DB의 스키마를 변경하는 것을 추천하지 않는다. This option automatically syncs your database tables with the given entities each time you run this code. This option is perfect during development, but in production you may ..

Javasciprt/NestJS 2024.04.23

부호있는 16진수를 10진수로 변환

최근 바이트로 저장된 값을 10진수로 변환하여 DB에 저장하는 로직을 구현해야했다. 단순히 부호가 없는 경우 parseInt 내장함수를 사용해 10진수로 변환할 수 있다. const buf = 'a1d2'; const num = parseInt(buf, 16); console.log(num); // 41426부호가 있는 경우 맨 앞 자리의 숫자에 따라 음수, 양수로 나눠지며 계산하는 방법도 달라진다. 부호가 있는 16진수의 경우 앞자리가 07은 양수, 8F는 음수다. (2진수로 변환시 맨 앞 비트가 0이면 양수, 1이면 음수) 2진수로 변환 후 맨 앞 비트에 따라 부호를 판단하고, 1의 보수를 구해 10진수로 변환하고 음수 변환을 한다. function getDecimal(buf) { //..

Javasciprt 2024.03.02

[NestJS] TypeORM naming strategy

보통 Typescript로 코드를 작성할 땐, camelCase로 이름 규칙을 작성하는데, Database에선 snake_case로 이름 규칙을 작성하게 된다. 기존에는 TypeORM 데코레이터에서 name으로 이름을 작성했다. @Entity('users') export class UserEntity { @Column({ name: 'last\_name' }) lastName: string; } 코드도 길어지고, 가끔 이름을 빼먹는 경우도 발생하고 문제가 되었다. 찾아보니 typeorm-naming-strategies라는 라이브러리가 있었고, 조금 더 코드를 단순화 할 수 있었다. 사용 설치 npm i typeorm-naming-strategies typeorm module에..

Javasciprt/NestJS 2023.12.26

[NestJS] Request 객체에서 IP 정보 가져오기

Nestjs common 데코레이터 @Ip @nestjs/common 에 있는 @Ip 데코레이터를 통해 IP 정보를 가져오도록 코드를 구현했는데, 공인 IP 주소가 아닌 사설 IP 주소를 가져왔다. 어떤 네트워크에서 접근해도 같은 사설 IP로 기록되는 문제가 발생했다. nestjs-real-ip 라이브러리를 찾아 적용하게 되었다. 공인 IP를 가져오는 것을 확인할 수 있었다. 무엇이 다를까? 기본 데코레이터를 사용하면 Reqeust 객체에서 ip를 조회한다. nestjs-real-ip를 사용하면 내부적으로 request-ip를 사용하는데, 단순히 Request 객체에서 ip를 조회하는게 아니다. request-ip 코드에 getClientIp 함수를 사용하는데, Request Header 객체 내에 IP..

Javasciprt/NestJS 2023.07.28

[React MUI] TablePagination 사용 시, body에 right padding

MUI Table Pagination 간단하게 Pagination을 사용하기 위해 MUI의 TablePagination을 사용했다. ISSUE TablePagination에서 select 선택 시 body에 right padding이 추가되었다. Solve MUI Select 사용 시 같은 현상이 있는데, 와 같이 코드를 추가하면 해당 현상을 해결할 수 있다고 한다. 하지만 TablePagination엔 MenuProps가 없다. 찾아보니 SelectProps가 존재했다. 위와 같이 처리해주면 body에 right padding이 강제로 들어가는 현상을 막을 수 있다.

Javasciprt 2023.07.12

[Node.js] Ubuntu 18.04에 Node.js 14버전 설치하기

Ubuntu에서 Node를 설치할 때, apt를 사용해 설치하면 기본적으로 낮은 버전의 Node.js가 설치된다. 개발환경과 서비스 환경을 맞추기 위해 Ubuntu에 Node.js 14버전을 설치할 필요가 있었다. 1. Node.js에서 source code 다운받기 Node.js에서 제공하는 tar.gz 파일을 다운받는다. (URL은 Node.js 공식문서에서 Linux banaries 64-bit 링크 복사하였음.) 설치된 파일의 압축을 해제한다. 해제된 디렉터리에 bin/node 를 통해 node를 사용할 수 있다. 하지만, 불편하게 경로를 다 써야한다. 그래서 환경변수로 Node를 등록한다. export [환경변수이름]=[환경변수값] 의 형태로 저장한다. (삭제할 경우 unset [환경변수이름])..

Javasciprt 2021.09.10

[ajax] Ajax를 통한 비동기 통신

웹 애플리케이션을 개발하다보면 한가지 기능을 수행하는데, 비효율적으로 동작하는 경우가 있다. 모든 비효율적 동작을 알 수 없고, 모두 효율적으로 해결할 수 없지만, 많이 알려진 것들은 배우고 활용할 필요가 있다. Ajax의 비동기적 통신은 웹 애플리케이션에서 불필요한 리소스를 불러오지 않고 클라이언트와 서버가 통신할 수 있도록 돕는다. 1. Ajax 사용을 위해 jQuery 호출하기 먼저, jQuery를 사용해야 한다. (slim에서는 사용할 수 없었다. minified로 사용했다.) 2. Ajax의 사용 ajax는 javascript 파일에서 사용된다. $.ajax({ type: 'get', url: url, data: data, dataType: 'json', error: onError, succes..

Javasciprt 2021.08.26

[Node.js] 회원가입 시 비밀번호 암호화

현재, 사용자 비밀번호를 회원가입시 바로 DB에 암호화 없이 평문으로 저장하고 있다. 암호화된 비밀번호가 필요하다. bcrypt 모듈을 많이 사용한다. npm i bcrypt const bcrypt = require("bcrypt"); // 암호화 bcrypt.hashSync(password, 10); // Sync로 하면 동기식, 10은 salt를 몇번 돌릴지 횟수, 높을수록 많이 돌리지만 느려질 수 있다. // 암호화된 비밀번호와 비교 bcrypt.compareSync(password, encryptedPassword); 암호화된 비밀번호는 60자의 길이를 갖는다.

Javasciprt 2021.08.24
반응형