- 프레임워크이다.
- 오픈 소스이다.
- 스프링은 IOC 컨테이너를 가진다.
- 스프링은 DI(DependencyInjection)를 지원한다.
- 스프링은 많은 필터를 가지고있다.
- 스프링은 많은 어노테이션을 가지고있다.
- 스프링은 MessageConverter를 가지고있다. (Jason)
- 스프링은 BufferedReader와 BufferedWriter를 쉽게 사용할 수 있다.
IOC란 Inversion Of Control이라고 해서 제어 역전을 의미한다. 주도권이 개발자에게 있는 것이 아니라 스프링에게 있다.
IOC 개념을 알기 이전에 Class, Object, Instance 개념을 알아야하는데 Class는 쉽게 말해서 '설계도'이고 Object는 '실체화가 가능한 것', Instance는 '실체화 된 것'이라고 이해하면 쉽다.
예를 들어 '의자'라는 오브젝트를 다른 메소드에서 각각 생성한다고 가정해보자.
1.
public void make(){
의자 s = new 의자();
}
2.
public void use(){
의자 s = new 의자();
}
이 경우 1번 의자와 2번 의자는 이름은 같지만 다르다!. 각각의 레퍼런스 주소(s)를 각각의 다른 메소드에서 관리한다.
힙 메모리 공간 내의 다른 공간에서 관리된다. 객체 공유의 어려움이 발생한다.나는 use()메소드에서 1번의 의자를 사용하고 싶은데 그렇게 할 경우 복잡해진다.
스프링은 사용자가 가지고있는 수많은 객체들을 스캔해서 이 객체들을 직접 힙 메모리 공간에 띄운다. 쉽게 말해 '의자','붕어 빵','사자','침대', 등 여러 객체들이 있으면 이것들 모두 힙에 다 넣는다.
그런 뒤 여러 다른 메소드들이 같은 객체를 공유하면서 불러들일 수 있다. 이렇게 메소드에서 객체들을 가져다 쓰는 것을 DI(DependencyInjection)(의존성 주입)이라고 한다. 스프링이 관리하는 객체들을 내가 원하는 모든 곳에서(어느 클래스의 메소드에서든지) 객체를 가져와서 쓸 수 있는 것이다!
예전에는 사용자가 new를 해서 객체의 주소를 사용자가 관리했다면 이젠 스프링이 객체들을 스캔해서 힙 메모리에 띄우고 스프링이 직접 관리하는 것이다. 이것이 Inversion Of Control(제어의 역전), 즉 IOC개념이다.
스프링은 또한 많은 필터를 가지고 있다. 스프링 컨테이너의 필터는 인터셉터라고하는데 권한 체크를 통해서 권한이 있으면 통과시키고 없으면 거부한다. 톰켓에도 필터가 있다.
스프링은 많은 어노테이션을 가지고있다.
어노테이션은 주석이긴하지만 컴파일라고 무시하지않고 체크할 수 있다.
@Override, @Component, @Autowired, @Controller,등이 있다.
@Override사용 예시를 들자면,
(1) class Animal{ (2)Class dog 상속 Animal{
@Override
run() run()
} }
dog클래스를 컴파일할 때 '@Override'어노테이션을 보고 Animal 부모클래스가 run()메소드를 가지고 있겠구나 예상하고 확인한 다음에 있으면 정상이고 없으면 컴파일체킹 시 에러가 뜬다.
또한 스프링은 어노테이션을 통해서 객체를 생성한다.
@Component는 이 어노테이션이 붙은 클래스는 메모리에 로딩하라는 뜻이고 @Autowired는 해당 클래스에 로딩된 객체를 해당 변수에 집어 넣으라는 것이다.
(1) (2)
@Component Class B{
Class A{ @Autowired
A a;
} }
위에 (1)예시처럼 @Component가 붙어있으면 스프링은 A클래스를 스캔해서 본인이 들고있는 힙 메모리 공간에 A클래스를 로드한다. 그 후 클래스B에 A를 사용하고 싶으면 (2)예시처럼 작성하면 된다. 스프링이 클래스B를 스캔할 때 B클래스 내부에 어떤 애가 있는지 분석(리플렉션)한다.
여기서 리플렉션이란 특정 클래스 내부에 매소드, 필드, 어노테이션이 어떤 것이 있는지 체킹하는 것이다. 체킹뿐만 아니라 다음에 무엇을 할지 설정하는 것을 말한다. 리플렉션은 런 타임 시에 일어난다.
리플렉션을 통해서 @Autowired를 확인하고 스프링은 힙에 있는 수많은 객체 중에서 A와 동일한 타입의 객체가 힙 메모리에 있는지 확인한다. 만약 힙에 A가 없다면 a에 null값이 들어가고 힙에 A가 있다면 힙 메모리의 객체가 들어간다. 이 때 객체가 들어가는 것을 앞서 설명한 DI인 것이다.
스프링은 MessageConverter를 가지고있다. 기본 값은 Jason이다.
자바 프로그램에서 자바 오브젝트를 파이썬 프로그램으로 직접 전달하기는 어렵다. 직접 전달하지 않고 어떤 프로그램이든 이해할 수 있는 언어로 중간에 변환해서 전달한다면 더욱 쉽다. 이때 사용되는 중간 언어가 Jason이다. 자바 데이터를 제이슨으로 바꾸고 제이슨을 파이썬 데이터로 바꿔 준다면 자바프로그램과 파이썬 프로그램은 데이터를 주고 받기에 용이해진다. 이때 해당 언어를 제이슨으로 바꿔주는 역할이 MessageConverter이다. MessageConverter는 스프링의 라이버리로 존재한다.
스프링은 어노테이션을 통해서 BufferedReader와 BufferedWriter를 쉽게 사용할 수 있다.
BufferedReader와 BufferedWriter는 데이터 통신을 Bytestream 통해서 전송할 때 전송단위를 문자열로 가변 길이의 데이터를 쓰게해주는 클래스이다. 스프링에서는 직접 구현할 필요가 없다. 어노테이션 @ResponseBody를 사용함으로써 BufferedWriter를 동작하게 할 수 있고 @RequestBody를 사용함으로써 BufferedReader를 동작하게해서 데이터를 쉽게 읽을 수 있다.