위로 아래

스프링 프레임워크

스프링 프레임워크 (Spring Framework)

  1. 자바 웹 애플리케이션 개발을 위한 오픈 소스 프레임워크
  2. 경량 프레임워크 
  3. 경량 컨테이너 (애플리케이션에서 사용되는 여러가지 빈(클래스 객체)를 스프링이 권한을 가지고 직접 관리)
  4. 메이븐 : 스프링 프레임워크 개발과 관련된 자동화 도구
  5. 프레임워크 : 시니어와 주니어 개발자의 차이를 줄이기 위해, 어떤 규약을 지키면서 프로그램을 개발할 수 있도록 도와준다. 프레임워크를 이용하면 어느정도 예측된 코드 품질과 개발 속도를 맞출 수 있다. 

 

 

사용 이유

  1. 스프링은 객체지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크
  2. 제어 역전, 의존성 주입을 통해 다형성을 활용해 레고 블럭을 조립하듯 쉽게 코딩할 수 있게 돕는다. 

 

주요 기능

  1. Core : 다른 기능과 설정을 분리하기 위한 IoC 기능을 제공
  2. Context : 스프링의 기본 기능으로서 애플리케이션의 각 기능을 하는 빈(Bean)에 대한 접근 방법을 제공
  3. DAO : JDBC 기능을 좀 더 편리하게 사용하도록 한다
  4. ORM : 하이버네이트나 마이바티스 같은 영속성 관련 프레임워크와 연동된 기능을 제공
  5. AOP : 관점 지향 기능을 제공
  6. Web : 웹 애플리케이션 개발에 필요한 기능을 제공
  7. WebMVC : 스프링에서 MVC 구현에 관련된 기능을 제공

 

 

 


다형성을 위한 스프링의 원칙 : 제어 역전 원칙 IoC

제어 역전 (IoC, Inversion of Control)

  1. 서블릿이나 빈 등을 개발자가 코드에서 생성하지 않고 프레임워크가 직접 수행하는 방법
  2. 메소드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라 외부에서 결정되는 것.
  3. 구현체는 자신의 로직만 담당할 뿐 어떤 구현 객체가 실행될지는 모른다. (인터페이스만 알고 있다)
  4. 객체의 생명주기를 개발자 대신 스프링(컨테이너)가 관리하게 된다.
  5. 역할과 책임을 분리해 객체지향 원칙을 잘 지킬 수 있도록 도와주어, 변경에 유연한 코드를 작성할 수 있다.
  6. IoC 원칙을 구현하는 방법(Pattern)
    1. Service Locator
    2. Factory
    3. Template Method
    4. Strategy
    5. Dependency Injection (의존성 주입)

 

 

 

다형성을 위한 스프링의 원칙 : 의존관계 역전 원칙 DIP

의존성 주입 (DI, Dependency Injection)

  1. 클래스 객체를 개발자가 코드에서 생성하지 않고 프레임워크가 생성하여 사용하는 방법
  2. xml, config 파일 등에 설정값이 입력되어 있어야 한다.
  3. 객체를 직접 생성하는 게 아니라, 외부에서 생성 후 주입 시켜주는 방식
  4. 의존성 : 클래스 간 의존 관계가 있다면, 한 클래스가 바뀌면 다른 클래스도 영향을 받는다
  5. 제어의 역전이 일어나는 것을 전제로 스프링 내부 객체들간의 관계를 관리할 때 사용
  6. 코드를 변경하지 않고도 의존 관계를 변경할 수 있게 해준다
  7. @Controller, @Service : Controller에서 Service를 호출할 때, Service를 받는 생성자가 어딘가에서 호출되어야 하지만, 객체를 주입하는 코드를 쓰지 않아도 사용이 가능하다.
  8. @Autowired : 의존관계를 자동으로 주입하는 방법. 스프링 컨테이너가 주입하려는 객체의 타입이 일치하는 객체를 찾아서 자동으로 주입한다. 
  9. 의존성 주입 방법
    1. 생성자 주입
    2. Setter 주입
    3. Interface 주입

 

 

