목차
- 테이블 생성
- Model 생성
- DI 주입
- Select, Insert , Update, Delete 생성
- 어트리뷰트(Attribute)
테이블 생성
손수 한땀 한땀 작성한 테이블 생성 쿼리다. 난 소문자가 좋더라
create table Member(
MemberSeq int primary key identity(1,1),
Name varchar(100),
Gender int,
BirthDay varchar(8),
Morph varchar(100),
Memo varchar(1000),
MotherSeq int ,
FatherSeq int,
CreateTime datetime
)
create table Growth(
MemberSeq int,
GrowthInfoJson varchar(max),
UpdateTime datetime
)
create table Payment(
MemberSeq int,
TransactionType int,
PaymentTime datetime,
Price int
)
create table Img(
MemberSeq int,
TopImg varchar(100),
LeftImg varchar(100),
RightImg varchar(100),
BackImg varchar(100),
FaceImg varchar(100),
AfarTopImg varchar(100),
AfarLeftImg varchar(100),
AfarRightImg varchar(100),
AfarBackImg varchar(100),
AfarFaceImg varchar(100),
ImgTime datetime
)
모델 생성
Table 필드 그대로 모델로 진화
public class Member
{
public Member()
{
Name = string.Empty;
BirthDay = string.Empty;
Morph = string.Empty;
Memo = string.Empty;
}
public int MemberSeq { get; set; }
public string Name { get; set; }
public int Gender { get; set; }
public string BirthDay { get; set; }
public string Morph { get; set; }
public string Memo { get; set; }
public int MotherSeq { get; set; }
public int FatherSeq { get; set; }
public DateTime CreateTime { get; set; }
}
DI 주입
DbConnection 클래스를 생성하고 전역 필드 생성
- IConfiguration : appsettings.json 파일을 읽어와서 사용할 수 있음
GetConnectoin() 메서드를 만듬, [대답해 게코] 애플리케이션의 appsettings.json 파일을 불러와서 DB 연결시키는 메서드
public class DbConnectoin
{
private readonly IConfiguration _config;
public DbConnectoin(IConfiguration config)
{
_config = config;
}
public IDbConnection GetConnection(string conn = "GeckoCareDb")
{
return new SqlConnection(_config.GetConnectionString(conn));
}
}
환경설정 파일이고 Logging은 Defalut 값이고 밑에 Connection 부분이 추가한 값임
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"ConnectionStrings": {
"GeckoCareDb": "Server=127.0.0.1;Database=test;Trusted_Connection=True"
}
}
다시 GetConnection 메서드는 appsettings.json 파일에서 "GeckoCareDb" 값을 불러와서 연결 시키는 메서드
자! 이제 DbConnection 클래스를 DI 주입 할 거임
[대답해 게코] 애플리케이션 program.cs 에다가 아래처럼 추가 할거임
"builder.Services.AddScoped<DbConnectoin>();" 이부분
DI는 클래스 내부가 아닌 외부에서 객체를 생성한 후 그 객체를 제공하는 기술
using Gecko_Care.Util;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddScoped<DbConnectoin>();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Select , Insert , Update , Delete
앞전에 DI를 통해 DbConnectoin 클래스를 주입 받았다. 주입 받은 클래스의 GetConnection() 메서드를 통해 DB 연결 까지 적용한 코드
private readonly DbConnectoin _dbContext;
public DataController(DbConnectoin dbContext)
{
_dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
}
[HttpGet]
public async Task<IActionResult> SelectMember(string name)
{
try
{
using IDbConnection db = _dbContext.GetConnection();
IEnumerable<Member> memberResult = await db.QueryAsync<Member>(Query.Query.SelectMember, new { name });
if (memberResult.Count() > 0)
{
return Ok(memberResult);
}
else
{
return BadRequest("Failed Select");
}
}
catch (Exception ex)
{
return BadRequest($"Error: {ex.Message}");
}
}
[HttpPost]
public async Task<IActionResult> InsertMember(Member member)
{
try
{
using IDbConnection db = _dbContext.GetConnection();
int result = await db.ExecuteAsync(Query.Query.InsertMember, new { member.Name, member.Gender, member.BirthDay, member.Morph, member.Memo, member.MotherSeq, member.FatherSeq });
if (result > 0)
{
return Ok("Good Insert");
}
else
{
return BadRequest("Failed Insert");
}
}
catch (Exception ex)
{
return BadRequest($"Error: {ex.Message}");
}
}
[HttpPut]
public async Task<IActionResult> UpdateMember(Member member)
{
try
{
using IDbConnection db = _dbContext.GetConnection();
int result = await db.ExecuteAsync(Query.Query.UpdateMember, new { member.Name, member.Gender, member.BirthDay, member.Morph, member.MotherSeq, member.FatherSeq, member.MemberSeq });
if (result > 0)
{
return Ok("Good Update");
}
else
{
return BadRequest("Failed Update");
}
}
catch (Exception ex)
{
return BadRequest($"Error: {ex.Message}");
}
}
[HttpDelete]
public async Task<IActionResult> DeleteMember(int seq)
{
try
{
using IDbConnection db = _dbContext.GetConnection();
int result = await db.ExecuteAsync(Query.Query.DeleteMember, new { seq });
if (result > 0)
{
return Ok("Good Delete");
}
else
{
return BadRequest("Failed Delete");
}
}
catch (Exception ex)
{
return BadRequest($"Error: {ex.Message}");
}
}
어트리뷰트(Attribute)
- .NET에서 컴파일, 런타임시 특성이나 동작을 갖는지 제어하는데 사용
- 대괄호 안에 작성되며 이를 통해 요소에 관련된 정보를 제공하거나 특정한 동작을 부여 할 수 있음
아래 빨간색으로 표시한 부분이 어트리뷰트
- [HttpGet] => 데이터 조회
- [HttpPost] => 데이터 생성
- [HttpPut] => 데이터 수정
- [HttpDelete] => 데이터 삭제
이 처럼 메서드 상단에 어트리뷰트를 선언해주면 .NET 에서 해당 메서드의 용도를 어트리뷰트로 정의 합니다.
그러면 [HttpGet] 어트리뷰트를 2개 이상 사용해야 할 때는 어떻게 해야 할까
아래 처럼 어트리뷰트에 라우팅 값을 설정해주면 된다.
[HttpGet] 뿐만이 아니고 나머지 어트리뷰트에도 사용 가능하다.
'Project > 대답해 게코' 카테고리의 다른 글
[대답해 게코] API 호출 (0) | 2023.08.07 |
---|---|
[대답해 게코] 프로젝트 소개 및 ERD (0) | 2023.08.01 |