[Spring] Spring 프레임워크와 Bean 등록, 컴포넌트 어노테이션
서버개발

[Spring] Spring 프레임워크와 Bean 등록, 컴포넌트 어노테이션

 

프레임워크 vs 라이브러리 vs API

# 프레임워크 : 응용프로그램이나 소프트웨어의 개발을 수월하게 하기위해 제공된 소프트웨어 환경

- 이미 만들어진 규칙에 따라 코딩, 프레임워크가 나의 코드를 호출

- 응용프로그램이 수동적으로 프레임워크에 의해 사용된다.

- 프레임워크는 완성된 제품이 아닌 완성된 제품을 만들기 위해 개발자를 도와주는 또는 기반이 되는 역할을 한다.

- 호출자 : 프레임워크

 

# 라이브러리 : 응용 프로그램 개발을 위해 필요한 기능을 모아 놓은 것

- 이미 만들어진 컴포넌트 자체, 구현 로직 없음

- 존재하는 코드를 직접 컨트롤한다.

- 호출자 : 응용프로그램

 

# API : 응용 프로그램에서 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스

- 컴포넌트를 사용하는 규약, 호출을 위한 수단, 구현 로직 없음

- API와 라이브러리의 차이 : 구현 로직의 유무

- 접근 권한이 필요하고, 인터페이스이기 때문에 내부 구조를 알 수 없음

- 라이브러리는 컴포넌트 자체를 의미하고, API는 그 컴포넌트를 활용하기 위한 규약이다. 

 

스프링 프레임워크란?

# 자바객체를 담고 직접 관리하는 IOC(Inversion of Control)기반의 경량의 프레임워크 

- 크기와 부하의 측면에서 경량 컨테이너 : 자바 객체의 생성, 소멸등의 라이프사이클을 직접 관리함

- POJO (Plain Old Java Object) : 객체지향 원리에 충실하며 필요에 따라 재사용 가능한 자바 클래스

- IOC (제어역행, Inversion of Control) : 객체에 대한 제어권을 프레임워크가 가지고 있음 

- DI (의존성주입, Dependency Injection) : 의존성이 존재하는 경우 이를 컨테이너가 주입을 해줌

- AOP (관점지향 프로그래밍, Aspect-Oriented Programming) : 공통적으로 사용할 수 있는 기능을 분리하여 모듈로 관리 (로깅, 보안 등)

- 높은 확장성을 가지고 있음

 

클래스 vs 오브젝트(객체) vs 인스턴스

# 클래스 

- 객체를 만들어 내기 위한 설계도 혹은 틀, 연관되어 있는 변수와 메서드의 집합

public class Monster{
...
}

 

# 객체

- 클래스라는 틀을 이용해 만들어낸 모양 그대로의 실체

- 클래스의 인스턴스라고도 불리며 메모리에 할당되지 않은 것

Monster m1;

 

# 인스턴스

- 객체를 소프트웨어에 실체화하면 그것을 인스턴스라고 부른다.

- 객체와의 관계에선 메모리에 할당되어 같은 객체에 여러 인스턴스가 바뀌어 할당될 수 있다.

- 인스턴스는 어떤 원본으로부터 생성된 복제본을 의미하여 추상적인 개념과 구체적인 객체 사이의 관계에 초점을 맞출 때 사용한다.

m1 = new Monster();

 

인터페이스와 추상클래스의 차이

# 추상클래스의 특징

- 추상 클래스는 new연산자를 사용하여 객체를 생성할 수 없다.

- 추상 클래스(부모)와 일반클래스(자식)는 상속의 관계에 놓여있다.

- 추상 클래스는 새로운 일반 클래스를 위한 부모 클래스의 용도로만 사용된다.

- 일반 클래스들의 필드와 메소드를 통일하여 일반 클래스 작성 시 시간을 절약할수 있다.

- 추상 클래스는 단일 상속만 가능하며 일반 변수를 가질 수 있다.

- 추상 클래스는 동일한 부모를 가지는 클래스를 묶는 개념으로 상속을 받아서 기능을 확장시키는것이 목적이다.

 

# 인터페이스의 특징

- 인터페이스는 모든 메서드가 추상 메서드인 경우를 말한다.

- 인터페이스는 추상 클래스보다 한 단계 더 추상화된 클래스라고 볼 수 있다.

- 인터페이스에 적는 모든 메서드들은 추상 메서드로 간주되기 때문에 abstract을 적지 않는다.

- 인터페이스는 static final 필드만 가질 수 있다. 필드를 선언할 때는 public static final 기능이 생략되어있다.

- public static final을 사용하는 이유는 다음과 같다.

 > 구현 객체의 같은 동작을 보장하기 위한 목적(값을 추가하거나 그런것을 불가능하도록)

 > 인터페이스의 변수는 스스로 초기화 될 권한이 없음

 > 아무 인스턴스도 존재하지 않는 시점이기 때문

- 인터페이스도 추상 클래스와 마찬가지로 new 연산자를 사용하여 객체를 생성할 수 없다.

- 인터페이스는 구현 객체가 같은 동작을 한다는 것을 보장하는 것이 목적이다.

