본문 바로가기

스프링

[스프링] 스프링부트 개념정리(이론)_1~7강 정리

스프링

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

Framework(Frame+work)란 틀 안에서 동작한다는 것을 의미한다.
***Frame
(나무·금속 등으로 된) 틀[액자], (가구·건물·차량 등의) 뼈대[프레임], 안경테,
(사람·동물의) 골격[뼈대], (이론·사상 등의) 틀, (영화·비디오의) 한 장면[프레임]

the basic structure and shape of the body of a person or animal
an arrangement of parts that support and form the basic shape or something

***work → 동작하다

 

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

오픈소스라는 것은 소스코드가 공개되어 있다.

스프링이 어떻게 만들어져있는지[작동하는지] 그 내부를 볼 수 있다.

그 내부를 볼 수 있다는 것은 불편한 부분을 개발자가 고칠 수 있다는 것을 의미한다.

 

3. 스프링은 IoC 를 갖는다, IoC는 스프링의 핵심

IoC는 Inversion of Control의 약어, 제어의 역전을 의미한다.

제어의[통제 → 주도권] 역전은 주도권이 개발자에서 스프링으로 바뀌었다는 것을 의미한다.

 

스프링 프레임워크는 자바 언어를 기반으로 구성되어 있다.

클래스는 설계도인데, Class와 abstract Class로(추상 클래스) 나뉘어진다.

클래스로부터 인스턴스화하여 인스턴스가 생성되면 객체다.

단, 추상 클래스만으로는 객체를 생성할 수 없다.

추상 클래스를 구현한 클래스 또는 추상 메서드가 없는 일반 클래스로부터 객체를 생성할 수 있다.

클래스를 기반으로 만들어지는 인스턴스, 클래스만 존재한다면 인스턴스는 무제한 만들 수 있으며

틀은 동일한데[속성은 동일한데] 속성 값을 다르게 설정할 수 있다.

 

통제의 주도권이 개발자에서 스프링으로 넘어간다는 것은

순수 자바에서는 개발자가 new키워드와 생성자를 사용해서 heap 메모리에 객체를 만들었다.

스프링 프레임워크에서 IoC는 스프링의 핵심이고,
IoC는 제어의 역전을 의미한다. 제어의 역전이란 일반적으로 객체를 생성하고, 관리하는 권한은 개발자에게 있지만,
스프링 프레임워크에서는 이 권한이 스프링에게 있고, 스프링이 생성한 객체들은 스프링 컨테이너에서 관리한다.
// 컨트롤을(통제를) 개발자가 할 때 --> 개발자에게 주도권이 있을 때

// new 연산자와 기본 생성자를 통해서 힙 메모리에 객체를 만든다.
// 그리고 stack 메모리에서 관리하는 참조변수가 해당 객체를 가리키게[참조하게] 한다.
// --> 힙 메모리에 생성된 객체를 스택 메모리에 존재하는 참조변수에 대입한다. 
// 스택 메모리에 존재하는 참조변수를 통해 힙 메모리에 존재하는 객체에 접근할 수 있다. 
의자 c = new 의자();

// 스프링 프레임워크
// 스프링이 주도권을 가졌을 때
// 스프링은 프로젝트내에 작성된 클래스를 모두 스캔해서 객체를 생성한 뒤,
// 생성된 객체를 메모리에 올려준다.

// 스프링 프레임워크를 사용하면,
// 스프링이 특정 클래스로부터 하나의 인스턴스를 생성한 뒤,
// 생성된 인스턴스들을 컨테이너 안에 보관하고 있다가
// 개발자가 해당 인스턴스를 필요시 하게 되면
// 프로젝트 내에서 동일한 인스턴스를 주입해준다.

// 객체에 대해 싱글톤으로 관리할지 프로토타입으로 관리할지
// 또한 애플리케이션의 성격에 맞게 스프링이 관리한다. 

// 스프링이 주도권을 가졌다는 것은
// 객체에 대한 관리가[통제권이] 스프링에게 있다는 것을 의미한다.

 

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

DI는 Dependency Injection의 약어로, "의존성 주입"이라 해석한다.

