- 스프링은 특정 서버에 국한되어 있지 않다
- 톰캣이라는 웹 서버가 있어도 스프링 엔진이 따로 필요하다.
- 즉 스프링 컨텍스트라는 엔진을 독립적으로 가동/구동시켜줘야한다.
- 스프링엔진을 구동하기위해서는
- 엔진이 해야할 일을 담아놓은 설정 xml파일, configuration 클래스가 필요하다
- 설정 xml파일은 하나를 바꾸면 Bean쪽도 바꿔줘야해서 요즘은 지양한다
- 대신 컨피그용 @Configuration 어노테이션이 붙은 클래스를 만들어서 사용한다.
- AOC 혹은 DI를 구분하기위해서 @Autowired를 써서 자동주입이 가능하게 했다.
<context:component-scan>
태그를 써서 해당 패키지의 특정 어노테이션(@Service, @Repository)가 붙은 클래스를 관리한다.
- 컴포넌트 스캔을 할 수 있는 객체들(우리가 만든 클래스들)은 DAOOracle, Service 등이다.
- 컴포넌트 스캔을 하지 못하는 객체들만 bean을 붙여 관리하면 된다.
- dataSourceSimple이나 외부 라이브러리인 Hikari 등도
<bean>
으로 해줘야했다.
- 스프링 빈 객체의 id를 주기 위해서는 속성값을 @어노테이션(프로퍼티)를 지정해줘야한다.
- "pDAO" 같은 이름을 @Repository의 속성값을 붙여준다.
- 빈에서는 id속성 값으로 사용됐었음
- 메서드 이름으로 사용됐었음
- 아이디 속성을 지정하지 않으면(어노테이션의 속성값을 지정하지 않으면) 클래스 이름이 아이디를 대신해서 속성값으로 쓰일 수 있다.
ex) ProductDAOOracle, ProductService
- @Repository뒤에 속성값을 안줬다, 하면 클래스 이름이 속성값을 자동으로 대신한다.
누가 누구를 has-a?
- SqlSessionFactory 객체를 CustomerDAOOracle이 has-a 관계로 가지고있음
- 스프링 컨테이너에 의해서 관리되는 SqlSessionFactory 객체를 사용하므로써 DataSource 사용 안해도 됐었다.
- SqlSessionFactory라는 객체도 스프링 어플리케이션 컨텍스트 영역에 포함되어있다.
has-a 관계로 DataSource를 가지고 있고 DataSource의 세터로 SqlSessionFactory을 has-a로 가지고 있다.
factoty.
부분을 통해 has-a 관계가 성립된다.
- ProductDAO는 ProductDAOOracle 을 has-a로 가지고있고, 또 ProductDAOOracle을 가보면 DataSource를 has-a로 가지고있다.
- dataSourceHikari 객체를
DAO가 Hikari를 사용하고 싶으면 아래와같이 연결해주면 된다.
- DataSourceSimple을 사용하고 싶으면 아래처럼 해주면 된다.
- DataSourceSimple을 커넥션 풀을 사용하지않으면 직접 DB와 연결된다.
- ProductService: 인터페이스 타입의 멤버변수 dao:ProductDAO를 가지고있다
- ProductDAOOracle: 인터페이스 타입의 멤버변수 ds:DataSource를 기지고있다.
- SimpleDriverDataSource, HikariDataSource 둘 다 DataSource를 상속받은 인터페이스이다.
- 따라서 ProductDAOOracle의 멤버변수의 자료형은 DataSource타입의 ds이다.즉 인터페이스 타입인데, 클래스들의 사용관계에서는 인터페이스를 사용하는 것 처럼 보이지만 네모객체들의 관계에서 보면은 인터페이스라는 것을 알 수 없기 때문에 누가 누구를 사용하는 것처럼 보이냐면 DAOOracle 객체가 DataSource를 사용하는 것처럼 보인다. = has-a 관계처럼 보인다 클래스 입장에서 바라보기
- 객체들의 관계에서는 실제 구현체인 SimpleDriverDataSource를 써서 구현할 수도 있고, HikariDataSource를 써서 구현할 수도 있다.
- 이 객체들의 관계는 소스코드를 결정하는게 아니라 설정부분만 바꿔주면된다.
- 메서드를 바꾼다거나, 멤버변수,멤버변수의 자료형을 바꾼다거나 그럴 필요없이 설정 xml파일에서 바꾸거나 @어노테이션(속성)을 바꿔주면 된다.
- Hikari를 쓰고싶다면 ProductDAOOracle 25번째줄 @Qualifier("dataSourceHikari")로 바꿔주면 된다.
즉 소스코드에서 new로 건드리지 않는다! 제어의 역전 이렇게 선언해서 생성자로 주입을 하겠다 -> 이렇게 하는게 아니다!
- 개발자가 원하는 객체를 직접 객체생성하고 그러는게 아니라 미리 만들어져있는 객체에 주입을 할거다
(DI를 통해 미리 만들어진 원하는 객체를 찾아서 알아서 주입!)
- 즉 외부에서 가져오는 것!
- 모든 제어는 설정파일을 통해서 제어가 되는 것이다.
- 그 설정파일을 통해서 제어된것을 주입하는것이 Dependency Injection이다.
- 의존성: 미리 만들어져있는 객체에 주입해서 쓰는것!
(미리 만들어져있는 객체란 HikariDataSource, SimpleDriverDataSource 등)
- 미리 만들어져 있는 객체로 만들기위해 @Service, @Repository 붙이는거다
- 어노테이션들이 잘 구동되는지 확인
- ContainerTest까지 구동 잘 되는지 확인
- 웹프로젝트에 쉬운 화면 구성으로 바꾸기
서버가 생김!
- 너무 깊은 디플로이 경로대신 두번째, 톰캣이 있는곳을 디플로이 패스로 설정
- context-root란 기본 프로젝트 이름이랑 같게해줘도 되고 바꿔줘도 된다.
http://localhost:8088/{여기에 들어갈 것!}
- content directory에는 html,css,js 파일드링 들어간다
이제 우리가 만드는 웹프로젝트는 스프링 컨테이너를 가지고있는 웹프로젝트가 되어야한다.
- 스프링 웹 mvc용 라이브러리!
- 하나하나 하기 귀찮으니까 maven으로 바꾸자!
- jar에서 was에서 바뀐걸 볼 수 있다.
- java..용..