티스토리 뷰
메타코딩 - 스프링부트 개념정리 with JPA 를 기반으로 작성된 글입니다.
스프링이란?
1.스프링은 Framework이다.
frame(틀) + work(동작하다) 틀에서 벗어나지 않는 개발을 위한 도구.
2.스프링은 오픈소스이다.
소스 코드가 공개되어 있다.(내부) -> 무료, 소스를 수정(기여) 할 수 있다.
3.스프링은 IoC컨테이너를 가진다.
IoC 스프링의 핵심! (Inversion of Control) : 제어의 역전, 주도권이 스프링에게 있다.
Class, Object, instance
Class = 설계도 (class, abstract class...)
Object = 실체화가 가능 한 것!
instance = 실체화 된 것! (추상 클래스는 실체화가 불가능 하다.)
ex) 가구(추상) {
의자 : Object,
책상 : Object
}
가구는 추상적이라 Object가 될 수 없다. 하지만 가구안의 의자와 책상처럼
Object가 실체화가 되면 instance가 된다.
제어의 역전이란 Object들을 스프링이 관리한다는 것이다.
일반적으로 인스턴스를 호출하게 되면 아래와 같다.
public void make() {
의자 s = new 의자();
}
public void use() {
의자 s = new 의자();
}
의자를 사용하기 위해 각각의 instance를 만들어 주게 되면 내용은 같은 의자이지만 heap 메모리에는 각각의 의자가 생성된다. 따라서 같은 주소를 가진 의자가 아닌 의자가 사용된다. 그래서 스프링은 각각의 Object들을 관리해주고 우리는 그것을 가져와서 사용할 수 있다.
4.스프링은 DI를 지원한다.
DI(Dependency Injection) : 의존성 주입
스프링이 IoC로 관리하는 객체를 내가 원하는 모든 곳에서 가져와서 사용할 수 있다. 이렇게 되면 모든 곳에서 사용하는 의자는 같은 주소를 바라보는 하나의 의자를 사용하게 되고, 싱글톤으로 관리가 된다.
5.스프링은 엄청나게 많은 필터를 가지고 있다.
필터는 검열의 기능을 가지고 있다.
톰캣의 filter = filter, 기능을 하는 file 이름 web.xml
스프링의 filter = interceptor, AOP(Aspect Oriented Programming)
6.스프링은 엄청나게 많은 어노테이션을 가지고 있다. (리플렉션, 컴파일 체킹)
어노테이션(Annotation) : 주석이지만 컴파일러가 무시하는 것이 아닌 체크할 수 있도록 힌트를 담는 주석.
주석을 통해 컴파일 단계에서 오류를 체크 할 수 있다.(ex. @Override)
스프링은 어노테이션을 통해 객체 생성을 할 수 있다.
ex)
@Component -> 클래스 메모리에 로딩
@Autowired -> 로딩된 객체 해당 변수에 집어 넣는다
@Component
class A {
}
스프링은 @Component가 포함되어 있는 클래스를 스캔해서 heap메모리 공간에 A라는 클래스를 load 한다.(IoC)
class B {
@Autowired
A a;
}
B클래스를 스캔할 때 클래스 내부를 분석(리플렉션 : 메서드, 필드, 어노테이션... 등등 체크) 한 후 IoC를 통해 읽어 들인 객체를 타입을 통해 찾은 후 넣어 준다.(DI)
7.스프링은 MessageConverter를 가지고 있다. 기본값은 현재 json이다.
자바 프로그램과 파이썬 프로그램이 있다고 가정할 때, 서로의 언어가 다르기 때문에 정보를 공유하기 어렵다. 따라서 중간 언어로 교체를 하는 방식이 필요하다. 중간 언어로는 예전에는 xml을 많이 썼지만 현재 json이 많이 쓰인다.
따라서 요청을 보낼 시
자바프로그램 - Json - 파이썬프로그램 순서로 변경이 된다.
요청을 받을 시에도
파이썬프로그램 - Json - 자바프로그램 순서로 변경이 된다.
이때, 자바 프로그램을 Json으로 Json을 자바 프로그램으로 변경해 주는 역할을 MessageConverter가 해준다. 따라서 서로 다른 언어라도 편리하게 주고받을 수 있다.
8.스프링은 BufferedReader와 BufferedWriter를 쉽게 사용할 수 있다.
통신 시 Byte Stream : 1Byte : 8bit로 전송 -> 자바에서 InputStream으로 읽는다(동작 단위 Byte)
-> InputStreamReader(문자 하나를 얻음), 또한 배열로 문자 여러 개를 받을 수 있다.
하지만, 배열은 크기가 정해져 있어 공간이 낭비가 된다. (반대의 경우 손실이 일어난다.)
BufferedReader : 가변 길이의 문자를 받을 수 있다. (@RequestBody -> BufferedReader 동작)
BufferedWriter : 통신을 Byte Stream을 통해서 데이터를 전송할 때, 전송 단위가 문자열로 가변 길이의 데이터를 쓰게 해 주는 클래스. (@ResponseBody -> BufferedWriter 동작)
9.스프링은 계속 발전 중이다.
참고자료 영상 :
'개발일지 > Spring' 카테고리의 다른 글
스프링부트 with JPA 블로그 13강 - 시큐리티 동작 원리 (0) | 2022.12.06 |
---|---|
스프링부트 with JPA 블로그 11강 - DB격리수준 (0) | 2022.11.24 |
스프링부트 개념정리 with JPA 3강 - 스프링부트 동작원리 (0) | 2022.11.01 |
스프링부트 개념정리 with JPA 2강 - JPA개념 잡기 (0) | 2022.10.28 |