<์ถœ์ฒ˜ ์ธํ”„๋Ÿฐ>

 

 

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ๋นˆ ์ด๋ฆ„๊ณผ ๋นˆ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์ค€๋‹ค. Public๊ณผ ํ•จ๊ป˜ ์“ด ๊ฒƒ์€ ํƒ€์ž…๊ณผ ์ด๋ฆ„์ด ๋œ๋‹ค. ์˜ˆ์‹œ๋กœ public MemberService memberService( )์˜ ๊ฒฝ์šฐ MemberService๋Š” ํƒ€์ž…์ด ๋˜๊ณ  memberService๋Š” ๋นˆ์˜ ์ด๋ฆ„์ด ๋œ๋‹ค. return new์™€  ํ•จ๊ป˜ ์“ฐ์ด๋ฉด ๋นˆ ๊ฐ์ฒด๊ณผ ๋œ๋‹ค. ์˜ˆ๋กœ return MemberServiceImpl(memberRepository( ))์˜ ๊ฒฝ์šฐ MemberServiceImpl์ด ๋นˆ ๊ฐ์ฒด๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์ €์žฅ๋˜์–ด ๊ด€๋ฆฌ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ์—” ๋นˆ์ด ์ œ๋Œ€๋กœ ๋“ฑ๋ก๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ๊ฒƒ์ด๋‹ค.

 

 


 

[ โ—€๏ธŽ ]

 

 

[Spring] ๊น€์˜ํ•œ ๊ธฐ๋ณธํŽธ_ ์„น์…˜ 4. ๊ฐ์ฒด์ง€ํ–ฅ์›๋ฆฌ์ ์šฉ

์„น์…˜ 3. ์˜ˆ์ œ๋งŒ๋“ค๊ธฐ์—์„œ ์ž ๊น ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ ๊ตฌํ˜„์ฒด์˜ ์˜์กด์„ฑ์„ ์™„์ „ํžˆ ๋ฐฐ์ œํ•œ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์™€ ์—ฐ๊ฒฐ๋œ ๊ตฌํ˜„์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ํ•˜๋‚˜ํ•˜๋‚˜ ํด๋ž˜์Šค๋ฅผ ์ฐพ์•„๊ฐ€ ์ˆ˜์ •ํ•ด์•ผํ•˜๋Š” ์ผ์ด ๋ฐœ์ƒํ• 

post-this.tistory.com

 

 

 

 

 

๐Ÿงธ

์ž˜๋ชป๋œ ์ •๋ณด๊ฐ€ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”


 

๐Ÿงธ ๊ตฌ์กฐํŒŒ์•… ๋ ˆ์ธ ๊ผฌ์šฐ- ๐Ÿงธ

test์— ์ด 3๊ฐ€์ง€์˜ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

  • beanfind
    ใ„ด ApplicationContextInfoTest, ApplicationContextBasicFindTest, ApplicationnContextExtendsFindTest
         , ApplicationContextSameBeanFindTest
  • beandefinition
    ใ„ด BeanDefinitionTest
  • xml
    ใ„ด XmlAppContext

 


 

โœ”๏ธ  beanfind_ApplicationContextInfoTest

 

โ–บ  findAllBean

: ๋‚ด๋ถ€์— ํฌํ•จ๋œ Bean์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

AnnotationConfigApplicationContext ac 
= new AnnotationConfigApplicationContext(AppConfig.class);

 

 

AnnotationConfigApplicationContext

: Bean์œผ๋กœ ์ง€์ •๋œ ๊ฐ์ฒด๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” context๊ณ  ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

 

ApplicationContext๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋‹ค์–‘ํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” AnnotationConfigApplicationContext์ด๋ฉฐ ํ˜„์žฌ ๊ฐ•์˜์—์„œ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด๋‹ค. ์„น์…˜ 4 ๊ฐ•์˜์—์„œ AppConfig์— @Configuration๊ณผ @Bean ์–ด๋…ธํ…Œ์ด์…˜์„ ์ •์˜ํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ •์˜๋ฅผ ํ†ตํ•ด ๋นˆ์„ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ด€๋ฆฌํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ ์Šค์บ” ํ˜น์€ ํ”„๋กœํŒŒ์ผ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

 

 

 