개발자가 객체를 생성하고, 관리할 때는 참조변수를 통해 접근하고자 하는 객체에 접근했었는데,

스프링 프레임워크에서 스프링이 생성한 객체에 어떻게 접근할까? 에 대한 질의에 답해주는 것이 스프링의 DI 지원이다.

 

특정 클래스에 대해서 하나의 인스턴스만 생성하고(싱글톤)

생성된 인스턴스를 프로젝트 내 어떤 곳에서든 사용할 수 있는데 

이는 스프링이 DI를 지원하기 때문이다.

 

5. 스프링은 (많은) 필터를 갖고 있다.

스프링 컨테이너에서 사용하는 필터와 톰캣이 사용하는 필터의 차이

톰캣이 사용하는 필터는 Filter, 이 Filter의 기능은 web.xml 파일에 작성하고,

스프링 컨테이너가 사용하는 필터는 Interceptor(인터셉터)라고 불린다.

ex. 인터셉터는 권한을 확인하는 기능이 있다.

 

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

 

컴파일 체킹

어노테이션은(annotation, @) 주석, 주해라는 의미를 갖고 있다.

어노테이션은 주석이란 의미를 갖고 있지만 자바에서 '//' 이 기호 다음에 작성하는 설명글 또한 주석이라고 한다.

어노테이션과 //의 차이는 컴파일러가 해석을 하는지의 여부다.

