dbmsv4 init...2

This commit is contained in:
최준흠 2025-12-01 21:40:27 +09:00
parent 48464e565f
commit 16ad702c5e
5 changed files with 24 additions and 26 deletions

View File

@ -9,7 +9,6 @@ use App\Models\CommonModel;
use CodeIgniter\Database\Exceptions\DatabaseException; use CodeIgniter\Database\Exceptions\DatabaseException;
use CodeIgniter\Validation\Exceptions\ValidationException; use CodeIgniter\Validation\Exceptions\ValidationException;
use RuntimeException; use RuntimeException;
use SebastianBergmann\Type\ObjectType;
/** /**
* @template TEntity of CommonEntity * @template TEntity of CommonEntity
@ -131,7 +130,6 @@ abstract class CommonService
//CURD 결과처리용 //CURD 결과처리용
protected function handle_save_result(mixed $result, int|string $uid): int|string protected function handle_save_result(mixed $result, int|string $uid): int|string
{ {
log_message('debug', $this->model->getLastQuery());
if ($result === false) { if ($result === false) {
$errors = $this->model->errors(); $errors = $this->model->errors();
$errorMsg = is_array($errors) ? implode(", ", $errors) : "DB 저장 작업이 실패했습니다."; $errorMsg = is_array($errors) ? implode(", ", $errors) : "DB 저장 작업이 실패했습니다.";
@ -164,6 +162,7 @@ abstract class CommonService
// INSERT 시 Entity의 PK는 0 또는 NULL이어야 함 (DB가 ID를 생성하도록) // INSERT 시 Entity의 PK는 0 또는 NULL이어야 함 (DB가 ID를 생성하도록)
$initialPK = $entity->getPK(); $initialPK = $entity->getPK();
$result = $this->model->save($entity); $result = $this->model->save($entity);
log_message('debug', $this->model->getLastQuery());
// 최종적으로 DB에 반영된 PK를 반환받습니다. (UPDATE이면 기존 PK, INSERT이면 새 PK) // 최종적으로 DB에 반영된 PK를 반환받습니다. (UPDATE이면 기존 PK, INSERT이면 새 PK)
$entity->{$this->model->getPKField()} = $this->handle_save_result($result, $initialPK); $entity->{$this->model->getPKField()} = $this->handle_save_result($result, $initialPK);
// handle_save_result에서 확인된 최종 PK를 사용하여 DB에서 최신 엔티티를 가져옴 // handle_save_result에서 확인된 최종 PK를 사용하여 DB에서 최신 엔티티를 가져옴
@ -221,21 +220,24 @@ abstract class CommonService
//수정용 //수정용
protected function modify_process($entity, array $formDatas): object protected function modify_process($entity, array $formDatas): object
{ {
//FormData 검증 // 검증
if (!$this->getFormService()->validate($formDatas)) { if (!$this->getFormService()->validate($formDatas)) {
throw new ValidationException(implode("\n", service('validation')->getErrors())); throw new ValidationException(
implode("\n", service('validation')->getErrors())
);
} }
//관리자 정보추가용 // 관리자 정보 추가
$formDatas['user_uid'] = $this->getAuthContext()->getUID(); $formDatas['user_uid'] = $this->getAuthContext()->getUID();
// DTO 데이터에서 PK 필드가 있다면 제거하여, fill()에서 기존 PK를 덮어쓰지 않도록 합니다. //PK 추가
$pkField = $this->model->getPKField(); $pkField = $this->model->getPKField();
if (isset($formDatas[$pkField])) { if (!isset($formDatas[$pkField]) && !empty($entity->getPK())) {
unset($formDatas[$pkField]); // original에 있는 PK 값을 attributes에 명시적으로 복사합니다.
$formDatas[$pkField] = $entity->getPK();
} }
$entity->merge($formDatas); $entity->fill($formDatas);
dd($entity);
return $this->save_process($entity); return $this->save_process($entity);
} }
final public function modify(string|int $uid, object $dto): CommonEntity final public function modify(string|int $uid, object $dto): CommonEntity
{ {
$db = \Config\Database::connect(); $db = \Config\Database::connect();

View File

@ -16,16 +16,12 @@ abstract class PartService extends CommonService
} }
abstract public function attachToServerPart(ServerPartEntity $serverPartEntity, array $formDatas = []): PartEntity; abstract public function attachToServerPart(ServerPartEntity $serverPartEntity, array $formDatas = []): PartEntity;
abstract public function detachFromServerPart(ServerPartEntity $serverPartEntity, array $formDatas = []): PartEntity; abstract public function detachFromServerPart(ServerPartEntity $serverPartEntity, array $formDatas = []): PartEntity;
final protected function updatePart($entity, array $formDatas): PartEntity
protected function modify_process($entity, array $formDatas): object
{ {
$updateResult = $this->model->update($entity->getPK(), $formDatas); $fields = array_keys($formDatas);
if ($updateResult === false || $updateResult === 0) { $this->getFormService()->setFormFields($fields);
// 업데이트 실패 시 예외 처리 $this->getFormService()->setFormRules('modify', $fields);
$errors = $this->model->errors(); return parent::modify_process($entity, $formDatas);
$errorMsg = is_array($errors) ? implode(", ", $errors) : "DB 업데이트 실패 또는 변경된 행 없음.";
throw new \Exception(__METHOD__ . ": " . $errorMsg);
}
$entity->merge($formDatas);
return $entity;
} }
} }

View File

@ -25,7 +25,7 @@ abstract class PartType1Service extends PartService
throw new \Exception("현재 사용가능 갯수[{$entity->getAvailable()}]보다 지정하신 갯수({$serverPartEntity->getCnt()})가 더 많습니다."); throw new \Exception("현재 사용가능 갯수[{$entity->getAvailable()}]보다 지정하신 갯수({$serverPartEntity->getCnt()})가 더 많습니다.");
} }
$formDatas['used'] = $entity->getUsed() + $serverPartEntity->getCnt(); $formDatas['used'] = $entity->getUsed() + $serverPartEntity->getCnt();
return $this->updatePart($entity, $formDatas); return parent::modify_process($entity, $formDatas);
} }
public function detachFromServerPart(ServerPartEntity $serverPartEntity, array $formDatas = []): PartEntity public function detachFromServerPart(ServerPartEntity $serverPartEntity, array $formDatas = []): PartEntity
{ {
@ -37,6 +37,6 @@ abstract class PartType1Service extends PartService
throw new \Exception("현재 사용된 갯수[{$entity->getUsed()}]보다 지정하신 갯수({$serverPartEntity->getCnt()})가 더 많습니다."); throw new \Exception("현재 사용된 갯수[{$entity->getUsed()}]보다 지정하신 갯수({$serverPartEntity->getCnt()})가 더 많습니다.");
} }
$formDatas['used'] = $entity->getUsed() - $serverPartEntity->getCnt(); $formDatas['used'] = $entity->getUsed() - $serverPartEntity->getCnt();
return $this->updatePart($entity, $formDatas); return parent::modify_process($entity, $formDatas);
} }
} }

View File

@ -27,7 +27,7 @@ abstract class PartType2Service extends PartService
throw new \Exception(__METHOD__ . ":에서 오류발생: {$entity->getTitle()}는 사용중입니다."); throw new \Exception(__METHOD__ . ":에서 오류발생: {$entity->getTitle()}는 사용중입니다.");
} }
//파트정보 수정 //파트정보 수정
return $this->updatePart($entity, $formDatas); return parent::modify_process($entity, $formDatas);
} }
public function detachFromServerPart(ServerPartEntity $serverPartEntity, array $formDatas = []): PartEntity public function detachFromServerPart(ServerPartEntity $serverPartEntity, array $formDatas = []): PartEntity
{ {
@ -38,6 +38,6 @@ abstract class PartType2Service extends PartService
//파트정보가져오기 //파트정보가져오기
$entity = $this->getPartEntityByServerPart($serverPartEntity); $entity = $this->getPartEntityByServerPart($serverPartEntity);
//파트정보 수정 //파트정보 수정
return $this->updatePart($entity, $formDatas); return parent::modify_process($entity, $formDatas);
} }
} }

View File

@ -26,7 +26,7 @@ abstract class PartType3Service extends PartType2Service
throw new \Exception(__METHOD__ . ":에서 오류발생: {$entity->getTitle()}는 사용중입니다."); throw new \Exception(__METHOD__ . ":에서 오류발생: {$entity->getTitle()}는 사용중입니다.");
} }
//파트정보 수정 //파트정보 수정
return $this->updatePart($entity, $formDatas); return parent::modify_process($entity, $formDatas);
} }
public function detachFromServer(ServerEntity $serverEntity, array $formDatas = []): PartEntity public function detachFromServer(ServerEntity $serverEntity, array $formDatas = []): PartEntity
@ -38,6 +38,6 @@ abstract class PartType3Service extends PartType2Service
//파트정보가져오기 //파트정보가져오기
$entity = $this->getPartEntityByServer($serverEntity); $entity = $this->getPartEntityByServer($serverEntity);
//파트정보 수정 //파트정보 수정
return $this->updatePart($entity, $formDatas); return parent::modify_process($entity, $formDatas);
} }
} }