일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- max MySQL
- 자바스크립트 배열 할당
- python tkinter 인터페이스
- 맥 mysql
- 맥 아파치
- 닐 스미스 지음
- 블록 스코프
- 제이쿼리연결
- 한글입력 안됨
- 자바스크립트 객체 만들기
- max apache
- jquery 사용하기
- 한글입력 잘림
- 한글잘림
- 제이펍 출판
- 객체지향
- 황반석 옮김
- 자바스크립트 객체
- 한글입력 오류
- SwiftUI 기반의 iOS 프로그래밍
- 한글입력 씹힘
- 배열 분해 할당
- 기획자랑 사이좋게 지내고 싶다
- 생활코딩
- 자바스크립트
- 핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍
- 자바스크립트 class
- 객체
- python GUI 사용하기
- 비주얼스튜디오 코드
Archives
- Today
- Total
반응형
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- max MySQL
- 자바스크립트 배열 할당
- python tkinter 인터페이스
- 맥 mysql
- 맥 아파치
- 닐 스미스 지음
- 블록 스코프
- 제이쿼리연결
- 한글입력 안됨
- 자바스크립트 객체 만들기
- max apache
- jquery 사용하기
- 한글입력 잘림
- 한글잘림
- 제이펍 출판
- 객체지향
- 황반석 옮김
- 자바스크립트 객체
- 한글입력 오류
- SwiftUI 기반의 iOS 프로그래밍
- 한글입력 씹힘
- 배열 분해 할당
- 기획자랑 사이좋게 지내고 싶다
- 생활코딩
- 자바스크립트
- 핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍
- 자바스크립트 class
- 객체
- python GUI 사용하기
- 비주얼스튜디오 코드
Archives
- Today
- Total
java,javascript,android,php,sql,공부용,메모용
라라벨7 - 서비스 컨테이너, 바인드와 리졸브 본문
반응형
🟢 라라벨 서비스 컨테이너 정리
1️⃣ 서비스 컨테이너란?
- 라라벨에서 객체 생성과 의존성 관리를 담당하는 핵심 기능
- 쉽게 말하면 “객체 공장 + 객체 저장소”
- 클래스 인스턴스를 직접 new로 만들지 않고, 컨테이너에 등록해두고 필요할 때 꺼내 쓸 수 있음.
💡 예시 코드
class FooLogger {
public function log($message) {
echo "[LOG] " . $message;
}
}
// 바인드 (등록)
app()->bind('logger', function() {
return new FooLogger();
});
// 리졸브 (사용)
$logger = app()->make('logger');
$logger->log("서비스 컨테이너 사용 예시");
- bind → 컨테이너에 “레시피” 등록
- make → 컨테이너가 “레시피를 사용해 객체 생성”
2️⃣ 바인드와 리졸브
🔹 개념
용어의미
바인드(Bind) | 컨테이너에 객체 생성 방법(레시피)을 등록 |
리졸브(Resolve) | 등록된 방법대로 객체를 만들어 꺼내 쓰는 과정 |
🔹 예시 (Logger)
// 1. 바인드
app()->bind('FooLogger', function() {
return new FooLogger();
});
// 2. 리졸브
$logger = app()->make('FooLogger');
$logger->log('로그 출력 완료');
- 매번 make를 호출할 때마다 새로운 인스턴스가 생성됨 (bind의 기본 동작)
3️⃣ 바인드(Bind) 관련 메서드
(1) bind() 메서드
- 컨테이너에 객체 생성 방법(클로저) 등록
- 매번 새로운 인스턴스 생성
app()->bind('Number', function() {
return new Number(0);
});
$num = app()->make('Number'); // 새 객체 반환
(2) bindIf() 메서드
- 같은 이름이 이미 등록되어 있으면 무시
- 예:
app()->bindIf('Number100', function() {
return new Number(100);
});
app()->bindIf('Number100', function() {
return new Number(200);
});
$num = app()->make('Number100');
echo $num->getNumber(); // 100
(3) singleton() 메서드
- 최초 생성 후 동일 인스턴스 재사용
app()->singleton('FooLogger', function() {
return new FooLogger();
});
$logger1 = app()->make('FooLogger');
$logger2 = app()->make('FooLogger');
var_dump($logger1 === $logger2); // true
(4) instance() 메서드
- 이미 생성한 인스턴스를 컨테이너에 등록
$logger = new FooLogger();
app()->instance('logger', $logger);
$resolvedLogger = app()->make('logger');
var_dump($logger === $resolvedLogger); // true
- 주로 테스트 더블이나 런타임 생성 객체 공유에 사용
(5) alias / 문자열을 이용한 리졸브 처리
- 한 이름을 다른 이름으로 매핑 가능
- 예:
app()->bind('A', 'B');
app()->bind('B', function() {
return new FooLogger();
});
$logger = app()->make('A'); // 실제로는 B의 객체 반환
🔹 복잡한 객체 바인드
- 의존성이 있는 객체도 컨테이너가 자동 생성 가능
class UserService {
protected $logger;
public function __construct(FooLogger $logger) {
$this->logger = $logger;
}
}
app()->bind('UserService', function($app) {
return new UserService($app->make('FooLogger'));
});
🔹 바인드 정의 위치
- 일반적으로 AppServiceProvider의 register() 메서드에서 등록
public function register() {
$this->app->bind('FooLogger', function() {
return new FooLogger();
});
}
4️⃣ 리졸브(Resolve)
(1) make() 메서드
- 컨테이너에 등록된 이름을 통해 객체 생성/리턴
$logger = app()->make('FooLogger');
$logger->log('Hello!');
(2) app() 헬퍼 함수
- app()->make() 와 동일하게 사용 가능
$logger = app('FooLogger');
$logger->log('헬퍼로 리졸브');
🔹 바인드되지 않은 문자열 리졸브
- 등록되지 않은 클래스 이름도 자동으로 인스턴스 생성 가능 (의존성 주입 포함)
class Example {
public function hello() {
echo "Hello";
}
}
$example = app()->make(Example);
$example->hello(); // Hello
✅ 요약
메서드동작특징
bind() | 요청 시 새 객체 생성 | 매번 새로운 인스턴스 |
bindIf() | 기존 등록이 없을 때만 바인드 | 이미 등록되면 무시 |
singleton() | 최초 생성 후 동일 인스턴스 반환 | 공유 객체 |
instance() | 이미 생성한 인스턴스를 등록 | 테스트/런타임 객체 공유 |
make() / app() | 컨테이너에서 객체 생성 | 자동 의존성 주입 가능 |
2️⃣ 라라벨 서비스 컨테이너
- 서비스 컨테이너란?
- 객체 생성과 의존성 관리를 담당하는 “객체 공장 + 객체 저장소”
- 바인드(bind)와 리졸브(resolve)
- 바인드 → 컨테이너에 객체 생성 방법 등록
- 리졸브 → 등록된 방법대로 객체 생성 및 반환
- 주요 메서드 특징
메서드역할 한 줄 요약
bind() | 요청할 때마다 새 객체 생성 |
bindIf() | 등록이 안 되어 있을 때만 객체 생성 |
singleton() | 최초 생성 후 동일 객체 재사용 |
instance() | 이미 생성된 객체를 등록, 공유 |
make() / app() | 컨테이너에서 객체 꺼내기, 의존성 자동 주입 가능 |
💡 핵심 한 문장 요약:
“필요할 때 컨테이너가 객체를 만들어주고, 상황에 따라 새로 만들거나 이미 있는 걸 재사용한다.”
🔹 서비스 컨테이너 쉽게 이해
- bind() → 매번 새 요리 만들기: 요청할 때마다 새로운 요리 제공
- singleton() → 대형 냉장고에 요리 저장: 처음 만든 요리를 계속 제공
- instance() → 이미 만든 요리 등록: 미리 만들어 둔 요리를 바로 사용
- make() / app() → 요리사에게 재료/요리 요청: 필요한 객체를 꺼내 사용
- bindIf() → 이미 저장된 요리 있으면 새로 만들지 않음
💡 한 줄 요약:
“컨테이너는 객체 요리사. 필요할 때 새로 만들거나, 이미 만들어진 걸 꺼내준다.”
🟢 라라벨 라이프사이클 vs 서비스 컨테이너
구분역할이해하기 쉬운 비유핵심 요약
구분 | 역할 | 이해하기 쉬운 비유 | 핵심 요약 |
서비스 컨테이너 | 객체 생성과 의존성 관리, 필요할 때 객체를 제공 | 요리사와 주방 창고: 요리사가 필요한 재료를 창고에서 꺼내 사용 | 필요한 객체를 컨테이너에 등록(bind) → 요청 시 꺼내 쓰기(make/app) |
반응형
'개발 > php' 카테고리의 다른 글
라라벨 6 - 라이프 사이클 정리, 엔트리포인트 (HTTP요청 기준 내용) (0) | 2025.10.15 |
---|---|
라라벨 5 - 메인(홈) 화면, 회원가입, 로그인, 로그아웃, 메일보내기 (0) | 2025.10.10 |
라라벨4 app/Providers 폴더 안에 내용이 없음 관련 (0) | 2025.09.30 |
맥북 Mac Homestead 환경: SSH 키 생성 → Vagrant 실행 → SSH 접속 (0) | 2025.09.15 |
라라벨 3 - 맥북 라라벨 개발 환경 구축: Sail & Homestead 설치 가이드 메모 (0) | 2025.09.15 |
Comments