(node:17836) [DEP0123] DeprecationWarning: Setting the TLS ServerName to an IP address is not permitted by RFC 6066. This will be ignored in a future version. (Use `node --trace-deprecation ...` to show where the warning was created) 데이터베이스 연결에 실패했습니다.
originalError: ConnectionError: Failed to connect to 110.10.130.21:1433 - C84E0000:error:0A0000BF:SSL routines:tls_setup_handshake:no protocols available:c:\ws\deps\openssl\openssl\ssl\statem\statem_lib.c:124:
encrypt: false로 변경함으로써 SSL/TLS 암호화를 사용하지 않게 되어 영향을 미칠 수 있습니다. 이것은 서버가 SSL/TLS 암호화를 지원하지 않을 때 문제를 해결할 수 있습니다. 하지만 보안상의 문제로 데이터 전송이 암호화되지 않게 됩니다. trustServerCertificate: true 옵션을 추가하여 서버의 인증서를 무조건 신뢰하도록 설정했습니다. 이 변경 사항으로 인해 클라이언트가 서버의 인증서를 확인하지 않고 연결을 수락하게 됩니다. 인증서가 올바르지 않거나, 자가 서명된 인증서를 사용하는 경우에도 연결에 성공할 수 있습니다. 그럼에도 불구하고 이 설정은 보안상 좋지 않은 선택이며 데이터 공격에 취약해질 수 있습니다. cryptoCredentialsDetails옵션을 수정하여 최소 TLS 버전을 'TLSv1'로 변경했습니다. 이것은 이전에 발생한 TLS 버전 불일치 문제를 해결하는 데 도움이 되었을 수 있습니다. 변경된 코드는 연결 문제를 일시적으로 해결했지만, 중요한 것은 데이터베이스와 클라이언트 사이의 전송에 암호화된 연결을 사용하도록 설정하는 것입니다. SSL/TLS를 사용하여 데이터를 암호화하고, 유효한 서버 인증서를 사용하여 서버에 대한 신뢰를 높이는 것이 좋습니다. 이러한 설정을 적용하기 위해 데이터베이스 서버 관리자와 협력하는 것이 필요할 수 있습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace WebApplication1.Controllers
{
public class HomeController : Controller
{
// GET: Home
public string Index()
{
return "My first Application!";
}
}
}
위 코드는 Home 컨트롤러에서 Index로 접속가능하게 해준다.
다음과 같은 url로 접속 가능한 이유는 App_start 폴더에 있는 Config에서 설정이 자동으로 되어 있기 때문이다.
< 컨트롤러 >
컨트롤러는 클래스,
액션은 메서드,
아이디는 매개변수라고 생각하면 된다.
새로운 컨트롤러 Board를 만들어보자.
컨트롤러 폴더에서 우클릭 + 추가를 통해 새로운 컨트롤러 생성.
namespace WebApplication1.Controllers
{
public class BoardController : Controller
{
// GET: Board
public string List(int? Id)
{
if (Id == null)
return "Error Message #1";
return "보드 리스트: " + Id.Value;
}
}
}
namespace WebApplication1.Models
{
public class Document
{
// prop 쓰고 tab을 누르면 빠르게 작성가능
public int Document_Number { get; set; }
public string Title { get; set; }
public string Writer { get; set; }
}
}
데이터의 처리를 위해 새폴더를 만들고 새로운 클래스 파일을 만들어줍니다.
namespace WebApplication1.Data
{
public class DocumentData
{
public List<Document> Documents
{
get
{
return new List<Document>
{
new Document{ Document_Number = 1, Title="공지1", Writer="홍길동"},
new Document{ Document_Number = 2, Title="공지2", Writer="임꺽정"},
new Document{ Document_Number = 3, Title="공지3", Writer="변사또"},
};
}
}
}
}
모델폴더에 데이터 처리를 위한 클래스를 새로 만들어준다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using WebApplication1.Data;
namespace WebApplication1.Models
{
public class DocumentActs
{
public List<Document> GetDocuments()
{
DocumentData documentData = new DocumentData();
var documents = documentData.Documents;
return documents;
}
}
}
그리고 보드컨트롤러로 가서 요청을 한다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using WebApplication1.Models; //추가
namespace WebApplication1.Controllers
{
public class BoardController : Controller
{
// GET: Board
public ActionResult List(int? Id)
{
if (Id == null)
return Content("Error Message #1");
DocumentActs documentActs = new DocumentActs();
var documents = documentActs.GetDocuments();
return View(documents);
}
}
}
DocumentActs documentActs = new DocumentActs();
var documents = documentActs.GetDocuments();
return View(documents);
< ViewBag & ViewData >
데이터를 전달하는 방법은 다음과 같습니다.
View(object model)
public ActionResult List()
{
DocumentActs documentActs = new DocumentActs();
var documents = documentActs.GetDocuments();
return View(documents);
}
이 경우 하나의 모델데이터만 전달할 수 있기 때문에 여러 데이터를 전달하려 한다면 한계가 있습니다.
그래서 ViewBag&ViewData가 필요합니다.
public ActionResult List()
{
DocumentActs documentActs = new DocumentActs();
MemberActs memberActs = new MemberActs();
var documents = documentActs.GetDocuments();
var member = memberActs.GetMember(1);
ViewBag.Member = member;
return View(documents);
}
View()는 한개의 매개변수만 담을 수 있으니,
ViewBag을 통해 다른 매개변수를 저장하고 사용합니다.
<p>
@ViewBag.Member.Name 님 환영합니다.
</p>
ViewData는 다음과 같이 사용할 수 있습니다.
ViewData["Members"] = member;
그리고 cshtml으로 갑니다.
@model List<WebApplication1.Models.Document>
@{
Layout = null;
var member = ViewData["Member"] as WebApplication1.Models.Member;
}
@foreach(string s in ViewBag.Arr)
{
<div>@s</div>
}
< Layout >
레이아웃을 우리말로 한다면 '배치'입니다.
프로그래밍적으로 레이아웃은 반복되는 코드, 중복되는 코드를 다시 사용할 일 없게끔 하는 것 입니다.
@RenderBody() 라는 것과 입력했던 값이 대체 된다.
<개념정리>
1. ViewBag & ViewData: 이들은 컨트롤러에서 뷰로 데이터를 전달하는 데 사용합니다. ViewData: ViewData는 Key-Value 쌍의 딕셔너리로서, TempData와 유사하지만 요청이 끝날 때 소멸됩니다. ViewData는 동적 속성을 제공하지 않으며, 문자열을 키로 사용합니다. 데이터 형식을 지정해야 되기 때문에 형식 변환이 필요할 수 있습니다. ViewBag: ViewBag은 ViewData의 래퍼이며, 동적 속성을 제공하는 데 사용됩니다. ViewBag을 이용하면 코드가 더 짧아지며, 지정된 속성에 동적으로 액세스할 수 있습니다. 형식 변환 필요성이 줄어들지만, 코드 작성 시 덜 엄격하게 체크한다는 단점이 있습니다.
2. Razor: Razor는 ASP.NET의 바인딩 구문 중 하나로, C# 또는 VB코드를 HTML 문서에 삽입하여 웹 페이지를 동적으로 생성합니다. Razor 구문은 '@' 기호로 시작하며, 다음과 같은 형식을 가집니다. '@(표현식)', '@{ ... }' 등입니다. Razor는 서버 측 코드와 클라이언트 측 코드를 명확하게 구분하여 개발자가 코드를 쉽게 작성하고 유지할 수 있도록 지원합니다.
3. Layout: Layout은 ASP.NET에서 마스터 페이지와 같은 개념으로, 공통되는 페이지 요소를 재사용하고 중복을 줄이기 위한 방법입니다. 여러 뷰에서 공유할 수 있는 베이스 페이지를 설정하고, 각 뷰에 필요한 내용만 추가하여 효율적으로 페이지 구성을 관리할 수 있습니다. Layout 페이지는 _Layout.cshtml 파일로 저장되며, 각 뷰에서 '@{ Layout = "_Layout"; }'와 같은 코드로 그것을 참조할 수 있습니다.
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace LibraryApplication.Models
{
public class Book
{
[Key]
public int Book_U { get; set; }
[DisplayName("제목")]
public string Title { get; set;}
[DisplayName("저자")]
public string Writer { get; set; }
[DisplayName("요약")]
public string Summary { get; set; }
[DisplayName("출판사")]
public string Publisher { get; set; }
[DisplayName("출판일")]
public int Published_date { get; set; }
}
}
그후 Web.config에서 다음과 같은 코드를 추가한다.
<connectionStrings>
<add name ="DBCS" connectionString="server=MSSQL_SERVER_ID; database=Library; integrated security=SSPI" providerName="System.Data.SqlClient"/>
</connectionStrings>
그리고 Context라는 폴더 생성후 클래스 LibaryDb 생성
using LibraryApplication.Models;
using System.Data.Entity;
namespace LibraryApplication.Context
{
public class LibaryDb : DbContext
{
public LibaryDb():base("name=DBCS") { }
public DbSet<Book> Books { get; set; }
}
}
자바스크립트에서는 원시 타입(primitive type)의 값은 call by value(값에 의한 호출)로 전달되고, 객체 타입(object type)은 call by reference(참조에 의한 호출)로 전달됩니다.
Call by value는 변수에 저장된 값을 복사해서 전달하는 방식입니다. 이 방식에서는 변수의 복사본이 전달되므로 함수 내부에서 전달 받은 값을 변경해도 원래 변수의 값은 변경되지 않습니다.
반면에 call by reference는 변수 자체가 전달됩니다. 이 방식에서는 해당 변수의 주소를 전달하므로 함수 내부에서 전달 받은 값을 변경하면 원래 변수의 값도 변경됩니다.
Call by value는 변수에 저장된 값을 복사해서 전달하는 방식입니다. 장점은 복사하여 처리하기 때문에 매개변수로 전달된 값이 보존되고 안전합니다. 단점으로는 복사를 하기 때문에 메모리 사용량이 늘어납니다.
call by reference는 변수 자체가 전달됩니다. 장점은 복사하지 않고 직접 참조를 하기 때문에 실행 속도가 빠릅니다. 단점은 직접 참조를 하기 때문에 원래의 값이 영향을 받습니다.
🔥꼬리질문🔥
< >
2. DDD와 MSA에 대해 설명해주세요.
DDD(Domain-Driven Design)는 도메인 주도 설계로 도메인 모델을 중심으로 설계하고 구현하는 것을 의미합니다.
도메인은 사건의 집합이라 생각하고, 여러 도메인들이 서로 상호작용하여 설계하는 것이 도메인 주도 설계입니다. DDD의 핵심은 도메인을 서비스별로 분리하는 것 입니다.
MSA(Microservice Architecture)는 서비스를 작은 단위의 마이크로서비스로 분리하여 개발하는 아키텍처 패턴입니다. 이는 각 마이크로서비스가 독립적으로 배포 및 확장 가능하도록 설계됩니다. MSA의 핵심은 설계 및 정의할 때는 그 경계를 정하는 것이 핵심입니다.
DDD와 MSA는 객체지향과 많은 관련이 있습니다. DDD와 MSA는 함께 사용하면 대규모 애플리케이션을 설계하고 개발하는 데 도움이 될 수 있습니다. DDD를 사용하면 애플리케이션의 도메인 지식을 이해하고 MSA를 사용하면 애플리케이션을 작은 서비스로 분해할 수 있습니다.