전체 글 (46)
방명록
- [Employee Manager] 데이터를 DB에 저장해보자2024년 12월 12일 03시 35분 32초에 업로드 된 글입니다.작성자: Devrun반응형
일단 시작하기 전에 모든 결과를 보여주는 영상을 첨부했다.
궁금하면 한 번씩 보시길 바란다.
Index.cshtml
@model Employee.Models.EmployeeViewModel @{ ViewData["Title"] = "Add Employee"; } <div class="container-fluid mt-5"> <!-- Tab Header --> <ul class="nav nav-tabs" id="myTab" role="tablist"> <li class="nav-item" role="presentation"> <button class="nav-link active fs-5 fw-bold" id="tab1-tab" data-bs-toggle="tab" data-bs-target="#tab1" type="button" role="tab" aria-controls="tab1" aria-selected="true"> 직원등록 </button> </li> <li class="nav-item" role="presentation"> <button class="nav-link fs-5 fw-bold" id="tab2-tab" data-bs-toggle="tab" data-bs-target="#tab2" type="button" role="tab" aria-controls="tab2" aria-selected="false"> 직원 목록 </button> </li> <li class="nav-item" role="presentation"> <button class="nav-link fs-5 fw-bold" id="tab3-tab" data-bs-toggle="tab" data-bs-target="#tab3" type="button" role="tab" aria-controls="tab3" aria-selected="false"> 기타 </button> </li> </ul> <!-- Tab Content --> <div class="tab-content mt-2" id="myTabContent"> <!--Tab 1--> <div class="tab-pane fade show active" id="tab1" role="tabpanel" aria-labelledby="tab1-tab"> @Html.Partial("_AddEmployee") </div> <!--Tab 2--> <div class="tab-pane fade" id="tab2" role="tabpanel" aria-labelledby="tab2-tab"> <h3>Content for Tab 2</h3> <p>This is the content for the second tab.</p> </div> <!--Tab 3--> <div class="tab-pane fade" id="tab3" role="tabpanel" aria-labelledby="tab3-tab"> <h3>Content for Tab 3</h3> <p>This is the content for the third tab.</p> </div> </div> </div> 이건 메인 화면 코드이다. 여기서 PartialView를 사용해서 _AddEmployee.cshtml을 불러와서 뷰 화면에 띄운다.
@model Employee.Models.EmployeeViewModel <div class="container-fluid mt-5"> <form asp-controller="Employee" asp-action="NewEmployee" method="post"> <p class="fs-3 fw-bold">기본 정보</p> <!-- Row 1 --> <div class="row"> <div class="col-2"> <label asp-for="Employee_Name" class="form-label fw-bold">이름</label> <input asp-for="Employee_Name" type="text" class="form-control" /> <span asp-validation-for="Employee_Name" class="text-danger"></span> </div> <div class="col-2"> <label asp-for="Employee_BirthDate" class="form-label fw-bold">생년월일</label> <input asp-for="Employee_BirthDate" type="date" class="form-control" /> <span asp-validation-for="Employee_BirthDate" class="text-danger"></span> </div> <div class="col-2"> <label asp-for="Employee_Phone" class="form-label fw-bold">전화번호</label> <input asp-for="Employee_Phone" type="text" class="form-control" /> <span asp-validation-for="Employee_Phone" class="text-danger"></span> </div> <div class="col-3"> <label asp-for="Employee_Email" class="form-label fw-bold">이메일</label> <input asp-for="Employee_Email" type="email" class="form-control" /> <span asp-validation-for="Employee_Email" class="text-danger"></span> </div> </div> <!-- Address Section --> <p class="fs-3 fw-bold mt-4">주소 정보</p> <div class="row"> <div class="col-1"> <label asp-for="Address_Unit" class="form-label fw-bold">동 / 호수</label> <input asp-for="Address_Unit" type="text" class="form-control" /> <span asp-validation-for="Address_Unit" class="text-danger"></span> </div> <div class="col-3"> <label asp-for="Address_Street" class="form-label fw-bold">도로명 주소</label> <input asp-for="Address_Street" type="text" class="form-control" /> <span asp-validation-for="Address_Street" class="text-danger"></span> </div> <div class="col-2"> <label asp-for="Address_City" class="form-label fw-bold">시/군/구</label> <input asp-for="Address_City" type="text" class="form-control" /> <span asp-validation-for="Address_City" class="text-danger"></span> </div> <div class="col-2"> <label asp-for="Address_Region" class="form-label fw-bold">시/도</label> <input asp-for="Address_Region" type="text" class="form-control" /> <span asp-validation-for="Address_Region" class="text-danger"></span> </div> <div class="col-2"> <label asp-for="Address_PostalCode" class="form-label fw-bold">우편번호</label> <input asp-for="Address_PostalCode" type="text" class="form-control" /> <span asp-validation-for="Address_PostalCode" class="text-danger"></span> </div> </div> <!-- Education Section --> <p class="fs-3 fw-bold mt-5">학력</p> <div id="education-container"> <div class="row mt-3"> <!-- Education Status--> <div class="col-2"> <label class="form-label fw-bold">상태</label> <select asp-for="Education_Status" class="form-select" aria-label="Default select example"> <option selected>졸업여부</option> <option value="1">대학교 졸업</option> <option value="2">대학교 중퇴</option> <option value="3">전문대 졸업</option> <option value="4">전문대 중퇴</option> <option value="5">고등학교 졸업</option> <option value="6">고등학교 중퇴</option> <option value="7">기타</option> </select> </div> <!-- School name --> <div class="col-4"> <label class="form-label fw-bold">학교명</label> <input asp-for="Education_School" type="text" class="form-control" /> </div> <!-- Major --> <div class="col-3"> <label class="form-label fw-bold">전공</label> <input asp-for="Education_Major" type="text" class="form-control" /> </div> </div> </div> <!-- Experience Section --> <p class="fs-3 fw-bold mt-5">경력</p> <div id="experience-container"> <div class="row mt-3"> <div class="col-1"> <label class="form-label fw-bold">시작일</label> <input asp-for="StartDate" type="date" class="form-control" /> </div> <div class="col-1"> <label class="form-label fw-bold">종료일</label> <input asp-for="EndDate" type="date" class="form-control" /> </div> <div class="col-3"> <label class="form-label fw-bold">회사명</label> <input asp-for="CompanyName" type="text" class="form-control" /> </div> <div class="col-2"> <label class="form-label fw-bold">부서</label> <input asp-for="Department" type="text" class="form-control" /> </div> <div class="col-2"> <label class="form-label fw-bold">직급</label> <input asp-for="JobTitle" type="text" class="form-control" /> </div> </div> </div> <!-- Submit Section --> <div class="text-center mt-5"> <button type="reset" class="btn btn-danger fs-4 fw-bold mt-3 me-5">등록취소</button> <button type="submit" class="btn btn-primary fs-4 fw-bold mt-3">직원등록</button> </div> </form> </div> 이게 Partial View에서 보이는 내용이다.
기존에 경력 추가, 학력 추가 버튼을 제거했다. 왜냐면 자꾸 에러가 발생하는데, 이를 해결하기 위해선 며칠 더 고생해야 할 것 같다. 그렇기 때문에 일단 제외시켰다. 이전 코드와 크게 달라진 점은 없고 ASP.NET Core에서 쓰는 ASP-For를 사용해서 데이터를 전달한다.
[HttpPost] public IActionResult newEmployee(EmployeeViewModel model) { if (ModelState.IsValid) { // Employee 객체를 먼저 데이터베이스에 추가 var emp = new EmployeeModel { Employee_Name = model.Employee_Name, Employee_BirthDate = model.Employee_BirthDate, Employee_Phone = model.Employee_Phone, Employee_Email = model.Employee_Email, }; _context.Add(emp); _context.SaveChanges(); // SaveChanges 호출로 Employee_ID가 생성됨 // 생성된 Employee_ID를 사용하여 Address, Education, Career 데이터를 추가 var addr = new EmployeeAddressModel { Address_Unit = model.Address_Unit, Address_Street = model.Address_Street, Address_City = model.Address_City, Address_Region = model.Address_Region, Address_PostalCode = model.Address_PostalCode, Employee_ID = emp.Employee_ID, // 데이터베이스에서 받은 Employee_ID }; var edu = new EmployeeEducationModel { Education_Status = model.Education_Status, Education_School = model.Education_School, Education_Major = model.Education_Major, Employee_ID = emp.Employee_ID, // 데이터베이스에서 받은 Employee_ID }; var career = new EmployeeCareerModel { StartDate = model.StartDate, EndDate = model.EndDate, CompanyName = model.CompanyName, Department = model.Department, JobTitle = model.JobTitle, Employee_ID = emp.Employee_ID, // 데이터베이스에서 받은 Employee_ID }; // Address, Education, Career 데이터를 추가 _context.Add(addr); _context.Add(edu); _context.Add(career); _context.SaveChanges(); // 모든 변경사항을 데이터베이스에 저장 return RedirectToAction("Index", "Employee"); // "Index"로 리다이렉트 } return View("Index", "Employee"); } EmployeeController에서는 각 모델에 ViewModel로 받아온 데이터를 전달해준다. 그러나 여기서 주의할 것이 RDB를 사용하고 있기 때문에, 관계형을 선언하기 위해서는 Employee_ID가 필수적이다. 그렇다면 Employee 테이블을 제외한 각 테이블에 Employee_ID를 FK로 선언해 주었다. 이를 대입하기 위해서는 Employee를 먼저 생성하고 나머지 모델들의 데이터를 DB로 전송해야 에러가 생기지 않는다.
사실... 이 부분을 알고는 있었지만... 에러가 생겨서 2시간 가량을 고생했다... 프로그래밍은... 인간 친화적이지 않다...
최종적으로 모든 데이터는 DB로 전송되고, 저장된다. 맨위에서 두 번째 영상을 보면 데이터가 저장된 것을 확인할 수 있다.
다음 글에서는 데이터를 출력할 것이다.
반응형'개발기록 > 직원관리 프로그램' 카테고리의 다른 글
[EmployeeManager] 직원 리스트를 뽑아보자 (1) 2024.12.13 [직원관리 프로그램] 포트폴리오 프로젝트 시작 (1) 2024.12.11 다음글이 없습니다.이전글이 없습니다.댓글Phantom Programming 팬텀 프로그래밍1인 개발자로 자유로운 삶을 살고 싶어하는 인간의 블로그