0.10.17 • Published 2 years ago

@inu-cafeteria/backend-core v0.10.17

Weekly downloads
-
License
GPL-3.0
Repository
github
Last release
2 years ago

cafeteria-backend-core

Cafeteria 백엔드에서 반복 사용되는 코어 부분입니다.

이게 무엇입니까

cafeteria-servercafeteria-console-server에서 사용되는 엔티티 정의와 TypeORM 설정을 하나로 모아 npm 모듈로 분리하였습니다.

왜 만들었나요 이런걸

cafeteria-servercafeteria-console-server, 그리고 cafeteria-mobile은 서로 다른 애플리케이션 룰을 가지지만, 모두 같은 비즈니스 룰을 공유합니다.

이는 엔티티에 어느 정도 녹아들어 있는데, 따라서 세 개의 저장소에서 똑같은 필드를 가지는 User 엔티티가 세 번이나 반복됩니다. 또한 백엔드(cafeteria-server, cafeteria-console-server) 부분에서는 데이터베이스 접근 설정과 ORM 또한 겹칩니다.

모바일 앱은 그렇다 쳐도, 백엔드 부분은 두 개의 애플리케이션이 같은 엔티티와 같은 데이터베이스를 공유합니다. 이는 우발적 중복이 아니며, 엔티티에 변화가 생기면 두 애플리케이션에서 동시에 엔티티를 수정해야 합니다.

따라서 두 백엔드 애플리케이션에서 코드를 두 번 작성하고 관리할 필요가 없다 판단을 내려 도메인의 코어 + DB 설정 부분을 합쳐 별도의 저장소로 분리하였습니다.

설치

$ npm install @inu-cafateria/backend-core

알아두어야 할 것

TypeORM 적응을 돕는 문단입니다. 익숙하시면 패스.

Repository 안 씁니다.

TypeORM 문서의 Active Record vs Data Mapper 부분을 살펴보시면 좋습니다.

데이터의 열람과 편집을 repository에 위임하지 않고, 엔티티 클래스의 static 메소드에게 맡겼습니다. 이런 식입니다:

User.findOne(1); // id가 1인 User를 찾아옴

Repository 인터페이스 만들고 인스턴스 주입하고 관리할 시간에 로직 하나라도 더 짜는게 빠르다 싶어 이렇게 결정했습니다.

TypeORM의 foreign key relation을 더 잘 활용하기 위한 필드 설계

사용자(User)는 질문(Question)을 할 수 있습니다. 한 사용자가 여러 개의 질문을 할 수 있기 때문에 이들은 일대다 관계를 형성합니다.

User와 Question 중 하나의 인스턴스만 가지고 있어도 서로 접근 가능합니다. 예를 들어, User.questionsQuestion.user와 같이 사용 가능합니다.

이를 위해 Question 엔티티 정의에 아래와 같이 User로의 레퍼런스를 명시해 두었습니다:

class Question {
  // ...
  @ManyToOne(() => User, (user) => user.questions)
  @JoinColumn()
  user: User;
  // ...
}

다만 이렇게 하면 Question 중에서 userId가 1인 것들만 가져오는 것이 귀찮습니다. 그래서 아래와 같이 userId 필드 또한 만들어 주었습니다:

class Question {
  // ...
  @ManyToOne(() => User, (user) => user.questions)
  @JoinColumn()
  user: User;
  
  @Column()
  userId: number;
  // ...
}

이제 아래처럼 쓸 수 있습니다.

Question.findOne({userId: 1});

Foreign key로 묶인 복잡한 엔티티 찾아올 때, 별도로 명시 안 해주면 묶인 애들 안 찾아와요.

User에는 questions 필드가 있습니다. 테이블 수준에서 실제 연관 정보는 Question 쪽에 foreign key로 존재합니다.

만약 User를 찾아올 때에, questions 필드를 채울 것을 지시하지 않으면, 그 필드는 없는 필드(undefined)가 됩니다.

그러니까 Question을 포함하여 User를 찾아오고 싶으면 이렇게:

User.findOne(userId, {
  relations: ['questions'],
});

그리고 Question 속의 answer까지 중첩으로 포함하여 찾아오고 싶으면 이렇게 하세요:

