스프링이란?

KOO HEESEUNG·2021년 6월 23일
0

Springboot with JPA

목록 보기
2/4
post-thumbnail

1. 스프링은 프레임워크다.

1.1. 프레임워크(Framework)란?

Frame(틀) + work(일하다). 정해진 틀에 맞춰 작업한다는 뜻으로, "특정 프로그램을 개발하기 위한 여러 요소들과 매뉴얼을 제공하는 프로그램" 을 말한다.

1.2. 프레임워크와 라이브러리의 차이?

라이브러리는 "프로그램을 개발하기 위한 특정 기능을 담은 도구들의 집합"이다.

프레임워크와 라이브러리는 프로그램 개발을 쉽게 해준다는 공통점이 있지만, 주도권을 누가 쥐고 있느냐 의 차이가 존재한다.

프레임워크는 전체적인 흐름을 프레임워크 스스로 갖고 있으며, 사용자는 프레임워크에 정해진 규약에 맞춰 개발해야 하는 반면, 라이브러리는 그 주도권이 이를 가져다 사용하는 사용자 본인에게 있어 프레임워크보다 자유도가 높다고 할 수 있다.

2. 스프링은 오픈소스이다.

2.1. 오픈소스(Open Source)란?

오픈소스는 말 그대로 소스코드가 공개되어 있다는 뜻으로, 누구나 자유롭게 확인, 수정, 배포할 수 있다.

✔︎ 참고

3. 스프링은 IoC 컨테이너를 가진다.

3.1. IoC (Inversion of Control) 란?

제어의 역전. 주도권이 스프링에게 있다는 뜻이다. IoC를 적용함으로써 설계가 깔끔해지고, 유연성이 증가하며 확장성이 좋아진다.

일반적으로 프로그램의 흐름은 main() 메서드와 같이 프로그램이 시작되는 지점에서 오브젝트를 정하고, 생성하고, 메서드를 호출하는 등의 작업이 반복된다. 각 오브젝트는 프로그램 흐름을 결정하거나 사용할 오브젝트를 구성하는 작업에 능동적으로 참여한다. 다시 말해 모든 종류의 작업을 사용하는 쪽에서 제어한다.

제어의 역전이란 이러한 제어 흐름의 개념을 거꾸로 뒤집는 것이다. 오브젝트가 자신이 사용할 오브젝트를 스스로 선택하고 생성하지 않고, 모든 제어 권한을 다른 대상(스프링)에게 위임한다. 주도권이 사용자가 아닌 프레임워크에게 있기 때문에, 스프링이 필요에 따라 사용자의 코드를 호출한다.

✔︎ 참고

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

4.1. DI (Dependency Injection) 란?

의존성 주입. 객체 사이의 의존관계가 외부에 의해 설정된다는 개념으로, 스프링에서는 외부 환경설정 파일(xml 등)을 사용하여 손쉽게 객체간의 의존관계를 설정할 수 있다.

스프링은 어떤 클래스가 필요로 하는 인스턴스를 자동으로 생성, 취득하여 연결시켜주는 역할을 한다. 스프링이 인스턴스를 생성하도록 하려면, 프로그램 소스 내부에서 new로 직접 생성하지 않고, 설정파일에서 필요로 하는 클래스의 정보를 설정해주어야 한다.

스프링을 이용하여 자바 빈 객체간 의존성 주입을 한다면, 소스코드 수정 없이 환경설정 파일만 변경함으로써 프로그램을 제어할 수 있다. 즉, 모듈간 결합도를 낮추어 애플리케이션의 유연한 변경을 가능하도록 하기 위해 DI의 개념을 사용하는 것이다.

의존성 주입 방법에는 (1) 생성자를 통한 주입 (2) Setter 메서드를 통한 주입 (3) @Autowired 애너테이션을 통한 주입 등이 있다.

✔︎ 참고

[Spring] 스프링 핵심 개념: Ioc(제어의 역전)과 DI(의존성 주입)

5. 스프링은 엄청나게 많은 필터를 갖고 있다.

5.1. 필터(Filter) 란?

자동차의 에어컨 필터의 역할이 무엇일까. 자동차 내부에 공기가 유입될 때 외부의 오염물질을 걸러 사람에게 알맞은 깨끗한 공기로 변환하는 역할을 하는 것이다.

스프링의 필터도 비슷한 역할을 한다. 애당초 필터는 스프링의 독자적 기능이 아닌 자바 서블릿에서 제공하는 기능으로, HTTP 요청과 응답을 변경할 수 있는 재사용 가능한 코드를 말한다. 객체의 형태로 존재하며, 클라이언트로부터 오는 요청(request)/클라이언트로 가는 응답(response)과 최종 자원(서블릿/JSP/기타 문서) 사이에 위치하여 클라이언트의 요청 정보/요청 결과를 알맞게 변경해준다.

