🎞 부록
지난 시간에는 Unity와 WebApi를 연동시켜주었다. Unity와 WebApi를 연동시켜주는 것은 이전 시간에 학습했었던 Blazor와 WebApi를 연동시켜주는 것과 크게 다를 것이 없었다. Blazor를 통해 이용했을 때에는 HttpClient를 사용했지만, 유니티에서는 HttpClient가 아닌 WebRequest를 사용해야 했다. 이 후 REST를 구현하기 위해 CRUD를 함수를 모두 만들어 구현했다. 구현하는 과정에서는 크게 다를 것이 없어서 어려움은 딱히 없었다. 이번 시간에는 일전에 학습하였던 Entity Framework에 대해서 조금 더 심화과정으로 알아보는 시간을 가져보도록 한다.
💥 EF Core 데이터 모델링
엔티티 프레임워크는 일전에 아무런 개념도 모른체 그냥 사용을 하고 있었다. 따라서 아래 이미지와 같이 GameResult를 Add Migration을 할 때 이미지의 오른쪽과 같이 자동으로 생성된다.
이 때 사실 굉장히 신기한 부분이 많다. 딱히 누가 Primary Key를 사용하라고 말을 하지 않았음에도 불구하고 GameResult의 Id가 테이블에서 Primary Key가 된 것을 볼 수 있다. 어떻게 Id가 아무말도 하지 않았음에도 불구하고 Primary Key가 되었는지 이번에 알아보도록 하자.
데이터 모델링의 종류는 크게 3가지로 나눌 수 있다. 1. Convention(컨벤션 = 관례), 2. Data Annotation(데이터 어노테이션 = 데이터 주석), 3. Fluent API(플루언트 API = 직접 정의)의 방법이 있다. 이 중 우리가 사용한 방법은 관례 방법이다. 따라서 무엇인가를 세팅하지 않아도 관례에 의해 자동으로 동작하는 개념이라고 볼 수 있다. 예를들어 우리가 Id라고 명명한 GameResult의 Id 변수가 자동으로 프라이머리 키가 되는 것이다.
그 다음으로는 데이터 주석 방법으로 말과 같이 데이터 자체에 주석을 달 수가 있어서 이를 설정하도록 해주는 것이다. 이는 Blazor를 사용할 때에도 사용한 방법이다. 마지막 방법은 플루언트 API를 통해 직접적으로 정의해주는 방법이다. 먼저 관례 방법에 대해서 자세히 알아보도록 하자
관례 방법을 사용할 때에는 클래스의 대한 규칙은 다음과 같다. 반드시 퍼블릭을 사용해야 하고, static이면 안된다. 그리고 생성자가 아예 없거나 있다고하면 인자 없는 생성자가 반드시 있어야 한다 라는 규칙이 있다. 이 후 일전에 말한 Id, 혹은 [클래스]Id의 형태의 변수(property)를 테이블의 Primary Key로 간주한다.
이어서 컬럼에 대한 관례는 다음과 같다. property의 이름이 테이블 컬럼 이름으로 사용되고, 이에 해당하는 타입을 SQL 타입으로 변환 시켜준다. 따라서 C# 형식의 기본 nullable이 테이블 컬럼에도 영향을 준다.
다음으로 데이터 주석 방법은 Blazor의 Form 검증을 사용한 모든 Anotation이 모두 등장한다. 예를 들어 MaxLength와 Required 등이 있다. 한마디로 주석을 붙이는 것이 데이터 주석 방법의 개념이 된다.
마지막으로 플루언트 API 방법은 관례, 데이터 주석 방법으로 처리할 수 없는 나머지 기능들을 모두 여기에서 사용할 수 있다. 따라서 OnModelCreateing 함수에서 한 땀 한 땀 필요한 정보들을 여기에서 처리할 수 있다.
다음으로는 데이터베이스에서 특정 부분을 제거하는 방법이다. 이는 데이터 주석 방법과 플루언트 API 방법으로 제거할 수 있다. 데이터 주석 방법에서는 NotMapped 기능을 사용하면 되고, 플루언트에서는 Ignore를 통해 이를 제거할 수 있다. 그렇다면 데이터베이스에서 사용을 안할것인데 이렇게까지 해서 만들 필요가 무엇이 있을까? 바로 C#에서 메모리 상에서 이를 활용하고 싶을 수 있어서 경우에 따라 위와 같이 DB에는 매핑을 제거해서 사용하기도 한다.
이 다음으로는 데이터베이스 컬럼에 type, size, null을 제어하는 방법도 위와 같다. not null의 경우 데이터 주석 방법의 경우 required, 플루언트 Api의 경우 IsRequired() 함수를 사용하면 된다. 나머지 Set String Size, Set String Varchar의 경우 각각의 이미지를 참고하면 된다.
프라이머리 키는 위 이미지를 참고한다. 관례 방법에서는 BookAuthor의 클래스의 경우 파라미터를 BookAuthorId를 사용할 경우 자동으로 프라이머리 키가 될 것이다. 위 이미지에서는 루키스님의 실수로 BookId로 설정되어 있다. 데이터 주석 방법에서는 [Key]를 명시해주고, 경우에 따라 복합키를 이용할 경우 Column과 Order를 통해 순서를 설정할 수 있다. 마지막으로 플루언트 Api의 경우 HasKey 함수를 통해 이를 설정할 수 있다.
테이블의 인덱스 설정은 플루어트 Api만 사용할 수 있다. HasIndex에 HasName, IsUnique 등을 통해 옵션을 설정하여 다양한 인덱스를 설정할 수 있다.
다음은 테이블의 이름 설정이다. 3가지 방법 모두 사용가능 하다. DbSet을 통해 설정한 테이블이 이름이 될 것이며, 테이블 주석 방법은 클래스 위에 Table("~")을 통해 이름을 설정할 수 있다. 마지막으로 플루어트 Api의 경우 ToTable() 함수를 통해 이를 설정할 수 있다.
그렇다면 결론적으로 어떤 방법을 사용해야 할까? 1. 기본 상태로 충분하다면 관례 방법을 사용한다. 이 후 데이터 주석 방법이 가능하다면 플루언트 API를 사용하지 않고 이를 사용한다. 데이터 주석 방법은 추후에 Blazor 등 다양한 곳에서 재사용 가능하기 때문에 좋다. 위 두 방법으로 진행되지 않을 경우에만 플루언트 Api를 사용하도록 한다. 이를 마지막으로 엔티티 프레임워크의 가장 기초가 될 수 있는 데이터 모델링에 대해서 알아보았다.
'공부 > 인프런 - Rookiss' 카테고리의 다른 글
Part 7. MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초) (1) | 2024.10.25 |
---|---|
Part 6-8-2. 부록 : EF Core 데이터 관계 모델링 (9) | 2024.10.21 |
Part 6-7-5. WebAPI와 REST 서비스 : Unity와 WebApi 연동 (6) | 2024.10.17 |
Part 6-7-4. WebAPI와 REST 서비스 : Blazor와 WebApi 연동 (2) | 2024.10.16 |
Part 6-7-3. WebAPI와 REST 서비스 : WebApi #3 (2) | 2024.10.14 |