@Autowired ์ด๋ ธํ ์ด์ ์ ํตํ ์์กด ์๋ ์ฃผ์
- ์๋ ์ฃผ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์คํ๋ง์ด ์์์ ์์กด ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ฃผ์ ํ๋ค.
- ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์์กด์ ์ฃผ์
ํ ๋์์
@Autowiwred
์ด๋ ธํ ์ด์ ์ ๋ถ์ด๋ฉด ๋๋ค. - ํด๋น ์ด๋ ธํ ์ด์ ์ด ๋ถ์ด์์ผ๋ฉด ์คํ๋ง์ด ์ด๋ฅผ ์ฐพ์ ํ๋์ ํ ๋นํ๋ค.
**@Autowired๋ฅผ ์ ์ฉํ ๋์์ ์ผ์นํ๋ ๋น์ด ์์ผ๋ฉด? **
ํด๋น ํ๋์ ๋ํ ์์กด์ ์ถฉ์กฑํ์ง ์๋๋ค๋ ๋ด์ฉ๊ณผ ํจ๊ป ๋น์ด ์กด์ฌํ์ง ์๋๋ค๋ ์๋ฌ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ค.
**๋ง์ฝ ๋๊ฐ ์ด์์ด๋ฉด? **
ํด๋น ํ์ ์ ๋น์ด ํ๊ฐ๊ฐ ์๋ ์ฌ๋ฌ๊ฐ๋ฅผ ๋ฐ๊ฒฌํ๋ค๋ ์์ธ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ค.
@Qualifier๋ฅผ ์ด์ฉํ ์์กด ๊ฐ์ฒด ์ ํ
- ์๋ ์ฃผ์ ๊ฐ๋ฅํ ๋น์ด ๋ ๊ฐ ์ด์์ธ ๊ฒฝ์ฐ ์๋ ์ฃผ์ ์ ํ ๋น์ ์ง์ ํ๋ ๋ฐฉ๋ฒ
์ฌ์ฉ ์์น
@Bean ์ ๋ถ์ธ ๋น ์ค์ ๋ฉ์๋
@Configuration
public class ApplicationContextTestResourceQualifier {
@Bean
@Qualifier("defaultFile")
public File defaultFile() {
File defaultFile = new File("defaultFile.txt");
return defaultFile;
}
}
@Autowired์์ ์๋ ์ฃผ์ ํ ๋น์ ํ์ ํ ๋ ์ฌ์ฉ
public class MemberListPrinter {
private MemberDao memberDao;
private MemberPrinter printer;
public MemberListPrinter(MemberDao memberDao, MemberPrinter printer) {
this.memberDao = memberDao;
this.printer = printer;
}
@Autowired
@Qualifier("printer")
public void setMemberPrint(MemberPrinter printer) {
this.printer = printer;
}
}
- @Qualifier์ ์์ฑ์ผ๋ก ์ฃผ์ ํ ๋น์ ํ๋ณด๋ฅผ ํ์ ํ๋ค.
- ๋น ์ค์ ์ ํด๋น ์ด๋ ธํ ์ด์ ์ด ์์ผ๋ฉด ๋น์ ์ด๋ฆ์ ํ์ ์๋ก ์ง์ ํ๋ค.
์์/ํ์ ํ์ ๊ด๊ณ์ ์๋ ์ฃผ์
MemberPrinter ํด๋์ค๋ฅผ ์์ํ MeberSummaryPrinter ํด๋์ค๊ฐ ์๋ค๊ณ ํ์.
public class MemberSummaryPrinter extends MemberPrinter {
@Override
public void print(Member member) {
System.out.printf(
"ํ์ ์ ๋ณด: ์ด๋ฉ์ผ=%s, ์ด๋ฆ=%s\n",
member.getEmail(), member.getName());
}
}
๊ทธ๋ฆฌ๊ณ AppCtx ์ค์ ์์ memberPrinter2()
๊ฐ ์ ๋น ๊ฐ์ฒด๋ฅผ ์ค์ ํ๋๋ก ๋ณ๊ฒฝํ๋ค.
@Configuration
public class AppCtx {
// ...
@Bean
public MemberPrinter memberPrinter1() {
return new MemberPrinter();
}
@Bean
public MemberSummaryPrinter memberPrinter2() {
return new MemberSummaryPrinter();
}
}
memberPrinter2()
์ ๋น์ MemberSummaryPrinter์ผ๋ก ๋ณ๊ฒฝํด๋ ๋น ์ค๋ณต ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.- MemberSummaryPrinter๋ MemberPrinter ํ์ ์๋ ํ ๋นํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ์คํ๋ง ์ปจํ ์ด๋๋ MemberPrinter ํ์ ๋น์ ์๋ ์ฃผ์ ํด์ผํ๋ @Autowired๋ฅผ ๋ง๋๋ฉด `memberPrinter1(), memberPrinter2() ์ค ์ด๋ค ๋น์ ์ฃผ์ ํด์ผํ๋ ์ง ์ ์ ์๋ค.
์ด ๋ฌธ์ ๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
@Qualifier
@Bean
@Qualifier("printer")
public MemberPrinter memberPrinter1() {
return new MemberPrinter();
}
@Bean
@Qualifier("summaryPrinter")
public MemberSummaryPrinter memberPrinter2() {
return new MemberSummaryPrinter();
}
MemberListPrinter๊ฐ MemberSummaryPrinter๋ฅผ ์ฌ์ฉํ๋๋ก (Composition)
public class MemberListPrinter {
private MemberDao memberDao;
private MemberPrinter printer;
// ...
@Autowired
public void setMemberPrinter(MemberSummaryPrinter printer) {
this.printer = printer;
}
}
@Autowired์ ํ์ ์ฌ๋ถ ์ง์ ๋ฐฉ๋ฒ
public class MemberPrinter {
private DateTimeFormatter dateTimeFormatter;
public void print(Member member) {
if (dateTimeFormatter == null) {
System.out.printf(
"ํ์ ์ ๋ณด: ์์ด๋=%d, ์ด๋ฉ์ผ=%s, ์ด๋ฆ=%s, ๋ฑ๋ก์ผ=%tF\n",
member.getId(), member.getEmail(),
member.getName(), member.getRegisterDateTime());
} else {
System.out.printf(
"ํ์ ์ ๋ณด: ์์ด๋=%d, ์ด๋ฉ์ผ=%s, ์ด๋ฆ=%s, ๋ฑ๋ก์ผ=%s\n",
member.getId(), member.getEmail(),
member.getName(),
dateTimeFormatter.format(member.getRegisterDateTime()));
}
}
@Autowired
public void setDateFormatter(DateTimeFormatter dateTimeFormatter) {
this.dateTimeFormatter = dateTimeFormatter;
}
// ...
dateTimeFormatter๊ฐ null์ธ์ง ์ฌ๋ถ์ ๋ฐ๋ผ ๋ ์ง ํ์์ ๋ฐ๊ฟ ์ถ๋ ฅํ๋ค.
์ฆ ๋ฐ๋์ setDateFormatter()
๋ฅผ ํตํด ์์กด ๊ฐ์ฒด๋ฅผ ์ฃผ์
ํ ํ์๊ฐ ์๋ค.
ํ์ง๋ง @Autowired
๋ ํด๋นํ๋ ๋น์ด ์กด์ฌํ์ง ์์ผ๋ฉด ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
@Autowired(required = false)
์ด ๊ฒฝ์ฐ @Autowired(required = false)
์ค์ ์ผ๋ก ์๋ ์ฃผ์
๋์์ด ํ์๊ฐ ์๋์ ๋ช
์ํ๋ค.
์ด๋ฌ๋ฉด ๋งค์นญ๋๋ ๋น์ด ์์ด๋ ์์ธ๊ฐ ๋ฐ์ํ์ง ์๊ณ ์๋ ์ฃผ์
์ ์ํํ์ง ์๋๋ค.
@Autowired(required = false)
public void setDateFormatter(DateTimeFormatter dateTimeFormatter) {
this.dateTimeFormatter = dateTimeFormatter;
}
Optional
์คํ๋ง 5๋ถํฐ๋ required ์์ฑ ๋ง๊ณ , Optional์ ์ฌ์ฉํ ์๋ ์๋ค.
@Autowired
public void setDateFormatter(Optional<DateTimeFormatter> formatterOpt) {
if (formatterOpt.isPresent()) {
this.dateTimeFormatter = formatterOpt.get();
} else {
this.dateTimeFormatter = null;
}
}
@Nullable
ํด๋น ์ด๋
ธํ
์ด์
์ ์์กด ์ฃผ์
๋์ ํ๋ผ๋ฏธํฐ์ ๋ถ์ด๋ฉด ์ธํฐ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์๋ ์ฃผ์
ํ ๋น์ด ์กด์ฌํ ๊ฒฝ์ฐ ์ธ์๋ก ๋ฐ๊ณ , ์กด์ฌํ์ง ์์ผ๋ฉด null์ ์ ๋ฌํ๋ค.
์ด ์ด๋
ธํ
์ด์
์ ์คํ๋ง์ด ์ ๊ณตํ๋ ์ด๋
ธํ
์ด์
์ด๋ค.
@Autowired
public void setDateFormatter(@Nullable DateTimeFormatter dateTimeFormatter) {
this.dateTimeFormatter = dateTimeFormatter;
}
required ์์ฑ์ false๋ก ํ ๋์ ์ฐจ์ด์ ?
@Nullable ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ๋ฉด ์๋ ์ฃผ์
ํ ๋น์ด ์กด์ฌํ์ง ์์๋ ์ธํฐ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค.
@Autowired(required = false)์ ๊ฒฝ์ฐ ๋์ ๋น์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ์ธํฐ ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์๋๋ค.
์์ ์ธ๊ฐ์ง ๋ฐฉ์์ ๋ฉ์๋ ๋ฟ๋ง ์๋๋ผ ํ๋์๋ ๋์ผํ๊ฒ ์ ์ฉํ ์ ์๋ค.
์์ฑ์ ์ด๊ธฐํ์ ํ์ ์ฌ๋ถ ์ง์ ๋ฐฉ์ ๋์
public class MemberPrinter {
private DateTimeFormatter dateTimeFormatter;
public MemberPrinter() {
dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy๋
MM์ dd์ผ");
}
public void print(Member member) {
if (dateTimeFormatter == null) {
System.out.printf(
"ํ์ ์ ๋ณด: ์์ด๋=%d, ์ด๋ฉ์ผ=%s, ์ด๋ฆ=%s, ๋ฑ๋ก์ผ=%tF\n",
member.getId(), member.getEmail(),
member.getName(), member.getRegisterDateTime());
} else {
System.out.printf(
"ํ์ ์ ๋ณด: ์์ด๋=%d, ์ด๋ฉ์ผ=%s, ์ด๋ฆ=%s, ๋ฑ๋ก์ผ=%s\n",
member.getId(), member.getEmail(),
member.getName(),
dateTimeFormatter.format(member.getRegisterDateTime()));
}
}
@Autowired(required = false)
public void setDateFormatter(DateTimeFormatter dateTimeFormatter) {
this.dateTimeFormatter = dateTimeFormatter;
}
}
@Autowired(required = false)์ผ ๊ฒฝ์ฐ
- dateTimeFormatter์ null์ ํ ๋นํ์ง ์๋๋ค.
setDateFormatter()
๊ฐ ํธ์ถ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
@Nullable
- ์ผ์นํ๋ ๋น์ด ์์ ๋ ๊ธฐ๋ณธ ์์ฑ์์์ ์ด๊ธฐํํด์ฃผ๊ณ ์์ด๋, dateTimeFormatter์ null ๊ฐ์ ํ ๋นํ๋ค.