1. 빈(Bean)

역대 빈

  • javaBeans - 재사용 가능한 컴포넌트, 인스턴스 변수, getter&setter, no-args constructor
  • Servlet&JSP bean - MVC 의 Model, EL, scope, JSP container가 관리하는 객체
  • EJB (큰 규모의 자바 빈) - 복잡한 규칙, EJB container가 관리
  • Spring Bean - POJO(Plain Old Java Object). EJB의 반대. 단순하고 독립적임, Spring container가 관리

Bean

  • Spring Container가 관리하는 객체
  • Spring Container : Bean 저장소, Bean을 저장/관리(생성, 소멸, 연결)
    1. BeanFactory - Bean을 생성, 연결하는 기본 기능을 정의함
    2. ApplicationContext - BeanFactory를 확장해서 여러 기능을 추가함
  • ApplicationContext는 인터페이스이고, 다양한 구현체가 있음
    설정과 웹인지 웹이 아닌지에 따라 선택해서 사용

Root AC와 Servlet AC

  • web이고, xml로 설정을 할때
  • AC는 XmlWebApplicationContext이고 new XmlWebApplicationContext으로 저장소 만든다
  • web.xml에서 이벤트 처리기인 ContextLoaderListener는 톰캣이 실행될 때 이벤트를 체크해서 AC를 생성해줌
  • 그때 기본적으로 두 개의 AC를 만들어 주는데
  1. root AC

    루트 AC의 설정 파일 위치(name으로 알려주고)를 value(root-context.xml)로 적어주면 XmlWebApplicationContext가 new 될 때 설정파일을 이용해서 생성됨

  2. Servlet AC

    디스패쳐서블릿이 생성되는데 그때 설정파일 정보를 root AC처럼 받고(servlet-context.xml) new XmlWebApplicationContext해서 Servlet AC가 생성됨

  • 두 개의 AC는 연결되는데, root AC가 부모, servlet AC가 자식 관계로 연결된다

  • 빈을 찾을 때 자식(servlet)에서 먼저 찾고, 없으면 부모(root)에서 찾는다

    자식 AC가 여러 개일 수 있다
    그래서 그 자식들에서 공통으로 사용되는 빈을 부모 AC에 담아두고 각 모듈에서 사용되는 개별적인 빈들은 자식 AC에 담는다
    부모 AC에는 웹과 상관 없는 non-Web 빈들을 넣는다

  • 톰캣 서버 구조

  • ApplicationContext(JSP 기본 객체)

ApplicationContext의 주요 메서드

2. IoC와 DI

IoC : 제어의 역전

  • 제어의 흐름을 전통적 방식과 다르게 뒤바꾸는 것
  • 전통적인 방식 : 사용자가 직접 framework 코드를 호출
    다른 사람의 코드를 호출해서 결과를 받는 방식
  • IoC 방식 : framework 코드가 사용자 코드를 호출
    사용자 코드를 라이브러리가 호출해서 주입을 받아서 결과를 만들어 낸다던가 함

DI : 의존성 주입

  • 코드를 주는 것
  • 사용할 객체를 외부에서 주입받는 것
  • 프레임웍이 사용할 코드를 사용자가 주는 것
  • new 해서 주는 것은 수동으로 주입하는 것이고
  • @Autowired 해서 주는 것은 자동으로 주입하는 것

3. 스프링 애노테이션

@Autowired

  • 인스턴스 변수, setter, 참조형 매개변수를 가진 생성자나 메서드(객체의 주소를 참조하는 것들)

  • 매개변수에 들어갈만한 것들을 AC에서 가져와서 연결해줌

  • 생성자의 @Autowired는 생략 가능

  • 각각 붙이는 것보다 생성자를 이용해서 한 번에 붙이는 것이 권장됨

  • 생성자로 주입할 때 @Autowired를 생략하면, 기본 생성자가 있으면 자동 주입하지 않고 기본 생성자로 객체를 생성해버림
    @Autowired를 붙여줘야함

  • 타입으로 빈을 검색해서 참조 변수에 자동 주입함

  • 검색된 빈이 여러개면 그 중에 참조변수와 이름이 일치하는 것을 주입함

  • 주입할 대상이 변수(1개)일 때 검색된 빈이 1개여야 예외가 발생하지 않고
    주입할 대상이 배열일 때 검색된 빈이 1개가 아니더라도 예외가 발생하지 않는다

  • @Autowired(required = false)면 0개여도 예외가 발생하지 않고 참조 값을 null로 갖는다

@Resourse

  • 이름으로 빈을 검색해서 참조 변수에 자동 주입해줌
  • 일치하는 이름의 빈이 없으면 예외가 발생한다

@Component

  • <context:component-scan base-package=""/> 안에 있는 클래스 중에 @Component가 붙은 클래스를 자동으로 검색해서 빈으로 등록함 (서브 클래스까지 몽땅)
  • 빈으로 등록되는 id는 클래스명의 첫 글자를 소문자로 바꾼 것
    따로 지정 가능 @Component("")
  • 애노테이션의 메타 에노테이션이 @Component인 경우에도 빈으로 등록됨
    @Controller, @Service, @Repository, @ControllerAdvice 등

@Value

  • 값을 지정하는 애노테이션
  • 내 컴퓨터 System의 값들을 가져올 수 있다
	@Value("#{systemProperties['user.timezone']}")
    String timeZone;
    @Value("#{systemEnvironment['APPDATA']}")
    String currDir;
    @Value("${autosaveDir}")
    String autosaveDir;
    @Value("${autosaveInterval}")
    int autosaveInterval;
    @Value("${autosave}")
    boolean autosave;
    
    결과
    ac.getBean(SysInfo.class)) = SysInfo{timeZone='Asia/Seoul', currDir='C:\Users\jju\AppData\Roaming', autosaveDir='/autosave', autosaveInterval=30, autosave=true}
  • 시스템의 환경변수들을 value로 가져올 수 있다
    환경변수를 보는 법
		Map<String, String> map = System.getenv();
        System.out.println("map = " + map);	
  • 시스템의 프로퍼티들을 보는 법
		Properties properties = System.getProperties();
        System.out.println("properties = " + properties);

스프링 애노테이션 vs 표준 애노테이션

4. 빈의 초기화

< property >와 setter

  • < property > 태그를 이용해서 인스턴스 변수를 모두 초기화할 수 있다
    setter를 이용하기 때문에 setter가 꼭 구현되어 있어야 함

< contructor-arg > 와 생성자

  • < contructor-arg > 태그를 이용해서 인스턴스 변수를 모두 초기화할 수 있다
    생성자를 이용하기 때문에 생성자가 꼭 구현되어 있어야 함 (기본 생성자도)

< list >< set >< map >

  • 각 자료구조마다 다르게 초기화된다
  • 참조형일 때는 ref, value-ref를 이용한다
profile
안녕하세요. Chat JooPT입니다.

0개의 댓글