๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Spring

[Spring] @Configuration๊ณผ ๋ฐ”์ดํŠธ์ฝ”๋“œ ์กฐ์ž‘

๐Ÿ“Œ @Configuration๊ณผ ๋ฐ”์ดํŠธ์ฝ”๋“œ ์กฐ์ž‘

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋‹ค. ์Šคํ”„๋ง ๋นˆ์ด ์‹ฑ๊ธ€ํ†ค์ด ๋˜๋„๋ก ๋ณด์žฅํ•ด์ฃผ๋Š” ๊ตฌ์กฐ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์Šคํ”„๋ง ์•ˆ์—์„œ ์ž๋ฐ” ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌ๋ ๊นŒ. ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด ์Šคํ”„๋ง์€ ํด๋ž˜์Šค์˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. @Configuration์„ ์ ์šฉํ•œ AppConfig์—์„œ ๋” ํ™•์‹คํžˆ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 

 

 

  • ์‚ฌ์‹ค AnnotationConfigApplicationContext์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธด ๊ฐ’์€ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋œ๋‹ค. ๊ทธ๋ž˜์„œ AppConfig๋„ ์Šคํ”„๋ง ๋นˆ์ด ๋œ๋‹ค. AppConfig ์Šคํ”Œ๋ง ๋นˆ์„ ์กฐํšŒํ•ด์„œ ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค. 
bean = class com.company.shop.AppConfig$$EnhancerBySpringCGLIB$$d397f221

 

  • ํ•˜์ง€๋งŒ, ์ˆœ์ˆ˜ํ•œ ํด๋ž˜์Šค ๋ผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒŒ ๋งž๋‹ค.
 class com.company.shop.AppConfig

 

๊ทธ๋Ÿฐ๋ฐ ์˜ˆ์ƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ํด๋ž˜์Šค๋ช…์— xxxCGLIB๊ฐ€ ๋ถ™์œผ๋ฉด์„œ ์ถœ๋ ฅ๊ฒฐ๊ณผ๊ฐ€ ๋ณต์žกํ•ด์ง„ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ๋Š” ๋‚ด๊ฐ€ ๋งŒ๋“  ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์Šคํ”„๋ง์ด CGLIB๋ผ๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์กฐ์ž‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ AppConfig ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ์ž„์˜์˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•œ ๊ฒƒ์ด๋‹ค. 

 

Configuration๊ณผ ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์กฐ์ž‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ @CGILB

 

 

์Šคํ”„๋ง์ด ๋งŒ๋“  ์ž„์˜์˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ๋ฐ”๋กœ ์‹ฑ๊ธ€ํ†ค์ด ๋ณด์žฅ๋˜๋„๋ก ํ•ด์ค€๋‹ค. 

์•„๋งˆ๋„ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•ด์„œ ์ž‘์„ฑ๋˜์–ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. (์‹ค์ œ๋กœ๋Š” ๋” ๋ณต์žกํ•˜๋‹ค)

 

AppConfig@CGLIB ์˜ˆ์ƒ ์ฝ”๋“œ 

@Bean
public MemberRepository memberRepository(){
	if (memoryMemberRepository ๊ฐ€ ์ด๋ฏธ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋˜์–ด ์žˆ์œผ๋ฉด?) {
    	return ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์ฐพ์•„์„œ ๋ฐ˜ํ™˜;
    } else { //์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์—†์œผ๋ฉด
    	๊ธฐ์กด ๋กœ์ง์„ ํ˜ธ์ถœํ•ด์„œ MemoryMemberRepository๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก
        return ๋ฐ˜ํ™˜;
    }
}
  • @Bean ์ด ๋ถ™์€ ๋ฉ”์†Œ๋“œ๋งˆ๋‹ค ์ด๋ฏธ ์Šคํ”„๋ง ๋นˆ์ด ์กด์žฌํ•˜๋ฉด ์กด์žฌํ•˜๋Š” ๋นˆ์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์Šคํ”„๋ง ๋นˆ์ด ์—†์œผ๋ฉด ์ƒ์„ฑํ•ด์„œ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋™์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค. 
  • ๋•๋ถ„์— ์‹ฑ๊ธ€ํ†ค์ด ๋ณด์žฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 
  • AppConfig@CGLIB๋Š” AppConfig์˜ ์ž์‹ํƒ€์ž…์ด๋ฏ€๋กœ, AppConfig ํƒ€์ž…์œผ๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด!!

@Configuration์„ ์ ์šฉํ•˜์ง€ ์•Š๊ณ  @Bean๋งŒ ์ ์šฉํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

 

@Configuration์‚ญ์ œ ์ฝ”๋“œ

//@Configuration ์‚ญ์ œ
public class AppConfig{

}
 bean = class com.company.shop.AppConfig
  • ์ด ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด์„œ AppConfig๊ฐ€ CGLIB ๊ธฐ์ˆ  ์—†์ด ์ˆœ์ˆ˜ํ•œ AppConfig๋กœ ์Šคํ”„๋ง ๋นˆ์— ๋“ฑ๋ก๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

call AppConfig.memberService
call AppConfig.memberRepository
call AppConfig.orderService
call AppConfig.memberRepository
call AppConfig.memberRepository
  • ์ด ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด์„œ MemberRepository๊ฐ€ ์ด 3๋ฒˆ ํ˜ธ์ถœ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 1๋ฒˆ์€ @Bean์— ์˜ํ•ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๊ณ , ๋‚˜๋จธ์ง€๋Š” ๊ฐ๊ฐ memberRepository()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•œ ์ฝ”๋“œ๋‹ค.

 

 ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐ™์€์ง€ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ 

memberService -> memberRepository = 
hello.core.member.MemoryMemberRepository@5236acv3
orderService -> memberRepository =
hello.core.member.MemoryMemberRepository@3e5103fc
memberRepository = hello.core.member.MemoryMemberRepository@12359a03
  • ๋‹น์—ฐํžˆ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐ™์€์ง€ ํ…Œ์ŠคํŠธ ํ•˜๋Š” ์ฝ”๋“œ๋„ ์‹คํŒจํ•˜๊ณ , ๊ฐ๊ฐ ๋‹ค ๋‹ค๋ฅธ MemoryMemberRepository ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. 

 

 

์ •๋ฆฌ

  • @Bean๋งŒ ์‚ฌ์šฉํ•ด๋„ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์ง€๋งŒ, ์‹ฑ๊ธ€ํ†ค์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • memberRepository() ์ฒ˜๋Ÿผ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ํ•„์š”ํ•ด์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•  ๋•Œ ์‹ฑ๊ธ€ํ†ค์ด ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์Šคํ”„๋ง ์„ค์ • ์ •๋ณด๋Š” ํ•ญ์ƒ @Configuration์„ ์‚ฌ์šฉํ•˜์ž.