백엔드감자's Today I Learned : ORM에 대한 공부.

BE_{Potato.}·2023년 2월 7일
0
post-thumbnail

부트캠프 기간동안을 돌아보면 내가 ORM에 대한 개념이 많이 부족하다는 느낌을 받았다. 어제 강의에서야 비로소 백엔드Part와 관계형 데이터베이스를 이어주는 것이 ORM이라는 것을 정확하게 깨달았다. 부트캠프는 시간적인 부족함 때문에 이해도 제대로 못하고 넘어가는게 너무 많았어서 이제서야 비로소 알게 되는 부분이 너무 많다.
본론으로 가자.


ORM은 DBMS에서 제공해주는 SQL의 불편함 때문에 프로그래밍 언어 차원에서 생긴 도구이다. 그 중에서도 TypeORM은 Typescript를 지원하고 Nest.js의 기본ORM이라는 것에 이점이 있다.
TypeORM을 쓸 때의 초기설정. MySQL은 켜져있어야 하고, app.module에 초기설정을 해줘야 한다.synchronize: true를 해줘야 코드에 입력한대로 바로 DB에 똑같이 적힌다. 예전에는 ORM이 없었는데, 그 때에는 SQL문을 다 외워서 써야했다. 하지만 지금은 90%정도는 ORM이 가능하고, ORM이 못하는 나머지를 SQL문으로 접근하면 되게 되었다. 아래의 logging: true는 ORM문이 SQL문으로 변환되는 것을 보여준다. 지금 당장 SQL문을 안 쓴다고 등한시할 것이 아니라 SQL문이 근본이기 때문에 이것 또한 공부하는 자세가 필요하다.
=> 성능개선을 위한 튜닝을 할 때에는 SQL이 필요하고, 터미널에 찍힌 SQL을 보고 이해하려는 노력이 필요하다. 성장할 때 반드시 필요한 부분이다.

TypeORM은 Entities를 설정하는게 먼저이다. 오른쪽에 Column 요소들과 타입을 적어주고, 위에 @데코레이터를 써줘야 typeorm이 이를 데이터베이스에 저장해준다. 맨위에 PrimaryGeneratedColumn은 ID 관련 Entity인데 uuid와 increment가 주로 있고,uuid는 구별가능한 유니크한 숫자, increment는 1씩 증가하는 숫자를 자동으로 부여한다. 다 작성했으면 app.module의 entities란에 써준다. 그리고 데이터베이스에 들어가서 데이터베이스를 미리 만들어야 코드가 위치를 인식하고 그 데이터베이스에 테이블을 만든다.

내가 보려고 만든 "간단한 TypeORM CRUD"

핵심은 인자로 받은 것들을 DB에 CRUD해주면 된다.

  • CREATE: .create()와 .save()가 있는데 .save()가 등록한 데이터를 가져와주기까지 해서 .save()를 선호한다. 괄호에는 받은 인자가 들어간다.
  • READ:두 가지 종류가 있는데,전체목록 조회와 개별조회이다.
    전체목록 조회는 .find()(모두 찾는 것이라 인자에 아무것도 안들어간다.), 개별조회는 .findOne({where: 조건 })이런 식으로 써준다. 해당 Id를 조건으로 쓴다.
  • UPDATE: .save()를 쓴다. 그 이유는 수정 후에 수정되지 않은 다른 결과값까지 모두 받을 수 있기 때문이다. 괄호 안에는 수정하려는 값 인자가 들어간다.
  • DELETE: 소프트-delete 방식을 구현한다.(TypeORM에서 제공).
    인자로 Id를 받아서 .softDelete({id: ~~~}) 식으로 쓴다.

🧘🏻‍♀️ 오늘의 내 생각.
컴공 기본공부를 먼저한다고 데이터베이스를 공부하다가 SQL문이 너무 어려워서 헤매고 서브쿼리는 정말 어렵고 그랬던 기억이 난다. 여기에서 진도가 잘 안 나갔고, 부트캠프 강의에서 말해주길 요즘 실무에는 SQL을 직접 입력하는 것보다 ORM을 이용한다고 했다. 이 말에 나름 안심 아닌 안심이 들었고 부트캠프 내내 백엔드에서 데이터로 접근하는 부분이 제일 헷갈렸던 터라 이 쪽을 거의 모르다시피 캠프기간을 보냈는데 ORM이 그 역할을 해준다는 것을 알게 되었다. 하지만 SQL을 아예 몰라도 된다는 얘기가 아니라 근본이 SQL이고, ORM이 처리하지 못하는 부분은 SQL으로 처리해야 하기 때문에 SQL은 성장하기 위해서는 필수로 알아야 한다고 했다. 명심해야겠다. 이해도 못하고 지나갔던 가장 가려웠던 부분 중 하나인데 많이는 아니지만 어느정도 가닥을 알게 되어 기분이 좋았다.

profile
항상 '기본'을 중요시하는 예비 백엔드개발자입니다!

0개의 댓글