ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Visual Studio] 2. Docker 기반 .NET 개발환경 쉽게 구축하기 - MSSQL 연동환경 구축 - part 2
    .NET/개발환경 및 Tools 2021. 2. 24. 22:32
    반응형

    지난시간에 구축작업을 완료했으니 직접 코드를 작성해보겠다.

     

    ddochea.tistory.com/110

     

    [Visual Studio] 2. Docker 기반 .NET 개발환경 쉽게 구축하기 - MSSQL 연동환경 구축 1편

    지난시간엔 도커 컨테이너 안에서 동작하는 Dotnet 콘솔프로그램 개발환경을 생성했다. ddochea.tistory.com/109 [Visual Studio] Docker 기반 .NET 개발환경 간단하게 구축하기 - 기본 Windows WSL2 기반 Docker..

    ddochea.tistory.com

    1. DB 및 테이블 생성

    Management Studio 또는 Visual Studio 서버탐색기를 통해 DB 및 Table을 생성한다. DB명은 "School"로 생성한다.
    * 원할한 한글 사용을 위해 데이터 정렬은 "Korean_Wansung" 으로 설정한다.

    테이블 생성 및 데이터는 아래 쿼리를 실행하여 생성한다.

    USE [School]
    GO
    /****** Object:  Table [dbo].[Student]    Script Date: 2021-02-24 오후 10:26:03 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Student](
    	[Idx] [int] IDENTITY(1,1) NOT NULL,
    	[Name] [varchar](50) NOT NULL,
    	[Grade] [int] NOT NULL,
     CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED 
    (
    	[Idx] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    SET IDENTITY_INSERT [dbo].[Student] ON 
    GO
    INSERT [dbo].[Student] ([Idx], [Name], [Grade]) VALUES (1, N'홍길동', 1)
    GO
    INSERT [dbo].[Student] ([Idx], [Name], [Grade]) VALUES (2, N'홍길순', 1)
    GO
    INSERT [dbo].[Student] ([Idx], [Name], [Grade]) VALUES (3, N'김철수', 2)
    GO
    INSERT [dbo].[Student] ([Idx], [Name], [Grade]) VALUES (4, N'김영희', 2)
    GO
    SET IDENTITY_INSERT [dbo].[Student] OFF
    GO
    ALTER TABLE [dbo].[Student] ADD  CONSTRAINT [DF_Student_Grade]  DEFAULT ((1)) FOR [Grade]
    GO
    

    2. EF Core Power Tools 메뉴 선택

    [EF Core Power Tools] -> [Reverse Engineer] 메뉴를 선택한다.
    * 해당 메뉴는 Visual Studio 기본 기능이 아닌, 3rd party로 제공하는 EFCore Power Tools 확장기능이다. 확장기능에 대한 설치는 https://ddochea.tistory.com/104 에서 확인가능하다.

    팝업창에서 상단의 "Add" 버튼을 선택한다. 만약 이전 단계에서 Visual Studio 서버탐색기를 이용해 DB 연결을 테스트하고 저장까지 시켰다면 드롭다운(dropdown)메뉴에 표기될 수도 있다.
    * 원할한 실습을 위해 가급적 "Add"를 하도록 하자.

    3. 연결속성 설정

    DB서버 정보 및 연결한 DB를 선택하고 확인을 누른다.

    OK를 눌러 다음단계로 넘어간다.

    4. 클래스(Class)화 시킬 테이블 선택

    사용할 테이블을 선택한 뒤 OK를 누른다.

    5. 최종설정 및 코드 성생

    DB연동 Context 클래스명을 DB연동임을 쉽게 파악할 수 있도록 "SchoolDBContext"로 변경하였다. EntityTypes 및 DbContext는 Models 하위 폴더에 생성되도록 추가입력했다. 그 외 설정은 기본값이다.

     

    OK를 누르면 코드가 자동생성된다.

     

    이번 포스트내용은 EntityFrameworkCore를 다루는게 주 목적이 아니므로, 해당 화면에 대한 별도의 설명없이 넘어가겠다.

    6. SchoolDBContext.cs 코드 수정

    이전 단계까지 정상적으로 완료했다면 Models 폴더가 생성됨과 동시에, SchoolDBContext.cs 와 Student.cs 파일이 생성될 것이다. SchoolDBContext.cs 파일을 열어 아래와 같이 수정하자.

    // <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
    using System;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.EntityFrameworkCore.Metadata;
    
    #nullable disable
    
    namespace DockerEnvTest2.Models
    {
        public partial class SchoolDBContext : DbContext
        {
            private string connString = ""; // 수정위치
            public SchoolDBContext(string connString)
            {
                this.connString = connString; // 수정위치
            }
    
            public SchoolDBContext(DbContextOptions<SchoolDBContext> options)
                : base(options)
            {
            }
    
            public virtual DbSet<Student> Student { get; set; }
    
    		// 해당 함수가 없을 수도 있다. 추가하여 아래와 같이 작성하자.
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            { 
            	// 수정위치
                if(!optionsBuilder.IsConfigured)
                {
                    optionsBuilder.UseSqlServer(connString);
                }
                base.OnConfiguring(optionsBuilder);
            }
    
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
            	// 여긴 생성한 코드 그대로 둔다.
                modelBuilder.HasAnnotation("Relational:Collation", "Korean_Wansung_CS_AS");
    
                modelBuilder.Entity<Student>(entity =>
                {
                    entity.HasKey(e => e.Idx)
                        .HasName("PK_Table_1");
    
                    entity.Property(e => e.Grade).HasDefaultValueSql("((1))");
    
                    entity.Property(e => e.Name).IsUnicode(false);
                });
    
                OnModelCreatingPartial(modelBuilder);
            }
    
            partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
        }
    }

    7. Program.cs 코드 수정

    DB 관련 작업이 끝났으므로, Main 함수를 수정할 차례이다.

    using DockerEnvTest2.Models;
    using System;
    
    namespace DockerEnvTest2
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("학생 명단 출력");
                using var db = new SchoolDBContext("Server=sql-dev;Database=School;User Id=sa;Password=yourStrong(!)Password;");
                foreach (var student in db.Student)
                {
                    Console.WriteLine($"이름 : {student.Name}, 학년 : {student.Grade}");
                }
            }
        }
    }
    

    한가지 유의할 점이 있다. SchoolDBContext 객체의 DB 연결정보를 보면 Server 값이 "localhost,2433" 가 아닌, sql-dev로 되어 있다. 지난시간에서 설정한 docker-compose를 다시 살펴보면, sql-dev는 sql server의 컨테이너명이다. 물리적으론 하나의 로컬환경에서 동작하는 것이지만, 컨테이너 관점에선 엄연히 다른 '서버'에 존재하는 것이므로 localhost로 연결할 수 없다.

     

    포트번호 또한 컨테이너 내부에선 1433을 사용하기 때문에, 2433을 명시하지 않는다.

     

    수정을 완료하고 F5를 누르거나, 상단에 "docker-compose"로 명시된 실행버튼을 누르면 아래와 같은 결과를 확인할 수 있다.

    실행결과

    만약 시작프로젝트를 "docker-compose"가 아닌, 소스 프로젝트로 설정하면 정상동작을 보장하지 않을 수 있다. 소스 프로젝트의 빌드 및 디버그 속성을 Docker가 아닌 프로젝트로 설정하면 localhost,2433으로 사용 가능하다.

     

    유의사항

    Visual Studio를 종료하면 관련 컨테이너 또한 종료된다. 지속적으로 유지가 필요한 DB환경이 필요하다면 docker 명령어를 통해 컨테이너를 생성해두고 해당 컨테이너를 사용하도록 수정해야한다.

    반응형

    댓글

Designed by Tistory.