[์ธํ๋ฐ/SPRING] ์คํ๋ง ๋น๊ณผ ์์กด๊ด๊ณโ
๐ ํ์ ์ปจํธ๋กค๋ฌ๊ฐ ํ์์๋น์ค์ ํ์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ฌ์ฉ : ์์กด๊ด๊ณ
๐ฉํ์ ์ปจํธ๋กค๋ฌ
: ์คํ๋ง ์คํ ์ ์คํ๋ง ์ปจํ ์ด๋๋ผ๋ ํต์ด ์๊ธฐ๋๋ฐ @Controller๊ฐ ์์ผ๋ฉด ํ์ ์ปจํธ๋กค๋ฌ ๊ฐ์ฒด ์์ฑํ์ฌ ์ปจํ ์ด๋์ ๋ฃ์ด๋๊ณ ์คํ๋ง์ด ๊ด๋ฆฌํจ. (์คํ๋ง Bean ์์ฑ)
@Controller
public class MemberController {
private MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
๐ฅ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ฒด ์ฌ๋ฌ๋ฒ ์์ฑํ ์ด์ ๊ฐ ์๋ค.
private final MemberService memberService = new MemberService();
๐๐DI (Dependency Injection), ์์กด์ฑ ์ฃผ์ : ๊ฐ์ฒด ์์กด๊ด๊ณ๋ฅผ ์ธ๋ถ์์ ๋ฃ์ด์ฃผ๋ ๊ฒ
์์ฑ์์ @Autowired ๊ฐ ์์ผ๋ฉด ์คํ๋ง์ด ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ์ปจํ ์ด๋์์ ์ฐพ์์ ๋ฃ์ด์ค๋ค.
(์ด์ ํ ์คํธ์์๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ฃผ์ ํ๊ณ , ์ฌ๊ธฐ์๋ @Autowired์ ์ํด ์คํ๋ง์ด ์ฃผ์ ํด์ค๋ค.)
>> ํ์ ์ปจํธ๋กค๋ฌ๊ฐ ์คํ๋ง ์ปจํ ์ด๋์ ์์ฑ > ์์ฑ์๋ฅผ ํธ์ถ > ์์ฑ์์ @Autowired๋ผ๊ณ ๋์ด์์ผ๋ฉด ์คํ๋ง์ด ๋ฉค๋ฒ ์๋น์ค๋ฅผ ์คํ๋ง ์ปจํ ์ด๋์ ์๋ ๋ฉค๋ฒ์๋น์ค์ ์ฐ๊ฒฐ์์ผ์ค
๐์คํ๋ง ๋น์ ๋ฑ๋กํ๋ 2๊ฐ์ง ๋ฐฉ๋ฒ
1. ์ปดํฌ๋ํธ ์ค์บ(์๋์ ์ด๋ ธํ ์ด์ ์ ์ปดํฌ๋ํธ๊ฐ ๊ทผ๋ณธ)๊ณผ ์๋ ์์กด๊ด๊ณ ์ค์
์คํ ์, @Component์ด๋ ธํ ์ด์ ์ด ์์ผ๋ฉด ์คํ๋ง ๋น์ผ๋ก ์๋ ๋ฑ๋ก๋๋ค
- @Controller : ์ธ๋ถ ์์ฒญ์ ๋ฐ์
- @Service : ๋น์ง๋์ค ๋ก์ง์ ๋ง๋ฆ
- @Repository : ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
- @Autowired : ์ฐ๊ด๊ด๊ณ ์ค์
์ฐธ๊ณ : ์คํ๋ง์ ์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น์ ๋ฑ๋กํ ๋, ๊ธฐ๋ณธ์ผ๋ก ์ฑ๊ธํค์ผ๋ก ๋ฑ๋กํ๋ค(์ ์ผํ๊ฒ ํ๋๋ง๋ฑ๋กํด์ ๊ณต์ ํ๋ค) ๋ฐ๋ผ์ ๊ฐ์ ์คํ๋ง ๋น์ด๋ฉด ๋ชจ๋ ๊ฐ์ ์ธ์คํด์ค๋ค. ์ค์ ์ผ๋ก ์ฑ๊ธํค์ด ์๋๊ฒ ์ค์ ํ ์ ์์ง๋ง, ํน๋ณํ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๋ฉด ๋๋ถ๋ถ ์ฑ๊ธํค์ ์ฌ์ฉํ๋ค.
ex) OrderService๊ฐ memberRepository๋ฅผ @Autowired ํ์ ๊ฒฝ์ฐ, memberService์ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ฃ์ด์ค. ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ!
2. ์๋ฐ ์ฝ๋๋ก ์ง์ ์คํ๋ง ๋น ๋ฑ๋กํ๊ธฐ
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
//new ํค์๋ ๋ค์ ์ธํฐํ์ด์ค ๊ตฌํ ํด๋์ค
return new MemoryMemberRepository();
}
}
@Bean๋ก ์ปจํ ์ด๋์ ์คํ๋ง ๋น ๋ฑ๋ก์ ํ๊ณ @Autowired ๋์ ๋ฆฌํด ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฐ๊ฒฐ
์ฐธ๊ณ : XML๋ก ์ค์ ํ๋ ๋ฐฉ์๋ ์์ง๋ง ์ต๊ทผ์๋ ์ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ์๋ตํ๋ค.
์ฐธ๊ณ : DI์๋ ํ๋ ์ฃผ์ , setter ์ฃผ์ , ์์ฑ์ ์ฃผ์ ์ด๋ ๊ฒ 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค. ์์กด๊ด๊ณ๊ฐ ์คํ์ค์๋์ ์ผ๋ก ๋ณํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์์ผ๋ฏ๋ก ์์ฑ์ ์ฃผ์ ์ ๊ถ์ฅํ๋ค.
//ํ๋ ์ฃผ์
- ์ฃผ์! ์คํ๋ง ์คํํ ๋๋ง ๋ฃ์ด์ฃผ๊ณ ์ค๊ฐ์ ๋ฐ๊ฟ ์๊ฐ ์๋ค..! ๊ถ์ฅX
@Autowired
private MemberService memberService;
//์์ฑ์ ์ฃผ์
- ์กฐ๋ฆฝ ์์ ์ ์์ฑ์๋ก ์กฐ๋ฆฝํด๋๊ณ ๋ณ๊ฒฝ๋ ์ ์๋๋ก ๋ง์๋ฒ๋ฆฌ๊ธฐ
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
//setter ์ฃผ์
- publicํ๊ฒ ๋
ธ์ถ๋์ด ์์ด์ผ ํจ. ํ๋ฒ ์ธํ
์ด ๋๋ฉด ๋ฐ๊ฟ ์ผ์ด ์์ผ๋ ์ํ.
// memeberService.setMemberService(); ์ฝ๋ ์ ์ด์ผํจ
private MemberService memberService;
@Autowired
public void setMemberService(MemberService memberService) {
this.memberService = memberService;
}
์ฐธ๊ณ : ์ค๋ฌด์์๋ ์ฃผ๋ก ์ ํํ๋ ์ปจํธ๋กค๋ฌ, ์๋น์ค, ๋ฆฌํฌ์งํ ๋ฆฌ ๊ฐ์ ์ฝ๋๋ ์ปดํฌ๋ํธ ์ค์บ์ ์ฌ์ฉํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ ํํ ๋์ง ์๊ฑฐ๋, ์ํฉ์ ๋ฐ๋ผ ๊ตฌํ ํด๋์ค๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ฉด ์ค์ ์ ํตํด ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค.
์ฃผ์: @Autowired ๋ฅผ ํตํ DI๋ helloController, memberService๋ฑ๊ณผ ๊ฐ์ด ์คํ๋ง์ด ๊ด๋ฆฌํ๋ ๊ฐ์ฒด์์๋ง ๋์ํ๋ค. ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ์ง ์๊ณ ๋ด๊ฐ ์ง์ ์์ฑํ ๊ฐ์ฒด์์๋ ๋์ํ์ง ์๋๋ค.
*์คํ๋ง ์ปจํ ์ด๋, DI ๊ด๋ จ๋ ์์ธํ ๋ด์ฉ์ ์คํ๋ง ํต์ฌ ์๋ฆฌ ๊ฐ์์์ ์ค๋ช ํ๋ค.
๋ฉด์ ์์ ์ด๋ ธํ ์ด์ ์ ๋ํ ์ง๋ฌธ์ ๋ฐ์ ์ ์ด ์๋ค. ํ๋ฒ๋ ํ์ธ์๊ฒ ์ค๋ช ํด๋ณธ ์ ์ด ์์ด์ ๋นํฉํ๋ฉฐ Controller, Service์ ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ ๊ฒฝ๋ก๋ฅผ ์ฐพ๊ฒ ๋์์ค๋ค๊ณ ๋ต๋ณํ์๋ค. Spring Bean๋ฅผ ๋ง๋ถ์ฌ์ ๋งํ๊ธด ํ๋๋ฐ ์ผ์ถ ๋ง๊ธด ํ๋ค..
๋ด๊ฐ ์๋๊ฑด ๋ฑ ์ฌ๊ธฐ๊น์ง๊ณ (@Autowired๋ฅผ ํ์ฉํด์ ์ฃผ์ ์์ผ์ฃผ๋ ๊ฒ๊น์ง?) ๊ฐ์๋ฅผ ๋ค์ผ๋ฉฐ ์ปดํฌ๋ํธ ์ค์บ ์๋ฆฌ๋ฅผ ์๊ฒ ๋์ด ๋ต~ํ๋ค. ์คํ๋ง์ ๋ฐฐ์ธ ๋ ์คํ๋ง ๋น์ด๋ผ๋ ๊ฐ๋ ์ด ์ถ์์ ์ด๊ณ ์๋ฟ์ง๊ฐ ์์๋ค. ์๋ํ๋ฉด ๊ตฌ๊ธ๋งํ ๋๋ ์ด๋ ธํ ์ด์ ์ฐ๋ ๋ฐฉ๋ฒ๊ณผ ์ง์ Config๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ ๋ ๋ค ์์ผ๋ ์ ๋๋ก ์ดํด๋ฅผ ๋ชปํ๊ณ ๊ธฐ๋ฅ ๊ตฌํ์ ๊ธ๊ธํ๋ ๊ฒ ๊ฐ๋ค. (๋ถ๋ช ,,์คํ๋ง ๋ถํธ์ ์ฅ์ ์ด ์ง์ ํ๋ํ๋ ์ค์ ์ํด๋ ๋๋ค๋๊ฑฐ์๋๋ฐ,,๋ญ์ง? ํผ๋์ ๋น ์ก์๋ค.) ํํ ์คํ๋ง์ ์คํ์ํฌ ๋ ์ปจํ ์ด๋๊ฐ ์๋๋ฐ ๊ฐ์ฒด ์์ฑํ ๋ ์ปดํฌ๋ํธ ์ค์บ์ผ๋ก ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๋๊ตฌ๋!
๊ฐ์ ๋ค์ผ๋ฉด์ ์์ฑ์ ์ฃผ์ ์ผ๋ก ์ค์ต์ ํ๋ค๋ณด๋ ๋ด๊ฐ ์ด๋๊น์ง ํ๊ฑด ๋ญ์ง..?๋ผ๋ ์๊ฐ์ด ๋ค์๋๋ฐ DI์ ๋ํ ์ข ๋ฅ๋ฅผ ์ค๋ช ํด์ฃผ์ ์ ๊ทธ์ ๊ฐ์ฌํ๋ค. ๋๋ ๊ณ์ ํ๋ ์ฃผ์ ์ ์ฌ์ฉํ๊ตฌ๋(์ ์ผ ์์ข์๋ฏ;;) ์ด์ ๋ถํฐ ํ๋์ ์ ๊ทผํ ์ ์๊ณ ์กฐ๋ฆฝ ์ ์ ์ฉํ ์์ฑ์ ์ฃผ์ ์ ์จ์ผ๊ฒ ๋ค.
์๋๋ ์๋ ์ DB ๊ด๋ จ ํ์นด๋ฆฌCP ์ค์ ์ ํ ๋ ์ด Config ํ์ผ,,์ด๋ @Bean์ด ๋ฌด์จ ์ฉ๋์ธ์ง ์๋ชฐ๋๋ค,,,
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
@Configuration
@PropertySource("classpath:/application.properties") //application.properties๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ค์ ํ์ผ์ ์์น๋ฅผ ์ ํด ์ค๋ค.
public class DatabaseConfiguration {
@Autowired
private ApplicationContext applicationContext; //bean ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ(beanfactory๋ฅผ ์์๋ฐ์.)
//application.properties์ ์ค์ ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ์ ๋ณด๋ฅผ ์ฌ์ฉํ๋๋ก ์ง์ ํ๋ค.
//@ConfigurationProperties ์ด๋
ธํ
์ด์
์ prefix๊ฐ spring.datasource.hikari๋ก ์ค์ ๋์๊ธฐ ๋๋ฌธ์
//spring.datasource.hikari๋ก ์์ํ๋ ์ค์ ์ ์ด์ฉํด์ ํ์นด๋ฆฌCP์ ์ค์ ํ์ผ์ ๋ง๋ ๋ค.
@Bean
@ConfigurationProperties(prefix="spring.datasource.hikari") //@ConfigurationProperties : *.properties, *.yml ํ์ผ์ ์๋ property๋ฅผ ์๋ฐ ํด๋์ค์ ๊ฐ์ ๊ฐ์ ธ์์ ์ฌ์ฉ ํ ์ ์๊ฒ ํด์ฃผ๋ ์ด๋
ธํ
์ด์
public HikariConfig hikariConfig() {
return new HikariConfig();
}
//์์์ ๋ง๋ ํ์นด๋ฆฌCP์ ์ค์ ํ์ผ์ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ๋ ๋ฐ์ดํฐ ์์ค๋ฅผ ์์ฑํ๋ค.
//์ฌ๊ธฐ์๋ ๋ฐ์ดํฐ ์์ค๊ฐ ์ ์์ ์ผ๋ก ์์ฑ๋์๋์ง ํ์ธํ๊ธฐ ์ํด์ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ถ๋ ฅํ๋ค.
@Bean
public DataSource dataSource() throws Exception {
DataSource dataSource = new HikariDataSource(hikariConfig());
System.out.println(dataSource.toString());
return dataSource;
}
@Bean
@ConfigurationProperties(prefix = "mybatis.configuration") //@ConfigurationProperties์ ํตํด์ application.properties์์ prefix๊ฐ mybatis.configuration์ธ ์ค์ ์ ๊ฐ์ ธ์จ๋ค.
public org.apache.ibatis.session.Configuration mybatisConfig(){
return new org.apache.ibatis.session.Configuration(); //๊ฐ์ ธ์จ ๋ง์ด๋ฐํฐ์ค ์ค์ ์ ์๋ฐ ํด๋์ค๋ก ๋ง๋ค์ด ๋ฐํํ๋ค.
}
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { //SqlSessionFactory : mybatis์ mysql ์๋ฒ๋ฅผ ์ฐ๋์์ผ์ค, sqlsession ์์ฑ
//sqlsession : ์ธ์
์ ํ๋ฒ ์์ฑํ๋ฉด ๋งคํ๊ตฌ๋ฌธ์ ์คํํ๊ฑฐ๋ ์ปค๋ฐ ๋๋ ๋กค๋ฐฑ์ ํ๊ธฐ ์ํด ์ธ์
์ ์ฌ์ฉํ ์ ์๋ค. ๋ ์ด์ ํ์ํ์ง ์์ ์ํ๊ฐ ๋๋ฉด ์ธ์
์ ๋ซ๋๋ค.
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:/mapper/**/*.xml")); //** : ํ์ํด๋์ ์ฒด
sqlSessionFactoryBean.setConfiguration(mybatisConfig()); //ํด๋น ์ค์ ์ sqlSessionFactory์ ์ค์ ํด์ค๋ค.
return sqlSessionFactoryBean.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { //SqlSessionTemplate์ SqlSession์ ๊ตฌํํ๊ณ ์ฝ๋์์ SqlSession๋ฅผ ๋์ฒดํ๋ ์ญํ ์ ํ๋ค.
return new SqlSessionTemplate(sqlSessionFactory);
}
}
ํ ๊ฐ์๋ง๋ค ์๊ฐ์ ์งง์๋ฐ ๋ฐ๋ณตํด์ ๋ฃ๋ค๋ณด๋ ์๊ฐ์ด ๊ฝค ๊ฑธ๋ฆฐ๋ค. ๋ค ๋ค์์ ๋ ๋ ๋ฒจ์ ๋์ด ์๊ธฐ๋ฅผ!!
์ถ์ฒ : ์คํ๋ง ์ ๋ฌธ - ์ฝ๋๋ก ๋ฐฐ์ฐ๋ ์คํ๋ง ๋ถํธ, ์น MVC, DB ์ ๊ทผ ๊ธฐ์