의존관계 역전 원칙 (DIP, Dependency Inversion Policy)

  1. DIP는 의존성을 분리시킨다.
  2. 상위 계층이 하위 계층에 의존하는 상황을 인터페이스를 이용해 역전시켜, 하위 계층의 구현으로부터 독립시킨다.
  3. 인터페이스에는 의존하되, 구현체에는 의존하면 안 된다.
  4. 구현체는 인터페이스들을 호출한다. 이때 import 코드를 통해 정적인 클래스 의존관계인 인터페이스는 파악할 수 있지만, 실제 실행 시점에서 어떤 구현체 객체들이 주입될지는 몰라서 동적인 의존관계는 파악할 수 없다

 

 

 


관점지향 프로그래밍 AOP

관점지향 프로그래밍 AOP (Aspect-Oriented Programming)

  1. 핵심 기능 외 부수 기능들을 분리 구현함으로써 모듈성을 증가시키는 방법
  2. 애플리케이션의 핵심적인 기능과 부가적인 기능을 분리해 각각 모듈화하는 방법
  3. 핵심 비즈니스 로직과 부가기능(Aspect)를 분리해 객체지향 프로그래밍(OOP)를 보완. 
  4. 핵심 비즈니스 로직에 더욱 집중할 수 있고 반복적인 코드들을 한 곳에서 관리할 수 있게 돕는다.

 

스프링 AOP의 특징

  1. @Aspect 어노테이션을 붙여서 이 클래스가 Aspect를 나타내는 클래스라는 것을 명시.
  2. @Component 어노테이션을 붙여서 빈으로 등록
  3. @Before, @After, @Around 어노테이션을 통해 타겟 메소드의 Aspect 실행 시점을 지정 

 

 

 


스프링 컨테이너

스프링 컨테이너

  1. 스프링에서 자바 객체들(빈)을 관리하는 공간
  2. 자바 객체의 생명 주기와 생성된 자바 객체들(빈)을 관리하는 역할
  3. 스프링 컨테이너 안에 스프링 빈 저장소가 있다.
  4. 스프링 빈 : 자바 객체를 생성한 뒤 스프링 컨테이너에 등록하면, 등록된 자바 객체를 스프링 빈이라고 부른다

 

스프링 컨테이너 종류

  1. BeanFactory : 빈을 등록하고 생성하고 조회하고 돌려주는 관리 역할. 
  2. ApplicationContext : BeanFactory 기능도 지닌 채, 스프링의 각종 부가 기능을 추가로 제공 (리스너로 등록된 빈에게 이벤트 발생, 환경변수 구분 등)

 

 

 


스프링 빈

스프링 빈(Spring Bean)

  1. 스프링 컨테이너에 의해 관리되는 자바 객체(POJO)
  2. 빈은 인스턴스화된 객체를 의미하며, 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.
  3. 기본적으로 싱글톤 빈으로, 스프링 컨테이너에서 한 번만 생성되고 컨테이너가 사라질 때 메모리에 남아 있다가 제거된다.
  4. 스프링 빈 스코프 : 빈이 생성되고 존재하고 적용되는 범위
  5. Map<Key(빈 이름),Value(빈 객체)> 형태로 스프링 빈 저장소에 저장된다. 
  6. 스프링 빈 등록 방법 : 자바 코드로 수동 등록, Component 어노테이션 

 

Bean 라이프사이클

스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존 관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 전 콜백 -> 스프링 종료

 

스프링에서 Bean 등록하는 방법

  1. Component 어노테이션 : 클래스나 인터페이스에 @Component 어노테이션을 붙이면 스프링 컨테이너에 의해 자동으로 생성되어 스프링 빈으로 등록된다.
  2. 자바 코드로 직접 등록 : 설정 클래스를 따로 만들어 @Configuration 어노테이션을 붙이고, 해당 클래스 안에서 빈으로 등록할 메소드를 만들어 @Bean 어노테이션을 붙여주면 자동으로 해당 타입의 빈 객체가 생성된다. 

 

xml <bean> 속성들

<bean id="personService" class="com.spring.ex01.PersonServiceImpl">
  <property name="name">
     <value>홍길동</value>
  </property>
</bean>

<bean id="personService1" class="com.spring.ex02.PersonServiceImpl">
    <constructor-arg value="이순신"/>
</bean>
  1. id : 빈 객체의 고유 이름. id를 이용해 빈에 접근한다.
  2. name : 빈 객체의 별칭
  3. class : 생성할 클래스. 패키지 이름까지 입력.
  4. constructor-arg : 생성자를 이용해 값을 주입할 때 사용
  5. property : setter를 이용해 값을 주입할 때 사용