Connected vs Disconnected

Eunho Bae·2022년 7월 1일
0

Connected vs Disconnected

Disconnected update

Update 3단계

지난 시간에 Update 과정은 3단계로 이루어진다고 배웠다.

  1. tracked entity를 얻어옴
  2. entity 클래스의 property를 변경
  3. SaveChanges 호출

설명

Update 단계가 1, 2, 3단계 연속해서 일어나지 않고, 중간에 끊기는 경우.
예를들어, 홈페이지에서 내 정보 수정을 한다고 가정해보자. 내 정보를 클릭하면 tracked entity를 가져와서 현재 내 정보를 사용자에게 뿌려줄 것이다. 그리고 사용자가 수정을 하고 적용을 하면 그제서야 Update 3단계의 나머지 과정들이 연속해서 실행된다. 즉, 2, 3단계는 1단계가 끝나자마자 진행되지 않고, 사용자 입력에 따라 나중에 진행된다는 것이다.

처리하는 두 가지 방법

Reload 방식

  public static void ShowGuilds()
        {
            using (AppDbContext db = new AppDbContext())
            {
                foreach (var guild in db.Guilds.MapGuildToDto())
                {
                    Console.WriteLine($"GuildId({guild.GuildId}) GuildName({guild.Name}) MemberCount({guild.MemberCount})");
                }
            }
        }

        public static void UpdateByReload()
        {
            Console.WriteLine("---------------------- Update By Reload -------------------");
            Console.WriteLine("Before Update");
            ShowGuilds();

            Console.Write("수정할 길드 아이디 입력 : ");
            int id = int.Parse(Console.ReadLine());
            Console.Write("수정할 길드 이름 입력 : ");
            string name = Console.ReadLine();

            using (AppDbContext db = new AppDbContext())
            {
                // 1, 2, 3단계 다시 실행
                Guild guild = db.Find<Guild>(id);
                guild.GuildName= name;
                db.SaveChanges();
            }
            Console.WriteLine("After Update");
            ShowGuilds();
        }

Disconnected update를 할때는 첫번째로 필요한 정보만 보내서 1,2,3 단계를 다시 거치는 방식이 있다.
코드에서 예를들면 서버 쪽에서 길드 id와 name을 클라쪽으로 보내주면 클라이언트에서 길드 이름만 변경해서 서버 쪽으로 넘겨주면 서버쪽에서 수정된 정보와 주키를 받아서 다시 한번 정보를 찾은 다음, 변경된 이름으로 수정하고 DB에 변경사항을 저장한다.

장점 : 최소한의 정보로 Update 가능
단점 : Read를 두 번 한다.

Full Update 방식

     public static string MakeUpdateJsonStr()
        {
            var jsonStr = "{\"GuildId\":1, \"GuildName\":\"Hello\", \"Members\":null}";
            return jsonStr;
        }

        public static void UpdateByFull()
        {
            Console.WriteLine("---------------------- Update By Full -------------------");
            Console.WriteLine("Before Update");
            ShowGuilds();
            
            string jsonStr = MakeUpdateJsonStr(); // Json 문자열을 받아온다. 모든 정보 통으로 받아옴.
            Guild guild = JsonConvert.DeserializeObject<Guild>(jsonStr); // 역직렬화

            /* 이렇게 객체를 하나 만들어서 직접 채워줘도 된다. 
            Guild guild2 = new Guild()
            {
            	GuildId = 1,
            	GuildName = "Hi"
            }
            */

            using (AppDbContext db = new AppDbContext())
            {
                db.Guilds.Update(guild); // 주키가 겹치는 애를 자동으로 찾아서 갱신
                db.SaveChanges();
            }
            Console.WriteLine("After Update");
            ShowGuilds();
        }

모든 정보를 다 보내고 받아서, 아예 entity를 다시 만들고 통으로 update하는 방식.

장점 : DB에 다시 read할 필요없이 바로 주키를 찾아서 update 가능
단점 : 모든 정보를 가져와야 한다. 따라서 보안 문제도 발생 가능. Json을 가져올때 잘못되거나 변조된 정보를 가져올 수 있다.

profile
개인 공부 정리

0개의 댓글