Springboot 개념정리

gw07167·2023년 6월 19일

Spring

스프링은 프레임워크이다

즉, 틀에서 동작한다는 의미이다

스프링은 오픈소스이다

즉, 소스를 원하는대로 바꿀 수 있다

스프링은 IoC (Inversion of Control) 컨테이너를 가진다

제어의 역전으로 주도권이 스프링이다

  • Class: 설계도
  • Object: 실체화가 가능한 것 (추상클래스는 Object가 아님)
  • Instance: 실체화 된 것

스프링이 Object들을 읽어서 heap(메모리)에 올린다

스프링은 DI (Dependency Injection) 를 지원한다

의존성 주입

스프링이 관리하는 객체를 원하는 모든 클래스의 메소드에서 사용할 수 있다

그 객체는 싱글톤으로 하나의 객체를 공유할 수 있다

스프링은 엄청나게 많은 필터를 가지고 있다

필터는 문지기로 권한에 대한 임무를 가질 수 있다

tomcat의 필터는 web.xml이고 스프링 컨테이너의 필터는 인터셉터(AOP)이다

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

어노테이션이란 주석+힌트로 컴파일러가 무시하지 않는다

리플렉션이란 분석하는 기법으로 런타임때 일어난다

스프링에서는 어노테이션으로 객체를 생성한다

@Component //클래스를 메모리에 로딩, IoC
@Autowired //로딩된 객체를 해당 변수에 집어 넣어, DI

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

중간 데이터란 JSON으로 모든 데이터가 이해하기 쉬운 데이터이다

Class Animal {
	int num = 10;
    String name = "사자";
}

-> {"num": 10, "name": "사자"}

MessageConverter이란 어떤 객체/프로그래밍 언어를 JSON으로 바꾸거나 반대로 바꿔줌

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

영어 한 문자는 8bit, 256가지의 문자를 전송할 수 있다
-> 8bit씩 끊어 일으면 한 문자씩 받을 수 있을 거야
-> 8bit = 1byte : 통신 단위

즉, 1byte는 하나의 문자이다

유니코드: UTF-8, 3byte 통신

