자바

Spring이란? Spring Boot란?

mrban 2022. 1. 28. 10:58

1. 스프링이란?

자바 기반의 웹 어플리케이션을 만들 수 있는 오픈소스 프레임워크다. 그러면 오픈소스는 뭐고 프레임워크가 뭔지 알아야한다.

 

2. 프레임워크란?

프레임 = 틀, 워크 = 동작한다. 즉, 틀안에서만 동작하는 것이다. 스프링은 바로 이 틀을 제공해주는 것이고 우리는 그 틀 안에서만 스프링을 사용할 수 있다.

 

3. 오픈소스란?

오픈소스는 소스코드를 공개한 것이다. 이 말은 우리들이 이 소스코드 내부를 뜯어 고쳐볼 수 있다는 것이다. 따라서 스프링도 실력만 있다면 마음대로 뜯어 고쳐서 사용할 수 있다.

 

4. 스프링은 IOC 컨테이너를 가진다.

IOC는 (Inversior Of Controll)로서 제어의 역전이라는 의미이다. 주도권이 나로부터 스프링에게 넘어간다는 의미다. 원래 객체를 실체화하는 것은(힙공간에 올리는 것) new라는 명령을 통해서 우리가 하는 것이였다. 스프링은 이런 주도권을 가져와서 우리가 만든 객체들을 스캔하고 직접 실체화한다. 즉, 우리가 하던 실체화에 대한 제어를 스프링이 가져간다는 것이다. 

참고로 Spring이 직접 관리하는 이런 객체들을 우리는 Bean이라고 부른다.

 

5. 스프링은 DI를 지원한다.

DI는 Dependency Injection으로 의존성 주입이다. 4번에서 spring은 IOC 컨테이너를 가진다고 하였다. spring이 직접 객체들을 실체화하는데 그 뒤로 우리는 어느 클래스의 메서드에서 필요할때마다 실체화된 하나의 인스턴스를 마음껏 가져와서 사용할 수 있게 된다.

spring이 객체들을 실체화할때는 싱글톤으로 인스턴스가 한개만 생성이 된다 (같은 객체를 여러 인스턴스로 따로 힙공간에 올라가지 않는다는 것이다). spring이 아닌 우리가 직접 new를 통해서 하나의 객체를 여러 메서드에서 동시에 실체화한다고 했을 때 하나의 인스턴스만 생성되지 않고 여러개의 인스턴스가 생성된다. 하지만 spring이 객체들을 실체화할 때는 인스턴스가 한개만 생성되고 우리는 힙공간에 있는 하나의 인스턴스를 다른 여러 클래스에서 공유하며 마음대로 사용할 수 있게 된다. 이것이 DI의 의미이다.

 

6. 스프링은 많은 필터를 가지고 있다. 

여기서 필터는 검열역할(권한체크)을 한다. 이 필터는 스프링 자체적으로 있는 필터 뿐만 아니라 사용되지 않고 있는 필터를 사용할 수도 있고 직접 필터를 만들수도 있다. 

 

7. 스프링은 많은 어노테이션을 가지고 있다.(리플렉션, 컴파일 체킹).

어노테이션은 주석인데 일반적인 주석과는 다르게 컴파일러가 무시하지 않고 힌트를 체크할 수 있는 주석이다. @override 이런식으로 만든다. 스프링에서는 어노테이션을 통해서 객체를 생성한다. @component는 해당 클래스를 메모리에 로딩한다 라는 힌트가 있어서 스프링은 이 힌트를 통해 알아서 해당 클래스를 힙 메모리에 스캔하여 올린다. 

리플렉션은 해당 클래스에 어떤 메서드, 어떤 어노테이션을 가지고 있는지 분석하는 기법을 의미한다. 이 리플렉션은 런타임때 발생한다. 

이 리플렉션을 통해서 @Autowired라는 어노테이션을 발견한다면 로딩되어있는 인스턴스들 중에 해당 변수의 타입과 같은 객체가 존재한다면 그 인스턴스를 값을 해당 변수에 넣는다. 이를 통해 우리는 하나의 인스턴스를 여러 클래스에서 사용할 수 있는 것이다.(DI)

 

8. 스프링은 MessageConverter를 가지고 있다. 기본값은 현재 Json이다.

MessageConverter는 내가 데이터를 보내거나 데이터를 받을 때 중간언어(예를 들면 Json)로 번역해주는 자동화 기능이다. 중간언어로 바꾸는 이유는 예를 들어 내가 자바의 객체를 파이썬 프로그램에 던져준다면 바로 이해할 수 없다. 또한 직접 자바의 객체를 파이썬 객체로 바꾸는 것은 굉장히 복잡할 것이다. 따라서 자바의 객체를 파이썬  때문에 중간언어로 번역해서 보내주면 상대방(파이썬 프로그램)이 다시 파이썬 객체로 번역하는 것이 더 쉬워지는 것이다. 즉, MessageConverter는 기본적으로 데이터를 주고 받을 때 Json형식으로 번역해주는 중간 단계 자동화 번역기라고 생각하자.

 

9. 스프링은 BufferedReader와 BufferedWriter를 쉽게 사용할 수 있다.

자바에서는 문자열을 입력받을 때 가변길이의 문자를 입력받을 수 있는 BufferedReader를 사용한다. JSP에서는 request.getReader를 통해서 bufferedReader를 통해 문자를 입력받을 수 있다. 내가 문자열을 보내고 싶을때는 BufferedWriter을 쓰지만 내려쓰기 기능 때문에 (println) printwriter를 좀 더 쓴다. 그 이외에 차이는 없다. JSP에서 out객체가 있는데 이게 바로 BufferedWriter에 해당된다. 이를 통해 문자열을 가변길이로 써서 전송하는 것이 가능하다.

 

이 BufferedReader와 BufferedWriter를 직접 구현할 필요 없이 spring에서는 간단하게 @ResponseBody를 통해 bufferedwriter가 동작시킬 수 있고 @RequestBody를 통해 bufferedReader를 동작시킬 수 있다.

 

10. Spring Boot란?

스프링은 위에서도 언급한 기능 이외에도 많은 기능들이 존재하기 때문에 사용하는데 어려움이 존재한다. 이것 때문에 등장한 것이 스프링부트로 스프링을 사용하기 위한 많은 설정들을 자동화하여 스프링을 사용하는데 어려움을 많이 줄여준 도구라고 할 수 있다.

 

 

출처:스프링부트 개념정리 with JPA 1강 - 스프링의 핵심은 무엇인가요? - YouTube

 

 

'자바' 카테고리의 다른 글

JPA 연관관계  (0) 2022.02.20
JPA란 무엇인가?  (0) 2022.02.06
JVM이란? 객체지향프로그래밍이란?  (0) 2022.01.23
해시맵(Hash Map)이란?  (0) 2022.01.18
String 비교시 '==' 가 아닌 .equals()를 써야하는 이유  (0) 2022.01.17