μ΄λ²μλ Dependency Injection(μμ‘΄μ± μ£Όμ )μ κ΄νμ¬ ν¬μ€ν ν΄ λ³΄κ² μ΅λλ€.
DIλ Dependency Injection
μ μ½μλ‘ μ°λ¦¬λ§λ‘λ 'μμ‘΄μ± μ£Όμ
'μ΄λΌκ³ λ²μν©λλ€.
μ΄ λ¨μ΄λ₯Ό μ΄ν΄νκΈ° μν΄μλ λ¨Όμ dependency(μμ‘΄)μ΄ λμ§ μμμΌ ν©λλ€. μ¬κΈ°μ λ§νλ dependencyλ κ°μ²΄ κ°μ μμ‘΄μ μλ―Έν©λλ€.
λ¨Όμ νμ κ°μ
μ μ²λ¦¬νλ κΈ°λ₯μ ꡬνν λ€μμ μ½λλ₯Ό λ³΄κ² μ΅λλ€.
package spring;
import java.time.LocalDateTime;
public class MemberRegisterService {
private MemberDao memberDao = new MemberDao();
public void regist(RegisterRequest req) {
// μ΄λ©μΌλ‘ νμ λ°μ΄ν°(Member) μ‘°ν
Member member = memberDao.selectByEmail(req.getEmail());
if(member != null) {
// κ°μ μ΄λ©μΌμ κ°μ§ νμμ΄ μ΄λ―Έ μ‘΄μ¬νλ©΄ μμΈ λ°μ
throw new DuplicateMemberException("dup email " + req.getEmail());
}
// κ°μ μ΄λ©μΌμ κ°μ§ νμμ΄ μ‘΄μ¬νμ§ μμΌλ©΄ DBμ μ½μ
Member newMember = new Member(
req.getEmail(), req.getPassword(), req.getName(),
LocalDateTime.now());
memberDao.insert(newMember);
}
}
μ μ½λλ λ¨Όμ λμΌν μ΄λ©μΌμ κ°μ§ νμ λ°μ΄ν°κ° μ‘΄μ¬νλμ§ νμΈν©λλ€. λ§μ½ κ°μ μ΄λ©μΌμ κ°μ§ νμ λ°μ΄ν°κ° μ‘΄μ¬νλ©΄ μμΈλ₯Ό λ°μμν΅λλ€.
νμ§λ§ κ°μ μ΄λ©μΌμ κ°μ§ νμ λ°μ΄ν°κ° μ‘΄μ¬νμ§ μλλ€λ©΄ νμ μ 보λ₯Ό λ΄μ Member
κ°μ²΄λ₯Ό μμ±νκ³ MemberDao
κ°μ²΄μ insert() λ©μλλ₯Ό μ΄μ©νμ¬ DBμ νμ λ°μ΄ν°λ₯Ό μ½μ
ν©λλ€.
μ μ½λμμ λμ¬κ²¨λ³Ό λΆλΆμ MemberRegisterService
ν΄λμ€κ° DB μ²λ¦¬λ₯Ό μν΄ MemberDao
ν΄λμ€μ λ©μλλ₯Ό μ¬μ©νλ€λ κ²μ
λλ€.
μ΄λ κ² ν ν΄λμ€κ° λ€λ₯Έ ν΄λμ€μ λ©μλλ₯Ό μ€νν λ μ΄λ₯Ό μμ‘΄
νλ€κ³ ννν©λλ€. μμ μ½λμμλ MemberRegisterService ν΄λμ€κ° MemberDao ν΄λμ€μ μμ‘΄νλ€
κ³ ννν μ μμ΅λλ€.
- μμ‘΄μ λ³κ²½μ μν΄ μν₯μ λ°λ κ΄κ³λ₯Ό μλ―Έν©λλ€.
μλ₯Όλ€μ΄MemberDao
μ insert() λ©μλμ μ΄λ¦μ insertMember()λ‘ λ³κ²½νλ©΄ μ΄ λ©μλλ₯Ό μ¬μ©νλMemberRegisterService
ν΄λμ€μ μμ€μ½λλ ν¨κ» λ³κ²½λ©λλ€. μ΄λ κ² λ³κ²½μ λ°λ₯Έ μν₯μ΄ μ νλλ κ΄κ³λ₯Ό 'μμ‘΄'νλ€κ³ ννν©λλ€.
μμ‘΄νλ λμμ΄ μμΌλ©΄ κ·Έ λμμ ꡬνλ λ°©λ²μ΄ νμν©λλ€. κ°μ₯ μ¬μ΄ λ°©λ²μ μμ‘΄ λμ κ°μ²΄λ₯Ό μ§μ μμ±νλ κ²μ
λλ€.
μμμ λ³Έ MemberRegisterService
ν΄λμ€λ λ€μ μ½λμ²λΌ μμ‘΄ λμμΈ MemberDao
μ κ°μ²΄λ₯Ό μ§μ μμ±ν΄μ νλμ ν λΉνμ΅λλ€.
public class MemberRegisterService {
// μμ‘΄ κ°μ²΄λ₯Ό μ§μ μμ±
private MemberDao memberDao = new MemberDao();
...
MemberRegisterService
ν΄λμ€μμ μμ‘΄νλ MemberDao
κ°μ²΄λ₯Ό μ§μ μμ±νκΈ° λλ¬Έμ MemberRegisterService
κ°μ²΄λ₯Ό μμ±νλ μκ°μ MemberDao
κ°μ²΄λ ν¨κ» μμ±λ©λλ€.
// μμ‘΄νλ MemberDaoμ κ°μ²΄λ ν¨κ» μμ±
MemberRegisterService svc = new MemberRegisterService();
μ΄λ κ² ν΄λμ€ λ΄λΆμμ μ§μ μμ‘΄ κ°μ²΄λ₯Ό μμ±νλ κ²μ΄ μ½μ§λ§ μ μ§λ³΄μ κ΄μ μμ λ¬Έμ μ μ μ λ°ν μ μμ΅λλ€. μ΄λ κ² μμ‘΄νλ κ°μ²΄λ₯Ό μ§μ μμ±νλ λ°©μ μΈμ μμ‘΄ κ°μ²΄λ₯Ό ꡬνλ λ λ€λ₯Έ λ°©λ²μ΄ μμ΅λλ€.
κ·Έ λ°©λ²μ DIμ μλΉμ€ λ‘μΌμ΄ν°μ
λλ€. μ΄ μ€ Springκ³Ό κ΄λ ¨λ κ²μ DIλ‘μ DIλ₯Ό μ΄μ©ν΄μ μμ‘΄ κ°μ²΄λ₯Ό ꡬνλ λ°©λ²μ λ³΄κ² μ΅λλ€.
DI(Dependency Injection, μμ‘΄μ± μ£Όμ
)λ μμ‘΄νλ κ°μ²΄λ₯Ό μ§μ μμ±νλ λμ μμ‘΄ κ°μ²΄λ₯Ό μ λ¬λ°λ λ°©μμ μ¬μ©ν©λλ€.
μλ₯Ό λ€μ΄ μμ μμ‘΄ κ°μ²΄λ₯Ό μ§μ μμ±ν MemberRegisterService
ν΄λμ€μ DIλ°©μμ μ μ©νλ©΄ μλ μ½λμ κ°μ΄ ꡬνν μ μμ΅λλ€.
01.CHAP01/src/main/java/spring/MemberRegisterService.java
package spring;
import java.time.LocalDateTime;
public class MemberRegisterService {
private MemberDao memberDao;
public MemberRegisterService(MemberDao memberDao) {
this.memberDao = memberDao;
}
public Long regist(RegisterRequest req) {
Member member = memberDao.selectByEmail(req.getEmail());
if(member != null) {
throw new DuplicateMemberException("dup email " + req.getEmail());
}
Member newMember = new Member(
req.getEmail(), req.getPassword(), req.getName(),
LocalDateTime.now());
memberDao.insert(newMember);
return newMember.getId();
}
}
μΆκ°λ λΆλΆμ MemberRegisterService
ν΄λμ€μ μμ±μ λΆλΆμ
λλ€
// μΆκ°λ λΆλΆ
public MemberRegisterService(MemberDao memberDao) {
this.memberDao = memberDao;
}
μ§μ μμ‘΄ κ°μ²΄λ₯Ό μμ±νλ μ½λμ λ¬λ¦¬ λ°λ μ½λλ μμ‘΄ κ°μ²΄λ₯Ό μ§μ μμ±νμ§ μμ΅λλ€. λμ μμ // μΆκ°λ λΆλΆ
κ³Ό κ°μ΄ μμ±μλ₯Ό ν΅ν΄μ μμ‘΄ κ°μ²΄λ₯Ό μ λ¬λ°μ΅λλ€.
μ¦ μμ±μλ₯Ό ν΅ν΄ MemberRegisterService
κ° μμ‘΄(Dependency)νκ³ μλ MemberDao
κ°μ²΄λ₯Ό μ£Όμ
(Injection) λ°μ κ²μ
λλ€.
μμ‘΄ κ°μ²΄λ₯Ό μ§μ ꡬνμ§ μκ³ μμ±μ
λ₯Ό ν΅ν΄μ μ λ¬λ°κΈ° λλ¬Έμ μ΄ μ½λλ DI(μμ‘΄μ± μ£Όμ
) ν¨ν΄μ λ°λ₯΄κ³ μμ΅λλ€.
DIλ₯Ό μ μ©ν κ²°κ³Ό MemberRegisterService
ν΄λμ€λ₯Ό μ¬μ©νλ μ½λλ λ€μκ³Ό κ°μ΄ MemberRegisterService
κ°μ²΄λ₯Ό μμ±ν λ μμ±μμ MemberDao
κ°μ²΄λ₯Ό μ λ¬ν΄μΌ ν©λλ€.
MemberDao dao = new MemberDao();
// μμ‘΄ κ°μ²΄λ₯Ό μμ±μλ₯Ό ν΅ν΄ μ£Όμ
νλ€
MemberRegisterService svc = new MemberRegisterService(dao);
μμ‘΄ κ°μ²΄λ₯Ό μ§μ μμ±νλ λ°©μμ νλλ μμ±μμμ new μ°μ°μλ₯Ό μ΄μ©νμ¬ κ°μ²΄λ₯Ό μμ±ν©λλ€. νμ λ±λ‘ κΈ°λ₯μ μ 곡νλ MemberRegisterService
ν΄λμ€μμ λ€μ μ½λμ²λΌ μμ‘΄ κ°μ²΄λ₯Ό μ§μ μμ±ν μ μμ΅λλ€.
public class MemberRegisterService {
private MemberDao memberDao = new MemberDao();
...
}
μ¬κΈ°μ νμμ μνΈ λ³κ²½ κΈ°λ₯μ μ 곡νλ ChangePasswordService
ν΄λμ€λ λ€μκ³Ό κ°μ΄ μμ‘΄ κ°μ²΄λ₯Ό μ§μ μμ±νλ€κ³ ν΄λ³΄κ² μ΅λλ€.
public class ChangePasswordService {
private MemberDao memberDao = new MemberDao();
...
}
MemberDao
ν΄λμ€λ νμ λ°μ΄ν°λ₯Ό λ°μ΄ν°λ² μ΄μ€μ μ μ₯νλ€κ³ κ°μ νκ² μ΅λλ€. μ΄λ° μν©μμ νμ λ°μ΄ν°μ λΉ λ₯Έ μ‘°νλ₯Ό μν΄ μΊμλ₯Ό μ μ©ν΄μΌ νλ μν©μ΄ λ°μνμμ΅λλ€.
κ·Έλμ MemberDao
ν΄λμ€λ₯Ό μμλ°μ CachedMemberDao
ν΄λμ€λ₯Ό λ§λ€μμ΅λλ€.
public class CachedMemberDao extends MemberDao {
...
}
Cache(μΊμ)
μΊμλ λ°μ΄ν° κ°μ 볡μ¬ν΄ λλ μμ μ₯μ λ₯Ό κ°λ¦¬ν΅λλ€. λ³΄ν΅ μ‘°ν μλ ν₯μμ μν΄ μΊμλ₯Ό μ¬μ©ν©λλ€. DBμ μλ λ°μ΄ν° μ€ μμ£Ό μ‘°ννλ λ°μ΄ν°λ₯Ό λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νλ μΊμμ 보κ΄νλ©΄ μ‘°ν μλλ₯Ό ν₯μμν¬ μ μμ΅λλ€.
μΊμ κΈ°λ₯μ μ μ©ν CachedMemberDao
λ₯Ό μ¬μ©νλ €λ©΄ MemberRegisterService
ν΄λμ€μ ChangePasswordService
ν΄λμ€μ μ½λλ₯Ό μλμ κ°μ΄ λ³κ²½ν΄ μ£Όμ΄μΌ ν©λλ€.
public class MemberRegisterService {
private MemberDao memberDao = new CachedMemberDao();
...
}
public class ChangePasswordService {
private MemberDao memberDao = new CachedMemberDao();
...
}
λ§μ½ MemberDao
κ°μ²΄κ° νμν ν΄λμ€κ° 100κ°λ©΄ 100κ°μ ν΄λμ€ λͺ¨λ, 10000κ°λ©΄ 10000κ°μ ν΄λμ€ λͺ¨λ λμΌνκ² μμ€ μ½λλ₯Ό λ³κ²½ν΄μΌ ν©λλ€.
λμΌν μν©μμ DIλ₯Ό μ¬μ©νλ©΄ μμ ν μ½λκ° μ€μ΄λ€κ² λ©λλ€. μλ₯Ό λ€μ΄ λ€μκ³Ό κ°μ΄ μμ±μλ₯Ό ν΅ν΄μ μμ‘΄ κ°μ²΄λ₯Ό μ£Όμ λ°λλ‘ κ΅¬ννλ€κ³ νκ² μ΅λλ€.
public class MemberRegisterService {
private MemberDao memberDao;
public MemberRegisterService(MemberDao memberDao) {
this.memberDao = memberDao;
}
...
}
public class ChangePasswordService {
private MemberDao memberDao;
public ChangePasswordService(MemberDao memberDao) {
this.memberDao = memberDao;
}
...
}
μ΄λ λ ν΄λμ€μ κ°μ²΄λ₯Ό μμ±νλ μ½λλ λ€μκ³Ό κ°μ΅λλ€.
MemberDao memberDao = new MemberDao();
MemberRegisterService regSvc = new MemberRegisterService(memberDao);
ChangePasswordService pwdSvc = new ChangePasswordService(memberDao);
μ΄μ MemberDao λμ CachedMemberDao
λ₯Ό μ¬μ©νλλ‘ μμ ν΄λ³΄κ² μ΅λλ€. μμ ν΄μΌ ν μμ€ μ½λλ ν κ³³(!)λΏμ
λλ€. μλ μ½λμ²λΌ MemberDao
κ°μ²΄λ₯Ό μμ±νλ μ½λλ§ λ³κ²½νλ©΄ λ©λλ€.
MemberDao memberDao = new CachedMemberDao();
MemberRegisterService regSvc = new MemberRegisterService(memberDao);
ChangePasswordService pwdSvc = new ChangePasswordService(memberDao);
DIλ₯Ό μ¬μ©νλ©΄ MemberDao
κ°μ²΄λ₯Ό μ¬μ©νλ ν΄λμ€κ° μμκ°μ¬λ λ³κ²½ν κ³³μ μμ‘΄ μ£Όμ
λμμ΄ λλ κ°μ²΄λ₯Ό μμ±νλ μ½λ ν κ³³ λΏμ
λλ€. μμ μμ‘΄ κ°μ²΄λ₯Ό μ§μ μμ±νλ λ°©μμ λΉν΄ λ³κ²½ν μ½λκ° ν κ³³μΌλ‘ μ§μ€λλ κ²μ μ μ μμ΅λλ€.
μ΄λ² ν¬μ€ν μμλ Dependency Injectionμ κ΄νμ¬ μμλ₯Ό 보며 곡λΆλ₯Ό ν΄ λ³΄μμ΅λλ€.
λ€μ ν¬μ€ν μμλ μμ νλ‘μ νΈλ₯Ό λ§λ€μ΄μ 곡λΆλ₯Ό ν΄ λ³΄κ² μ΅λλ€.
κ°μ¬ν©λλ€.
https://www.kame.co.kr/nkm/detail.php?tcode=306&tbook_jong=3