Spring

Jung·2021년 4월 13일
0

수업

목록 보기
14/20
  • OOP의 특징
    • Encapsulation : reflection기능이 뭐지?
    • Inheritance : 상속, 공통적인 것은 묶어서 부모 클래스로 보내고,
    • Abstraction : 추상화, 복잡한 부분에서 꼭 필요한 부분을 모아 간단히 간추려 클래스를 만드는 것이다. 노출하고 싶은 부분만 노출하게 된다. 공통부분을 모아서 인터페이스로 만든다든지, 부모 자식 관계로 만든다든지.
    • Polymorphism : 다형성,

  • SOLID 원칙
    • Single Responsibility Principle : 단일 책임 원칙 : 하나의 객체가 한번에 하나의 책임만을 진다.
    • Open / Closed Principle : 변경이 닫혀있어야하고, 확장이 열려있어야 한다. 남이 바뀌었다고 나까지 바뀌면 안된다는 뜻이다.
    • 리스코프 치환 원칙 : 정확성을 꺠트리지 않으면서 하위 타입의 이느턴슬 바꾸는 것이다. 상위 타입이 하위 타입으로 변경 가능해야 한다. List a = new ArrayList(); 에서 List를 쓰든 ArrayList를 타입으로 쓰든 똑같이 동작해야 한다.
    • Interface Segregation Principle : 가능하면 범용적으로 쓰는 인터페이스 하나보단, 특정 상황에 맞는 인터페이스 여러개를 만들라는 뜻이다. 전용의 작은 인터페이스가 좋다.
    • Dependency Inversion Principle : 의존성 역전. 의존성을 역전 시키는 것이 더 좋다.

  • Spring Triangle

    • AOP : 메소드 앞뒤에 호출할 수 있는 조각같은 것이다. 인터셉터가 AOP와 비슷한 개념이다. 코딩하다보면 핵심로직이 가운데 있고, 자투리 코드가 메소드 앞뒤에 붙을 때가 있다. qna미션에선 HttpSession에서 로그인 사용자 확인이다. 여러 메소드에 걸쳐 공통적으로 나타나는 로직을 Cross cutting concern라고 부르고, 다른 말로 Aspect이다. Session, Logging, Transactional, (transaction이 윌 메소드 감싸고 나서 롤백하는 것), 시간 측정 등이 대표적인 Aspect 예시이다. Aspect를 직접 짤 수 있는데 굉장히 어렵고, 필터와 인터셉터를 쓴다.
    • Inversion Of Control :
    • Portable Service Abstraction: 스프링의 기술을 다른 것으로 바꿔치기 해도 잘 돌아가야한다. 다양한 서비스 인터페이스를 제공해줘서, 로거도 지금은 로그백을 쓰지만 어떤 규격을 준수하면 어떤 것을 사용해도 된다. 우리는 스프링 부트를 써서 커스터마이징 안된 모듬st이지만, 커스터마이징 가능하고 다른걸로 바꿔도 된다.
  • Dependency Injection :

    • Dependency 는 언제 발생하는가? : 테스트가 편해진다. 테스트 잘되는 코드가 객체지향적인 코드이다.

car은 tire에 의존성을 주입당했다. car생성자 매개변수로 tire이 들어온다. 만약 생성자에 매개변수 받지 않고, 기본 생성자로

Car () { 
	this.tire = new KoreaTire(); 
}

와 같이 하면, Car 생성할 때 car은 무조건 Tire 타입의 타이어를 갖게 된다. car와 tire가 강한 결합?이 되어서, 타이어를 갈게 되면, 무조건 KoreaTire에 의존성을 갖게 된다. OCP측면에서 나쁘다.

Car (Tire tire) { 
	this.tire = tire; 
}

와 같이 하면 생성자 매개변수로 새로운/다른 타입의 tire을 넣을수 있다.

  • spring context mvn :
    스프링은 자바 빈이 들어있는 컨테이너다. IOC 컨테이너가 빈을 관리해준다. 이 컨테이너를 통칭하는 말이 ApplicationContext이다. 컨테이너는 xml(구닥다리 방식), 애노테이션 방식으로 만들 수 있다.
	ApplicationContext ctx = new ClassPathXmlApplicationcontext("config.xml", Kyu.class);