ใ…ค- ApplicationContext ์„ค๋ช… ์ถœ์ฒ˜

 

[Spring] ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ(Application Context)์™€ ์Šคํ”„๋ง์˜ ์‹ฑ๊ธ€ํ†ค(Singleton)

์ด๋ฒˆ์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ(Application Context) [ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ(Application Context)๋ž€? ] Spring์—์„œ๋Š” ๋นˆ์˜ ์ƒ์„ฑ๊ณผ ๊ด€๊ณ„

mangkyu.tistory.com

 

 

 

- AnnotationConfigApplicationContext ์ถœ์ฒ˜

 

Bean ๊ฐ์ฒด๋“ค์˜ ๋งŒ๋‚จ์˜ ๊ด‘์žฅ : AnnotationConfigApplicationContext

AnnotationConfigApplicationContext AnnotationConfigApplicationContext ์€ Bean์œผ๋กœ ์ง€์ •๋œ ๊ฐ์ฒด๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” context ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ ๋„ ๋ถ€๋ฆ…๋‹ˆ๋‹ค. AnnotationConfigApplicationContext ์„ ํ†ตํ•ด ํ˜„์žฌ ์–ด๋–ค Bean ๊ฐ์ฒด๋“ค

jindevelopetravel0919.tistory.com

 

 

 

-  AnnotationConfigApplication  ์ถœ์ฒ˜

 

[Spring] AnnotationConfigApplicationContext์˜ ์—ญํ• ๊ณผ ํ™œ์šฉ ๋ฐฉ๋ฒ•

Spring ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ApplicationContext ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‹ค์–‘ํ•œ ๊ตฌํ˜„์ฒด ์ค‘ ํ•˜๋‚˜๋กœ AnnotationConfigApplicationContext๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. AnnotationConfigApplicationContext๋Š” Java ๊ธฐ๋ฐ˜์˜ ์„ค์ • ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นˆ(Bean)

jjangadadcodingdiary.tistory.com

 

 

 

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์† AppConfig์˜ ๋นˆ์ด๋ฆ„๊ณผ ๋นˆ๊ฐ์ฒด

 

 

 

 

••• ์ด์–ด์„œ ๋‹ค์Œ ์ฝ”๋“œ •••

 

 

 

String[] beanDefinitionNames = ac.getBeanDefinitionNames();

 

 

getBeanDefinitionNames( )

: ํŒฉํ† ๋ฆฌ์— ๋“ฑ๋ก๋œ ๋ชจ๋“  bean์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  @bean์„ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋“ฑ๋ก๋œ ์‹ฑ๊ธ€ํ†ค Bean์€ ๋ฌด์‹œํ•œ๋‹ค. ๋˜ํ•œ ๊ณ„์ธต๊ตฌ์กฐ๋„ ๋ฌด์‹œํ•œ๋‹ค. 

 

ac๋Š” AppConfig์— ๋“ฑ๋ก๋œ bean์— ๋Œ€ํ•œ ์„ค์ • ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค. ํ•˜์ง€๋งŒ getBeanDefinitionNames๋Š” ๋‚ด๋ถ€์˜ ๋ชจ๋“  bean์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ์ •์˜๋˜์–ด์žˆ๋Š”๋ฐ, ๊ทธ ์ด์œ ๋ฅผ ์‚ดํŽด๋ณด๋ฉด AppConfig์˜ ์„ค์ •์„ ์ ์šฉํ•˜๋ฉด์„œ Spring์— ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„์š”๋กœํ•˜๋Š” ๋‚ด๋ถ€ ๋นˆ๋“ค๋„ ์ž๋™์ ์œผ๋กœ ํ•จ๊ป˜ ๋“ฑ๋ก๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๋‚ด๋ถ€ ๋นˆ๋“ค๋„ ๋ชจ๋‘ ๋ณด๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ getBeanDefinitionNames()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

 

 

- getBeanDefinitionNames ์ •์˜ ์ถœ์ฒ˜

 

ListableBeanFactory (Spring Framework 6.1.11 API)