BufferedReader(request.getReader() //JPA)로 데이터를 받으면 가변길이의 문자를 받아서 통신함
BufferedWriter는 Printwriter을 자주 사용하여 문자열을 가변길이로 쓴다

@RequestBody //BufferReader
@ResponseBody //BufferWriter

스프링은 계속 발전중이다


JPA

JPA는 Java Persistence API이다

Persistence는 영속성으로 데이터가 영구적으로 기록되게 해주는 것

하드디스크 안에 DBMS에 비휘발성으로 기록한다

API란 애플리케이션(A) 프로그래밍(P) 인터페이스(I)

  • 인터페이스: 프로그램을 사용할 때 필요한 약속
  • 프로토콜: 동등한 관계에 있는 프로그램 간의 약속

JPA는 ORM 기술이다

Object Relational Mapping으로 객체를 데이터베이스에 연결하는 방법론이다

모델링이란 추상적인 것을 현실로 뽑아내는 것이다
-> 클래스를 통해 데이터베이스를 만들어내는것

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

Select, Delete, Update, Insert을 자주 사용한다

<반복적인 작업>
1. 자바는 DB에 connection 요청
2. DB는 session을 만듬
3. 자바는 Connection을 가짐
4. 자바는 쿼리 전송
5. DB는 데이터를 돌려주는데, 자바 Object로 변경해야한다

-> JPA는 함수 하나로 단순하게 처리한다

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

컨텍스트(context)란 그 대상에 대한 모든 정보이다

영속성 컨텍스트와 DB는 동기화되어 내용이 변경이 되면 자동으로 update를 한다

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

자바에는 객체를 넣고 DB는 JPA가 자동으로 처리한다

JPA는 OOP의 관점에서 모델링을 할 수 있게 해준다 (상속, 콤포지션, 연관관계)

Class Car {
	String name;
    String color;
    Engine engine;
}

Class Engine {
	int id;
    int power;
}

방언 처리가 용이하여 Migration하기 좋음. 유지보수에도 좋음

JPA는 오라클, 마리아, MYSQL, MSSQL등을 지원하기 때문에 어떤 DB기술을 사용해도 추상화 객체를 통해 DB에 접근가능하다

JPA는 쉽지만 어렵다


SpringBoot 동작원리

내장 톰켓을 가진다

socket: 운영체제가 가지고 있는 것, 연결이 지속됨

다수의 연결을 하기 위해서는? -> 스레드, timeslice

http(문서(static 자원) 전달이 목적) 통신 - Stateless 방식
--> 단점을 보안한 것이 웹 서버

웹 서버(아파치) + 톰켓의 형태

  • 웹 서버는 요청한 파일을 응답해줌
  • 톰켓은 request로 온 자바코드(jsp)를 컴파일해서 html을 아파치에게 주어 response

톰켓을 따로 설치할 필요 없이 바로 실행가능하다

서블릿 컨테이너

  • 정적인 파일이 request오면, 아파치가 일함
  • 동적인 파일이 request오면, 톰켓이 일함

but 스프링부트는 URI로 식별자로 접근하여 특별한 파일을 요청할 수 없고 request시에는 무조건 자바를 거친다

http://naver.com/a.png  //URL
http://naver.com/picture/a   //URI

서블릿 컨테이너란 톰켓으로 자바코드로 웹을 할 수 있는 것을 모아 컨테이너를 만듬
1. 스레드(동시에 요청 많음) 생성
2. 서블릿 객체 생성

서블릿 객체는 stateless가 아닌 재사용하여 속도가 빠름

web.xml

ServletContext의 초기 파라미터

한 번 설정하면 어디서든지 사용할 수 있음

Session의 유효시간 설정

인증이 된 것 : Session

Servlet/JSP에 대한 정의와 매핑

목적지를 알려줌

Mime Type 매핑

들고올 데이터의 Type, Type이 맞지 않으면 error

  • Get 방식: select

Welcome File List

그냥 들어온 파일이 갈곳을 정의

Error Pages 처리

이상한 파일은 error로 보내

리스너/필터 설정

리스너는 web.xml의 대리인의 역할
필터를 통해 알맞지 않으면 거부함

보안

보호하는것

FrontController 패턴

web.xml은 너무 많은 일을 하기 때문에 최초의 앞단에서 특정 주소를 FrontController에게 넘김 -> 내부의 자원에 접근 (request)으로 새롭게 new됨 -> RequestDispatcher을 통해 request와 response를 그대로 유지시켜줌으로써 페이지간 데이터 이동 가능

DispatchServlet

FrontController 패턴이나 RequestDispatcher를 직접 구현할 필요가 없다. 왜냐하면 스프링에는 DispatchServlet이 있기 때문!

DispatchServlet은 주소 분배를 함

DispatchServlet = FrontController + RequestDispatcher

스프링 컨테이너

DispatcherServlet에 의해 생성된 객체들

ApplicationContext

  1. request
  2. web.xml
  3. ContextLoaderListener
    : 모든 스레드가 공통적으로 사용하는 것
    root_ApplicationContext.xml 파일을 메모리에 적재함
    ex. DB
  4. DispatchServlet의 컴포넌트 스캔을 통해 src 폴더 안의 모든 자바파일을 스캔하여 수 많은 객체(IoC)들을 생성하고 ApplicationContext에 등록된다
  5. HandlerMapping
@Controller
@RestController
@Configration
@Repository
@Service
@Component
  • servlet-applicationContext: ViewResolver, MultipartResolver 객체를 생성하고 웹과 관련된 어노테이션 Controller, RestController를 스캔
  • root-applicationContext: Service, Repository등을 스캔(메모리에 적재)하고 DB관련 객체를 생성, 먼저 로드한다

Bean Factory

미리 띄우는 것이 아니라, 필요할 때 getBean()을 통해 메모리에 로드 가능

요청 주소에 따른 적절한 컨트롤러 요청 (Handler Mapping)

Get요청 -> 적절한 컨트롤러의 함수를 찾아서 실행

응답

  • html파일 -> ViewResolver(경로)
WEB-INF/view/hello.jsp
  • Data -> MessageConverter가 JSON 형태로 변경
{"id" : 1, "name":"홍길동"}
profile

0개의 댓글