๐Ÿ๏ธ Spring

์š”์ฆ˜์€ OAuth2๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ํ†ตํ•ด ๊ฐ€์ž…์ด ๊ฐ€๋Šฅํ•œ ์„œ๋น„์Šค๋“ค์ด ๊ต‰์žฅํžˆ ๋งŽ๋‹ค. ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์—์„œ๋„ OAuth2๋ฅผ ์ด์šฉํ•œ ์†Œ์…œ ๋กœ๊ทธ์ธ ๋ฐฉ์‹์„ ์ง€์›ํ•˜๋Š”๋ฐ, ํ•„์ž๋Š” ๋งจ ์ฒ˜์Œ ์ด๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ๋„ˆ๋ฌด ์–ด๋ ค์› ์—ˆ๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ ์‹œํ๋ฆฌํ‹ฐ์—์„œ OAuht2๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž. ์˜์กด์„ฑ ๊ด€๋ฆฌ ์šฐ์„  OAuth2๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด OAuth2-client ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค. build.gradle ์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์ž. implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' oauth2Login() ์˜ ์ž‘๋™๋ฐฉ์‹ WebSecurityConfigurerAdapter ๋ฅผ ์ƒ์†๋ฐ›์€ Security Config ํŒŒ์ผ์—์„œ oauth2 ๋กœ๊ทธ์ธ..
@Autowired ์‚ฌ์šฉ ์‹œ ์กฐํšŒ๋œ ๋นˆ์ด 2๊ฐœ ์ด์ƒ์ผ ๊ฒฝ์šฐ @Autowired๋ฅผ ํ†ตํ•œ ์˜์กด๊ด€๊ณ„ ์ž๋™ ์ฃผ์ž… ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—, ๋™์ผํ•œ ํƒ€์ž…์˜ ๋นˆ์ด 2๊ฐœ ์ด์ƒ์ด๋ผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‘๊ฐœ์˜ ๋นˆ๋“ค ์ค‘ ์–ด๋– ํ•œ ๋นˆ์„ ์ฃผ์ž…ํ•ด์•ผ ํ•  ์ง€ ๊ฒฐ์ •ํ•˜์ง€ ๋ชปํ•ด์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ธ๋ฐ, ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ๊ตฌ์ฒด ํด๋ž˜์Šค์— ํ•ด๋‹นํ•˜๋Š” ํ•„๋“œ๋ช…(ํ˜น์€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ช…)์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” DIP๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ @Qualifier์™€ @Primary์™€, ์–ด๋…ธํ…Œ์ด์…˜์„ ์ง์ ‘ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, ํ•˜๋‚˜ํ•˜๋‚˜ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. @Primary ์‚ฌ์šฉ @Primary๋Š” ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ ๋˜๊ฒŒ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. @Componet @Prim..
ํŠน์ • ํƒ€์ž…์˜ ๋นˆ์ด ์—ฌ๋Ÿฌ๊ฐœ ๋“ฑ๋ก๋˜์–ด ์žˆ์„ ๋•Œ, ๋“ฑ๋กํ•œ ๋ชจ๋“  ๋นˆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ๋“ฑ๊ธ‰์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์„œ๋น„์Šค๊ฐ€ ์ ์šฉ๋˜์–ด์•ผ ํ•˜๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋“ฑ์˜ ๊ฒฝ์šฐ๊ฐ€ ๊ทธ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ List๋‚˜ Map, Set์„ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋“ฑ๋กํ•œ ๋นˆ ๋ชจ๋‘ ์กฐํšŒ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž. public class DiscountService { private final Map policyMap; private final List policiList; private final Set policieSet; @Autowired public DiscountService( Map policyMap, List policiList, Set policieSet ){ ..
@Qualifier์˜ ๋ฌธ์ œ์  @Qualifier("mainDiscountPolicy") ์ฒ˜๋Ÿผ, ๋ฌธ์ž๋ฅผ ์ง์ ‘ ์ ์–ด์ฃผ๋Š” ๋ฐฉ์‹์€ ์ปดํŒŒ์ผ ์‹œ์ ์— ์ฒดํฌ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์ง์ ‘ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋…ธํ…Œ์ด์…˜ ์ง์ ‘ ๋งŒ๋“ค๊ธฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์–ด๋…ธํ…Œ์ด์…˜ ์† @Qualifier๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,ElementType.TYPE, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Qualifier("mainDiscountPolicy") pu..
@Autowired @Autowired๋ž€ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์ž๋™์œผ๋กœ ์˜์กด ๊ด€๊ณ„๋ฅผ ์—ฐ๊ฒฐ(์ฃผ์ž…) ์‹œ์ผœ์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค. @ComponentScan์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์˜์กด๊ด€๊ณ„์— ๋Œ€ํ•œ ์„ค์ •์„ ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฐ์ฒด์˜ "ํƒ€์ž…"์— ํ•ด๋‹นํ•˜๋Š” ๋นˆ์„ ์ฐพ์•„์„œ ์ž๋™์œผ๋กœ ์ฃผ์ž…์‹œ์ผœ์ค๋‹ˆ๋‹ค. ์˜์กด๊ด€๊ณ„ ์ž๋™ ์ฃผ์ž… ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž ์ฃผ์ž… ์ˆ˜์ •์ž ์ฃผ์ž… (Setter ์ฃผ์ž…) ํ•„๋“œ ์ฃผ์ž… ์ƒ์„ฑ์ž ์ฃผ์ž… ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํŠน์ง• ์ƒ์„ฑ์ž ํ˜ธ์ถœ์‹œ์ ์— ๋‹จ 1ํšŒ๋งŒ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. ๋ถˆ๋ณ€, ํ•„์ˆ˜ ์˜์กด๊ด€๊ณ„์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. @Component public class OrderServiceImpl implements OrderService { private..
@ComponentScan @ComponentScan์€ @Component ๋ฐ @Service, @Repository, @Controller, @Configuration๋“ฑ๊ณผ ๊ฐ™์ด @Component๊ฐ€ ๋ถ™์–ด์žˆ๋Š” Class๋“ค์„ ์ž๋™์œผ๋กœ Scanํ•˜์—ฌ ์Šคํ”„๋ง Bean์œผ๋กœ ๋“ฑ๋กํ•ด์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. @Component๋Š” ํด๋ž˜์Šค์— ์‚ฌ์šฉ๋˜๋ฉฐ, ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋  ๋•Œ์—๋Š” ํด๋ž˜์Šค๋ช…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ํด๋ž˜์Šค์˜ ๋งจ ์•ž๊ธ€์ž๋งŒ ์†Œ๋ฌธ์ž๋กœ ๋ฐ”๊ฟ”์„œ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ Member ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ์—๋Š” Bean์œผ๋กœ ๋“ฑ๋ก๋˜๋Š” ๊ฒฝ์šฐ member๋กœ ๋“ฑ๋ก๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. @ComponentScan์˜ ๋ฒ”์œ„ ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ๋Š” @ComponenetScan์ด ์‚ฌ์šฉ๋œ ํŒจํ‚ค์ง€๋ฅผ ์‹œ์ž‘ ์œ„์น˜๋กœ ํ•˜์—ฌ, ํ•ด๋‹น ํŒจํ‚ค์ง€์™€ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ..
@Configuration @Configuration์€ ์Šคํ”„๋ง ์„ค์ • ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜๋Š” ์• ๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์• ๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ, ์Šคํ”„๋ง ๋นˆ๊ณผ ๊ด€๋ จ๋œ ์„ค์ • ํด๋ž˜์Šค์ž„์„ ๋ช…์‹œํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ๋™์‹œ์— ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜ ๋” ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์‹ฑ๊ธ€ํ†ค๊ณผ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. @Configuration๊ณผ ์‹ฑ๊ธ€ํ†ค @Configuration public class AppConfig { @Bean public MemberService memberService() { //์Šคํ”„๋ง ๋นˆ์— ๋“ฑ๋ก๋ ๋•Œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์œผ๋กœ ๋“ฑ๋ก return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { return new Or..
์‹ฑ๊ธ€ํ†ค ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ์–ด๋–ค ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์˜ค์ง ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๋ฉฐ, ์ด ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ „์—ญ์ ์ธ ์ ‘์ด‰์ ์„ ์ œ๊ณตํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์‹ฑ๊ธ€ํ†ค์„ ๊ตฌํ˜„ํ•˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, ํ•˜๋‚˜ํ•˜๋‚˜ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 1. Eager Initialization (์ด๋ฅธ ์ดˆ๊ธฐํ™”, Thread - safe) Eager Initialization์€ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ์˜ ์‹ฑ๊ธ€ํ†ค ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. public class Singleton { private static final Singleton instance = new Singleton();//ํด๋ž˜์Šค ๋กœ๋”ฉ ์‹œ์ ์— ์ƒ์„ฑ private Singleton(){} //private ์ƒ์„ฑ์ž๋กœ ์™ธ๋ถ€ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋Š”๊ฒƒ์„ ์ฐจ๋‹จํ•œ๋‹ค. public sta..
๋ง ๋ž‘
'๐Ÿ๏ธ Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (22 Page)