Extension of the BeanFactory interface to be implemented by bean factories that can enumerate all their bean instances, rather than attempting bean lookup by name one by one as requested by clients. BeanFactory implementations that preload all their bean d

docs.spring.io

 

 

 

ใ…คใ…ค••• ๊ทธ ๋‹ค์Œ ์ฝ”๋“œ •••

 

 

for (String beanDefinitionName : beanDefinitionNames) {
            Object bean = ac.getBean(beanDefinitionName);
            System.out.println ("name = " + beanDefinitionName + "object = " + bean); }

 

 

getBean( );

: ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ bean์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

Object

: ์ตœ์ƒ์œ„ ํด๋ž˜์Šค๋กœ ์ž๋ฐ” ํด๋ž˜์Šค์— ๋”ฐ๋กœ extendsํ•˜์ง€ ์•Š์œผ๋ฉด java.lang.Object๋ฅผ ์ƒ์†ํ•œ๋‹ค. ํ•„๋“œ๊ฐ€ ์•„๋‹Œ ๋ฉ”์„œ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ์œผ๋ฉฐ ๋ชจ๋“  ํƒ€์ž…์„ ๋‹ค ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

beanDefinitionNames๋Š” ๋ชจ๋“  ๋นˆ์„ ๋ฐ˜ํ™˜ ๋ฐ›์•„์˜จ ๋ฌธ์ž์—ด์ด๋‹ค. for๋ฌธ์„ ์ด์šฉํ•˜์—ฌ beanDefinitionNames์— ๋“ค์–ด์žˆ๋Š” ๋นˆ ์ด๋ฆ„์„ beanDefinitionName ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.  ๊ทธ๋ฆฌ๊ณ  ac.getBean์„ ์ด์šฉํ•˜์—ฌ ๋นˆ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜๋ฉฐ ์ด๋•Œ bean์— ์ €์žฅ๋˜๋Š” ํƒ€์ž…์€ Object๋กœ ๋ชจ๋“  ํƒ€์ž…์„ ๋‹ค ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง ๋‚ด๋ถ€์— ์žˆ๋Š” ๋นˆ๊นŒ์ง€ ๋ชจ๋‘ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์•„๋ž˜ <๊ฒฐ๊ณผ>๋ฅผ ๋ณด๋ฉด name์€ ๋นˆ์˜ ์ด๋ฆ„์ด ์ถœ๋ ฅ๋˜์—ˆ๊ณ  object๋Š” ์ง€์ •๋œ ํด๋ž˜์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค. ์ฆ‰ discountPolicy๋Š” hello.core.discount.RateDiscountPolicy์™€ ์—ฐ๊ฒฐ๋˜์–ด์žˆ์Œ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

<๊ฒฐ๊ณผ>
name = discountPolicy
object = hello.core.discount.RateDiscountPolicy@246f8b8b

์š”๋”ด์‹์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค.๐Ÿป

 

 

Q.๊ผญ beanDefinitionName ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์ค˜์•ผํ•˜๋Š”๊ฑด๊ฐ€? 

A.
๊ผญ ๊ทธ๋Ÿดํ•„์š”๋Š” ์—†๋‹ค. ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๋ฟ.

String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (int i = 0; i < beanDefinitionNames.length; i++) {
    String beanName = beanDefinitionNames[i];
    System.out.println("Bean Name " + (i + 1) + ": " + beanName);
}โ€‹

์ด๋Ÿฐ์‹์œผ๋กœ ๊ทธ๋ƒฅ ๋ณ€์ˆ˜์—†์ด ๋ฐ›์•„๋„ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ›์•„์˜จ ๊ฑธ beanName์— ์ €์žฅํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

Q.ac.getBean์—์„œ ac๋Š” ๊ผญ ๋ถ™์—ฌํ•˜๋Š”๊ฑธ๊นŒ? 

A.
getBean์€ApplicationContext์—์„œ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ์ด๋‹ค.๊ทธ๋ ‡๊ธฐ์— ๊ด€๋ จ ApplicationContext์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์“ฐ๋ ค๋ฉด ๋‚ด๊ฐ€ ์ง€์ •ํ•œ ๋ณ€์ˆ˜(ac)๋ฅผ ๊ผญ ๋ถ™์—ฌ์จ์•ผ ํ•œ๋‹ค.

 

 

 

 

