javaBeans 라는 규약이 있다.
class 를 작성하는 규칙이다
3가지 정도만 기억하자
코드를 작성할 때 염두해두어야 하는 사항은?
요구사항이 변화함에 따라 우리의 코드가 이런 변화에 잘 대응할 수 있도록 작성해야 한다.
그 방법에는 2가지가 기본적으로 존재한다.
soc(separation of concerns) : 관심사의 분리.
같은 concern(주제) 이 한 곳에 분리되어 존재해야함!
만약 내가 만든 프로그램을 판다면, 파는 물건은
.class 파일. 즉 내가 만든 .java, 소스코드 자체를 제공하지는 않는다.
따라서 구매자가 필요한 만큼 확장해서 사용할 수 있도록,
상속
이라는 기법을 이용해 확장을 가능토록 한다
변화할 수 있는 부분(코드)을 추상화(abstract) 시키는 것이다.
// 패키지가 다르더라도 접근이 가능토록 하는 접근제한자인 projected 를 사용한다.
protected abstract Connection getConntection();
상속관계에 있어서
userDao
: 로직처리의 일부분을 가지고 있고,
userDao을 상속한 NUserDao
: userDao 가 가진 로직 + 구현 객체만의 로직 일부분을 가지고 있다.
이러한 디자인 패턴을 템플릿 메소드 패턴이라 한다.
상위 class 에서 userDao의 getConnection 을 추상화해놓았는데, 해당 메소드는 객체를 생성하는 역할을 한다.
하위 클래스
상위 에서 객체가 필요한데, 상위 클래스는 추상화되어 있기 때문에 객체생성이 불가능, 따라서 하위클래스를 통해 객체를 만들고 그것을 끌고 올라오는 것.
즉 구체적인 객체 생성 방법을 하위 클래스에서 결정하는 기법
상속을 사용하지 않고 분리를 통해 확실하게 두 개의 클래스로 분리해보자.
연결 정보를 가져오는 class 에 대해 너무 상세히 알고 있다보니 이 역시 tightly coupled 되어 버리기 때문에 이 문제를 해결해야 한다. 이 때 사용되는 것이 interface
class가 생성될 때 다른 객체를 받아서,
클래스명이 직접적으로 나오는 코드를 분리시키자.
injection 은 생성자를 통한 주입이 있고, setter를 통한 주입이 있다.
상속을 통해 일부분을 만들어 놓은 추상 클래스와, 이를 상속 받아 최종적으로 구현해 사용하는 구현 클래스로 나누어 사용하는 형태.
이와 비슷한 디자인 패턴으로 전략 패턴이라는 것이 있다.
자신의 기능 context의 일부분을 인터페이스를 통해 통채로 외부로 분리시키는 방법
즉 자신의 로직의 일부분을 인터페이스화로 통째로 외부로 분리시시키는 것이다.
이러한 전략 패턴과 템플릿 메소드 패턴은 비슷한 형태를 띄고 있다.
다만 차이점은, 템플릿 메소드 패턴은 상속을 통해 구현하는 것이고, 전략 패턴은 인터페이스를 통해 구현한다는 점이다.
전략 패턴을 이용할 경우, 우리 예제처럼 전략을 바꿔주는 요소가 필요하다.
userDao는 connectionMaker 라는 인터페이스를 통해 SimpleMakeConnection
이라는 전략을 사용하게 된다. 이러한 전략은 connectionMaker 라는 인터페이스를 구현한 것으로, 언제든지 다른 전략으로 바뀔 수 있다.
또한 이러한 전략을 userDao 에게 주입하는 또다른 객체(ex userDaoTest)가 필요해진다.
제어의 역전
이라고도 불리는 개념이다.
Spring은 IoC Container이다.
Spring이 관리하는 객체들을 Bean
이라고 통칭한다.
이러한 Bean
을 관리하는 컨테이너를 Spring Container 라고 부른다.
Spring Container 는 IoC 라는 개념에 의거하여 관리가 이루어진다.
참고로 서블릿 컨테이너 역시 IoC 의 개념에 의거해 관리가 이루어지고 있었다.
앞의 예제6의 코드를 보면, UserDaoTest 라는 객체는 userDao의 기능이 정상적으로 동작하는지 확인이 가능하다.
원리는 테스트용 클래스였는데, 여기에 기능이 추가된 것이다. 객체 간의 런타임 연관성을 맺어주는(주입) 기능이 추가된 것이다.
factory 를 만들어서 해당 연관성을 맺어주는 객첼르 생성하게 된다.
Annotaion : @~~ 정해져있는 키워드
이런 어노테이션은 로직에는 영향을 주지 않고, 프고르매의 구조에 영향을 끼친다.
Springd은 상당히 방대한 기능을 가지고 있다. 그 중 가장 핵심을 담당하는 기능이야 말로 Bean Factory 기능이다.
bean factory 란 application context.
DaoFactory 와 같은 IoC 기능을 일반화시킨 container
spring이 제어권을 가지고, 직접 만들고, 관계를 부여하는 객체를 Bean 이라 한다.
applicationContext 는 설정 정보를 통해 bean 을 관리하게 된다.
주로 xml 파일, 혹은 어노테이션 두 가지 방식을 통해 설정을 해줄 수 있다. 두 가지는 일장일단이 있다. 가장 기본이 되는 방식은 xml 파일을 통한 방법이 있다.
bean 의 구성요소
1. class : bean 으로 등록할 자바 클래스(full package 를 명시)
2. bean 의 Id
: bean 의 고유 식별자
3. scope : singleton 과 prototype, request, session 등 스코프를 정해야 한다.
4. constractor-arg : bean 생성 시 생성자에게 전달할 인자.
5. property : bean 생성 시 setter 에게 전달할 인자를 표현
이와 같은 내용을 기반으로 bean을 등록하고, bean을 싱글톤으로 생성해서 관리한다.
bean을 등록하기 위한 방법
1. 수동(annotaion을 통한 방법)
public class MyResouce {
// 이 클래스의 객체를 bean 으로 관리한다면?
}
applicationContext 실행 정보를 바탕으로 bean을 관리
여기에서의 설행정보는 xml이나 annotation.
@Configuration
public class MyResourceComfig {
@Bean
public MyResource getResource() {
return new MyResource();
}
}
이게 수동으로 bean 을 등록하는 방법이다.
getResource
== Bean 의 id, 즉 식별자. 따라서 메소드의 이름이 중복될 수 없다.
Spring Container(=applicationContext) 란 @Configuration
이 붙은 class 를 의미한다.
그리고, 이 클래스 역시 하나의 bean 객체로 식별된다.
해당 class를 @Bean 으로 두었다가, 해당 클래스 내부의 method에 의해 생성되는 객체들을 Bean 으로 생성.