μ€νλ§ ν΅μ¬ μ리μ κ°μ λ΄μ©μ μ 리ν ν¬μ€ν μ λλ€.
λΉ μ€μ½νλ?
λ§ κ·Έλλ‘ λΉμ΄ μ‘΄μ¬ν μ μλ λ²μλ₯Ό λ»νλ€.
μ§κΈκΉμ§λ μ€νλ§ λΉμ΄ μ€νλ§ μ»¨ν μ΄λμ μμκ³Ό ν¨κ» μμ±λμ΄ μ€νλ§ μ»¨ν μ΄λκ° μ’ λ£λ λκΉμ§ μ μ§λλ€κ³ νμ΅νμλλ°, μ΄κ²μ μ€νλ§ λΉμ΄ κΈ°λ³Έμ μΌλ‘ μ±κΈν€ μ€μ½νλ‘ μμ±λκΈ° λλ¬Έμ΄λ€.
μ€νλ§μ λ€μκ³Ό κ°μ΄ λ€μν μ€μ½νλ₯Ό μ§μνλ€.
1. μ±κΈν€: κΈ°λ³Έ μ€μ½νλ‘ μ€νλ§ μ»¨ν μ΄λμ μμκ³Ό μ’ λ£κΉμ§ μ μ§λλ κ°μ₯ λμ λ²μμ μ€μ½νμ΄λ€.
2. νλ‘ν νμ : μ€νλ§ μ»¨ν μ΄λλ νλ‘ν νμ λΉμ μμ±κ³Ό μμ‘΄ κ΄κ³ μ£Όμ , μ΄κΈ°νκΉμ§λ§ κ΄μ¬νκ³ κ·Έ μ΄μ κ΄λ¦¬νμ§ μλ μ§§μ λ²μμ μ€μ½νμ΄λ€.
3. μΉ κ΄λ ¨ μ€μ½ν
3-1 request: μΉ μμ²μ΄ λ€μ΄μ€κ³ λκ° λκΉμ§ μ μ§λλ μ€μ½νμ΄λ€.
3-2 session: μΉ μΈμ μ΄ μμ±λκ³ μ’ λ£λ λκΉμ§ μ μ§λλ μ€μ½νμ΄λ€.
3-3 application: μΉμ μλΈλ¦Ώ 컨ν μ€νΈμ κ°μ λ²μλ‘ μ μ§λλ μ€μ½νμ΄λ€.
λΉ μ€μ½νλ μ»΄ν¬λνΈ μ€μΊ μλ λ±λ‘κ³Ό μλ λ±λ‘ λ κ°μ§ λ°©λ²μΌλ‘ μ§μ ν μ μλλ°, μλ λ±λ‘μ λ°©λ²μ λ€μκ³Ό κ°λ€.
@Scope("prototype")
@Component
public class HelloBean {}
νλ‘ν νμ μ€μ½ν
νλ‘ν νμ μ€μ½νμ λΉμ μ±κΈν€ μ€μ½νμ λ€λ₯΄κ² μ€νλ§ μ»¨ν μ΄λμ μ‘°νν κ²½μ°, μ€νλ§ μ»¨ν μ΄λλ νμ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μμ±ν΄ λ°ννλ€.
κ³Όμ
1. νλ‘ν νμ μ€μ½νμ λΉμ μ€νλ§ μ»¨ν μ΄λμ μμ²νλ€.
2. μ€νλ§ μ»¨ν μ΄λλ μ΄ μμ μ νλ‘ν νμ λΉμ μμ±νκ³ , νμν μμ‘΄ κ΄κ³λ₯Ό μ£Όμ νλ€.
3. μ€νλ§ μ»¨ν μ΄λλ μμ±ν νλ‘ν νμ λΉμ ν΄λΌμ΄μΈνΈμ λ°ννλ€.
4. μ΄νμ μ€νλ§ μ»¨ν μ΄λμ κ°μ μμ²μ΄ μ€λ©΄ νμ μλ‘μ΄ νλ‘ν νμ λΉμ μμ±ν΄μ λ°ννλ€.
μ€νλ§ μ»¨ν
μ΄λλ νλ‘ν νμ
λΉμ μμ±/μμ‘΄ κ΄κ³ μ£Όμ
/μ΄κΈ°νκΉμ§λ§ μ²λ¦¬νκΈ° λλ¬Έμ, νλ‘ν νμ
λΉμ κ΄λ¦¬ν μ±
μμ ν΄λΉ λΉμ λ°μ ν΄λΌμ΄μΈνΈμκ² μλ€. λ°λΌμ @PreDestroy
μ κ°μ μ’
λ£ λ©μλκ° νΈμΆλμ§ μμΌλ©° ν΄λΌμ΄μΈνΈκ° μ§μ νΈμΆν΄μΌ νλ€.
κ·Έλ°λ° νλ‘ν νμ
μ€μ½νμ λΉμ μ±κΈν€ λΉκ³Ό ν¨κ» μ¬μ©νμ λ λ¬Έμ κ° λ μ μλ μν©μ΄ μ‘΄μ¬νλ€.
μ€νλ§μ μΌλ°μ μΌλ‘ μ±κΈν€ λΉμ μ¬μ©νλ―λ‘, μ±κΈν€ λΉμ΄ νλ‘ν νμ
λΉμ μ¬μ©νκ² λλ€. κ·Έλ°λ° μ±κΈν€ λΉμ μμ± μμ μλ§ μμ‘΄ κ΄κ³ μ£Όμ
μ λ°κΈ° λλ¬Έμ, νλ‘ν νμ
λΉμ΄ μλ‘ μμ±λκΈ°λ νμ§λ§ μ±κΈν€ λΉκ³Ό ν¨κ» κ³μ μ μ§κ° λλ€.
μλ₯Ό λ€μ΄ μ±κΈν€ λΉμΈ clientBean
μ΄ μκ³ ν΄λΉ λΉμ΄ κ°μ§κ³ μλ νλ‘ν νμ
λΉμ κ°μ§κ³ μλ€κ³ κ°μ ν΄ λ³΄μ.
ν΄λΌμ΄μΈνΈλ νλ‘ν νμ
λΉμ μ΄μ©νκΈ° μν΄ clientBean
μ μ€νλ§ μ»¨ν
μ΄λμ μμ²ν΄μ λ°μ κ²μ΄λ€.
μ΄λ clientBean
μ μ±κΈν€ λΉμ΄λ―λ‘ νμ κ°μ κ°μ²΄κ° λ°νλλλ°, ν΄λΉ λΉμ΄ κ°μ§κ³ μλ νλ‘ν νμ
λΉ μμ clientBean
μ΄ μμ±λμ΄ μμ‘΄ κ΄κ³λ₯Ό μ£Όμ
νλ μμ μ μμ±λ μνμ΄λ―λ‘ ν΄λΌμ΄μΈνΈκ° μμ²μ ν λλ§λ€ μλ‘ μμ±λμ§ μλλ€.
νμ§λ§ νλ‘ν νμ
λΉμ νΉμ±μ κ³ λ €ν΄ λ³΄μμ λ, μ£Όμ
μμ μλ§ μλ‘ μμ±νλ κ²μ΄ μλ μ¬μ©ν λλ§λ€ μλ‘ μμ±ν΄μ μ¬μ©νλ κ²μ μν κ²μ΄λ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ λ°©λ²μ ν¬κ² μΈ κ°μ§κ° μλ€.
1. μ€νλ§ μ»¨ν
μ΄λμ μμ²
μ±κΈν€ λΉμ΄ νλ‘ν νμ
μ μ¬μ©ν λλ§λ€ μ€νλ§ μ»¨ν
μ΄λμ μλ‘ μμ²νλ κ²μΌλ‘, κ°μ₯ κ°λ¨ν λ°©λ²μ΄κΈ°λ νλ€.
μ΄λ κ² μμ‘΄ κ΄κ³λ₯Ό μΈλΆμμ μ£Όμ
λ°λ κ²μ΄ μλ, μ§μ νμν μμ‘΄ κ΄κ³λ₯Ό μ°Ύλ κ²μ DL(Dependency Lookup)μ΄λΌκ³ νλ€.
κ·Έλ°λ° μμ‘΄ κ΄κ³λ₯Ό μ°ΎκΈ° μν΄μλ μ€νλ§μ μ ν리μΌμ΄μ
컨ν
μ€νΈ μ 체λ₯Ό μ£Όμ
λ°μμΌ νκ³ , μ΄λ μ€νλ§ μ»¨ν
μ΄λμ μ’
μμ μΈ μ½λκ° λ¨κ³Ό λμμ λ¨μ ν
μ€νΈλ μ΄λ €μμ§μ μλ―Ένλ€.
2. ObjectFactory, ObjectProvider
μ§μ ν λΉμ 컨ν
μ΄λμμ λμ μ°Ύμμ£Όλ DL κΈ°λ₯μ μ 곡νλ κ²μ΄ λ°λ‘ ObjectProvider
μ΄λ€. ObjectProvider
λ ObjectFactory
λ₯Ό μμλ°μ μ€νΈλ¦Ό μ²λ¦¬μ κ°μ νΈμ κΈ°λ₯μ μΆκ°ν΄ λ§λ€μ΄μ§ κ²μ΄λ€.
ObjectProvider
μλ getObject()
λΌλ λ©μλκ° μ‘΄μ¬νλλ°, ν΄λΉ λ©μλλ₯Ό νΈμΆνλ©΄ λ΄λΆμμλ μ€νλ§ μ»¨ν
μ΄λλ₯Ό ν΅ν΄ ν΄λΉ λΉμ μ°Ύμμ λ°ννλ€. μ€νλ§μ΄ μ 곡νλ κΈ°λ₯μ μ¬μ©νμ§λ§ κΈ°λ₯μ΄ λ¨μνλ―λ‘, λ¨μν
μ€νΈλ₯Ό λ§λ€κ±°λ mock μ½λλ₯Ό λ§λ€κΈ°μ νκ²° μμν΄μ§λ€.ObjectProvider
λ DLμ λμ κΈ°λ₯λ§ μ 곡νκΈ° λλ¬Έμ λ¨μνκ³ , λ³λμ λΌμ΄λΈλ¬λ¦¬κ° νμ μλ€λ μ₯μ μ΄ μλ€.
3. JSR-330 Provider
ν΄λΉ λ°©λ²μ javax.inject.Provider
λΌλ JSR-330 μλ° νμ€μ μ¬μ©νλ λ°©λ²μ΄λ€. Provider
μμ get()
μ΄λΌλ λ©μλκ° μ‘΄μ¬νλλ°, λ΄λΆμμ μ€νλ§ μ»¨ν
μ΄λλ₯Ό ν΅ν΄ ν΄λΉ λΉμ μ°Ύμ λ°ννλ€.
λ³λμ λΌμ΄λΈλ¬λ¦¬κ° νμνλ€λ λ¨μ μ΄ μ‘΄μ¬νμ§λ§, μλ° νμ€μ΄λ―λ‘ μ€νλ§μ΄ μλ λ€λ₯Έ 컨ν
μ΄λμμλ μ¬μ©ν μ μλ€λ μ₯μ μ΄ μλ€.
κ·Έλ λ€λ©΄ μ€νλ§μ΄ μ 곡νλ ObjectProviderλ₯Ό μ¬μ©ν κ²μΈμ§, μλλ©΄ μλ° νμ€μΈ JSR-330 Providerλ₯Ό μ¬μ©ν κ²μΈμ§ κ³ λ―Όμ΄ λ μ μλλ° ObjectProviderλ DLμ μν νΈμ κΈ°λ₯μ λ§μ΄ μ κ³΅ν΄ μ£Όκ³ μ€νλ§ μΈμ λ³λμ μμ‘΄ κ΄κ³ μΆκ°κ° νμ μκΈ° λλ¬Έμ νΈλ¦¬νλ€.
μ½λλ₯Ό μ€νλ§μ΄ μλ λ€λ₯Έ 컨ν
μ΄λμμ μ¬μ©ν μΌμ΄ μμ κ²½μ°, ObjectProviderλ₯Ό μ¬μ©νλ©΄ λ κ²μ΄λ€.
μ°Έκ³ λ‘ ObjectProviderμ JSR-330 Providerλ νλ‘ν νμ λΏλ§ μλλΌ DLμ΄ νμν κ²½μ° μΈμ λ μ§ μ¬μ©ν μ μλ€.
μΉ μ€μ½ν
μΉ μ€μ½νλ μΉ νκ²½μμλ§ λμνλ©°, νλ‘ν νμ κ³Ό λ€λ₯΄κ² μ€νλ§μ΄ ν΄λΉ μ€μ½νμ μ’ λ£ μμ κΉμ§ κ΄λ¦¬νλ€. λ°λΌμ μ’ λ£ λ©μλκ° νΈμΆλλ€. μΉ μ€μ½ν μ€ request μ€μ½νλ HTTP μμ²μ΄ μμ λ λ‘κ·Έλ₯Ό ꡬλΆνκΈ° μν λͺ©μ μΌλ‘ μ¬μ©νκΈ°μ μ ν©νλ°, λ€μμ ν΄λΉ κΈ°λ₯μ ꡬνν μ½λμ΄λ€.
@Component
@Scope(value = "request")
public class MyLogger {
private String uuid;
private String requestURL;
public void setRequestURL(String requestURL) {
this.requestURL = requestURL;
}
public void log(String message) {
System.out.println("[" + uuid + "]" + "[" + requestURL + "] " + message);
}
@PostConstruct
public void init() {
uuid = UUID.randomUUID().toString();
System.out.println("[" + uuid + "] request scope bean create:" + this);
}
@PreDestroy
public void close() {
System.out.println("[" + uuid + "] request scope bean close:" + this);
}
}
@Service
@RequiredArgsConstructor
public class LogDemoService {
private final MyLogger myLogger;
public void logic(String id) {
myLogger.log("service id = " + id);
}
}
λ‘κ·Έλ₯Ό μΆλ ₯νκΈ° μν logic()
λ©μλκ° κ΅¬νλμ΄ μλλ°, ν΄λΉ μ½λμλ λ¬Έμ μ μ΄ μ‘΄μ¬νλ€.
μ€νλ§ μ ν리μΌμ΄μ
μ μ€ννλ μμ μ μ±κΈν€ λΉμΈ LogDemoService
λ μμ±ν΄μ μ£Όμ
μ΄ κ°λ₯νμ§λ§, request μ€μ½ν λΉμΈ MyLogger
λ μ€μ μμ²μ΄ μ€μ§ μμκΈ° λλ¬Έμ μμ§ μμ±λ μκ° μλ κ²μ΄λ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν λ°©λ²μΌλ‘ ν¬κ² λ κ°μ§κ° μλλ°, μ€μ½νμ Provider
λ₯Ό μ΄μ©νλ λ°©λ²κ³Ό μ€μ½νμ νλ‘μ
λ₯Ό μ΄μ©νλ λ°©λ²μ΄ μλ€.
μ€μ½νμ Provider
ν΄λΉ λ°©λ²μ μμ λ±μ₯ν Providerλ₯Ό μ¬μ©νλ κ²μ΄λ€.
@Service
@RequiredArgsConstructor
public class LogDemoService {
private final ObjectProvider<MyLogger> myLoggerProvider;
public void logic(String id) {
MyLogger myLogger = myLoggerProvider.getObject();
myLogger.log("service id = " + id);
}
}
ObjectProvider
λλΆμ getObject()
λ₯Ό νΈμΆνλ μμ κΉμ§ request scope λΉμ μμ±μ μ§μ°ν μ μλ€. getObject()
λ₯Ό νΈμΆνλ μμ μλ HTTP μμ²μ΄ μ§ν μ€μ΄λ―λ‘ request scope λΉμ μμ±μ΄ μ μμ μΌλ‘ μ΄λ£¨μ΄μ§λ€.getObject()
λ₯Ό 컨νΈλ‘€λ¬μ μλΉμ€μμ κ°κ° νΈμΆν΄λ, κ°μ HTTP μμ²μ΄λ©΄ κ°μ μ€νλ§ λΉμ΄ λ°νλκΈ° λλ¬Έμ κ°μ μμ²λΌλ¦¬ μλ³μ΄ κ°λ₯νλ€.
μ€μ½νμ νλ‘μ
νλ‘μ λ°©μμ μ¬μ©ν΄λ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.
@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyLogger {
}
@Service
@RequiredArgsConstructor
public class LogDemoService {
private final MyLogger myLogger;
public void logic(String id) {
myLogger.log("service id = " + id);
}
}
μμ μ½λμ proxyMode = ScopedProxyMode.TARGET_CLASS
λ₯Ό μΆκ°ν΄ μ£Όμκ³ , μλΉμ€μ μ½λλ μλ μμ±νλ λλ‘ λμκ°λ€. Scopeμ μ μ© λμμ΄ ν΄λμ€λ©΄ TARGET_CLASS
, μΈν°νμ΄μ€λ©΄ INTERFACES
λ₯Ό μ
λ ₯νλ©΄ λλ€. μ΄λ κ² νλ©΄ MyLoggerμ κ°μ§ νλ‘μ ν΄λμ€λ₯Ό λ§λ€μ΄λκ³ , HTTP μμ²μ΄ μλμ§ μ¬λΆμ μκ΄ μμ΄ κ°μ§ νλ‘μ ν΄λμ€λ₯Ό λ€λ₯Έ λΉμ 미리 μ£Όμ
ν΄ λ μ μλ€.
proxyMode = ScopedProxyMode.TARGET_CLASS
λ₯Ό μ€μ ν¨μΌλ‘μ¨, μ€νλ§ μ»¨ν
μ΄λκ° CGLIBλΌλ λ°μ΄νΈμ½λ μ‘°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ΄μ©ν΄ κ°λ°μκ° μμ±ν ν΄λμ€λ₯Ό μμλ°λ κ°μ§ νλ‘μ κ°μ²΄λ₯Ό μμ±νλ€. μλΉμ€ ν΄λμ€μ μλ MyLogger
μ ν΄λμ€λ₯Ό μ‘°νν΄ λ³΄λ©΄ μμν ν΄λμ€κ° μλμ μ μ μλ€. λ°λΌμ μ€νλ§ μ»¨ν
μ΄λμ λ±λ‘λλ myLogger
λ κ°μ§ νλ‘μ κ°μ²΄μ΄κ³ , μμ‘΄ κ΄κ³ μ£Όμ
μμ κ°μ§ νλ‘μ κ°μ²΄λ‘ μ΄λ£¨μ΄μ§λ κ²μ΄λ€.
κ°μ§ νλ‘μ κ°μ²΄μλ μμ²μ΄ μ€λ©΄ κ·Έμ μΌ λ΄λΆμμ μ§μ§ λΉμ μμ²νλ μμ λ‘μ§μ΄ λ€μ΄μλ€. μ¬κΈ°μ ν΅μ¬ μμ΄λμ΄λ κ°μ§ κ°μ²΄λ₯Ό μΈμλ μΌλ‘μ¨ μ§μ§ κ°μ²΄ μ‘°νλ₯Ό λ°λμ νμν μμ κΉμ§ λ―Έλ€λλ κ²μ΄λ€. κ·Έλ¦¬κ³ ν΄λΉ μμ΄λμ΄λ₯Ό μ λ Έν μ΄μ μ€μ λ³κ²½λ§μΌλ‘ ꡬνν μ μλ€. μ΄λ νλ‘μλ μΉ μ€μ½νκ° μλλλΌλ μ¬μ©ν μ μλ€.
μ΄λ¬ν λ°©λ²μ μ΄μ©ν΄ λ§μΉ μ±κΈν€μ μ¬μ©νλ κ²μ²λΌ ꡬνμ΄ κ°λ₯νμ§λ§, μ€μ λ‘λ λ€λ₯΄κ² λμνκΈ° λλ¬Έμ μ£Όμν΄μ μ¬μ©ν΄μΌ νλ©° μ΄λ κ² νΉλ³ν scopeλ μ μ§λ³΄μλ₯Ό μν΄ κΌ νμν κ³³μ μ΅μννμ¬ μ¬μ©νλ κ²μ΄ μ’λ€.
'Language & Framework > Spring' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μ€νλ§ MVC] μλΈλ¦Ώ (0) | 2023.01.21 |
---|---|
[μ€νλ§ MVC] μΉ μ ν리μΌμ΄μ μ΄ν΄ (0) | 2023.01.21 |
[μ€νλ§ ν΅μ¬ μ리] λΉ μλͺ μ£ΌκΈ° μ½λ°± (0) | 2023.01.10 |
[μ€νλ§ ν΅μ¬ μ리] μμ‘΄κ΄κ³ μλ μ£Όμ (2) (0) | 2022.12.21 |
[μ€νλ§ ν΅μ¬ μ리] μμ‘΄κ΄κ³ μλ μ£Όμ (1) (0) | 2022.12.21 |