- getBean ์ถœ์ฒ˜

 

BeanMap (Spring Framework 6.1.11 API)

Limit the properties reflected in the key set of the map to readable properties.

docs.spring.io

 

 

 

- Object ์ถœ์ฒ˜

 

2. Java ์ž๋ฐ” [API] - Object ํด๋ž˜์Šค, Object ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ 1

์ž๋ฐ”์˜ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•  ๋•Œ extends ํ‚ค์›Œ๋“œ๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์ง€ ์•Š์œผ๋ฉด ์•”์‹œ์ ์œผ๋กœ java.lang.Object ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ž๋ฐ”์˜ ๋ชจ๋“  ํด๋ž˜์Šค๋Š” Object ํด๋ž˜์Šค์˜ ์ž์‹์ด๊ฑฐ๋‚˜ ์ž์† ํด

kephilab.tistory.com

 

 

 

 

 

โ–บ  findApplicationBean

: ๋‚ด๊ฐ€ ๊ฐœ๋ฐœํ•œ bean ์ถœ๋ ฅํ•˜๊ธฐ.

 

 

for (String beanDefinitionName : beanDefinitionNames) {
            BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
๋ชจ๋“  ๋นˆ์„ getBeanDefinitionNames๋กœ ๊ฐ€์ ธ์™”๋‹ค. ๊ทธ๋ฆฌ๊ณ  for์„ ํ†ตํ•ด ๋ชจ๋“  ๋นˆ์˜ ๋ฉ”ํƒ€์ •๋ณด๋ฅผ getBeanDefinition์œผ๋กœ beanDefinition์— ์ €์žฅํ•  ๊ฒƒ์ด๋‹ค.

 

getBeanDefinition( );

: ํŠน์ • bean์˜ ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

 

 

BeanDefinition

: ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ •์˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ bean์˜ ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

 

Q. ์œ„์˜ ์ฝ”๋“œ ์ค‘ getBean์—์„œ๋Š” Object๋ผ๋Š” ๊ฐ์ฒด ํƒ€์ž…์„ ์ ์—ˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ๋Š” ์™œ BeanDefinition์„ ์ ์„๊ฑธ๊นŒ?
getBean๋„ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ์ธ๊ฑฐ ์•„๋‹Œ๊ฐ€? ํ˜„์žฌ ์‚ฌ์šฉ์ค‘์ธ bean์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ˆ. ๊ทธ๋Ÿฐ๋ฐ ์™œ ๋‹ค๋ฅด๊ฒŒ ์“ฐ๋Š”๊ฑธ๊นŒ?

A. getBean()๊ณผ getBeanDefinition( )์€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค. getBean()์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋นˆ์˜ ์‹ค์ œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ (์‰ฝ๊ฒŒ ๋งํ•ด์„œ bean๊ณผ ์—ฐ๊ฒฐ๋œ ํด๋ž˜์Šค) Object ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ฐ˜๋ฉด์— getBeanDefinition()์€ ํŠน์ • ๋นˆ์˜ ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์ ธ์˜จ ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ์ •์˜ํ•ด์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ BeanDefinition์ด ๋˜๊ธฐ์— ๋นˆ์˜ ์ด๋ฆ„์ด ํ˜ธ์ถœ๋˜๋ฉด BeanDefinition ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰ Object์™€ BeanDefinition์„ ์จ์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์™„์ „ํžˆ ๋‹ค๋ฅด๋ฉฐ BeanDefinition์€ ํ•˜๋‚˜์˜ ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์ด ์•„๋‹ˆ๋‹ค.

 

 

Q. getBean( ) ๋ฉ”์„œ๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Object๋กœ ๋ฐ›๋Š”๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์ผ๋ฐ˜์ ์œผ๋กœ Object๋กœ ๋ฐ›๋Š”๊ฐ€?

A. ๋นˆ์˜ ์‹ค์ œ ํƒ€์ž…์ด ๋ฌด์—‡์ด๋“ ์ง€ ์ƒ๊ด€์—†์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด Object๋กœ ๋ฐ›๋Š”๋‹ค. (์œ ์—ฐ์„ฑ๊ณผ ์ผ๊ด€์„ฑ์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค)

 

 

 

ใ…คใ…ค•••๊ทธ ๋‹ค์Œ ์ฝ”๋“œ •••

 

 

if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
                Object bean = ac.getBean(beanDefinitionName);
                System.out.println("name = " + beanDefinitionName 
                + "object = " + bean); }

 

 

