- Today
- Total
- pytorch
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- database
- ์์์ ๋ ฌ
- Algorithm
- tree
- ์๋ฐ
- CS
- ๊ตฌํ
- ์๋ฐ์์ ์
- ๋ฐฑ์๋
- MST
- array
- ๋ฌธ๋ฒ
- ๋ฐฑ์ค
- Graph
- ์๋ฃ๊ตฌ์กฐ
- ์กธ์ ์ํ
- dp
- BFS
- ๋ฒจ๋งํฌ๋
- leetcode
- spring
- ๋ค์ต์คํธ๋ผ
- ๊ทธ๋ฆฌ๋
- ์ธํด
- PS
- java
- ํ๋ก๊ทธ๋๋จธ์ค
- OOP
Partially Committed
[Spring] ์ฑ๊ธํค ์ปจํ ์ด๋ ๋ณธ๋ฌธ
์ฑ๊ธํค ์ปจํ ์ด๋
# ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ฑ๊ธํค
- ์คํ๋ง์ ๊ธฐ์ ์ฉ ์จ๋ผ์ธ ์๋น์ค ๊ธฐ์ ์ ์ง์ํ๊ธฐ ์ํด ํ์ํจ.
- ๋๋ถ๋ถ์ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฉฐ, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณดํต ์ฌ๋ฌ ๊ณ ๊ฐ๋ค์ด ๋์์ ์์ฒญ์ ํจ.
@Configuration
public class AppConfig {
@Bean
public MemberService memberService(){
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService(){
return new OrderServiceImpl(
memberRepository(),
discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
//return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
์์ ๊ฐ์ด DI ์ปจํ ์ด๋๋ฅผ ์์ฑํ์์ ๋, 3 ๋ช ์ ํด๋ผ์ด์ธํธ๊ฐ memberService ๋ฅผ ์์ฒญํ๋ ์ํฉ์ ๊ฐ์ ํด๋ณด์. ์์ฒญ์ด ๋ค์ด์ค๋ฉด DI ์ปจํ ์ด๋(AppConfig)๋ ๊ฐ๊ฐ ๋ค๋ฅธ memberService ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ณ ๊ฐ์ ์์ฒญ์ด ๊ณ์ ๋ฐ์ํ๋๋ฐ, ์์ฒญ์ด ๋ฐ์ํ ๋ ๋ง๋ค ๊ณ์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค. (๋ฌธ์ ์ )
package hello.core.singleton;
import hello.core.AppConfig;
import hello.core.member.MemberService;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
public class SingletonTest {
@Test
@DisplayName("์คํ๋ง ์๋ ์์ํ DI ์ปจํ
์ด๋")
void pureContainer(){
AppConfig appConfig = new AppConfig();
// 1. ์กฐํ : ํธ์ถํ ๋ ๋ง๋ค ๊ฐ์ฒด๋ฅผ ์์ฑ
MemberService memberService1 = appConfig.memberService();
MemberService memberService2 = appConfig.memberService();
// ์ฐธ์กฐ๊ฐ์ด ๋ค๋ฅธ ๊ฒ์ ํ์ธํด๋ณด์
System.out.println("memberService1 = " + memberService1);
System.out.println("memberService2 = " + memberService2);
Assertions.assertThat(memberService1).isNotSameAs(memberService2);
}
}
์ ํ ์คํธ ์ฝ๋๋ฅผ ์คํ ์, ์๋์ ๊ฐ์ด ๊ฐ๊ฐ์ MemberService ๊ฐ์ฒด๋ ์ฐธ์กฐ๊ฐ์ด ๋ค๋ฅธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
memberService1 = hello.core.member.MemberServiceImpl@ba2f4ec
memberService2 = hello.core.member.MemberServiceImpl@1c1bbc4e
์กฐํ ์์ฒญ์ด ๋ค์ด์ฌ ๋ ๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ฃผ์ด์ผ ํ๋ฏ๋ก ์ด๊ฒ์ด JVM ๋ฉ๋ชจ๋ฆฌ์ ์์ด๋ ๊ตฌ์กฐ์ด๋ค. (๋นํจ์จ์ ) ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด ๋์ฑ ์์ข์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ ์์ ๊ฒ! ๊ณ ๊ฐ ํธ๋ํฝ์ด ์ด๋น 100 ์ด๋ผ๊ณ ๊ฐ์ ํ๋ฉด, ์ด๋น 100 ๊ฐ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ์๋ฉธ๋ ๊ฒ์ด๋ค.(๋ฉ๋ชจ๋ฆฌ ๋ญ๋น)
>> ํด๋น ๊ฐ์ฒด๊ฐ ๋ฑ 1๊ฐ๋ง ์์ฑ๋๊ณ , ๊ณต์ ํ๋๋ก ์ค๊ณํ๋ฉด ํด๊ฒฐ์ด ๊ฐ๋ฅํ๋ฉฐ ์ด๋ฅผ ์ฑ๊ธํค ํจํด(singleton pattern) ์ด๋ผ๊ณ ํ๋ค.
# ์ฑ๊ธํค ํจํด (Singleton Pattern)
- ์ฑ๊ธํค ํจํด์ด๋ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋ฑ ํ ๊ฐ๋ง ์์ฑ๋๋ ๊ฒ์ ๋ณด์ฅํ๋ ๋์์ธ ํจํด์ด๋ค.
- ์ด๋ฅผ ์ํด์๋ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ 2๊ฐ ์ด์ ์์ฑ๋์ง ๋ชปํ๋๋ก ๋ง์์ผ ํ๋ค.
>> private ์์ฑ์๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ์์ ์์๋ก new ํค์๋๋ฅผ ์ด์ฉํ์ง ๋ชปํ๋๋ก ๋ง์ผ๋ฉด ๋๋ค.
>> ์๋ ์์ ์ฝ๋๋ฅผ ๋ณด์.
package hello.core.singleton;
public class SingletonService {
private static final SingletonService instance = new SingletonService();
// static ์ผ๋ก ์ ์ธํจ์ผ๋ก์จ ํด๋์ค level ์ ์กด์ฌํ๋ฏ๋ก ๋จ ํ ๊ฐ๋ง ์กด์ฌํจ.
// 1. static ์์ญ์ ๊ฐ์ฒด๋ฅผ ๋ฑ 1๊ฐ๋ง ์์ฑํด๋๋ค.
public static SingletonService getInstance(){
return instance;
}
// 2. public ์ผ๋ก ์ด์ด์ ๊ฐ์ฒด ์ธ์คํด์ค๊ฐ ํ์ํ๋ค๋ฉด ์ด static ๋ฉ์๋๋ฅผ ํตํด์๋ง ์กฐํํ๋๋ก ํ์ฉ.
private SingletonService(){
}
// 3. ์์ฑ์๋ฅผ private ์ผ๋ก ์ ์ธํด์ ์ธ๋ถ์์ new ํค์๋๋ฅผ ์ฌ์ฉํ ๊ฐ์ฒด ์์ฑ์ ๋ชปํ๊ฒ ๋ง์.
public void logic(){
System.out.println("์ฑ๊ธํค ๊ฐ์ฒด logic ํธ์ถ");
}
}
- ์์ ๊ฐ์ด static ์์ญ์ ๊ฐ์ฒด instance ๋ฅผ ๋ฏธ๋ฆฌ ํ๋ ์์ฑํด๋์ด์ ์ฌ๋ ค๋๋ค.
- ํด๋น ๊ฐ์ฒด๊ฐ ํ์ํ๋ฉด getInstance() ๋ฉ์๋๋ก๋ง ์กฐํ๊ฐ ๊ฐ๋ฅํ๋ค. ์ด๋ก๋ถํฐ ํญ์ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ฐํ๋ฐ์ ์ ์๋ค.
- ์ค์ง 1 ๊ฐ์ ๊ฐ์ฒด ์ธ์คํด์ค๋ง ์กด์ฌํด์ผ ํ๋ฏ๋ก, ์์ฑ์๋ฅผ private ์ผ๋ก ๋ง์์ ํน์๋ผ๋ ์ธ๋ถ์์ new ํค์๋๋ก ๊ฐ์ฒด ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
>> ์๋ ํ ์คํธ ์ฝ๋๋ฅผ ๋ณด์
@Test
@DisplayName("์ฑ๊ธํค ํจํด์ ์ ์ฉํ ๊ฐ์ฒด ์ฌ์ฉ")
void singletonServiceTest(){
SingletonService singletonService1 = SingletonService.getInstance();
SingletonService singletonService2 = SingletonService.getInstance();
System.out.println("singletonService1 = " + singletonService1);
System.out.println("singletonService2 = " + singletonService2);
Assertions.assertThat(singletonService1).isSameAs(singletonService2);
}
singletonService1 = hello.core.singleton.SingletonService@2cd76f31
singletonService2 = hello.core.singleton.SingletonService@2cd76f31
Process finished with exit code 0
- ์์ ๊ฐ์ด Singleton pattern ์ ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๋ฒ ํธ์ถํ์ฌ๋ ํญ์ ๊ฐ์ ๊ฐ์ฒด๊ฐ ๋ฐฉ์ง๋๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- Spring ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด, ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ singleton ์ผ๋ก ๋ง๋ค์ด์ ๊ด๋ฆฌํด์ค๋ค!
- ์ฑ๊ธํค ํจํด์ ์ ์ฉํ๋ฉด ์ด๋ฏธ ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ฅผ ๊ณต์ ํด์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ์ง๋ง ์๋์ ๋ฌธ์ ์ ์ด ์กด์ฌํ๋ค.
<์ฑ๊ธํค ํจํด์ ๋ฌธ์ ์ >
- ์ฑ๊ธํค ํจํด์ ๊ตฌํํ๋ ์ฝ๋ ์์ฒด๊ฐ ๋ง์ด ๋ค์ด๊ฐ๋ค.
- ์์กด๊ด๊ณ ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌ์ฒด ํด๋์ค์ ์์กดํ๊ฒ ๋์ด, DIP ๋ฅผ ์๋ฐ.
- ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌ์ฒด ํด๋์ค์ ์์กดํด์ OCP ์์น์ ์๋ฐํ ๊ฐ๋ฅ์ฑ์ด ์๊ธด๋ค.
- ํ ์คํธ ํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
- ๋ด๋ถ ์์ฑ์ ๋ณ๊ฒฝ/์ด๊ธฐํ ํ๊ธฐ์ ๊น๋ค๋กญ๋ค.
- private ์์ฑ์๋ก ์์ ํด๋์ค๋ฅผ ๋ง๋ค๊ธฐ ์ด๋ ต๋ค.
- ์ ์ฐ์ฑ์ด ๋จ์ด์ ธ์, ์ํฐ ํจํด์ด๋ผ๊ณ ๋ถ๋ฆฌ๊ธฐ๋ ํ๋ค.
>> ์คํ๋ง ์ปจํ ์ด๋๋ ์์ ๊ฐ์ ์ฑ๊ธํค ํจํด์ ์ ๋ถ ํด๊ฒฐํ๋ฉด์๋ ๊ฐ์ฒด๋ฅผ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌํ๋ค.
# ์ฑ๊ธํค ์ปจํ ์ด๋
- ์คํ๋ง ๋น์ด ๋ฐ๋ก ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌ๋๋ ๋น์ด๋ค.
- ์คํ๋ง ์ปจํ ์ด๋๋ ์ฑ๊ธํค ํจํด์ ์ ์ฉํ์ง ์์๋ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌํด์ค๋ค. ์ปจํ ์ด๋๋ ๊ฐ์ฒด ํ๋๋ง ์์ฑํด์ ๊ด๋ฆฌํ๋ค. ์คํ๋ง ์ปจํ ์ด๋๋ ์ฑ๊ธํค ์ปจํ ์ด๋ ์ญํ ์ ํ๋ฉฐ, ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ฑ๊ธํค ๋ ์ง์คํธ๋ฆฌ๋ผ๊ณ ํ๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ ๋๋ถ์ ์ฑ๊ธํค ํจํด์ ๋จ์ ์ ํด๊ฒฐํ๋ฉฐ, ๊ฐ์ฒด๋ฅผ ์ฑ๊ธํค์ผ๋ก ์ ์งํ ์ ์๊ฒ ํด์ค๋ค.
- ์ฑ๊ธํค ํจํด์ ์ํ ๋ถ๊ฐ์ ์ธ ์ฝ๋๊ฐ ํ์ํ์ง ์์ผ๋ฉฐ DIP, OCP, ํ ์คํธ, private ์์ฑ์๋ก๋ถํฐ ์์ ๋กญ๊ฒ ์ฑ๊ธํค์ ์ฌ์ฉํ ์ ์๋ค.
>> ์๋์ ํ ์คํธ ์ฝ๋๋ฅผ ๋ณด์
@Test
@DisplayName("์คํ๋ง ์ปจํ
์ด๋์ ์ฑ๊ธํค")
void springContainer() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
// 1. ์กฐํ : ํธ์ถํ ๋ ๋ง๋ค ๊ฐ์ฒด๋ฅผ ์์ฑ
MemberService memberService1 = ac.getBean("memberService", MemberService.class);
MemberService memberService2 = ac.getBean("memberService", MemberService.class);
// ์ฐธ์กฐ๊ฐ์ด ๊ฐ์ ๊ฒ์ ํ์ธํด๋ณด์
System.out.println("memberService1 = " + memberService1);
System.out.println("memberService2 = " + memberService2);
Assertions.assertThat(memberService1).isSameAs(memberService2);
}
์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ ๋๋ถ์ ๊ณ ๊ฐ์ ์์ฒญ์ด ๋ค์ด์ฌ ๋ ๋ง๋ค, ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋ ์ด๋ฏธ ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ฅผ ๊ณต์ ํด์ ํจ์ฌ ํจ์จ์ ์ผ๋ก ์ฌ์ฌ์ฉํ ์ ์๋ค.
* ์คํ๋ง์ ๊ธฐ๋ณธ ๋น ๋ฑ๋ก ๋ฐฉ์์ ์ฑ๊ธํค์ด๊ธฐ๋ ํ๋ ๋ค์ํ ๋ฐฉ์์ ์ ๊ณตํ๋ค. ์์ฒญ์ด ๋ค์ด์ฌ ๋ ๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ฐํํ๋ ๊ธฐ๋ฅ ๋ํ ์ ๊ณตํ๋ฉฐ, ์ด๋ ์ดํ์ ๋น ์ค์ฝํ์์ ๊ณต๋ถํ๋๋ก ํ์!
# ๐ง ์ฑ๊ธํค ๋ฐฉ์์ ์ฃผ์์
- ์ฑ๊ธํค ํจํด์ ์ ์ฉํ๋ ์ฑ๊ธํค ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ ์ด์ฐ๋์๋ ๊ฐ์ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ํ๋๋ง ์์ฑํ๋ ๋ฐฉ์์ด ๋ฐ๋ก ์ฑ๊ธํค ํจํด์ด๋ค. ์ด๋ฌํ ์ฑ๊ธํค ๋ฐฉ์์ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๊ฐ ํ๋์ ๊ฐ์ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ์ฑ๊ธํค ๊ฐ์ฒด๋ ์ํ๋ฅผ ์ ์ง(stateful)ํ๊ฒ ์ค๊ณํ๋ฉด ์๋๋ค. stateless ํ๋๋ก ์ค๊ณํด์ผ ํ๋๋ฐ, ์ด๋ฅผ ์ํด์ ์๋ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
(1) ํน์ ํด๋ผ์ด์ธํธ์ ์์กด์ ์ธ ํ๋๊ฐ ์์ผ๋ฉด ์๋๋ค.
(2) ํน์ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ํ๋๊ฐ ์์ผ๋ฉด ์๋๋ค.
(3) ๊ฐ๊ธ์ ์ด๋ฉด ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํด์ผ ํ๋ค.
(4) ํ๋ ๋์ ์ ์๋ฐ์์ ๊ณต์ ๊ฐ ๋์ง ์๋ ์ง์ญ ๋ณ์, ํ๋ผ๋ฏธํฐ, ThreadLocal ๋ฑ์ ์ฌ์ฉํด์ผ ํ๋ค.
๐์คํ๋ง ๋น์ ํ๋์ ๊ณต์ ๊ฐ์ ์ค์ ํ๋ฉด ํฐ ์ฅ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์๋ ์์๋ฅผ ๋ณด์!
package hello.core.singleton;
public class StatefulService {
private int price; // ์ํ๋ฅผ ์ ์งํ๋ ํ๋
public void order(String name, int price){
System.out.println("name = " + name + " price = " + price);
this.price = price; // <-- ์ฌ๊ธฐ์์ ๋ฌธ์ ๊ฐ ๋ฐ์!
}
public int getPrice(){
return price;
}
}
์์ ๊ฐ์ด StatefulService ํด๋์ค๋ฅผ ์ ์ธํ๊ณ ์๋์ ๊ฐ์ด ํ ์คํธ ์ฝ๋๋ฅผ ๋ง๋ค์๋ค.
package hello.core.singleton;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
class StatefulServiceTest {
@Test
void statefulServiceTest(){
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
StatefulService statefulService1 = ac.getBean(StatefulService.class);
StatefulService statefulService2 = ac.getBean(StatefulService.class);
// ThreadA : A ์ฌ์ฉ์๊ฐ 10000 ์ ์ฃผ๋ฌธ
statefulService1.order("userA", 10000);
// ThreadB : B ์ฌ์ฉ์๊ฐ 20000 ์ ์ฃผ๋ฌธ
statefulService2.order("userB", 20000);
// ThreadA : ์ฌ์ฉ์A ์ฃผ๋ฌธ ๊ธ์ก ์กฐํ
int price = statefulService1.getPrice();
System.out.println("price = " + price);
Assertions.assertThat(statefulService1.getPrice()).isEqualTo(20000);
}
static class TestConfig{
@Bean
public StatefulService statefulService(){
return new StatefulService();
}
}
}
์ ํ ์คํธ ์ฝ๋์ ์ํฉ์ ๋จ์ํ๋ค. ์ฌ์ฉ์ A ๊ฐ 10000 ์์ ์ฃผ๋ฌธํ๊ณ ์ด์ด์ ๋ฐ๋ก ์ฌ์ฉ์ B ๊ฐ 20000 ์์ ์ฃผ๋ฌธํ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ statefulService1.getPrice() ๋ฅผ ๊บผ๋ด์ ์ฌ์ฉ์ A ๊ฐ ์ฃผ๋ฌธํ ๊ธ์ก์ ํ์ธํด๋ณด๋ฉด 10000 ์์ด ์๋๋ผ 20000 ์ด ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค... ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์ ๋ฐ๋์ ์คํ๋ง ๋น์ ๋ฌด์ํ(stateless)๋ก ์ค๊ณํด์ผ ํ๋ค!
์๋ฅผ ๋ค์ด์ ์๋์ ๊ฐ์ด ์ค๊ณํ๋ฉด ๋๋ค.
public class StatefulService {
public int order(String name, int price){
System.out.println("name = " + name + " price = " + price);
return price;
}
}
# @Configuration ๊ณผ ์ฑ๊ธํค
์คํ๋ง ์ปจํ ์ด๋๋ ์ฑ๊ธํค ๋ ์ง์คํธ๋ฆฌ์ด๋ฏ๋ก ์คํ๋ง ๋น์ด ์ฑ๊ธํค์ด ๋๋๋ก ๋ณด์ฅํด์ฃผ์ด์ผ ํ๋ค. ํ์ง๋ง ์คํ๋ง์ด ์๋ฐ ์ฝ๋๋ฅผ ์ผ์ผ์ด ์ ์ดํ๊ธฐ๋ ์ด๋ ค์ด๋ฐ, ์ด๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด ํด๋์ค์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์กฐ์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ CGLIB ๋ฅผ ์ฌ์ฉํ๋ค. AppConfig ํด๋์ค๋ฅผ ์์๋ฐ์ ์์์ ๋ค๋ฅธ ํด๋์ค๋ฅผ ๋ง๋ ๋ค์์ ํด๋น ํด๋์ค๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค. ์ด ์์์ ๋ค๋ฅธ ํด๋์ค๊ฐ ์ฑ๊ธํค์ ๋ณด์ฅํด์ฃผ๋๋ก ํด์ฃผ๋ ๊ฒ์ด๋ค. ๋๋ต ์๋์ ์๋ฆฌ๋ก ์์ฑ๋์์ ๊ฒ์ด๋ค.
@Bean
public MemberRepository memberRepository(){
if(memoryMemberRepository ๊ฐ ์คํ๋ง ์ปจํ
์ด๋์ ์ด๋ฏธ ๋ฑ๋ก๋์ด ์๋ค๋ฉด){
return ์คํ๋ง ์ปจํ
์ด๋์์ ์ด๋ฅผ ์ฐพ์์ ๋ฐํ;
}
else { // ์คํ๋ง ์ปจํ
์ด๋์ ์๋ค๋ฉด
๊ธฐ์กด ๋ก์ง์ ํธ์ถํ์ฌ MemoryMemberRepository ๋ฅผ ์์ฑํ ๋ค์์ ์คํ๋ง ์ปจํ
์ด๋์ ๋ฑ๋ก
return ๋ฐํ
}
}
- @Bean ์ด ๋ถ์ด์๋ ๋ฉ์๋๋ง๋ค ์ด๋ฏธ ์คํ๋ง ๋น์ด ์ปจํ ์ด๋์ ์กด์ฌํ๋ฉด, ์กด์ฌํ๋ ๋น์ ์ปจํ ์ด๋์์ ์ฐพ์์ ๋ฐํํ๊ณ , ์คํ๋ง ๋น์ด ์ปจํ ์ด๋์ ์๋ค๋ฉด ์์ฑํด์ ์คํ๋ง ๋น์ ๋ฑ๋กํ๊ณ ๋ฐํํ๋ ์ฝ๋๊ฐ ๋์ ์ผ๋ก ๋ง๋ค์ด ์ง๋ ๊ฒ์ด๋ฉฐ ์ด ๋๋ถ์ ์ฑ๊ธํค์ด ๋ณด์ฅ๋๋ ๊ฒ์ด๋ค.
- ์ ๋ฆฌํ์๋ฉด @Bean ๋ง ์ฌ์ฉํด๋ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋์ง๋ง ์ฑ๊ธํค์ด ๋ณด์ฅ๋์ง ์๋๋ค. ์คํ๋ง ์ค์ ์ ๋ณด๋ ํญ์ @Configuration ์ ์ฌ์ฉํ๋ฉด ๋ง์ฌํด๊ฒฐ!
Reference
'๐ป Study ! > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ธํ ๋ฆฌ์ ์ด์์ ๊ฐ์๊ธฐ ์คํ๋ง ํ๋ก์ ํธ์ ๋นจ๊ฐ์ค์ด ๋๋ฌดํ๋ค๋ฉด?! (0) | 2023.08.05 |
---|---|
JSP MVC ํจํด (0) | 2023.05.14 |
[Spring] ๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ, ๋น ์ค์ฝํ (0) | 2023.01.18 |
[Spring] ์์กด๊ด๊ณ ์๋ ์ฃผ์ (0) | 2023.01.16 |
[Spring] Spring ๊ณผ OOP (0) | 2023.01.04 |