이러한 시스템은 비즈니스 로직 구현만이 아닌 보안, 안정성, 확장성, 성능을 모두 고려해서 개발해야한다.
결국 비즈니스 로직, 안정성, 확장성, 성능에 더해 추후 바뀔지 모르는 비즈니스 로직에 대한 유지보수 및 수정까지 고려해야하는 큰 어려움에 부딪혔다
1. 의존이란
DI(Dependency Infjection) 의존 관계 주입이라는 말로 해석 할 수 있다. 표준국어대사전에 의하면 ‘의존’이란 다른 것에 의지하여 존재하는 즉, 의존관계란 변경에 의해 영향을 받는 관계를 의미한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
publicclassMemberRegisterService{
// new 연산자를 이용해서 MemeberDao의 인스턴스를 생성한다. 이를 '보통객체'라 부른다. private MemberDao memberDao = new MemberDao();
publicvoidregist(RegisterRequest req){ // 이메일로 회원 데이터(Member)조회 Member member = memberDao.selectByEmail(req.getEmail()); if (member != null) { // 같은 이메일을 가진 회원이 이미 존재하면 익셉션 발생 thrownew AlreadyExistingMemberException("dup email : " + req.getEmail()); } // 같은 이메일을 가진 회원이 존재하지 않으면 DB에 삽입 Member newMember = new Member(req.getEmail(), req.getPassword(), req.getName(), new Date()); memberDao.insert(newMember); } }
위 코드는 전달 받은 회원 객체 내 이메일 주소가 현재 회원 DB 테이블 내에 존재하는 경우 익셉션을 발생시키고 같은 이메일 주소를 가진 회원이 존재하지 않는 경우 DB에 INSERT 시키는 간단한 로직을 가지고 있다.
이와 같이 한 클래스에서 다른 클래스의 메소드를 실행하는 경우를 ‘의존’한다고 말한다.
의존은 변경에 의해 영향을 받는 관계를 의미한다. ex) MembaerDao의 insert() 메소드의 이름을 insertMemeber()라고 변경하면 이 메소드를 사용하는 타 클래스들도 영향을 받는다.
여기서 알고 가면 좋은 한 가지. 객체지향 프로그래밍의 기초 개념 중 하나는 관심사의 분리 라는 것이다.
단순히 DB INSERT하고 SELECT하는 메소드를 만들때 위와 같은 코드를 만들 수 있지만 리소스의 낭비나 환경의 변화에 바로 대응하기 위해선 관심사의 분리가 중요하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
public Connection getConnection()throws ClassNotFoundException, SQLException { Class.forName("oracle.jdbc.driver.OracleDriver"); Connection c = DriverManager.getConnection( "jdbc:oracle:thin:@127.0.0.1:1521:orcl", "PPS_DB", "PPS123"); return c; } ...
publicMemberAssembler(){ memberDao = new MemberDao(); registerService = new RegisterService(memberDao); pwChangeService = new PwChangeService(memberDao); }
public MemberDao getMemberDao(){ return memberDao; }
스프링 컨테이너에 등록한 bean과 객체들 간 의존 관계를 이용하여 위와 같은 코드로 변경될 수 있다. 직접 주입하지 않고 스프링 컨테이너를 통해 주입하고 getBean을 통해 불러오기만 하면 된다. 지금까진 xml을 이용한 의존 주입을 해왔다. 다음 해당 포스팅에선 어노테이션을 이용한 방법에 대해 설명하도록 한다.
결국 의존 주입은 관심사의 분리를 통해 유지보수와 수정을 용이하게 하기 위함에 목적이 있다.