getRole

: ํ•ด๋‹น ์—ญํ• ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ •์ˆ˜๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

ROLE_APPLICATION

: ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ(๋‚ด๊ฐ€ ๋งŒ๋“ ) ๋นˆ์ด๋‹ค. ์ •์ˆ˜๊ฐ’์€ 2

  • ROLE_SUPPORT : ์Šคํ”„๋ง ๋‚ด๋ถ€์—์„œ ์ง€์›ํ•˜๋Š” ์—ญํ• ์„ ๊ฐ€์ง„ ๋นˆ์ด๋‹ค. ์ •์ˆ˜๊ฐ’์€ 4
  • ROLE_INFRASTRUCTURE : ์Šคํ”„๋ง์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ง€์›ํ•˜๋Š” ๋นˆ์ด๋‹ค. ์ •์ˆ˜๊ฐ’์€ 8

 

for๋ฌธ์œผ๋กœ ๋ชจ๋“  ๋นˆ์˜ ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™”๊ณ (beanDefinition), ๊ทธ ๋ฉ”ํƒ€์ •๋ณด๋ฅผ if๋ฌธ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ๋นˆ์ธ์ง€ ์•„๋‹Œ์ง€ ๊ตฌ๋ถ„ํ•  ๊ฒƒ์ด๋‹ค. beanDefinition์— ์žˆ๋Š” ์ •๋ณด๋ฅผ getRole์„ ํ†ตํ•ด ์—ญํ• ์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•œ๋‹ค. ๊ทธ ์—ญํ• ์ด ROLE_APPLICATION์ธ์ง€ ํ™•์ธํ•˜์—ฌ ๋งž์œผ๋ฉด ๊ด„ํ˜ธ ์•ˆ์— ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œBeanDefinition.ROLE_APPLICATION์œผ๋กœ ์“ด ์ด์œ ๋Š” ROLE_APPLICATION์ด BeanDefinition ํด๋ž˜์Šค ์•ˆ์— ์„ ์–ธ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ํ˜•ํƒœ๋กœ ์ ์–ด์•ผ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•œ๋‹ค.

beanDefinitionName(๋ชจ๋“  ๋นˆ์„ ๋ฐ˜ํ™˜๋˜์–ด ์ €์žฅํ•œ ๋ณ€์ˆ˜)์—์„œ ์กฐ๊ฑด์— ๋งž๋Š” ๋นˆ์„ ๊บผ๋‚ด Object ํƒ€์ž…์ธ bean์— ์ €์žฅํ•œ๋‹ค.

 

 

Q. ๋ฌด์กฐ๊ฑด getBean( )๊ณผ Object๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋ฐ›์•„์•ผ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋˜๋Š”๊ฐ€?
ใ…ค
A. ๊ทธ๋ ‡๋‹ค. ์‹ค์ œ ๋นˆ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป์–ด์™€์•ผ๋งŒ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. getRole( )์€ ํ•ด๋‹น ์—ญํ• ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ ๋ฟ, ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ ‡๊ธฐ๋•Œ๋ฌธ์— ์‹ค์ œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” getBean( )์„ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. getBean(ํƒ€์ž…) ํ˜น์€ getBean(๋นˆ์ด๋ฆ„, ํƒ€์ž…)์„ ์ ์œผ๋ฉด ์กฐํšŒ๊ฐ€ ๋œ๋‹ค.

 

 

 

 

- getRole ์ถœ์ฒ˜

 

BeanDefinition (Spring Framework 6.1.11 API)

Return the current bean class name of this bean definition. Note that this does not have to be the actual class name used at runtime, in case of a child definition overriding/inheriting the class name from its parent. Also, this may just be the class that