컴파일러는 슬러시기호 두 개(//)를 사용하여 작성한 것은 무시한다(컴파일 하지 않는다)

어노테이션은(@) 컴파일러가 무시하지 않는다.

 

스프링에서 어노테이션은 주로 객체를 생성하고, 관리하는 기능을 약속한 위주로 사용된다.

예를 들어 @Component, @Bean, @Controller 등의 어노테이션이 존재하는데,

@Component 어노테이션은 클래스를 메모리에 로딩하는 역할을 하고,

@Autowired 어노테이션은 로딩된 객체를 해당 참조변수에 대입하는[주입하는] 역할을 한다.

 

// 스프링이 클래스들을 스캔할 때
// @Component 아노테이션이 붙은 클래스들을
// 객체 생성하고, 힙 메모리에 로딩한다.
// 개발자가 객체를 생성하는 것이 아니라 스프링이 하는 것이므로
// 이를 제어의 역전(IoC)이라고 한다.

@Component 
class A {
	//...
}

// 그리고 어떤 클래스에서 메모리에 로딩된 인스턴스 A를 사용하고 싶다면
// 메모리에 로딩된 객체를 주입할 참조변수를 필드로 선언하고,
// 해당 필드 위에 @Autowired 아노테이션을 작성하면
// 스프링이 B클래스를 스캔할 때,
// 리플렉션하고(어떤 클래스 내부에 작성된 메서드, 필드, 어노테이션 등을 분석하고,
// 그 역할과 기능에 맞게 설정을 한다.)
// @Autowired 어노테이션을 발견하면, 힙 메모리에 동일한 타입의 인스턴스가 있는지를 스캔하고,
// 있다면 해당 인스턴스를 참조변수에 주입해준다
// 스프링 스캔(리플렉션) → 스프링의 DI 기능 지원

class B {
	@Autowired
	A a;
}

 

스프링에서 어노테이션은 주석인데 런타임시 컴파일할 때 체크하는 기능을 갖고 있다.

무엇을 체킹[스캔]하는가? 스프링이 클래스 내부에 작성된 메서드, 필드, 어노테이션 등을 분석할 때,

즉 리플렉션할 때(리플렉션은 런타임 때 작동한다, 런타임시 분석), 스프링이 해야할 기능?이 없는지 체크하고,

기능을 수행한다. 예를 들어 클래스 위에 @Component 어노테이션이 작성되어 있다면

해당 클래스를 인스턴스화한 뒤 생성된 인스턴스를 힙 메모리에 로딩하는 작업을 한다.

 

클래스를 리플렉션할 때 필드에 @Autowired 어노테이션이 작성되어 있다면,

메모리에 로딩되어 있는 해당 타입의 인스턴스를 스캔한 뒤,

존재한다면 필드에 주입해준다(스프링의 DI 기능) 존재하지 않는다면 null이 주입된다.

@Autowired를 필드 위에 작성하기 전에 null 방지를 위해서 스프링이 관리하는 객체인지를 체크할 것

즉, 컴포넌트로 등록되어 있는 클래스인지를 체크해 봐야겠다.

 

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

자바가 다루는 객체와 파이썬이 다른 객체의 생김새는 다르다.

플랫폼간 데이터를 주고 받을 때, 자바가 파이썬 객체를 직접 전달할 수 없고,

파이썬 또한 자바 객체를 직접 전달할 수 없다. 이런 경우 자바도 이해할 수 있고,

파이썬도 이해할 수 있는 형식으로 데이터를 전달해야 하는데, 그 중간 형식이 JSON이고,

MessageConverter라는 라이브러리는 자바의 객체를 JSON 형식으로 변환하는 역할을 한다.

그리고 파이썬으로부터 JSON 형식의 응답이 오면, 해당 데이터를 자바의 객체로 변환해주는 역할을 한다.

스프링에서 지원하는 MessageConverter라는 라이브러리는 자바 기반의 객체를

JSON 형식으로 변환해주고, JSON 형식의 데이터를 자바 기반의 객체로 변환해주는 역할을 한다.

 

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

 

영어 한 문자를 나타내는데 8bit가 필요하다. 영어라는 언어를 기준으로 1Byte(8bit)가 통신의 단위가 되었다.한글 한 문자를 나타내는데는 2Byte(16bit)가 필요하다. 중국어의 글자인 한자 한 글자를 나타내려면 3Byte(24bit)가 필요하다.모든 글자를 나타내는데 문제가 없게하기 위해(인코딩에 문제가 없게 하기 위해) 유니코드에서 UTF-8이라는 캐릭터 인코딩을 제공,UTF-8은 3Byte 통신이다.

 

데이터 통신할 때 ByteStream 기반으로 통신하는데 ByteStream은 데이터의 통신단위가 1byte 단위다.그래서 문자단위로 통신할거면 InputStream을 사용하는데, 여러문자를 통신할 때는 배열을 사용하는 특성으로 인한 단점으로 인해( → 배열의 크기를 정해야하고, 배열의 크기를 넘는 데이터를 통신할 때는 데이터가 잘리는 현상이 발생)가변 길이의 BufferedStream을 추천하는데, 스프링을 사용하면 BufferedStream 쉽게 사용할 수 있다.

 

바이트 스트림 통신을 전송단위가 문자열로 가변길이의 데이터를 통신할 수 있게 해주는 클래스가 BufferedStream이다.이 BufferedReader와 BufferedWriter를 통해서 통신하게 되는데,이 클래스들을 직접 구현할 필요없이 스프링에서는 어노테이션으로 쉽게 사용할 수 있다.

@ResponseBody 어노테이션 사용시 BufferedWriter가 동작한다.

데이터를 받을 때는 @RequestBody 어노테이션을 사용하면 BufferedReader가 동작한다.

 

JPA란

1. JPA는 Java Persistence API의 약어다.

***persistence
고집, 집요함, 인내력, 불굴, 끈기
지속, 영속, (없어지지 않고 오랫동안) 지속됨

여기서 persistence란 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 의미한다.

 

램은 휘발성 메모리다.

전기로 데이터를 저장하기 때문에 전기가 끊기면 저장되어 있던 메모리가 모두 휘발된다.

전기가 끊기면(ex. 정전, 컴퓨터 종료 등) 램에 저장되어 있는 메모리들이 휘발하는데,

해당 데이터들을 비휘발성인 하드디스크에 저장하게 되면 그 데이터들은 영구히 저장된다.

이를 어떤 하나의 데이터가 영구히 기록되는 것, 즉 영속성이라고 한다.

 

자바 프로그램을 할 때 생성된 데이터를 영구적으로 저장하기[기록하기] 위해

영구히 기록할 수 있는 환경에 저장하기 위한 연결점을(인터페이스) JPA라고 한다.

 

***API는 Application Programming Interface의 약어로

프로그램을 만들기 위한 (어플리케이션 프로그래밍) 인터페이스를 의미한다.

 

***인터페이스와 프로토콜은 약속의 의미를 갖는데,

차이가 있다면 인터페이스는 상하관계가 존재하는 약속이고,

프로토콜은 동등한 관계를 갖는다. 인터넷은 수 많은 프로토콜에 의해 만들어졌다.

 

2. JPA는 ORM 기술이다.

ORM은 Object Relational Mapping의 약어로,

객체를 데이터베이스 관리 시스템에서 관리하는 데이터와 연결하는 방법론을 의미한다.

└ 클래스를 먼저 만들고, 클래스를 통해서 테이블을 만들 수 있다. 이 때 필요한 것이 JPA다.

 

3. JPA는 반복적인 CRUD 작업을 생략하게 해준다.

                                  └ Create(insert), Read(select, select all), Update(update), Delete(delete)

 

4. JPA는 영속성 컨텍스트를 가지고 있다.

영속성이라는 것은 데이터를 영구적으로 기록하는 것[저장하는 것]을 의미한다.

자바 프로그램에서 데이터를 저장할 때 보편적으로 데이터베이스 관리 시스템에 테이블 단위로 저장한다.

데이터베이스 관리 시스템의 대표적인 예로는 MySQL이 있다.

영속성 컨텍스트란 데이터를 영구히 저장할 수 있는 환경에(DBMS) 데이터를 저장하고,

DBMS에서 데이터를 가져오고 등의 일련의 모든 방법과 정보가 존재하는 곳이다.

자바는 영속성 컨텍스트를 통해서 데이터를 저장하고, DBMS에 존재하는 정보를 영속성 컨텍스트를 통해서 데이터를 가져온다.

 

***context란 어떤 대상의 모든 정보를 가지고 있다는 것

context: (어떤 일의) 맥락, 전후 사정, (글의) 맥락, 문맥, (사건 따위의) 정황, 배경

 

5. JPA는 DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공한다(DB는 객체 저장이 불가능하다)

DB는 객체 저장이 불가능하지만 자바에서는 객체 저장이 가능하다.

(자바에서) 클래스 내부에 필드 선언시 객체를 선언할 수 있다. 

자바 프로그램에서는 객체를 저장하고, 해당 데이터를 DBMS의 테이블에 저장할 때

외래키를 사용해서 자동으로 데이터를 삽입하는 기능을 JPA가 수행한다. 

 

7. JPA는 OOP 관점에서 모델링을 할 수 있게 해준다.

JPA는 클래스를 기반으로 DBMS에 테이블 형식을 만든다.

 

***Java언어를 기반으로 클래스를 작성할 때

해당 클래스에 객체타입의 필드가(콤포지션 → 결합) 존재한다면

그 객체타입의 필드를 DBMS에 테이블로 저장할 때 문제가 된다.

DBMS에서는 데이터를 테이블 단위로 관리하는데

테이블의 각 컬럼에는 객체를 저장할 수 없기 때문이다.

이렇게 객체지향적인 관점에서 프로그래밍한 코드를 분석하여

자동으로 데이터베이스 관리 시스템에 저장할 수 있게 도와주는 것이 JPA다.

 

8. JPA는 방언 처리가 용이하여 Migration 하기 용이하다. 유지보수에 좋다.

JPA를 이용해서 ---- 추상화 객체 ---- 데이터베이스 관리 시스템에 접근하는데,

MySQL뿐만 아니라 오라클, 마리아DB 등 다양한 종류의 데이터베이스 관리 시스템에 접근할 수 있다.

추상화 객체를 구현한 객체를 바꾸기만 하면 내부 코드의 큰 변경 없이

데이터베이스 관리 시스템을 용이하게 연결할 수 있다.

 

참고


[메타코딩] 스프링부트 개념정리(이론)
1강 - 스프링의 핵심은 무엇인가요?
2강 - 필터란 무엇인가요?
3강 - 메시지 컨버터가 무엇인가요?

4강 - JPA란 무엇인가요?
5강 - ORM이란 무엇인가요?
6강 - 영속성 컨텍스트란 무엇인가요?
7강 - OOP 관점에서 모델링이란 무엇일까요?