PHP(15)
-
락 전략 with Laravel
1. 낙관적 락 (Optimistic Lock)개요낙관적 락은 데이터 충돌이 거의 발생하지 않을 것이라는 가정하에 동작합니다. 실제로 데이터를 수정할 때만 충돌을 확인합니다.사용 상황읽기 작업이 쓰기 작업보다 훨씬 많은 경우동시 수정 가능성이 낮은 경우높은 동시성이 요구되는 경우라라벨에서의 구현라라벨에는 version 컬럼을 사용하여 낙관적 락을 구현합니다.use Illuminate\Database\Eloquent\Model;class Product extends Model{ use \Illuminate\Database\Eloquent\Concerns\HasAttributes; protected $fillable = ['name', 'price', 'version'];}// 사용 예시$pro..
2024.10.21 -
[Laravel] beginTransaction, lockForUpdate 활용 (일관성, 동시성) with. ORM
[문제 상황]특정 endPoint에 거의 동시간(1초 이내 시간) 통신요청이 들어와 DB에 중복적인 데이터가 처리됨 [문제 당시 코드]단순한 upsert 코드였지만 1초 이내에 아래 로직을 실행 시 동일한 pk_id를 가진 행이 실행 수 만큼 생성이 되었습니다. $pkId], [$upsertVo]); DB::commit(); } catch (Exception $ee) { DB::rollBack(); } transaction으로 해당 로직을 묶었지만 transaction은 일관성을 유지할 뿐 선택 된 행에 대해 동시성 문제를 해결하지 못하는 상황이 연출되었습니다. [해결 코드]updateOrCreate(['pk_id' => $pkId], [$upsertVo]); ..
2024.08.12 -
DTO DAO 정리 with 라라벨
DTO와 DAO는 데이터베이스와 상호 작용하는데 사용되는 패턴입니다. DTO(Data Transfer Object) - DTO는 데이터베이스와 통신하는 데 사용되는 객체 - 속성과 그 속서에 접근하기 위한 getter / setter 메소드를 이용 - 데이터 저장 및 타입변환 기능 class UserDTO { private $id; private $name; private $email; private $age; public function __construct($id, $name, $email, $age) { $this->id = $id; $this->name = $name; $this->email = $email; $this->age = $age; } public function getId() { re..
2023.04.21 -
라라벨 서비스컨테이너와 서비스프로바이더 with DIP
서비스컨테이너(serviceContainer)란 객체를 생성하고 의존성 주입을 처리하는데 사용되는 라라벨의 기본 구성 요소입니다. 서비스 컨테이너는 라라벨 어플리케이션의 모든 객체를 인스턴스화하고 필요한 객체 간의 의존성을 자동으로 해결합니다. 이러한 기능을 수행하기 위해, 서비스 컨테이너는 객체의 클래스 이름과 생성 방법 등의 정보를 가지고 있습니다. 서비스프로바이더(serviceProvider)란 서비스 컨테이너에게 객체 생성 및 등록을 수행하는 역할을 합니다. 즉, 서비스 프로바이더는 라라벨 어플리케이션에 필요한 서비스들을 등록하고, 서비스 컨테이너가 이를 인스턴스화하고 의존성 주입을 처리할 수 있도록 지원합니다. 서비스 프로바이더는 서비스 컨테이너의 동작을 제어하는 데 사용되는 라라벨의 확장 기능..
2023.03.17 -
라라벨 가바지 컬렉션 처리
가바지 컬렉션(garbage collection : GC)은 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능을 말합니다. 라라벨은 PHP 언어를 기반으로 하며, PHP는 자체적으로 가비지 컬렉션을 처리합니다. 따라서, 라라벨에서 가비지 컬렉션을 처리하는 방법은 PHP 자체의 가비지 컬렉션 방식과 동일합니다. PHP의 가비지 컬렉션은 참조 카운트(reference counting)와 Zend Memory Manager를 기반으로 작동합니다. PHP에서는 참조하는 변수가 없을 때 메모리를 자동으로 해제하는데, 이를 참조 카운트 방식이라고 합니다. 또한, PHP의 Zend Memory Manager는 작은 크기의 객체에 대한 메모리 관리를 효율..
2023.03.17 -
Eloquent ORM 이란
Eloquent ORM 정의 Eloquent ORM 은 라라벨에서 제공하는 가볍고 사용하기 쉬운 ORM(Object-relational mapping) 으로 MVC 아키텍처에서 Model 을 담당하고 있습니다. ORM 정의와 특징 ORM(Object-relatinal mapping)이란 객체(CLASS)와 관계(RDBMS)와의 설정을 의미 합니다. 객체 지향 프로그래밍은 클래스를 사용하고 관계형 데이터 베이스는 테이블을 사용합니다. 여기서 객체 모델과 관계형 모델간에 불일치가 존재 하는데 이 객체간의 관계를 바탕으로 SQL을 자동 생성하여 불일치를 해결 하는 것이 ORM입니다. Object DB데이터 에서 매핑의 역할을 하는 것이 ORM이라 할 수 있습니다. ORM을 사용하면 SQL 에 코드에 포함시키지..
2022.12.14