본문 바로가기
카테고리 없음

스프링 부트 핵심 가이드 1주차

by 이두덩이 2023. 7. 23.

책을 보면서 생소했던 용어나 설명이 부족했던 부분에 대해 정리하려고 한다.

 

▶ 제 01장.  스프링 부트란

  1. 제어 역전
    • 객체 제어의 주체가 객체를 사용하는 클래스 자신이 아닌 외부에 있다는 의미이다.
    • 필요한 객체를 클래스 내부에서 직접 생성하지 않고 외부에서 주입받는 형태를 가진다.
      • @Bean @Component…등의 어노테이션을 붙인다  해당 객체를 스프링 컨테이너에 빈으로 등록한 것  제어를 역전시킨 것
  2. 의존성 주입
    • 제어의 역전을 구현하는 방법이 의존성 주입이다.
    • 스프링 프레임워크 환경에서의 의존성 주입
      • 스프링 컨테이너라는 공간에서 빈(Bean)객체드를 관리한다. (이 곳에서 관리되는 빈은 싱글톤 객체)
      • 컨테이너는 등록된 빈을 가지고 의존성 주입을 한다. 
        • 생성자, 필드, 메소드 등에 @Autowired 어노테이션을 붙인다 해당 빈의 의존성을 주입한 것
  3. 관점지향 AOP
    • 핵심기능과 부가기능을 나눠서 각각 하나의 관심사로 관리하는 것이다.
    • AOP는 횡단 관심사(cross-cutting concern)의 분리를 허용해 모듈의 의존성도 낮추고, 각각의 모듈성이 강화되어 유지보수도 용이하다.
      • * 로깅 로직
      • * 트랜잭션 시작/종료 로직
      • * 보안 인증 로직
        • 여러 서비스 시작학 때와 종료될 때 공통적으로 트랜잭션 로직을 실행시킨다.
        • 컨트롤러의 RequestMapping이 되어 있는 모든 메서드는 시작 시 로깅 로직을 실행시킨다.
  4. JPA
    • JPA : 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스, 우리가 직접 save(), findById(), findAll()등의 구현체를 직접 만들어서 사용해야 한다.
      • EntityManager를 사용해서 직접 구현체를 작성해야 기능을 할 수 있다.
    • Spring Data JPA : Repsitory에 JpaRepository 인터페이스를 상속 받아서 사용하는 것, JPA를 쓰기 편하게 만들어 둔 모듈이다. 
  5. Hibernate
    • 자바의 ORM 프레임워크이자, JPA인터페이스의 구현체이다.
      • 객체지향 프로그래밍 언어와 관계형 데이터베이스 간의 데이터를 변환은 자동화 해주는 기술이다.
  6. @Component어 노테이션 
    • @Controller, @Service, @Repository 어노테이션들은 @Component 어노테이션의 구체화된 형태이다.
  7. @Bean 어노테이션
    • 개발자가 직접 제어가 불가능한 외부 라이브러리 등을 Bean으로 만들려고 할 때 사용한다.

 

▶ 제 02장. 개발에 앞서 알면 좋은 기초 지식

  1. 스프링 레이어드 아키텍쳐
    • 스프링 대표 3가지 레이어드 
      • * Web Layer: REST API 로직, Client 종속적인 로직 등
      • * Business Layer: 서비스의 내부 정책에 따른 비즈니스 로직
      • * Data Layer: DB 연동이나 기타 외부 연동 등
    • 각각의 레이어마다 필요한 횡단 관심사
      • * Web Layer의 경우
        • 요청과 응답에 대한 로깅이나 DTO의 유효성 검사, 직렬화 작업 등이 공통적으로 사용된다.
      • * Business Layer의 경우
        • 트랜잭션의 설정과 해제, 비즈니스 로직에 필요한 검증 로직 등이 공통적으로 사용된다.
          • 예) @Transactional 어노테이션
      • * Data Layer의 경우
        • 마찬가지로 트랜잭션 설정이 필요, 또한 DB 연결/해제 등이 공통적으로 사용된다.
  2. Persistence Context(영속성 컨텍스트)
    • 엔티티를 영구 저장하는 환경이라는 의미이다.
    • EntityManager를 이용해 Entity를 저장하거나 조회할 때 EntityManager 는 영속성 컨텍스트에 Entity 를 보관하고 관리하며, EntityManager를 하나 생성할 때 하나가 만들어진다.
    • 영속성 컨텍스트의 특징
      1. Entity에서 @Id어노테이션을 통해 지정한 멤버변수가 영속성 컨텍스트에 식별자 값으로 저장된다.
      2. JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 Entity를 DB에 반영한다. (Flush)
      3. 1차 캐시(영속성 컨텍스트 내부에 존재하는 캐시(Map))를 이용
        • 영속 상태의 Entity가 저장되어 있는 공간이며 키는 @Id, 값은 Entity 인스턴스로 매핑 되어있다.
        • 만약 찾는 Entity가 1차 캐시에 없으면 데이터베이스에서 조회한 후 1차 캐시에 저장하고 영속 상태인 해당 객체를 반환한다.
      4. 트랜잭션을 지원하는 쓰기 지연을 수행한다.
        • EntityManager는 트랜잭션을 commit 하기 직전까지 DB에 Entity를 저장하지 않고 영속성 컨텍스트 내부의 SQL 저장소에 생성 쿼리를 저장해둔다.
        • 이 후 commit을 하게 되면 저장해두었던 쿼리를 DB에 보낸다.(Flush)
        • Flush: 영속성 컨텍스트의 변경 내용을 DB에 동기화하는 작업(등록, 수정, 삭제한 Entity를 DB에 반영)이다.
      5. 변경을 감지한다.
        • 영속성 컨텍스트에는 이전 flush() 때의 Entity 상태를 복사해서 저장해둔 스냅샷이 존재해서, JPA는 flush() 시점에 스냅샷과 Entity를 비교해 변경된 부분에 대해서 감지해서 update문이 날아가게 된다.
        • 영속성 컨택스트에 없으면 아무리 수정이 되어도 변경을 감지 하지 못하기 때문에 병경 사항에 대한 update를 원한다면, find로 Entity를 영속성 컨텍스트에 넣어두고 변경을 주어야 한다.
      6. 지연 로딩을 수행한다.
        • 지연 로딩(Lazy Loading)이란 실제 객체 대신 프록시 객체를 로딩해두고 해당 객체를 실제 사용할 때 영속성 컨텍스트를 통해 데이터를 불러오는 방법이다.
  3. REST API
    • URI는 정보의 자원을 표현해야 한다.
    • 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE)로 표현한다.

 

▶ 제 03장. 개발 환경 구성 

정리 사항 없음