토비의 스프링 - 1장. 오브젝트와 의존관계(1)
Date: 2022-02-04
들어가며
스프링이란 무엇인가?
- 애플리케이션의 기본 틀 - 스프링 컨테이너
- 스프링 컨테이너(=애플리케이션 컨텍스트) : 스프링에서 제공하는 런타임 엔진
- 스프링 컨테이너는 설정 정보를 참고해서 애플리케이션을 구성하는 오브젝트(=Bean)를 생성하고 관리한다.
- 공통 프로그래밍 모델 - IoC/DI, 서비스 추상화, AOP
스프링 프레임워크의 3가지 프로그레밍 모델 (라이브러리 VS. 프레임워크)- IoC/DI
- 오브젝트의 생명주기와 의존관계에 대한 프로그레밍 모델이다.
- 스프링은 객체지향 설계 원칙과 디자인 패턴의 핵심 원리를 담고 있는 IoC/DI를 프레임워크의 근간으로 삼고 있다.
- 서비스 추상화
- 구체적인 기술과 환경에 종속되지 않도록 유연한 추상 계층을 두는 방법이다.
- AOP
- 애플리케이션 코드에 산재해서 나타나는 부가적인 기능을 독립적으로 모듈화하는 프로그래밍 모델이다.
- IoC/DI
- 기술 API
- 스프링은 개발의 다양한 영역에 바로 활용할 수 있는 방대한 양의 기술 API를 제공한다.
1.1 초난감 DAO
- JDBC를 이용하는 작업의 일반적인 순서
- DB 연결을 위한 Connection을 가져온다.
- SQL 을 담은 Statement(또는 PreparedStatement)를 만든다.
- 만들어진 Statement를 실행한다.
- 조회의 경우 SQL 쿼리의 실행 결과를 ResultSet으로 받아서 정보를 저장할 오브젝트에 옮겨준다.
- 작업 중에 생성된 Connection, Statement, ResultSet 같은 리소스는 작업을 마친 후 반드시 닫아준다.
- 예제 코드
1.2 DAO의 분리
관심사의 분리
- 객체지향 설계와 프로그래밍이 이전의 절차적 프로그래밍 패러다임에 비해 초기에 좀 더 많은, 번거로운 작업을 요구하는 이유는 객체지향 기술 자체가 지니는 변화에 효과적으로 대처할 수 있다는 기술적인 특징 때문이다.
- 그러면 어떻게 변경이 일어날 때 필요한 작업을 최소화하고, 그 변경이 다른 곳에 문제를 일으키지 않게 할 수 있었을까? 그것은 분리와 확장을 고려한 설계가 있었기 때문이다.
- 관심사의 분리란, 관심사가 같은 것끼리 모으고 다른 것은 분리해줌으로써 같은 관심에 효과적으로 집중할 수 있게 만들어주는 것이다.
- 중복 코드 메소드 추출
- 변경사항에 대한 검증: 리팩토링과 테스트
main()
메소드를 이용해 테스트를 실행한다.- 두번째 테스트 부터는 테이블의 기본키인 id 값이 중복되기 때문에 예외가 발생한다.
main()
메소드 테스트를 다시 실행하기 전에 User 테이블의 사용자 정보를 삭제해줘야 한다.
리팩토링
리팩토링인 기존의 코드를 외부의 동작방식에는 변화 없이 내부 구조를 변경해서 재구성하는 작업 또는 기술을 말한다. - 상속을 통한 확장
- 예제 코드 - 상속을 통한 확장 방법이 제공되는 UserDao
- 템플릿 메소드 패턴
슈퍼클래스에 기본적인 로직의 흐름을 만들고, 그 기능의 일부를 추상 메소드나 오버라이딩이 가능한 protected 메소드 등으로 만든 뒤 서브 클래스에서 이런 메소드를 필요에 맞게 구현해서 사용하도록 하는 방법의 디자인 패턴
- 팩토리 메소드 패턴
서브클래스에서 구체적인 오브젝트 생성 방법을 결정하게 하는 디자인 패턴디자인 패턴
디자인 패턴은 소프트웨어 설계 시 특정 상황에서 자주 만나는 문제를 해결하기 위해 사용할 수 있는 재사용 가능한 솔루션을 말한다. 디자인 패턴을 사용하면 설계의 의도와 해결책을 파악하기 쉽다는 장점이 있다.- 상속의 한계
- 만약 UserDao가 다른 목적을 위해 상속을 사용하고 있다면, 자바에서 다중상속을 허용하지 않기 때문에 상속을 사용할 수 없다.
- 상속을 통한 부모-자식 클래스의 관계는 생각보다 밀접하다. 그래서 슈퍼클래스 내부의 변경이 있을 때 모든 서브클래스를 함께 수정하거나, 서브클래스의 변경이 슈퍼클래스에 영향을 주지 않도록 제한해야 한다.
- 만약 다른 DAO 클래스를 만들어야 하는 경우,
getConnection()
구현 코드가 중복된다.