위로
아래
스프링 프레임워크
스프링 프레임워크 (Spring Framework)
- 자바 웹 애플리케이션 개발을 위한 오픈 소스 프레임워크
- 경량 프레임워크
- 경량 컨테이너 (애플리케이션에서 사용되는 여러가지 빈(클래스 객체)를 스프링이 권한을 가지고 직접 관리)
- 메이븐 : 스프링 프레임워크 개발과 관련된 자동화 도구
- 프레임워크 : 시니어와 주니어 개발자의 차이를 줄이기 위해, 어떤 규약을 지키면서 프로그램을 개발할 수 있도록 도와준다. 프레임워크를 이용하면 어느정도 예측된 코드 품질과 개발 속도를 맞출 수 있다.
사용 이유
- 스프링은 객체지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크
- 제어 역전, 의존성 주입을 통해 다형성을 활용해 레고 블럭을 조립하듯 쉽게 코딩할 수 있게 돕는다.
주요 기능
- Core : 다른 기능과 설정을 분리하기 위한 IoC 기능을 제공
- Context : 스프링의 기본 기능으로서 애플리케이션의 각 기능을 하는 빈(Bean)에 대한 접근 방법을 제공
- DAO : JDBC 기능을 좀 더 편리하게 사용하도록 한다
- ORM : 하이버네이트나 마이바티스 같은 영속성 관련 프레임워크와 연동된 기능을 제공
- AOP : 관점 지향 기능을 제공
- Web : 웹 애플리케이션 개발에 필요한 기능을 제공
- WebMVC : 스프링에서 MVC 구현에 관련된 기능을 제공
다형성을 위한 스프링의 원칙 : 제어 역전 원칙 IoC
제어 역전 (IoC, Inversion of Control)
- 서블릿이나 빈 등을 개발자가 코드에서 생성하지 않고 프레임워크가 직접 수행하는 방법
- 메소드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라 외부에서 결정되는 것.
- 구현체는 자신의 로직만 담당할 뿐 어떤 구현 객체가 실행될지는 모른다. (인터페이스만 알고 있다)
- 객체의 생명주기를 개발자 대신 스프링(컨테이너)가 관리하게 된다.
- 역할과 책임을 분리해 객체지향 원칙을 잘 지킬 수 있도록 도와주어, 변경에 유연한 코드를 작성할 수 있다.
- IoC 원칙을 구현하는 방법(Pattern)
- Service Locator
- Factory
- Template Method
- Strategy
- Dependency Injection (의존성 주입)
다형성을 위한 스프링의 원칙 : 의존관계 역전 원칙 DIP
의존성 주입 (DI, Dependency Injection)
- 클래스 객체를 개발자가 코드에서 생성하지 않고 프레임워크가 생성하여 사용하는 방법
- xml, config 파일 등에 설정값이 입력되어 있어야 한다.
- 객체를 직접 생성하는 게 아니라, 외부에서 생성 후 주입 시켜주는 방식
- 의존성 : 클래스 간 의존 관계가 있다면, 한 클래스가 바뀌면 다른 클래스도 영향을 받는다
- 제어의 역전이 일어나는 것을 전제로 스프링 내부 객체들간의 관계를 관리할 때 사용
- 코드를 변경하지 않고도 의존 관계를 변경할 수 있게 해준다
- @Controller, @Service : Controller에서 Service를 호출할 때, Service를 받는 생성자가 어딘가에서 호출되어야 하지만, 객체를 주입하는 코드를 쓰지 않아도 사용이 가능하다.
- @Autowired : 의존관계를 자동으로 주입하는 방법. 스프링 컨테이너가 주입하려는 객체의 타입이 일치하는 객체를 찾아서 자동으로 주입한다.
- 의존성 주입 방법
- 생성자 주입
- Setter 주입
- Interface 주입
의존관계 역전 원칙 (DIP, Dependency Inversion Policy)
- DIP는 의존성을 분리시킨다.
- 상위 계층이 하위 계층에 의존하는 상황을 인터페이스를 이용해 역전시켜, 하위 계층의 구현으로부터 독립시킨다.
- 인터페이스에는 의존하되, 구현체에는 의존하면 안 된다.
- 구현체는 인터페이스들을 호출한다. 이때 import 코드를 통해 정적인 클래스 의존관계인 인터페이스는 파악할 수 있지만, 실제 실행 시점에서 어떤 구현체 객체들이 주입될지는 몰라서 동적인 의존관계는 파악할 수 없다
관점지향 프로그래밍 AOP
관점지향 프로그래밍 AOP (Aspect-Oriented Programming)
- 핵심 기능 외 부수 기능들을 분리 구현함으로써 모듈성을 증가시키는 방법
- 애플리케이션의 핵심적인 기능과 부가적인 기능을 분리해 각각 모듈화하는 방법
- 핵심 비즈니스 로직과 부가기능(Aspect)를 분리해 객체지향 프로그래밍(OOP)를 보완.
- 핵심 비즈니스 로직에 더욱 집중할 수 있고 반복적인 코드들을 한 곳에서 관리할 수 있게 돕는다.
스프링 AOP의 특징
- @Aspect 어노테이션을 붙여서 이 클래스가 Aspect를 나타내는 클래스라는 것을 명시.
- @Component 어노테이션을 붙여서 빈으로 등록
- @Before, @After, @Around 어노테이션을 통해 타겟 메소드의 Aspect 실행 시점을 지정
스프링 컨테이너
스프링 컨테이너
- 스프링에서 자바 객체들(빈)을 관리하는 공간
- 자바 객체의 생명 주기와 생성된 자바 객체들(빈)을 관리하는 역할
- 스프링 컨테이너 안에 스프링 빈 저장소가 있다.
- 스프링 빈 : 자바 객체를 생성한 뒤 스프링 컨테이너에 등록하면, 등록된 자바 객체를 스프링 빈이라고 부른다
스프링 컨테이너 종류
- BeanFactory : 빈을 등록하고 생성하고 조회하고 돌려주는 관리 역할.
- ApplicationContext : BeanFactory 기능도 지닌 채, 스프링의 각종 부가 기능을 추가로 제공 (리스너로 등록된 빈에게 이벤트 발생, 환경변수 구분 등)
스프링 빈
스프링 빈(Spring Bean)
- 스프링 컨테이너에 의해 관리되는 자바 객체(POJO)
- 빈은 인스턴스화된 객체를 의미하며, 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.
- 기본적으로 싱글톤 빈으로, 스프링 컨테이너에서 한 번만 생성되고 컨테이너가 사라질 때 메모리에 남아 있다가 제거된다.
- 스프링 빈 스코프 : 빈이 생성되고 존재하고 적용되는 범위
- Map<Key(빈 이름),Value(빈 객체)> 형태로 스프링 빈 저장소에 저장된다.
- 스프링 빈 등록 방법 : 자바 코드로 수동 등록, Component 어노테이션
Bean 라이프사이클
스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존 관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 전 콜백 -> 스프링 종료
스프링에서 Bean 등록하는 방법
- Component 어노테이션 : 클래스나 인터페이스에 @Component 어노테이션을 붙이면 스프링 컨테이너에 의해 자동으로 생성되어 스프링 빈으로 등록된다.
- 자바 코드로 직접 등록 : 설정 클래스를 따로 만들어 @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>
- id : 빈 객체의 고유 이름. id를 이용해 빈에 접근한다.
- name : 빈 객체의 별칭
- class : 생성할 클래스. 패키지 이름까지 입력.
- constructor-arg : 생성자를 이용해 값을 주입할 때 사용
- property : setter를 이용해 값을 주입할 때 사용