5.2. 필터와 인터셉터(Interceptor)의 차이?

request-lifecycle

위 그림을 참고할 때, 필터와 인터셉터의 차이는 다음과 같다.

  1. 실행되는 시점이 다르다. 필터는 DispatcherServlet의 앞단에서, 인터셉터는 DispatcherServlet에서 Handler(controller)로 가기 전에 정보를 처리한다.
  2. 필터는 J2EE 표준 스펙에 정의되어 있는 기능이며, 인터셉터는 스프링에서 자체적으로 제공하는 기능이다.
✔︎ 참고

6. 스프링은 엄청나게 많은 어노테이션을 갖고 있다.(리플렉션, 컴파일체킹)

6.1. 어노테이션이란?

어노테이션(Annotation, @)은 사전적인 의미로 주석이다. 그러나 일반적으로 알고 있는 주석(//, /* */)은 컴파일러가 무시하는 반면, 어노테이션은 컴파일러가 무시하지 않으며, 오히려 프로그램에 추가적인 정보를 제공해주어 지정한 기능을 수행하도록 한다.

가장 쉽게 접할 수 있는 자바 어노테이션 중 하나가 @Override로, 상속한 클래스의 메서드를 오버라이딩할 때, 해당 메서드에 이 어노테이션을 붙이면 컴파일러가 이를 인식하며, 오버라이딩 조건을 어겼을 경우, 컴파일 오류가 발생한다.

스프링에서도 @Controllet, @Bean, @Component, @Autowired 등 수많은 어노테이션이 존재하며, 이를 통해 주로 객체를 생성한다.

6.2. 리플렉션(Reflection)

리플렉션이란 구체적인 클래스의 타입을 알지 못해도 그 클래스의 메서드, 타입, 변수에 접근할 수 있도록 해주는 자바 API 이다.

스프링에서는 클래스에 @Controller 를 붙이면, 인스턴스를 생성하지 않아도 스프링이 알아서 생성해서 빈으로 관리해준다. 이렇게 스프링에서는 리플렉션과 어노테이션을 이용하여 객체에 특수한 기능을 추가해줄 수 있다.

✔︎ 참고

7. 스프링은 MessageConverter를 가지고 있다.

7.1. MessageConverter란?

서로의 모국어와 영어 외에는 할 줄 모르는 한국인과 독일인이 서로 대화하려고 한다. 한국인은 한국어로, 독일인은 독일어로 말하면 서로 대화가 통하지 않는 것이 당연하다. 이때 둘 다 이해 가능한 영어를 중간 언어로 사용한다면 어떨까? 영어로 의사를 전달하면 듣는 사람은 영어를 자기 모국어로 변환해서 해석할 수 있고, 서로 대화가 통할 것이다.

스프링에서 이러한 역할을 하는 것이 MessageConverter이다. MessageConverter는 HTTP 통신에서 일반 문자열이 아닌 XML이나 JSON으로 통신하기 위해 사용되며, 서로 데이터를 주고받을 수 있도록 JSON이나 XML 데이터로 변환해준다.

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

ByteStream을 통해 데이터를 전송하면, Java에서는 이를 InputStream으로 읽는다. Byte 통신을 하면 InputStream이 읽는 하나의 단위가 Byte이기 때문에 문자를 변형하기 위해 char 등의 타입으로 형변환을 해야 한다.

이를 간편하게 하는 것이 InputStreamReader라는 클래스를 사용한다. 이 클래스로 감싸면 문자 하나를 반환하기도 하고, 배열로 여러개의 문자를 받을 수도 있다. 그러나 배열은 크기가 정해져 있다는 단점이 있기 때문에 너무 길게 하면 메모리가 낭비되고, 너무 짧게 하면 모든 문자를 온전히 받을 수 없다는 문제가 발생한다.

그래서 대신 사용하는 것이 BufferedReader이다. BufferedReader로 데이터를 받게 되면 가변길이의 문자를 받을 수 있다. JSP에서는 request.getReader()를 사용하면 BufferedReader의 역할을 해준다.

데이터를 response 할 때는 BufferedWriter를 사용한다. 그런데 BufferedWriter는 내려쓰는 기능이 없어서 자바에서는 보통 PrintWriter를 사용한다. PrintWriter는 BufferedWriter와 같고, print(), println() 메서드를 제공한다. JSP에서는 out이라는 내장객체로 되어 있다.

정리하자면, BufferedReader와 BufferedWriter는 각각 요청/응답 시에 문자열로 가변길이의 데이터를 읽고, 쓰게 해주는 클래스이다.

스프링에서는 이를 구현할 필요 없도록 어노테이션을 제공해준다. @ResponseBody를 사용하면 BufferedWriter가, @RequestBody를 사용하면 BufferedReader가 동작한다.

0개의 댓글