Aspnet Core에서 EntityFramwork를 활용해 MySql연결하기
작성날짜 2024/07/08
SqlServer는 Arm을 지원하지 않아요.
마이크로소프트 생태계에서 데이터베이스를 쓴다고 하면 SqlServer가 국룰이다. 물론 aspnet core에서도 이를 매우 사용하기 편하게 지원하고 있다.
하지만 내 서버는 Arm 아키텍처 기기에서 돌아가고 있어서 차선책인 MySql을 사용하게 되었다. MySql을 지원하는 패키지가 있긴 했지만 마이크로소프트의 공식 지원이 아니어서 그런지 여러 시행착오 끝에 연결에 성공했다.
그래서 또 까먹지 않기 위해 이렇게 기록을 남겨둔다.
아래와 같은 순서대로 진행을 하였다.
- 프로젝트 생성
- 패키지 설치
- Model 작성 및 DbContext 작성
- 연결 설정
- 데이터베이스 업데이트
- 작동 테스트
프로젝트 생성
우선 Visual Studio에서 Web API 템플릿을 선택해준다.
프로젝트 이름은 적당히 적어넣고
OpenAPI는 필요 없으니 선택 해제하고 나머지는 건드리지 않고 프로젝트를 생성
프로젝트를 실행해보면 기본 WeatherForecast Api의 응답이 출력되는 것을 확인할 수 있다.
패키지 설치
패키지 관리자를 열어주고(Project>Manage NuGet Packages)
첫번째로 설치할 것은 mysql 연결과 관련된 패키지이다. mysql을 검색해주자.
Pomelo.EntityFrameworkCore.Mysql을 설치해주자.
그 다음엔 EntityFramework Core 관련 패키지이다.
EntityFramworkCore와 EntityFrameworkCore.Tools를 설치해주자.
Model 작성 및 DbContext 작성
프로젝트에 Model 파일을 담을 Models 폴더를 만들고, 서점 정보를 담을 BookStore.cs 파일을 만들자.
그리고 아래 사진과 같이 책 정보를 정의한다.
Book 클래스가 aspnet core에서는 책의 정보를 담은 객체가 되고, EntityFramework에서는 테이블의 속성이 된다.
이름이나 타입뿐만 아니라 DataAnnotation을 통해 각 속성의 제약조건을 설정할 수 있다.
위 사진에 쓰인 DataAnnotation은 이렇다.
[Table("books")]
public class Book() {}
클래스의 이름은 Book이지만 Db에서 테이블의 이름은 books가 된다.
[Key]
이 속성을 PrimaryKey로 지정한다.
[Required]
null을 허용하지 않는다.
그 후 Data 폴더를 만들고 아래 사진처럼 파일을 만들어 준다.
이로써 DbContext에 books 테이블이 추가 되었다.
연결 설정
appsetting.json에 들어가 다음 내용을 추가한다.
"ConnectionStrings": {
"DefaultConnection": "Server=[서버 위치];Port=[포트 번호];Database=[데이터베이스 이름];User=[유저 이름];Password=[비밀번호];Pooling=true;"
}
그 후 Programs.cs 파일에서 mysql 서비스 등록을 해준다.
appsettings.json의 DefaultConnection의 정보로 연결을 시도한다.
데이터베이스 업데이트
terminal에 다음 명령어를 입력하여 EntityFramework migration을 생성해준다.
dotnet ef migrations add init
이렇게 성공으로 뜨면 프로젝트에 migration 폴더와 파일이 생성되어 있을 것이다.
우리가 작성한 DbContext의 내용을 토대로 sql 쿼리를 자동으로 생성해준다.
그 후 다음 명령어를 사용하면 Mysql database의 정보가 자동으로 갱신된다.
dotnet ef database update
작동 테스트
Visual Studio를 사용하고 있으므로 클릭 몇번으로 간단하게 컨트롤러를 만들 수 있다. 솔루션 탐색기에서 원하는 곳에 우클릭>추가>컨트롤러
Book 모델을 선택하면 자동으로 Book모델 CRUD API 컨트롤러가 생성된다.
임시로 데이터를 넣어놓고 테스트 해보면 잘 작동되는 것을 확인 할 수 있다.
결론
예전에 잘 몰랐을 때는 이렇게 모델 클래스를 만들고 DbContext를 상속해서 서비스 등록하는 등의 절차가 귀찮기만 하고 불필요 하다고 생각했었다. 하지만 다른 프레임워크를 써보니 EntityFramework의 장점을 알 수 있었다.
DB에서 불러온 데이터를 마치 객체처럼 바로 다루거나, sql 쿼리가 아닌 c#코드로 DB를 조작하는 등 다른 곳에서 당해보니까 알 수 있는 편한 기능이었다.