#7. ์คํ๋ง์ ์ฑ๊ธํค ์ปจํ ์ด๋ (@Configuration)
by JiwonDevํด๋น ๊ธ์ ๊น์ํ๋์ ์ธํ๋ฐ ๊ฐ์๋ฅผ ๊ณต๋ถํ๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
# ์น ์ดํ๋ฆฌ์ผ์ด์
- ์คํ๋ง ํ๋ ์์ํฌ๋ ์ฒ์๋ถํฐ ๊ธฐ์ ์ฉ ์จ๋ผ์ธ ์๋น์ค ๊ธฐ์ ์ง์์ ํ๊ฒ์ผ๋ก ํ์ํ๋ค.
- ๋๋ถ๋ถ์ ์คํ๋ง ์ฑ์ ์น์ด๋ค. ๋ฌผ๋ก ์น ๋ง๊ณ ๋ค๋ฅธ ์ฑ์ ๋ง๋ค ๋ ์คํ๋ง์ ์ฌ์ฉํด๋ ๋๋ค.
- ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ณดํต ์ ๋ง์ ์ฌ์ฉ์๊ฐ ๋์์ ์์ฒญ์ ํ๋ค.
๊ธฐ์กด์ ์๋ฐ ์ฝ๋๋ฅผ ์ด์ฉํ์ฌ DI ์ปจํ ์ด๋(AppConfig)๋ฅผ ๊ตฌํํ ๊ฒฝ์ฐ, ๊ณ ๊ฐ์ ์์ฒญํ ๋ ๋ง๋ค ๊ฐ์ฒด๋ฅผ ์๋ก ์์ฑํ๊ณ ์๋ฉธํ๋ค. ๊ทธ๋ฐ๋ฐ DI ์ปจํ ์ด๋๋ฅผ ๊ตณ์ด ์ด๋ ๊ฒ ์๋ฐฑ, ์๋ง๊ฐ๋ฅผ ๋ง๋ค์๋ค๊ฐ ์๋ฉธ์ํฌ ํ์๊ฐ ์์๊น? ์ด๋ DI ์ปจํ ์ด๋ ๊ฐ์ฒด๋ฅผ ํ๋๋ง ๋ง๋ค์ด์ ๊ณต์ ํ๋๋ก ์ค๊ณํ๋ฉด ๋๋ค. ์ด๋ฅผ ์ฑ๊ธํค ํจํด์ด๋ผ ํ๋ฉฐ ์คํ๋ง ์ปจํ ์ด๋๋ ์ฑ๊ธํค ํจํด์ ์ฌ์ฉํ๋ค.
# ์ฑ๊ธํค ํจํด
๊ทธ๋ฐ๋ฐ ์ฑ๊ธํค ํจํด์ ๊ตณ์ด ์คํ๋ง์ด ์๋๋๋ผ๋, ๋ด๊ฐ ์ง์ DI ์ปจํ ์ด๋์ ํจํด์ ์ ์ฉํ ์ ์๋ ๊ฒ ์๋๊น?
์ฑ๊ธํค ํจํด์ ์คํ๋ง์์๋ง ์ฌ์ฉํ ์ ์๋ ๊ฐ๋ ์ด ์๋๋ค. ์์์ ์๋ธ๋ฆฟ์ ๋์๊ณผ์ ์ ๋ฐฐ์ ๋ค๋ฉด ์๊ฒ ์ง๋ง, ํด๋์ค์ ์ธ์คํด์ค๊ฐ 1๊ฐ๋ง ์์ฑ๋๋ ๊ฒ์ ๋ณด์ฅํ๋ ๋์์ธ ํจํด์ด๋ค. private ์์ฑ์๋ฅผ ์ฌ์ฉํด์ ์ธ๋ถ์์ new ํค์๋๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ๋ง๋๋ค.
public class SingletonService {
//1. static ์์ญ์ ๊ฐ์ฒด๋ฅผ ๋ฑ 1๊ฐ๋ง ์์ฑํด๋๋ค.
// ๋๋ getInstance() ํธ์ถ ์, ํ์ฌ ์์ฑ๋ ๊ฐ์ฒด๊ฐ ์๋์ง ์ฒดํฌํ์ฌ ๋ง๋๋ ๋ฐฉ๋ฒ๋ ์๋ค.
private static final SingletonService instance = new SingletonService();
//2. getInstance()๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
public static SingletonService getInstance() {
return instance;
}
//3. ์์ฑ์๋ฅผ private์ผ๋ก ์ ์ธํด์ ์ธ๋ถ์์ new ํค์๋๋ฅผ ์ฌ์ฉํ ๊ฐ์ฒด ์์ฑ์ ๋ชปํ๊ฒ ๋ง๋๋ค.
private SingletonService() {
}
public void logic() {
System.out.println("์ฑ๊ธํค ๊ฐ์ฒด ๋ก์ง ํธ์ถ");
}
}
ํ์ง๋ง ์ฑ๊ธํค ํจํด์ ์ง์ ๊ตฌํํ์ ๋ ์๋์ ๊ฐ์ ๋ฌธ์ ์ ์ ๋ง์ดํ๊ฒ ๋๋ค.
- ์ฑ๊ธํค ํจํด์ ๊ตฌํํ๋ ๊ฐ๋ฐ์์ ์ฝ๋ ์์ฒด๊ฐ ๋ง์ด ๋ค์ด๊ฐ๋ค.
- ์์กด๊ด๊ณ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌํ์ฒด ํด๋์ค์ ์์กดํ๋ค. [ ...=๊ตฌํ์ฒด.getInstance() ] -> DIP, OCP ์๋ฐ
- ํ ์คํธํ๊ธฐ ์ด๋ ต๊ณ , ์์๋ ์ด๋ ต๊ณ , ๋ด๋ถ ์์ฑ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ด๊ธฐํํ๊ธฐ ๊น๋ค๋กญ๋ค.
- ์ฆ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ค. (์์ฃผ ์ฌ์ฉ๋๋ ์์ข์ ์ฝ๋, ์ํฐํจํด์ด๋ผ๊ณ ๋ถ๋ฆฌ๊ธฐ๋ ํ๋ค.)
# ์ฑ๊ธํค ์ปจํ ์ด๋
์คํ๋ง ์ปจํ ์ด๋๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ฑ๊ธํค์ ๊ตฌํํ ํ์ ์๋๋ก ๋ง๋ค์ด ์ฑ๊ธํค ํจํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. ์ง๊ธ๊น์ง ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ์คํ๋ง ๋น์ ์ ๋ถ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌ๋๋ ๋น์ด์๋ค.
- ์คํ๋ง ์ปจํ
์ด๋๋ ์ฑ๊ธํด ํจํด์ ์ ์ฉํ์ง ์์๋, ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธํค์ผ๋ก ๊ฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ๊ด๋ฆฌํ๋ค.
- ์ปจํ ์ด๋๋ ๊ฐ์ฒด๋ฅผ ํ๋๋ง ์์ฑํด์ ๊ด๋ฆฌํ๋ค. - ์คํ๋ง ์ปจํ ์ด๋๋ ์ฑ๊ธํค ์ปจํ ์ด๋ ์ญํ ์ ํ๋ค. ์ด๋ ๊ฒ ์์ฑ/๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ฑ๊ธํค ๋ ์ง์คํธ๋ฆฌ๋ผ๊ณ ๋ ํ๋ค.
- ์คํ๋ง ์ปจํ ์ด๋์ ์ด๋ฐ ๊ธฐ๋ฅ ๋๋ถ์ ์ฑ๊ธํด ํจํด์ ๋จ์ ์ ํด๊ฒฐํ๋ฉด์, ๊ฐ์ฒด๋ฅผ ์ฑ๊ธํค์ผ๋ก ์ ์งํ๋ค.
- ๋ฌด์๋ณด๋ค ์ฑ๊ธํค ํจํด์ ์ํ ์ง์ ๋ถํ ์ฝ๋๊ฐ ํ์์๋ค.
- DIP, OCP, ํ ์คํธ, Private ์์ฑ์๋ก๋ถํฐ ์์ ๋กญ๊ฒ ์ฑ๊ธํค ํจํด์ ์ฌ์ฉํ ์ ์๋ค.
# ์ฑ๊ธํค & ์ฑ๊ธํค ์ปจํ ์ด๋ ๋ฐฉ์์ ์ฃผ์์
์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋, ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๊ฐ ํ๋์ ๊ฐ์ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ๋ค๋ ์ฌ์ค์ ๊น๋จน์ผ๋ฉด ์๋๋ค. ๋น์ฐํ ์ฌ์ค์ธ ๋ฏ ํด๋ ์ฑ๊ธํค ๊ฐ์ฒด์ ์ํ๋ฅผ ์ ์ง(Stateful)ํ๋๋ก ์ค๊ณํ๋ ์ค์๋ฅผ ์ข ์ข ๋ณผ ์์๋ค.
- ๋ฌด์ํ(stateless)ํ๊ฒ ์ค๊ณํด์ผํ๋ค.
- ํน์ ํด๋ผ์ด์ธํธ์๊ฒ ์์กด์ ์ธ ํ๋๊ฐ ์์ผ๋ฉด ์๋๋ค.
- ํน์ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ํ๋๊ฐ ์์ผ๋ฉด ์๋๋ค.
- ๊ทธ๋์ ๊ฐ๊ธ์ ์ฑ๊ธํค ๊ฐ์ฒด๋ '์ฝ๊ธฐ' ๋ง ๊ฐ๋ฅํ๋๋ก ๋ง๋ค์ด์ผ ํ๋ค.
- ํ๋ ๋์ ์ ์๋ฐ์์ ๊ณต์ ๋์ง ์๋ ์ง์ญ๋ณ์, ํ๋ผ๋ฉํ, ThreadLocal๋ฑ์ ์ฌ์ฉํด์ผ ํ๋ค
์ด๋ฅผ ์ ์ํ์ง ์๊ณ ์คํ๋ง ๋น์ ํ๋์ ํด๋ผ์ด์ธํธ ๊ฐ ๊ณต์ ๊ฐ์ ์ค์ ํ๋ฉด, ์ ๋ง ํด๊ฒฐํ๊ธฐ ์ด๋ ค์ด ํฐ ์ฅ์ ๊ฐ ํฐ์ง๊ฒ ๋๋ค. ์ฑ๊ธํค ๊ฐ์ฒด์ธ ์คํ๋ง ๋น์ ํญ์ ๋ฌด์ํ(Stateless)๋ก ์ค๊ณํด์ผ ํจ์ ์ ๋ ๊น๋จน์ง ๋ง์.
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;
}
# @Configuration๊ณผ ์ฑ๊ธํค
์๋ ์ปจํ ์ด๋ ์ฝ๋๋ฅผ ๋ค์ ์ดํด๋ณด์. ๋ฌด์ธ๊ฐ ์ด์ํ ์ ์ด ์์ง ์์๊ฐ?
- memberService ๋น์ ๋ง๋๋ ์ฝ๋์ memberRepository()๋ฅผ ํธ์ถํ๋ค.
- memberService Bean์ new MemoryMemberRepository๊ฐ ์์ฑ๋๋ค. - OrderService ๋น์ ๋ง๋๋ ์ฝ๋์ memberRepository()๋ฅผ ํธ์ถํ๋ค.
- OrderService Bean์ new MemoryMemberRepository๊ฐ ์์ฑ๋๋ค.
๊ทธ๋ ๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก๋ ๋ค๋ฅธ 2๊ฐ์ ๋น์, ๊ฐ์ ๊ตฌํ์ฒด๊ฐ ์์ฑ๋๋ฉฐ ์ฑ๊ธํค์ ๊นจ์ง๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค. ์คํ๋ง ์ปจํ ์ด๋๋ ์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ์๊น?
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(
memberRepository(),
discountPolicy());
}
... ์๋ต ...
}
์ง์ ์คํ์ ํตํด ์์๋ณด์.
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
//1๋ฒ
System.out.println("call AppConfig.memberService");
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService() {
//1๋ฒ
System.out.println("call AppConfig.orderService");
return new OrderServiceImpl(
memberRepository(),
discountPolicy());
}
@Bean
public MemberRepository memberRepository() {
//2๋ฒ? 3๋ฒ?
System.out.println("call AppConfig.memberRepository");
return new MemoryMemberRepository();
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
}
//์ฝ์ ์ถ๋ ฅ ๊ฒฐ๊ณผ. ๋๋๊ฒ๋ ๊ฐ๊ฐ 1๋ฒ๋ง ํธ์ถ๋๋ค.
call AppConfig.memberService
call AppConfig.memberRepository
call AppConfig.orderService
# @Configuration๊ณผ ๋ฐ์ดํธ์ฝ๋ ์กฐ์์ ๋ง๋ฒ
์คํ๋ง ์ปจํ ์ด๋๋ ์ฑ๊ธํค ๋ ์ง์คํธ๋ฆฌ์ด๋ค. ๋ฐ๋ผ์ ์คํ๋ง ๋น์ด ์ฑ๊ธํค์ด ๋๋๋ก ๋ณด์ฅํด์ฃผ์ด์ผ ํ๋ค. ํ์ง๋ง ์์ ์์ ์์ ์ ์ ์๋ค์ถ์ด, ์ด๋ฅผ ์๋ฐ ์ฝ๋์์์ ๊ตฌํํ๊ธฐ์๋ ๋งค์ฐ ์ด๋ ต๋ค๋ ๊ฑธ ์ ์ ์๋ค. ๊ทธ๋์ ์คํ๋ง์ ํด๋์ค์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์กฐ์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
๋ชจ๋ ๋น๋ฐ์ @Configuration์ ์ฌ์ฉํ AppConfig์ ์๋ค. ์ฌ์ค ์คํ๋ง ์ปจํ ์ด๋์ ๊ตฌํ์ฒด(AnnotationConfigApplicationContext)๋ฅผ ๋ง๋ค ๋ ํ๋ผ๋ฉํ๋ก ๋๊ธด ๊ฐ์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋๋ค. ์ฆ AppConfig ๊ฐ ์คํ๋ง ๋น์ด ๋๋ค๋ ๋ง์ด๋ค.
@Test
void configurationDeep(){
ApplicationContext ac=new
AnnotationConfigApplicationContext(AppConfig.class);
// AppConfig๋ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋๋ค.
AppConfig bean=ac.getBean(AppConfig.class);
// ์์ํ ํด๋์ค Bean ์ ์ถ๋ ฅ = class hello.core.AppConfig
System.out.println("bean = "+bean.getClass());
// ์ค์ ์ฝ์์ฐฝ ์ถ๋ ฅ: bean = class hello.core.AppConfig$$EnhancerBySpringCGLIB$$bd479d70
}
ํ์ง๋ง ์ฝ์์ฐฝ์ AppConfig๋ฅผ ์ฐ์ด๋ณด๋ฉด ์๊ฒ ์ง๋ง, AppConfig ๋น ์์ EnhancerBySpring CGLIB ๋ผ๊ณ ๋ณต์กํ๊ฒ ์ ํ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๋ ๋ด๊ฐ ๋ง๋ ํด๋์ค๊ฐ ์๋๋ผ ์คํ๋ง์ด CGLIB๋ผ๋ ๋ฐ์ดํธ์ฝ๋ ์กฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ AppConfig ํด๋์ค๋ฅผ ์์๋ฐ์ [ AppConfig@CGLIB... ]๋ฅผ ๋ง๋ค๊ณ ์ด๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ ๊ฒ์ด๋ค.
์ดํดํ๊ธฐ ์ฝ๊ฒ ์๋ฐ์ฝ๋๋ก ๋น์ ํ์๋ฉด, ์๋์ ๊ฐ์ด ๋ฐ์ดํธ์ฝ๋๋ฅผ ์์ฑํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. ์คํ๋ง์ @Bean์ด ๋ถ์ ๋ฉ์๋๋ง๋ค ์คํ๋ง ๋น์ด ์กด์ฌํ๋์ง ํ์ธ ํ, ์์ ๋๋ง ์์ฑํ๋๋ก ๋ฐ์ดํธ์ฝ๋๋ฅผ ์กฐ์ํ์ฌ ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ๋ณด์ฅํ๋ค.
@Bean
public MemberRepository memberRepository() {
if (memoryMemberRepository๊ฐ ์ด๋ฏธ ์คํ๋ง ์ปจํ
์ด๋์ ๋ฑ๋ก๋์ด ์์ผ๋ฉด?) {
return ์คํ๋ง ์ปจํ
์ด๋์์ ์ฐพ์์ ๋ฐํ;
} else { //์คํ๋ง ์ปจํ
์ด๋์ ์์ผ๋ฉด
๊ธฐ์กด ๋ก์ง์ ํธ์ถํด์ MemoryMemberRepository๋ฅผ ์์ฑํ๊ณ ์คํ๋ง ์ปจํ
์ด๋์ ๋ฑ๋ก
return ๋ฐํ
}
}
# @Configuration์ ์ ์ฉํ์ง ์์ผ๋ฉด์?
๋ชจ๋ ๋น๋ฐ์ @Configuration์ ์ฌ์ฉํ AppConfig ์ ์๋ค.
์คํ๋ง์ @Configuration ์ค์ ์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์กฐ์ํ๋ CGLIB ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์ฑ๊ธํค์ ๋ณด์ฅํ๋ค. ๋ง์ฝ ์ด๋ฅผ ์ ์ฉํ์ง ์๊ณ , @Bean๋ง ์ฌ์ฉํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
// ์ด๋
ธํ
์ด์
์ ์ฃผ์์ฒ๋ฆฌํ์์.
// @Configuration
public class AppConfig {
...
}
/* AppConfig๋ฅผ ์ฝ์์ ์ถ๋ ฅํ ๋ชจ์ต.
AppConfig bean=ac.getBean(AppConfig.class);
System.out.println("bean = "+bean.getClass());
*/
bean = class hello.core.AppConfig
CGLIB ๊ธฐ์ ์ด ์์ด ์์ํ AppConfig๋ก ์คํ๋ง ๋น์ ๋ฑ๋ก๋๋ค. ์ค์ ๋ก ์ด๋ ๊ฒ ์ฌ์ฉํ๊ฒ๋๋ฉด ์ผ๋ฐ ์๋ฐ์ฝ๋์ ๋ค๋ฅธ๊ฒ ์๊ธฐ ๋๋ฌธ์, ์์์ ๋งํ ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์ ์งํ์ง ๋ชปํ๋ค. ์์ ์์ ๋ฅผ ๋ค์ ๋๋ ค๋ณด๋ฉด memberRepository๋ฅผ ํธ์ถํ ๋งํผ ๊ฐ์ฒด๋ฅผ ์๋กญ๊ฒ ์์ฑํ๋ ๊ฒ์ ์ ์ ์๋ค.
call AppConfig.memberService
call AppConfig.memberRepository // @Bean ์ต์ด ๋ฑ๋ก
call AppConfig.orderService
call AppConfig.memberRepository // OrderService -> memberRepository()
call AppConfig.memberRepository // MemberReposiotry -> memberRepository()
๋น์ฐํ๊ฒ๋ ์ด๋ ๊ฒ Bean์ ๋ฎ์ด์์ฐ๊ฒ๋๋ฉด ์ธ์คํด์ค๊ฐ ๊ฐ์์ง ํ ์คํธํ๋ ์ฝ๋๋ ์ ์์๋ ํ์ง์๋๋ค. ์๋ํ๋ฉด ๊ฐ๊ฐ์ ์๋น์ค๋ง๋ค ๋ค๋ฅธ memberRepository() ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
# ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ง๋ค๋ฉด ์ข์๊น์?
์๋๋ค. ์ฌ์ฌ์ฉ ํ ์ผ์ด ๋ฑํ ์๋ ๊ฐ์ฒด๋ ์คํ๋ง์ ์์กด์ฑ ์ฃผ์ ์ด ํ์ํ์ง ์๋ค๋ฉด, ๊ทธ๋ฅ new๋ก ์์ฑํด๋ ๋๋ค.
์คํ๋ง์์๋ ์๋์ ๊ฐ์ ๊ฐ์ด๋๋ผ์ธ์ ์ ๊ณตํ๋ค.
๐ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํด์ ์ฌ์ฉํ๋ฉด ์ข์ ๊ฒฝ์ฐ
- ๋ค๋ฅธ ๊ฐ์ฒด์ ์์กด์ฑ์ด ํ์ํ ๊ฒฝ์ฐ
- ๋ค๋ฅธ ์คํ๋ง ๋น์ ์์กด์ฑ์ผ๋ก ์ฃผ์ ๋๋ ๊ฒฝ์ฐ
- ์คํ๋ง์ ๊ธฐ๋ฅ์ด ํ์ํ ๊ฒฝ์ฐ (ํธ๋์ญ์ , ์ธํฐ์ ํฐ, ํ๋ก์, SpringDataJpa๋ฑ)
๐ ์คํ๋ง ๋น์ผ๋ก ๊ตณ์ด ๋ฑ๋กํ ํ์ ์๋ ๊ฒฝ์ฐ
- ์์ ๋ฐ๋๋ก ๋ฑํ ์ฃผ์ ๋ฐ๊ฑฐ๋ ์ฃผ์ ํ๋ ๊ฐ์ฒด๊ฐ ์๋ ๊ฒฝ์ฐ
- Spring์ ๊ธฐ๋ฅ์ด ๋ฑํ ํ์์๋ ๊ฒฝ์ฐ
- ๋ํ์ ์ผ๋ก Entity, DTO, Value Object ๋ฑ
์ฑ๊ธํค ๋น ๋ด๋ถ์์ ์ฌ์ฉํ๋ ๊ฐ์ฒด์ ๊ฒฝ์ฐ, ์ด์ฐจํผ new Object ๋ก ์์ฑํ๋๋ผ๋ ๋ณ ์๊ด์๋ค. (์ ์๊ฐํด๋ณด๋ฉด, ์ด์ฐจํผ ์ปจํ ์ด๋๊ฐ 1๋ฒ ์์ฑํ๊ณ ๊ณ์ ์ด๋ค) ๋๋ฌด ์คํ๋ง ๋น์ ์ง์ฐฉํ์ง๋ ๋ง์.
# ๊ฒฐ๋ก
์ฌ์ค ์ด๋ ต๊ฒ ์ค๋ช ํ์ง๋ง, ๊ฒฐ๋ก ์ ์คํ๋ง ์ค์ ์ ๋ณด๋ ํญ์ @Configuration์ ์ฌ์ฉํ์๋ผ๋ ๋ง์ด๋ค. ํด๋น ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด ์คํ๋ง์์ ์ด๋ค ๋ฐฉ๋ฒ์ ์จ์๋ผ๋ ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์ ์งํ๊ฒ ํด์ค๋ค.
'๐ฑ Spring Framework > Spring Core' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
#9 ์์กด๊ด๊ณ ์๋์ฃผ์ ์์ ์๊ธฐ๋ ๋ฌธ์ (+Lombok ์๊ฐ) (0) | 2021.08.03 |
---|---|
#8 ์ปดํฌ๋ํธ ์ค์บ๊ณผ ์์กด๊ด๊ณ ์๋์ฃผ์ (0) | 2021.08.02 |
BeanFactory, BeanDefinition (+ ์คํ๋ง ์ปจํ ์ด๋ XML ์ค์ ) (0) | 2021.08.02 |
#6. ์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น (0) | 2021.08.02 |
#5 ์คํ๋ง์ผ๋ก ์ ํํ๊ธฐ (0) | 2021.08.02 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev