스프링

Walter Mitty·2023년 1월 31일
0
  • 스프링은 특정 서버에 국한되어 있지 않다
    • 톰캣이라는 웹 서버가 있어도 스프링 엔진이 따로 필요하다.
    • 즉 스프링 컨텍스트라는 엔진을 독립적으로 가동/구동시켜줘야한다.
  • 스프링엔진을 구동하기위해서는
    • 엔진이 해야할 일을 담아놓은 설정 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..용..

0개의 댓글