기존 회사에서는 expressjs + typeorm 0.2 버전을 쓰고있어서 프로젝트 중 세팅을 어떻게 해야하는지 몰랐다.
공식문서를 보고 참고해서 연결했던것 같다.
0. 패키지 설치
npm install reflect-metadata typeorm mysql2
나는 mysql, typeorm 0.3.17, expressjs, typescript, docker-compose 를 이용했다.
참고로 typeorm 0.3.11 버전은 오류가 있는듯 하니까 이 버전은 피하도록 한다.
typescript, tsconfig-paths 설정들에 대한 이야기는 제외하고 설명하고자 한다.
그리고 mysql가 아니라 mysql2를 설치해야 정상적으로 사용할 수 있으므로 참고한다.
1. db config 설정
## src/config/data-source.ts
import 'reflect-metadata';
import { DataSource } from 'typeorm';
import SnakeNamingStrategy from '../database/namingStrategy/SnakeNamingStrategy';
import { UserPhoneAuth } from '~/database/entity';
import { User } from '~/database/entity';
export const AppDataSource = new DataSource({
type: "mysql",
host: "mysql", //DB HOST
port: 3306, // DB 포트 mysql default port는 3306
username: "testuser", // DB 접속시 계정
password: "testuser", // DB 접속시 비밀번호
database: "testdb", // DB내 사용하는 DATABASE
synchronize: true, // 엔티티 동기화 여부, 개발 중일땐 true를 해도 상관없으나 실서버에서는 false로 하고 migration을 하거나, 직접 수정한다.
logging: true,
entities: [UserPhoneAuth, User],
subscribers: [],
migrations: [],
namingStrategy: new SnakeNamingStrategy(),
timezone: '+09:00',
});
위처럼 data-source.ts라는 파일을 만들고 값을 넣고 설정했다.
위처럼 바로 넣어도 되고, dotenv 설정으로 .env.local 파일처럼 가져와도 되는데,
dotenv 가 읽어오는 속도가 db 로드하는 속도보다 느려서, 못읽어 오길래 우선은 하드코딩했다.
만약 dotenv로 읽어오고 싶다면 함수로 만들어서 내부에서 dotenv를 이용해 가져오면 되겠다.
그럼 dotenv호출을 db 로드할때 같이 하므로 못가져오는 일이 없을 것이다.
entities를 나는 직접 넣는걸로 했는데, 경로 설정을 해서 가져와도 되긴한다.
근데 여기서 나는 ~ 이렇게 가져왔는데, 이건 tsconfig.json 설정을 그렇게 한거라서 개인 프로젝트에 맞게 경로를 가져오면 된다.
참고로 호스트가 mysql로 되어있는데, 나는 docker-compose로 해서 컨테이너 이름이 들어간거라 해당 프로젝트의 호스트네임을 넣으면 된다. 보통 로컬이면 localhost나 127.0.0.1 일 것이다.
마지막으로 현지 시간이 utc 타임이라 9시간 느리니 서울 시간은 9시간 빠르게 해야해서 +9 해줬다.
2. 쿼리할때 사용하기
## src/routes/user/service.ts
import { User } from '../../database/entity/Account';
import { UserPhoneAuth } from '../../database/entity/UserPhoneAuth';
import { AppDataSource } from '../../config/data-source';
const userRepository = AppDataSource.getRepository(User);
const phoneExists = await userRepository.findOne({ where: { phone } });
위처럼 export 한 AppDataSource를 가져와서 레포지토리를 만드는 메서드인 getRepository(엔티티이름)를 사용한다.
그럼 레포지토리를 만들고 여기에 findall, findOne, softDelete 등을 사용하면 된다.
참고로 0.2에는 where을 안써도 됐는데, 0.3부터는 where 키를 무조건 써줘야했다.
# 앞으로 수정할 점 1
const userRepository = AppDataSource.getRepository(User);
const phoneExists = await userRepository.findOne({ where: { phone } });
매 호출때마다 위 코드 2줄이 들어가는게 좀 불편하다. 이걸 리팩토링해보고자 한다.
# 앞으로 수정할 점 2
config 설정을 dotenv 이용해서 다중환경에도 사용할 수 있도록 수정해보고자 한다.
'JaveScript > ExpressJS' 카테고리의 다른 글
dayjs 사용해서 나이 계산하기 (0) | 2023.12.14 |
---|---|
ts-jenum으로 Enum객체 활용 (0) | 2023.12.13 |
morgan 세팅 (0) | 2023.11.30 |
ExpressJS 구조 파악하기. (0) | 2023.07.20 |
ExpressJS 프로젝트 세팅하기 (0) | 2023.07.18 |