- 인터페이스는 추상 클래스와 반대로 다중 상속이 가능하다.

 

# 공통점

- 클래스는 크게 일반 클래스와 추상 클래스로 나뉘는데 추상 클래스는 클래스 내 '추상 메소드'가 하나 이상 포함되거나 abstract 정의된 경우를 뜻한다. 

- 추상 클래스와 인터페이스는 상속받는 클래스 혹은 구현하는 인터페이스 안에 있는 추상 메소드를 구현해야한다.

 

# 차이점 

- 인터페이스와 추상 클래스는 존재 목적이 다르다.

1. 추상 클래스는 그 추상 클래스를 상속받아서 기능을 이용하고, 확장시키는데 있다.

2. 인터페이스는 함수의 껍데기만 있으며, 그 이유는 그 함수의 구현을 강제하기 위해서이다.

구현을 강제함으로써 구현 객체의 같은 동작을 보장할 수 있기 때문이다.

- 추상 클래스(단일상속) / 인터페이스(다중상속)이다.

- 추상 클래스의 목적은 상속을 받아서 기능을 확장시키는 것

- 인터페이스의 목적은 구현하는 모든 클래스에 대해 특정한 메서드가 반드시 존재하도록 강제하는 역할

(구현 객체가 같은 동작을 한다는 것을 보장하기 위함)

 

빈(Bean)이란?

# Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라고 부른다. ApplicationContext.getBean()을 통해 얻을 수 있는 객체타입

- ApplicationContext 에서 주입을 해주는 객체로 그 안에 담겨있다.

- 제어의 역전을 통해 주입될 객체로 IoC 컨테이너에 등록되어있다. 

 

# Bean의 속성 : 속성에 설정된 정보를 토대로 객체가 생성이 됨

- class : 자바의 클래스 명

- id : Bean의 식별자

- scope : 객체의 범위 (default - singleton)

- constructor-arg : 객체 생성시 생성자에 전달할 인수 (constructor injection)

- property : 생성시 bean setter에 전달할 인수 (setter injection)

- init-method : 객체 생성시 실행되는 함수

- destory-method : 객체 소멸시 호출되는 함수

 

# Bean의 Scope : 기본적으로 싱글톤 객체가 됨 - 한 번 생성되어 모든 객체가 동일한 객체를 참조하는 방식

- 다른 Scope를 지정 할 수 있음

prototype 요청마다 새로운 객체를 생성
request http request 하나에 대한 생명 주기
session http session과 동일한 생명 주기

 

어노테이션(Annotation)이란? 

- 어노테이션은 자바의 기능으로 사전상으로는 주석의 의미이지만, Java에서는 자바 소스 코드에 추가하여 사용할 수 있는 메타 데이터의 일종이다. @Override, @Deprecated같은 기본 어노테이션이 있고, Spring에서는 Bean을 등록하기 위해 @Component 어노테이션을 사용한다. 

@Controller : MVC의 Controller 객체임을 명시

@Service : 로직이 수행되는 Service 객체임을 명시

@Repository : DAO 객체임을 명시

@AutoWired : Bean을 자동으로 주입시켜줌

@Bean은 @Configuration이 설정된 클래스의 메서드에서 사용이 가능

@Primary : 객체의 생성에 우선권을 부여 (@Bean과 @Component에서 함께 사용이 됨)

@Qualifier : 객체를 주입 받을 때 주어진 Bean의 이름과 동일한 객체를 찾음 
(@Autowired와 함께 사용이 됨)

 

빈 등록방식?

# Component Scan

- @ComponentScan 어노테이션과 @Component 어노테이션을 사용해 빈을 등록하도록 하는 방법이다. @ComponentScan은 어느 지점부터 컴포넌트를 찾으라고 알려주는 역할이고, @Component는 실제로 찾아 빈으로 등록할 클래스를 의미한다.

- 이 @ComponentScan 애노테이션은 어디서부터 컴포넌트를 찾아볼 것인지 알려주는 역할을 한다.

@ComponentScan이 붙어있는 클래스가 있는 패키지에서부터 모든 하위 패키지의 모든 클래스를 훑어보며 @Component 애노테이션(또는 @Component 애노테이션을 사용하는 다른 애노테이션)이 붙은 클래스를 찾는다.

 

# 빈 설정파일에 직접 등록

@Configuration
public class Sample{
	@Bean
    	public Sample sampleController(){
        	return new SampleController();
        }
}

- SampleController()에서 리턴되는 객체가 IoC 컨테이너 안에 빈으로 등록된다.

- 이렇게 빈을 직접 정의해서 등록하면 @Component 어노테이션을 붙이지 않아도 된다.

- @Bean은 @Configuration이 설정된 클래스의 메서드에서 사용이 가능

 

 

 

 

 

 

#스프링 프레임워크 #스프링 컴포넌트스캔 #빈 설정파일 #빈 등록 방식 #프레임워크 vs 라이브러리 #객체 클래스 인스턴스

#자바 어노테이션 #스프링 어노테이션 #인터페이스 추상클래스