-
ASP.NET 개발에서 DataTable은 만악의 근원입니다.프로그래밍 2024. 2. 15. 13:17
DataTable은 만악의 근원입니다.
먼저 간략하게 ASP.NET 개발의 역사에 대해 알아보자.
ASP.NET 의 시초는 ASP이며 ASP는 JSP과 동등한 레벨의 Model1 스타일의 코드를 작성하는 개발 프레임워크이다.
ASP와 JSP의 Model1은 페이지 코딩으로 ASP에서는 vb문법을 채택하고 있다.
중요한 점은 asp와 jsp 모두 페이지 중심의 개발 스타일이라는 점이다.
ASP.NET으로 발전된 이후 ASP.NET은 2가지로 분리된다.
1. ASP.NET WEBFORM
2. ASP.NET MVC
ASP.NET WEBFORM은 C# WINFORM에 기반한, 즉, CS 개발자가 접근하기 쉽게 하기위해 만들어진 프레임워크이다.
ASP.NET MVC는 이름 그대로 Model-View-Controller의 개념을 따른다.
자, 과거에 ASP.NET을 처음 접했던 사람들은 모두 WEBFORM을 기반으로 한다.
즉, Native Application 제작 했던 경험을 바탕으로 WEBFORM을 개발하게 된다.
대부분의 C# WINFORM(Native Application)은 Model, 또는 Dto라는 개념이 존재하지 않는다.
그럼 어떻게 개발할까?
대부분의 경우에 DataTable로 데이터베이스와 조회 및 삭제, 저장을 처리하게 된다.
이게 왜 문제냐?
MVC 패턴은 Model 또는 ViewModel을 강제하는 패턴이다.
따라서 WINFORM에서 시작했던 개발자는 Model이라는 개념이 생소하고 Model을 만들어가는 과정을 매우 지루하게 생각한다.
DataTable이 무엇인가? 쉽게 말하면 Dictionary, Map이며 Row와 Col로 이루어진 객체이다.
또한 DataTable이 어떻게 만들어지게 되었는지 생각해보자.
DataTable은 Winform에서 DataGridView에 최적화된 객체이다. 따라서 Winform을 위한 사실상 전용 객체나 다름없다.
또다른 문제는 DataTable사용을 MVC에서 허용하고 있다는 것이 문제다.
.NET의 가장 큰 장점이면서 가장 큰 단점이 무엇인가?
바로 하위 호환성이다.
이 하위 호환성을 유지해 주기 위해서 Winform 전용 객체나 다름없는 DataTable 사용을 허용하고 있다는 것도 문제다.
DataTable은 무겁고 UI 바인딩과 DB 속성에 모두 관여하기에 매우 무겁고 느린 객체이다.
우리가 왜 MVC 에서 Model을 만드는가?
이유 중 하나는 웹에서 응답성이 좋지 않기 때문이다.(과거에는 - 인터넷속도가 1M인 시절 -)
따라서, 웹은 가벼운 객체를 필요로 하고 JAVA는 그 부분에 최적화된 상태로 시작 했고, C#은 Winform에서 시작한 개발자들이 Webform을 거쳐 MVC로 오면서 DataTable이라는 극강의 편리함에서 벗어 나지 못한 것 이겠다.
또한 OOP 언어를 사용하면서 C스타일로 코드를 작성하는 것도 문제다.
이러한 주제, 또는 논란은 벌써 10년전에 있었다.
그럼 10년이 지나서 왜 오늘에 다시 꺼내냐고?
아직도 너무나 많은 닷넷을 사용하는 회사들이 DataTable에 의존하고 있는 것을 다시 봐서 이겠다.
자, 닷넷 개발자 들이여.
10년이 지난 시점이다. Winform도 Model을 사용할 수 있다. BindingSource를 꼭 공부해 보라.
이건 이미 닷넷2.0 시절에도 있었다.
DataTable을 사용하지 말고 제발 Model화 해라.
그리고, 우리에게는 Dapper가 있고 EF가 있다.
SqlClient의 SqlDataAdapter는 잊어라.
DataTable보다 SqlReader를 사용해라.
그리고, Model화 하는 것을 귀찮아 하는 개발자라면 이미 개발자 실격이다.
그것도 2024년에 말이다.
'프로그래밍' 카테고리의 다른 글
ASP.NET MVC에서 ASP.NET CORE MVC + WEBAPI의 여정 - 파트1 (0) 2024.02.15 로그인을 구현하시나요? 당장 Session사용을 멈추세요. (0) 2024.02.15 Why asp.net is too slow? compared to Java Spring. (0) 2024.01.09 DTO 클래스 대신 C# 레코드 사용 (0) 2023.12.03 NET 8 및 C# 12 - ref readonly 매개 변수 (1) 2023.12.03