docs.spring.io

 

 

 

- getRole์˜ ์ƒ์ˆ˜ ์ถœ์ฒ˜

 

BeanDefinition (Spring Framework 6.1.11 API)

Return the current bean class name of this bean definition. Note that this does not have to be the actual class name used at runtime, in case of a child definition overriding/inheriting the class name from its parent. Also, this may just be the class that

docs.spring.io

 

 

 

 

 


 

 

 

 

โœ”๏ธ  beanfind_ApplicationContextBasicFindTest

 

โ–บ  findBeanByName

: ๋นˆ ์ด๋ฆ„์œผ๋กœ ์กฐํšŒํ•˜๊ธฐ.

 

 

MemberService memberService = ac.getBean("memberService", MemberService.class);
        assertThat(memberService).isInstanceOf(MemberServiceImpl.class);

 

 

assertThat( ).isInstanceOf( )

: ํ•ด๋‹น ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค์ธ์ง€๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

 

bean ์ด๋ฆ„ ์ค‘์—์„œ memberService์ด๋ฉฐ ํ•ด๋‹น ํƒ€์ž…์„ MemberService๋กœ ์ง€์ •ํ•œ ๋นˆ์„ MemberService(์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์œผ๋กœ)๊ฐ€์ง€๋ฉฐ ๋ณ€์ˆ˜ ์ด๋ฆ„์€ memberService์œผ๋กœ ๋ฐ›๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ MemberServiceimpl(๊ตฌ์ฒดํด๋ž˜์Šค)์ด memberService์˜ ์ธ์Šคํ„ด์Šค์ธ์ง€ ๋น„๊ตํ•œ๋‹ค.

์ข€ ๋” ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด๋ณด์ž๋ฉด, AppConfig์— ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋ฉ”์„œ๋“œ ๋ช…์„ ๊ฐ™์ด ์ ์—ˆ๊ณ  return ๊ฐ’์œผ๋กœ ๊ตฌ์ฒดํด๋ž˜์Šค๋ฅผ ์ ์—ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ AppConfig์— ์ ์€ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌ์ฒดํด๋ž˜์Šค๊ฐ€ ๋งž๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๊ณ  "memberService"๋ฅผ ์ ์–ด ์ด๋ฆ„์œผ๋กœ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

 

 

 

โ–บ  findBeanByNameX

: ๋นˆ ์ด๋ฆ„์œผ๋กœ ์กฐํšŒํ•˜์ง€ ์•Š๊ธฐ.

 

 

 assertThrows(NoSuchBeanDefinitionException.class,
                () -> ac.getBean("XXXX", MemberService.class));

 

 

assertThrows

: JUnit ๋˜๋Š” AssertJ์™€ ๊ฐ™์€ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€๋ฅผ ํ…Œ์ŠคํŠธํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ๋ฐœ์ƒ๋œ ์˜ˆ์™ธ ํƒ€์ž…๊ณผ ์˜ˆ์ƒ๋˜๋Š” ์˜ˆ์™ธ ํƒ€์ž…์ด ์ผ์น˜ํ•˜๋ฉด ํ…Œ์ŠคํŠธ๋Š” ์„ฑ๊ณตํ•œ๋‹ค.

 

 

NoSuchBeanDefinitionException.class

: ์ •์˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” Bean ์ธ์Šคํ„ด์Šค๋ฅผ ์š”์ฒญํ–ˆ์„ ๋•Œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

 

() -> ๋žŒ๋‹ค์‹

: (๋งค๊ฐœ๋ณ€์ˆ˜)๊ฐ€ ๋“ค์–ด๊ฐ€๊ณ  -> ์‹œ์ž‘๋ถ€๋ถ„์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

 

 

-> (์‹œ์ž‘๋ถ€๋ถ„)์œผ๋กœ ๊ฐ€์„œ XXXX๊ฐ€ MemberService.class์˜ ํ•ด๋‹น ๋นˆ์œผ๋กœ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด NoSuchBeanDefinitionException ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

 

 

 

 

- assertThrows ์ถœ์ฒ˜

 

