๐ง ์ธ์ํ
์คํธ ๋ฐ์ดํฐ ์ด๊ธฐํ ์ธ์ํ
์คํธ ํน์ ํตํฉํ
์คํธ๋ฅผ ์์ฑํ ๋์๋ ํ
์คํธ๋ฅผ ๊ฒฉ๋ฆฌํ๊ธฐ ์ํด ๋ค์ํ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด์ ๊ด๋ จํ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ๋ํด์๋ ์ธ์ํ
์คํธ์์ ํ
์คํธ ๊ฒฉ๋ฆฌํ๊ธฐ ๊ธ์ ์์ธํ ๋ํ๋ ์์ต๋๋ค. ์ ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ๋ค ์ค @Sql ์ ๋
ธํ
์ด์
์ ์ฌ์ฉํ์ฌ truncate ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ฃผ๋ก ์ฌ์ฉํ์๋๋ฐ์, ์ด ๋ฐฉ๋ฒ์ truncate.sql ํ์ผ์ ์ฝ๋๊ฐ ์์กด์ ์ด๊ฒ ๋๋ฉฐ, ํ
์ด๋ธ์ด ์๋ก ์ถ๊ฐ๋๊ฑฐ๋ ์ญ์ ๋๋ ๊ฒฝ์ฐ truncate.sql ํ์ผ๋ ๊ณ์ํด์ ์์ ํด์ฃผ์ด์ผ ํ๋ค๋ ๋จ์ ์ ๋๊ผ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค BeforeEachCallback๋ผ๋ ๊ฒ์ ๋ํด ์๊ฒ๋์๊ณ , ์ด๋ฅผ ์ฌ์ฉํ์ฌ truncate.sql ํ์ผ ์์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด๊ธฐํ๋ฅผ ์๋ํ ์์ผฐ๋๋ฐ์, ํด๋น ๋ฐฉ๋ฒ์ ๋ํด์ ์..
๐๏ธ Spring/๊ธฐ๋ณธ
๐ง ์๋ก 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..