토비의 스프링
들어가며
스프링이란 무엇인가?
스프링은 자바 엔터프라이즈 어플리케이션 개발에 사용되는 어플리케이션 프레임워크다.
크게 세가지 관점으로 스프링이 무엇인지 알아볼 수 있다.
- 어플리케이션의 기본 틀 - 스프링 컨테이너
- 공통 프로그래밍 모델 - IoC/DI , 서비스 추상화 AOP
- 기술 API
스프링의 성공요인
- 단순함 - EJB에 반하여 자바라는 언어의 근본을 통해 단순한 객체지향적 개발 모델인 POJO 프로그래밍을 가능하게 하는 프레임워크.
- 유연성 - 유연성과 확장성이 뛰어나며, 스프링을 제대로 사용하려면 스프링을 필요에 맞게 확장해서 자신만의 프레임워크를 만들어서 사용할 줄 알아야한다.
오브젝트와 의존관계
- 스링이 자바에서 가장 중요하게 가치를 두는 ㄹ것은 바로 객체지향 프로그래밍이 가능한 언어라는 점이다.
- 스프링은 오브젝트를 어떻게 효과적으로 설계하고 구현하고, 사용하고, 이를 개선해나갈 것인가에 대한 명쾌한 기준을 마련해준다.
- 스프링은 객체지향 기술과 설계, 구현에 관한 실용적인 전략과 검증된 베스트 프랙티스를 평범한 개발자도 자연스럽고 손쉽게 적용할 수 있도록 프레임워크 형태로 제공한다.
1.1 초난감 DAO
- 유저 정보를 저장하는 UserDao 자바빈을 생성하고, DB와 컨넥션을 하여 데이터를 생성하고 조회하는 로직을 구현하였다.
- 구현한 로직을 테스트하기위해 서버를 구축하고 띄워서 체크하는 과정 대신, main 메소드를 활용해 로직을 실행하고 출력으로 정상적으로 값이 얻어지는지 확인하였다.
- 구현한 UserDao를 객체지향 기술의 원리에 충실한 멋진 스프링 스타일의 코드로 개선해보는 작업을 하고자 한다.
1.2 DAO의 분리
- 소프트웨어 개발에서 끝이란 개념은 없다. 사용자의 비즈니스 프로세스와 그에 따른 요구사항은 끊임없이 바뀌고 발전한다. 기술들도 시간이 지남에 따라 바뀌고, 운영되는 환경도 변화한다.
- 따라서 개발자가 객체를 설계할 때 가장 염두에 둬야 할 사항은 바로 미래의 변화를 어떻게 대비할 것인가이다.
- 변화는 보통 한 번에 한 가지 관심에 집중돼서 일어나며, 따라서 우리가 대비해야 할 일은 한가지 관심이 한 군데에 집중되게 하는 것이다. 이렇게 함으로써 수정과 변화를 최소화 할 수 있을 것이다.
- 이를 관심사의 분리라고 볼 수 있다. 아래의 ‘하자’로 끝나는 문장은 모두 관심사의 분리 작업으로 볼 수 있다.
- 중복 코드들을 메소드로 추출하고 해당 메소드 하나를 사용하도록 하자.
- 커스터마이징이 필요한 메소드는 추상 메소드로 만들어 놓고, 상속을 통해 구현이 가능하도록 하자.
- feat. 템플릿 메소드 패턴, 팩토리 메소드 패턴 - 스프링에서 많이 활용하는 디자인 패턴.
- 상속을 사용하면 몇 가지 단점이 있다.
- 다중상속이 불가능하다는 점, 상속을 통한 상하위 클래스의 관계는 생각보다 밀접하다는 점.
1.3 DAO의 확장
- 앞서 상속을 통해 상하위 클래스로 분리하여 관심사를 분리하였다. 이번에는 관심사가 다르고 변화의 성격이 다른 두 가지 코드를 화끈하게 분리하자. 바로 별도의 클래스에 담고, 구현한 클래스를 이용하게 하는 것.
- 이렇게 하니 한가지 문제점이 생겼다. 이용하는 클래스가 다른 클래스에 종속된다는 점. 상속을 사용했을 때 처럼 코드의 수정 없이 기능을 변경할 방법이 없다.
- 이를 해결하기위해 인터페이스를 도입하자. ( 두 개의 클래스가 서로 긴밀하게 연결되어 있지 않도록 중간에 추상적인 느슨한 연결고리를 만들어 주는 것, 자바가 추상화를 위해 제공하는 가장 유용한 도구는 인터페이스. )
- 인터페이스를 통해 접근하게 되면 실제 구현 클래스가 바껴도 신경 쓸 일이 없다.
- 인터페이스를 적용해보니 최초 생성자에서 오브젝트를 생성하는 코드에서 여전히 구현 클래스에 의존한다. 따라서 결국 구현 클래스가 변경되면 UserDao의 메소드에 대한 직접적인 수정이 필요하다.