[Junit] Junit5 Exception Throw ํ…Œ์ŠคํŠธ

์ด ๊ธ€์€ ํ˜ผ์ž ํ•™์Šตํ•œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ‹€๋ฆฌ๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ์ˆ˜์ •ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 1. Junit4 Exception ํ…Œ์ŠคํŠธ ๋งŽ์€ ๊ฐœ๋ฐœ์ž ๋ถ„๋“ค์ด ์‚ฌ์šฉ

small-stap.tistory.com

 

 

 

- NoSuchBeanDefinitionException ์ถœ์ฒ˜

 

NoSuchBeanDefinitionException (Spring Framework 6.1.11 API)

Return the required type of the missing bean, if it was a lookup by type that failed.

docs.spring.io

 

 

 

- ๋žŒ๋‹ค์‹ ์ถœ์ฒ˜

 

[Java/์ž๋ฐ”] ๋žŒ๋‹ค์‹(Lambda)์ด๋ž€? ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ๋ฒ•

๋žŒ๋‹ค์‹์ด๋ž€ ? ๋žŒ๋‹ค์‹์ด๋ž€ ์‰ฝ๊ฒŒ ๋งํ•ด ๋ฉ”์„œ๋“œ๋ฅผ "ํ•˜๋‚˜์˜ ์‹"์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์‹์œผ๋กœ ํ‘œํ˜„ํ•˜์—ฌ ํ›จ์”ฌ ๊ฐ„๋žตํ•˜๊ฒŒ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜๋ฉฐ, ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„๊ณผ ๋ฐ˜ํ™˜๊ฐ’์ด ์—†์–ด์ง€๋ฏ€๋กœ "์ต๋ช…ํ•จ์ˆ˜

hstory0208.tistory.com

 

 

 

 

 


 

 

 

 

โœ”๏ธ  beanfind_ApplicationContextSameBeanFindTest

 

    @Configuration
    static class SameBeanConfig {
        @Bean
        public MemberRepository memberRepository1() {
            return new MemoryMemberRepository();
        }
        @Bean
        public MemberRepository memberRepository2() {
            return new MemoryMemberRepository();
        }
  }
AppConfig๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์‹ซ์œผ๋‹ˆ, ์ด๋ ‡๊ฒŒ ๊ฐ™์€ ํƒ€์ž…์˜ ๊ฐ™์€ ๊ตฌ์ฒดํด๋ž˜์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‘๊ฐœ์˜ bean์„ ๋งŒ๋“ค์—ˆ๋‹ค.

 

 

 

โ–บ  findAllBeanByType

 

Map<String, MemberRepository> beansOfType =
	ac.getBeansOfType(MemberRepository.class);

 

 

getBeansOfType

: ํƒ€์ž…์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š”๋‹ค. Bean ์ด๋ฆ„์„ key๋กœ ๊ฐ์ฒด๋ฅผ value๋กœ ํ•˜๋Š” Map์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ฃผ๋กœ ํŠน์ • ํƒ€์ž…์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋นˆ์ด ์žˆ์„ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

 

MemberRepository ํƒ€์ž…์— ์žˆ๋Š” ๋นˆ์„ getBeansOfType ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด key์™€ value๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด String์— bean์˜ ์ด๋ฆ„์ด ๋“ค์–ด๊ฐ€๊ณ  MemberRepository์— ์‹ค์ œ bean์˜ ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ MemberRepository ํƒ€์ž…์— bean์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ BeansOfType ๋ณ€์ˆ˜์— ๋ชจ๋‘ ๋‹ด์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

 

 

ใ…คใ…ค•••๊ทธ ๋‹ค์Œ ์ฝ”๋“œ •••

 

 

       for (String key : beansOfType.keySet()) {
            System.out.println("key = " + key + " value = " +
beansOfType.get(key));
        }

 

KeySet

: Map์˜ ๋ชจ๋“  key๋ฅผ ๊ฐ€์ ธ์™€ Set๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. for-each ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผํ•˜๊ณ , ๊ฐ key๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ value์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

