본문 바로가기
Framekwork/SPRING

[SpringBoot] 스프링부트 개념정리 - 메타코딩

by 아이엠제니 2022. 3. 22.

 

 

Springboot with JPA 1강 스프링 개념잡기 (1~3)

1. 스프링이란?

  • 스프링은 프레임워크이다.
    • 프레임은 틀, 워크는 동작하다 => 틀 안에 동작한다.
  • 스프링은 오픈소스이다. (무료)
    • 소스코드 공개되어 있음 (내부를 볼 수 있고, 뜯어 고칠 수 있다.)
  • 스프링은 IoC 컨테이너를 가진다. (Inversion of Controll => 제어의 역전)
    • 주도권을 빼앗김. 주도권이 스프링한테 있다.
      • class: 설계도
      • object: 실체화가 가능한 것
      • instance: 실체화 된 것
  • 스프링은 DI를 지원한다. (Dependency Injection => 의존성 주입)
  • 스프링은 엄청나게 많은 필터를 가지고 있다. (검열)
    • 톰캣: filter (web.xml)
    • 스프링 컨테이너: 인터셉터 (AOP)
  • 스프링은 엄청나게 많은 어노테이션을 가지고 있다. (리플렉션(분석), 컴파일체킹)
    • 컴파일체킹
    • 어노테이션(주석+힌트) <- 컴파일러가 무시하지 않음
      • // 글~ (주석) <- 컴파일러가 무시
      • 스프링에서는 어노테이션을 통해 객체 생성을 함
        • @component: 클래스 메모리에 로딩
        • @Autowired: 로딩된 객체 해당 변수에 집어 넣어
    • 리플렉션: 분석하는 기법 -> 런타임 시 분석
  • 스프링은 MessageConverter를 가지고 있다.
    • JSON => {"num":10, "name":"사자"}
  • 기본값은 현재 Json이다.
  • 스프링은 BufferedReader와 BufferedWriter를 쉽게 사용할 수 있다.
  • 스프링은 계속 발전중이다.

 

 

 

Springboot with JPA 2강 JPA 개념잡기 (4~7)

1. JPA란?

  • Java Persistence AIP 이다. (영속성)
  • ORM(Object Relational Mapping) 기술이다.
  • 반복적인 CRUD 작업을 생략하게 해준다.
  • 영속성 컨텍스트를 가지고 있다.
  • DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공한다. (DB는 객체저장 불가능)
  • OOP의 관점에서 모델링을 할 수 있게 해준다. (상속, 콤포지션, 연관관계)
  • 방언 처리가 용이하여 Migration하기 좋음. 유지보수에도 좋음.
  • JPA는 쉽지만 어렵다.

 

 

 