config.xml은 new로 생성하려 할 때 xml file..
어플리케이션 context에서 getBean으로 koreaTire이란 name의 Bean을 가져오라고 하면, 에러가 난다. 그런 이름의 빈이 없다고 한다. xml파일에 <bean> 으로 name koreatire, class honux.KoreaTire로 등록해주면 된다.
POJO: plain old java ~. xml설정이 모여있다. code를 돌아다니며 고치는것보다, xml 파일 단 하나만 보면 되므로 설정파일을 xml에 모아 둔 것이다. (마이바티스 쓰면 쿼리를 모아서 xml파일에 모아둔다. 코드가 아닌 모든 것을 resource아래 xml에 두는데, 모든 빈과빈을 엮는 것을 xml로 해준다. 한 xml에 모두 다 넣기엔 너무 내용이 많기 때문에, 쪼개서 넣는다.
xml 로 하면, setter로 주입시켜줘야한다.
코드에선 Tire tire = ctx.getBean("tire", Tire.class);로 빈을 가져오고, xml에서 <bean>에다 KoreaTire, MichellinTire로 어떤 종류의 tire인지 지정해주면 된다. main클래스의 코드는 건드리지 않고, xml 설정파일에서 어떤 타이어를 쓸지 수정할수 있는 것이다.
또는, 생성자 주입으로하고, xml에서 <property>로 매개변수 주입??

@autowired를 하면 생성자, setter 필요없다. xml에 <context:annotation-config/> 추가하고, <beans>에는 xmls:context="http:www.springframework.org/schema/context"를 추가해준다.
어떤 타이어를 쓸지 메인코드에서 지정해주지 않아도, autowire을 통해 tire이면 car에 주입해준다. 이때 xml파일에서 설정한 tire의 종류를 따른다. 만약 한국타이어 타입으로 빈 설정이 되어있으면 car에 한국타이어가, 미셰린 타이어 타입으로 빈설정이 되어있으면 car에 미세린 타이어가 달린다. tire타입 빈이 하나밖에 없으면 알아서 껴준다.
그런데 만약 한국타이어 타입, 미셰린타이어 타입 빈이 두개가 등록이 되어 있으면, @autowired에서 어떤 타이어 빈을 가져와서 주입시켜야할지를 모른기 때문에, 에러가 난다.
한국타이어, 미세린 타이어 중 어떤 타입의 빈을 등록할지 설정하려면, @autowired밑에 @Qualifier("빈이름")을 어떤 것 설정할지 정해준다.
@Resource도 @Autowire대신에 사용할 수 있는데, autowire은 스프링 어노테이션이고, @Resource는 자바의 표준 어노테이션이다. 둘의 차이는 크지 않다. 자바 표준으로도 dependency injection이 된다.

@Configuration이 xml파일을 대신하는 것이다. ApplicationContext ctx 가 annotationConfiguration~~로 설정된다. 어노테이션 기반으로 빈들을 엮어준다. 빈은 빈끼리 의존성을 갖는다. car을 빈으로 만들어준 이유도 @autowire을 쓰기 위해선 car가 빈이어야하기 때문이다.


Servlet과 servlet Container 관계

  • 웹서버가 있고, 그 안에 서블릿 컨테이너가 있다. 서블릿 컨테이너엔 여러 서블릿이 담긴다. 스프링도 서블릿의 일종이다.
    스프링 부트 안에 내장 탐캣이 담겨 있다.
    -스프링 컨테이너에 담긴 빈. 빈끼리 연결된 것은 빈끼리의 의존성이 생긴 것이다. 의존성은 xml, configuration으로 집어넣는다. applicationContext ioc, inversion of control이라고한다. 컨트롤이 역전된 컨테이너라고, 의존성을 날로생으로 주입하지않고, 설정파일을 이용해 의존성을 거꾸로 주입해준다고 해서 IOC Container이라고 한다. ApplicationContext가 IOC Container이다.

  • 스프링 컨테이너가 관리하는 Object를 빈이라고 부른다. jar가 항아리(java archive)에 빈을 담는다는 뜻이다. 스프링 컨테이너가 여러분의 평범한 자바, pojo를 configuration metadata를 이용해서 빈으로 바꿔준다.

  • 스프링 빈들은 전부 싱글톤이다. 라이프스타일에서 해당하는 객체가 단 한개 생기는 것이 싱글톤이다.

  • setter은 p namespace, 생성자는 c namespace로 <bean>의존성을 한줄로 설정할 수 있따.

  • <context: cmponent-scan>하면 내 소스 전체 돌아서 @Component단 애들 전부 빈으로 등록한다.

0개의 댓글