beansOfType์— ์žˆ๋Š” ๋ชจ๋“  key(๋นˆ์˜ ์ด๋ฆ„)๋ฅผ ๊ฐ€์ ธ์™€ ๋ฐ˜๋ณตํ•˜์—ฌ ๋ณ€์ˆ˜ key์— ๋„ฃ๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  get(key)๋ฅผ ํ†ตํ•ด ๊ทธ key(๋นˆ์˜ ์ด๋ฆ„)์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ beansOfType์—์„œ ๊ฐ€์ ธ์˜จ๋‹ค. ์—ฌ๊ธฐ์„œ beansOfType์€ key์™€ MemberRepository๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜๋ช…์œผ๋กœ, get(key)๋Š” ๋นˆ์˜ ์ด๋ฆ„์— ๋งž๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ๋œ๋‹ค.

 

 

 

ใ…ค•••๊ทธ ๋‹ค์Œ ์ฝ”๋“œ •••

 

 

  System.out.println("beansOfType = " + beansOfType);
        assertThat(beansOfType.size()).isEqualTo(2);
beansOfType์€ ๋ชจ๋“  bean์˜ ์ด๋ฆ„๊ณผ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์œผ๋‹ˆ, ๊ทธ๊ฒƒ์„ ๋ชจ๋‘ ์ถœ๋ ฅํ•œ๋‹ค.  assertThat์„ ์ด์šฉํ•˜์—ฌ beansOfType์— ์žˆ๋Š” bean์˜ ๊ฐœ์ˆ˜๊ฐ€ 2๊ฐœ๊ฐ€ ๋งž๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค.

 

 

 

 

 

- getBeansOfType ์ถœ์ฒ˜

 

getBean์˜ NoSuchBeanDefinitionException ํšŒํ”ผํ•˜๊ธฐ

getBean์˜ NoSuchBeanDefinitionException ํšŒํ”ผํ•˜๊ธฐ

thecodinglog.github.io

 

 

 

- KeySet ์ถœ์ฒ˜

 

[Java] Map ์ „์ฒด ์ถœ๋ ฅ(entrySet, keySet, Iterator, Lambda, Stream)

๋ชฉ์ฐจ Map ๊ฐ์ฒด์˜ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•1. entrySet()entrySet() ๋ฉ”์„œ๋“œ๋Š” Map์—์„œ ๋ชจ๋“  Entry(Key-Value ์Œ)๋ฅผ ๊ฐ€์ ธ์™€ Set ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. foreach ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ Entry์— ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘

tychejin.tistory.com

 

 

 

 


 

 

 

โœ”๏ธ XML

 

<bean id="memberService" class="hello.core.member.MemberServiceImpl">
         <constructor-arg name="memberRepository" ref="memberRepository" /> ์ฐธ์กฐ
</bean>
     
                                   ์‹ค์ œ ๊ตฌํ˜„ ๊ฐ์ฒด
<bean id="memberRepository" class="hello.core.member.MemoryMemberRepository" />

 

 

GenericXmlApplicatonContext

: ์Šคํ”„๋ง ์„ค์ • ํŒŒ์ผ์„ ์ฝ์–ด์™€ ๋กœ๋”ฉ ์‹œํ‚ค๊ณ , ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

 

 

- GenericXmlApplicationContext ์ถœ์ฒ˜

 

[SPRING]GenericXmlApplicationContext๋ž€? ์Šคํ”„๋ง ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ๋ฒ•

์˜ค๋Š˜์€ ApplicationContext.xml ์Šคํ”„๋ง ์„ค์ • ํŒŒ์ผ์„ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , GenericXmlApplicationContextํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ ‘๊ทผํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ดํ•ด๋ฅผ ์‰ฝ๊ฒŒ

junghn.tistory.com

 

 

 

 


 

 

.

ํ˜ผ์ž ์ฒœ์ฒœํžˆ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ž˜๋ชป๋œ ๋‚ด์šฉ์ด ์ ํ˜€์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ๊ฐ์•ˆํ•˜๊ณ  ๋ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ€ ๋ชจ๋‘๋“ค ํ™”์ดํŒ…ํ•˜์„ธ์š” ๐Ÿ€

 

+ Recent posts