User.findOne(userId, {
relations: ['questions', 'questions.answer'],
});

중첩 relation에 관한 논의는 여기에 많아요

0.10.17

2 years ago

0.10.9

2 years ago

0.10.1

2 years ago

0.10.2

2 years ago

0.10.3

2 years ago

0.10.4

2 years ago

0.10.5

2 years ago

0.10.6

2 years ago

0.10.7

2 years ago

0.10.8

2 years ago

0.10.0

2 years ago

0.10.14

2 years ago

0.10.15

2 years ago

0.10.16

2 years ago

0.10.10

2 years ago

0.10.11

2 years ago

0.10.12

2 years ago

0.10.13

2 years ago

0.8.5

3 years ago

0.8.4

3 years ago

0.8.6

3 years ago

0.9.4

3 years ago

0.9.3

3 years ago

0.8.1

3 years ago

0.8.0

3 years ago

0.8.3

3 years ago

0.8.2

3 years ago

0.9.0

3 years ago

0.9.2

3 years ago

0.9.1

3 years ago

0.7.11

3 years ago

0.7.10

3 years ago

0.7.9

3 years ago

0.7.8

3 years ago

0.7.2

3 years ago

0.7.1

3 years ago

0.7.4

3 years ago

0.7.3

3 years ago

0.7.0

3 years ago

0.7.6

3 years ago

0.7.5

3 years ago

0.7.7

3 years ago

0.6.22

3 years ago

0.6.21

3 years ago

0.6.20

3 years ago

0.6.19

3 years ago

0.6.12

3 years ago

0.6.11

3 years ago

0.6.18

3 years ago

0.6.17

3 years ago

0.6.14

3 years ago

0.6.13

3 years ago

0.6.16

3 years ago

0.6.15

3 years ago

0.6.9

3 years ago

0.6.8

3 years ago

0.6.10

3 years ago

0.6.7

3 years ago

0.6.6

3 years ago

0.6.3

3 years ago

0.6.2

3 years ago

0.6.5

3 years ago

0.6.4

3 years ago

0.6.1

3 years ago

0.5.0

3 years ago

0.4.0

3 years ago

0.6.0

3 years ago

0.3.17

3 years ago

0.3.16

3 years ago

0.3.15

3 years ago

0.3.14

3 years ago

0.3.13

3 years ago

0.3.9

3 years ago

0.3.12

3 years ago

0.3.11

3 years ago

0.3.10

3 years ago

0.3.6

3 years ago

0.3.5

3 years ago

0.3.8

3 years ago

0.3.7

3 years ago

0.3.2

3 years ago

0.3.4

3 years ago

0.3.3

3 years ago

0.3.0

3 years ago

0.3.1

3 years ago

0.2.1

3 years ago

0.2.3

3 years ago

0.2.2

3 years ago

0.2.5

3 years ago

0.2.4

3 years ago

0.1.44

3 years ago

0.1.45

3 years ago

0.2.0

3 years ago

0.1.43

3 years ago

0.1.41

3 years ago

0.1.42

3 years ago

0.1.40

3 years ago

0.1.39

3 years ago

0.1.38

3 years ago

0.1.30

3 years ago

0.1.31

3 years ago

0.1.32

3 years ago

0.1.33

3 years ago

0.1.34

3 years ago

0.1.35

3 years ago

0.1.36

3 years ago

0.1.37

3 years ago

0.1.27

3 years ago

0.1.28

3 years ago

0.1.29

3 years ago

0.1.24

3 years ago

0.1.25

3 years ago

0.1.26

3 years ago

0.1.20

3 years ago

0.1.21

3 years ago

0.1.22

3 years ago

0.1.23

3 years ago

0.1.18

3 years ago

0.1.19

3 years ago

0.1.14

3 years ago

0.1.15

3 years ago

0.1.16

3 years ago

0.1.17

3 years ago

0.1.13

3 years ago

0.1.11

3 years ago

0.1.12

3 years ago

0.1.10

3 years ago

0.1.8

3 years ago

0.1.9

3 years ago

0.1.7

3 years ago

0.1.6

3 years ago

0.1.5

3 years ago

0.1.4

3 years ago

0.1.3

3 years ago

0.1.2

3 years ago

0.1.1

3 years ago

0.1.0

3 years ago