Springboot with JPA 3강 Springboot 동작원리 (8~

  •  soket: 운영체제가 가지고 있는 것 (ex)
    • 5000 소켓 오픈 (main 스레드)
    • 5001 (스레드 1), 5002 (스레드2)
      • http 통신(문서를 전달하는 통신): stateless 방식

 

  1. 내장 톰캣을 가진다.
    • 톰캣을 따로 설치할 필요 없이 바로 실행 가능하다.
      • 아파치: 요청한 파일을 응답해주는 것이다.
      • 톰캣: 요청한 파일 중에 자바 코드가 요청이 되면 그것을 컴파일 해서 html 파일로 번역해서 돌려줌
  2. 서블릿 컨테이너
    • 클라이언트 => 서블릿 컨테이너(톰캣) => 최초 요청 (-> 메모리 로딩 -> 객체 생성 -> init())
    • 최초 요청이 아닐 시에는 재사용
    • Service(HttpServletRequest, HttpServletResponse) - 톰캣이 들고 있음
  3. web.xml
    • ServletContext의 초기 파라미터
    • Session의 유효시간 설정
    • Servlet/JSP에 대한 정의
    • Servlet/JSP 매핑
    • Mime Type 매핑
    • Welcome File list
    • Eorro Pages 처리
    • 리스너/필터 설정
    • 보안
    • (여기에서 Selvelte/JSP 매핑시(web.xml에 직접 매핑 or @webServlet 어노테이션 사용)에 모든 클래스에 매핑을 적용시키기에는 코드가 복잡해지기 때문에 FrontController 패턴 이용함)
  4. FrontController 패턴
    • 최초 앞단에서 request 요청을 받아서 필요한 클래스에 넘겨준다. 왜? web.xml에 정의하기 너무 힘듦. 이때 새로운 요청이 생기기 때문에 request와 response가 새롭게 new 될 수 있다. 그래서 아래의 RequestDispatcher가 필요하다.
  5. RequestDispatcher
    • 필요한 클래스 요청이 도달했을 때 FrontController에 도착한 request와 response를 그대로 유지시켜준다.
  6. DispatchServlet
    • FrontController 패턴을 직접 짜거나 RequestDispatcher를 직접 구현할 필요가 없다. 왜냐하면 스프링에는 DispatchServlet이 있기 때문이다. DispatchServlet은 FrontController 패턴 + RequestDispatcher이다. DispatchServlet이 자동생성되어 질 때 수많은 객체가 생성(IoC)된다. 보통 필터들이다. 해당 필터들은 내가 직접 등록할 수도 있고, 기본적으로 필요한 필터들은 자동 등록되어진다.
  7. 스프링 컨테이너
    1. ApplicatonContext
      • 수많은 객체들이 ApplicationContext에 등록됨. 이것을 IoC라고 함. IoC란 제어의 역전을 의미. 개발자가 직접 new를 통해 객체를 생성하게 된다면 해당 객체를 가르키는 레퍼런스 변수를 관리하기 어렵다. 그래서 스프링이 직접 해당 객체를 관리함. 이때 주소를 몰라도 됨. 왜냐하면 필요할 때 DI하면 되기때문임. DI를 의존성 주입이라고 함. 필요한 곳에서 ApllicationContext에 접근하여 필요한 객체를 가져올 수 있음. ApplicationContext는 싱글톤으로 관린되기 때문에 어디에서 접근하든 동일한 객체라는 것을 보장해줌.
      • ApplicationContext의 종류에는 두 가지가 있음. (root-applicationContext와 Servlet-applicationContext)임
        • Servlet-appliationContext는 ViewResolver, Interceptor, MultipartResolver 객체를 생성하고 웹과 관련된 어노테이션 Controller, RestController를 스캔함. ==> 해당 파일은 DispatchServlet에 의해 실행됨
        • root-applicationContext는 해당 어노테이션을 제외한 어노테이션 Service, Repository 등을 스캔하고 DB관련 객체를 생성한다. (스캔ㄴ이란: 메모리에 로딩한다는 뜻) ==> 해당 파일은 CotextLoaderListener에 의해 실행됨. ContextLoaderListener를 실행해주는 것은 web.xml이기 때문에 root-applicationContext는 servlet-applicationContext보다 먼저 로드된다. 당연히 servlet-applicationContext에서는 root-applicationContext가 로드한 객체를 참조할 수 있지만 그 반대는 불가능하다. 생성 시점이 다르기 때문이다.
    2. Bean Factory
      • 필요한 객체를 Bean Factory에 등록할 수도 있다. 여기에 등록하면 초기에 메모리에 로드되지 않고 필요할 때 getBean()이라는 메소드를 통하여 호출하여 메모리에 로드할 수 있다. 이것 또한 IoC이다. 그리고 필요할 때 DI하여 사용할 수 있다. ApplicationContext와 다른 점은 Bean Factory에 로드되는 객체들은 미리 로 드됮 않고 필요할 때 호출하여 로드하기 때문에 lazy-loading이 된다는 점이다.
  8. 요청 주소에 따른 적절한 컨트롤로 요청 Handler Mapping)
    • GET요청 => http://localhost:8080/post/1
      • 해당 주소 요청이 오면 적절한 컨트롤러의 함수를 찾아서 실행함
  9. 응답
    • html파일을 응답할지 Data를 응답할지 결정해야 하는데 html 파일을 응답하게 되면 ViewResolver가 관여하게 된다. 하지만 Data를 응답하게 되면 MessageConverter가 작동하게 되는데 메시지를 컨버팅할 때 기본전략은 json이다.

 

 

URL: 자원접근

URI: 식별자 접근

 

 

 

메타코딩 [스프링부트 개념정리] 공부 기록
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9/videos
300x250