ORM이 뭐임
ORM은 Object Relational Mapping의 약자로 객체와 DB의 관계를 매핑해주는 도구다.
객체지향적 코드를 활용해 더 직관적이고 비즈니스 로직에 더 집중할 수 있게 해준다. SQL대신에 좀더 직관적인 코드와 메서드로 데이터를 조작할 수 있게 되는 것.
설치, 프로젝트 적용
npm i typeorm
기존 프로젝트에 적용하기
npx typeorminit --database mysql
나는 mysql을 쓸꺼니까 이렇게 해줄 것이다.
보통 구글링하다보면 createConnection함수나 ormconfig.json을 통해 설정하는데, 이건 0.2.45버전에 해당하는 세팅이고, 0.3부터는 createConnection, ormconfig.json이 없어졌으며 data-source.ts로 연결처리를 해준다.
import 'reflect-metadata';
import { DataSource } from 'typeorm';
import { User } from '../entity/User';
import dotenv from 'dotenv';
dotenv.config();
const { DB_USER, DB_PASSWORD } = process.env;
export const AppDataSource = new DataSource({
type: 'mysql',
host: 'localhost',
port: 3306,
username: DB_USER,
password: DB_PASSWORD,
database: '데이터베이스 이름',
synchronize: true,
logging: false,
entities: [User],
migrations: [],
subscribers: [],
});
dotenv를 통해 환경변수로 db USER명과 PASSWORD를 처리해주었다.
기존파일의 index.ts는 이렇게 생기게 되는데
import { AppDataSource } from './data-source';
import { User } from './entity/User';
export default () =>
AppDataSource.initialize()
.then(async () => {
console.log('Inserting a new user into the database...');
const user = new User();
user.firstName = 'Timber';
user.lastName = 'Saw';
user.age = 25;
await AppDataSource.manager.save(user);
console.log('Saved a new user with id: ' + user.id);
console.log('Loading users from the database...');
const users = await AppDataSource.manager.find(User);
console.log('Loaded users: ', users);
console.log(
'Here you can setup and run express / fastify / any other framework.'
);
})
.catch((error) => console.log(error));
연결이 안된다면 08004오류일 가능성이 매우 크므로 아래 링크를 보면된다.
https://www.lesstif.com/javascript/nodejs-mysql-er_not_supported_auth_mode-125305533.html
nodeJS에서 MySQL 연결시 ER_NOT_SUPPORTED_AUTH_MODE 에러 해결
www.lesstif.com
아니고 1045(28000)인경우는 비밀번호가 잘못 된 것이니 원만한 합의 바란다.
AppDataSource.initialize부분이 DB와 연결하는 것인데, 이 부분을 서버 시작 파일(app.ts)에서 딱 한번만 실행시키고, 이후에는 갖다 쓰기만 하면 된다.
아래는 예시 코드이다.
app.ts
const app: Express = express();
const port = 8080;
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
AppDataSource.initialize()
.then(async () => {})
.catch((err) => console.log(err));
app.use('/signup', signup);
app.use('/profile', profile);
app.get('/', (req: Request, res: Response) => {
res.send('Server Setting');
});
app.listen(port, () => {
console.log('서버 ON');
});
profile.ts
import { AppDataSource } from './data-source';
import { User } from '../entity/User';
const getProfile = async (id: number) => {
const userRepo = AppDataSource.getRepository(User);
const profile = await userRepo.findOne({
where: {
id: id,
},
});
return profile;
};
export default getProfile;
AppDataSource.getRepository를 통해 기존에 만들어둔 엔터티에 접근할 수 있다. userRepo에서 findOne과 같은 메서드를 통해 SQL없이 정보를 조회할 수 있게 된다.