๐Ÿ๏ธ Spring/๊ธฐ๋ณธ

๐Ÿง ์ธ์ˆ˜ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™” ์ธ์ˆ˜ํ…Œ์ŠคํŠธ ํ˜น์€ ํ†ตํ•ฉํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ์—๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ด€๋ จํ•œ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ์ธ์ˆ˜ํ…Œ์ŠคํŠธ์—์„œ ํ…Œ์ŠคํŠธ ๊ฒฉ๋ฆฌํ•˜๊ธฐ ๊ธ€์— ์ž์„ธํžˆ ๋‚˜ํƒ€๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•๋“ค ์ค‘ @Sql ์• ๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ truncate ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฃผ๋กœ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ์š”, ์ด ๋ฐฉ๋ฒ•์€ truncate.sql ํŒŒ์ผ์— ์ฝ”๋“œ๊ฐ€ ์˜์กด์ ์ด๊ฒŒ ๋˜๋ฉฐ, ํ…Œ์ด๋ธ”์ด ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜๋Š” ๊ฒฝ์šฐ truncate.sql ํŒŒ์ผ๋„ ๊ณ„์†ํ•ด์„œ ์ˆ˜์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋‹จ์ ์„ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋˜ ์ค‘ BeforeEachCallback๋ผ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์•Œ๊ฒŒ๋˜์—ˆ๊ณ , ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ truncate.sql ํŒŒ์ผ ์—†์ด๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”๋ฅผ ์ž๋™ํ™” ์‹œ์ผฐ๋Š”๋ฐ์š”, ํ•ด๋‹น ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ..
๐Ÿง ์„œ๋ก  Repository์™€ DAO์— ๊ด€ํ•ด์„œ ํ—ท๊ฐˆ๋ ค ํ•˜๋Š” ๋ถ„๋“ค์ด ๋˜๊ฒŒ ๋งŽ์€ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์„ ๋Š๋ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋„ ์ฒ˜์Œ ํ•ด๋‹น ๋‘ ์šฉ์–ด๋ฅผ ์ ‘ํ–ˆ์„ ๋•Œ์—๋Š” ๊ต‰์žฅํžˆ ํ˜ผ๋™์Šค๋Ÿฌ์› ๋˜ ๊ธฐ์–ต์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์œ„ ๋‘ ์šฉ์–ด์— ๋Œ€ํ•ด์„œ ๊ฐ๊ฐ ์–ด๋–ค ์˜๋ฏธ๋ฅผ ๊ฐ–๊ณ  ์–ด๋–ค ์‹์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์‚ดํŽด๋ด„์œผ๋กœ์จ ๊ณ ๋ฏผ์„ ์กฐ๊ธˆ ํ•ด๊ฒฐํ•ด ๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ง€๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๋ก ๋งŒ ๋ณด๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด, ๋งจ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€์…”๋„ ๋ฉ๋‹ˆ๋‹ค. ๐Ÿง DAO Data Access Object์˜ ์ค„์ž„๋ง์ธ DAO๋Š” ํ•ด์„ ๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๋” ํ’€์–ด์„œ ์„ค๋ช…ํ•˜์ž๋ฉด, DAO๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ˜น์€ ๋‹ค๋ฅธ ์˜์†์„ฑ(Persistence) ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ถ”์ƒํ™”ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€, ํ˜น์€ ์–ด๋–ค ์˜์†์„ฑ ์ €์žฅ ..
๐Ÿง ์„œ๋ก  ๋„๋ฉ”์ธ ์ด๋ฒคํŠธ๋ฅผ ํ•œ๋ฒˆ ์‚ฌ์šฉํ•ด๋ณด๊ณ ์ž ์ด๋Ÿฐ์ €๋Ÿฐ ์ž๋ฃŒ๋“ค์„ ์ฐธ๊ณ ํ•˜๋ฉฐ ์‚ฌ์šฉ์„ ํ•˜๋˜ ์ค‘์— ๋ฌธ์ œ๊ฐ€ ํ•˜๋‚˜ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ํ•˜๊ณ ์ž ํ–ˆ๋˜ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ์ž„ ์ƒ์„ฑ (๋ชจ์ž„ ์ƒ์„ฑ ์ด๋ฒคํŠธ ๋ฐœํ–‰) -> ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ (๋ชจ์ž„ ๊ธฐ๋ณธ ์—ญํ•  ๋“ฑ๋ก) & ๋ชจ์ž„ ๊ธฐ๋ณธ ์—ญํ•  ๋“ฑ๋ก ์ด๋ฒคํŠธ ๋ฐœํ–‰ -> ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ (๋ชจ์ž„์„ ์ƒ์„ฑํ•œ ํšŒ์›์„ ํšŒ์žฅ์œผ๋กœ ๋“ฑ๋ก) ์šฐ์„  ๋ชจ์ž„๊ณผ, ๋ชจ์ž„์˜ ์—ญํ• , ๋ชจ์ž„ ์ฐธ๊ฐ€์ž๋Š” ๋”ฐ๋กœ๋”ฐ๋กœ ์ˆ˜์ •๋˜๊ณ  ์ œ๊ฑฐ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋‹ค๋ฅธ ์—๊ทธ๋ฆฌ๊ฑฐํŠธ๋ผ ํŒ๋‹จํ•˜์—ฌ ์ด๋“ค์„ ๋ถ„๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์œ„ ์ƒํ™ฉ์—์„œ ์ €๋Š” @TransactionalEventListener๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. @Transactional @Service public class CreateClub implements CreateCl..
@ConfigurationProperties @ConfigurationProperties๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ application.yml๋“ฑ๊ณผ ๊ฐ™์€ ์„ค์ •์ •๋ณด์— ์ž‘์„ฑํ•œ ์„ค์ • ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. application.yml myproperty: name: shin ์„ค์ • ๊ฐ’์„ ๋ณด๊ด€ํ•  ํด๋ž˜์Šค @ConstructorBinding @ConfigurationProperties("myproperty") data class ApplicationProperties( val name: String, ) { } @ConstructorBinding์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์„ฑ์ž ๋ฐฉ์‹์œผ๋กœ ๊ฐ’์„ ์„ธํŒ…ํ•  ์ˆ˜ ์žˆ์–ด, ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด setter๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๋ฐ”์ธ๋”ฉ ์‹œ..
๋“ฑ๋ก๋œ ๋ชจ๋“  ๋นˆ ์กฐํšŒํ•˜๊ธฐ ๋“ฑ๋ก๋œ ์Šคํ”„๋ง ๋นˆ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ApplicationContext๋ฅผ ์ฃผ์ž…๋ฐ›์€ ๋’ค, beanDefinitionNames()๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ์œ„ํ•ด CommandLineRunner๋ฅผ ํ†ตํ•ด ๋นˆ์ด ๋ชจ๋‘ ๋“ฑ๋ก๋œ ํ›„ ๋นˆ์„ ์ถœ๋ ฅํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. @Component class BeanPrinter( ac: ApplicationContext ) : CommandLineRunner { private final val ac: ApplicationContext = ac override fun run(vararg args: String?) { val beanDefinitionNames = ac.beanDefinitionNames for (beanDefini..
์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋กœ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๋˜ ์ค‘์—, ์ฝ”๋“œ์— ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. (์ •ํ™•ํžˆ๋Š” ๋ฐœ๊ฒฌํ•ด์ฃผ์‹  ๊ฒƒ) ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด์ž. @Service @RequiredArgsConstructor public class LoadUserService { private final RestTemplate restTemplate = new RestTemplate(); private SocialLoadStrategy socialLoadStrategy;//์ถ”์ƒ ํด๋ž˜์Šค, ๋กœ๊ทธ์ธ์„ ์ง„ํ–‰ํ•˜๋Š” ์‚ฌ์ดํŠธ๋ ˆ ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง public OAuth2UserDetails getOAuth2UserDetails(AccessTokenSocialTypeToken authentication) { SocialType socialType = aut..
๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•ด์•ผํ•  ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋Ÿด ๋•Œ @PostContructor๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ง€๊ธˆ๋ถ€ํ„ฐ ๊ทธ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž. @Component @RequiredArgsConstructor public class InitDb { private final InitService initService; @PostConstruct public void init() { initService.doInit(); } @Component @Transactional @RequiredArgsConstructor static class InitService { private final EntityManager em; public void doInit(){ Member member = new Member()..
Inner Class๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ๊ฒฝ์šฐ static ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์ฃผ์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. @SpringBootTest class InnerClassTests { @Test void AutowiredOption() { ApplicationContext ac = new AnnotationConfigApplicationContext(InnerClass.class); } class InnerClass { @Autowired public void setNoBean1(){} } } ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜ UnsatisfiedDependencyException: Error creating bean with name 'InnerClassTests.InnerClass': Un..
๋ง ๋ž‘
'๐Ÿ๏ธ Spring/๊ธฐ๋ณธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก