책을 보면서 생소했던 용어나 설명이 부족했던 부분에 대해 정리하려고 한다.
▶ 제 01장. 스프링 부트란
- 제어 역전
- 객체 제어의 주체가 객체를 사용하는 클래스 자신이 아닌 외부에 있다는 의미이다.
- 필요한 객체를 클래스 내부에서 직접 생성하지 않고 외부에서 주입받는 형태를 가진다.
- @Bean @Component…등의 어노테이션을 붙인다 ≫ 해당 객체를 스프링 컨테이너에 빈으로 등록한 것 ≫ 제어를 역전시킨 것
- 의존성 주입
- 제어의 역전을 구현하는 방법이 의존성 주입이다.
- 스프링 프레임워크 환경에서의 의존성 주입
- 스프링 컨테이너라는 공간에서 빈(Bean)객체드를 관리한다. (이 곳에서 관리되는 빈은 싱글톤 객체)
- 컨테이너는 등록된 빈을 가지고 의존성 주입을 한다.
- 생성자, 필드, 메소드 등에 @Autowired 어노테이션을 붙인다 ≫ 해당 빈의 의존성을 주입한 것
- 관점지향 AOP
- 핵심기능과 부가기능을 나눠서 각각 하나의 관심사로 관리하는 것이다.
- AOP는 횡단 관심사(cross-cutting concern)의 분리를 허용해 모듈의 의존성도 낮추고, 각각의 모듈성이 강화되어 유지보수도 용이하다.
- * 로깅 로직
- * 트랜잭션 시작/종료 로직
- * 보안 인증 로직
- 여러 서비스 시작학 때와 종료될 때 공통적으로 트랜잭션 로직을 실행시킨다.
- 컨트롤러의 RequestMapping이 되어 있는 모든 메서드는 시작 시 로깅 로직을 실행시킨다.
- JPA
- JPA : 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스, 우리가 직접 save(), findById(), findAll()등의 구현체를 직접 만들어서 사용해야 한다.
- EntityManager를 사용해서 직접 구현체를 작성해야 기능을 할 수 있다.
- Spring Data JPA : Repsitory에 JpaRepository 인터페이스를 상속 받아서 사용하는 것, JPA를 쓰기 편하게 만들어 둔 모듈이다.
- JPA : 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스, 우리가 직접 save(), findById(), findAll()등의 구현체를 직접 만들어서 사용해야 한다.
- Hibernate
- 자바의 ORM 프레임워크이자, JPA인터페이스의 구현체이다.
- 객체지향 프로그래밍 언어와 관계형 데이터베이스 간의 데이터를 변환은 자동화 해주는 기술이다.
- 자바의 ORM 프레임워크이자, JPA인터페이스의 구현체이다.
- @Component어 노테이션
- @Controller, @Service, @Repository 어노테이션들은 @Component 어노테이션의 구체화된 형태이다.
- @Bean 어노테이션
- 개발자가 직접 제어가 불가능한 외부 라이브러리 등을 Bean으로 만들려고 할 때 사용한다.
▶ 제 02장. 개발에 앞서 알면 좋은 기초 지식
- 스프링 레이어드 아키텍쳐
- 스프링 대표 3가지 레이어드
- * Web Layer: REST API 로직, Client 종속적인 로직 등
- * Business Layer: 서비스의 내부 정책에 따른 비즈니스 로직
- * Data Layer: DB 연동이나 기타 외부 연동 등
- 각각의 레이어마다 필요한 횡단 관심사
- * Web Layer의 경우
- 요청과 응답에 대한 로깅이나 DTO의 유효성 검사, 직렬화 작업 등이 공통적으로 사용된다.
- * Business Layer의 경우
- 트랜잭션의 설정과 해제, 비즈니스 로직에 필요한 검증 로직 등이 공통적으로 사용된다.
- 예) @Transactional 어노테이션
- 트랜잭션의 설정과 해제, 비즈니스 로직에 필요한 검증 로직 등이 공통적으로 사용된다.
- * Data Layer의 경우
- 마찬가지로 트랜잭션 설정이 필요, 또한 DB 연결/해제 등이 공통적으로 사용된다.
- * Web Layer의 경우
- 스프링 대표 3가지 레이어드
- Persistence Context(영속성 컨텍스트)
- 엔티티를 영구 저장하는 환경이라는 의미이다.
- EntityManager를 이용해 Entity를 저장하거나 조회할 때 EntityManager 는 영속성 컨텍스트에 Entity 를 보관하고 관리하며, EntityManager를 하나 생성할 때 하나가 만들어진다.
- 영속성 컨텍스트의 특징
- Entity에서 @Id어노테이션을 통해 지정한 멤버변수가 영속성 컨텍스트에 식별자 값으로 저장된다.
- JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 Entity를 DB에 반영한다. (Flush)
- 1차 캐시(영속성 컨텍스트 내부에 존재하는 캐시(Map))를 이용
- 영속 상태의 Entity가 저장되어 있는 공간이며 키는 @Id, 값은 Entity 인스턴스로 매핑 되어있다.
- 만약 찾는 Entity가 1차 캐시에 없으면 데이터베이스에서 조회한 후 1차 캐시에 저장하고 영속 상태인 해당 객체를 반환한다.
- 트랜잭션을 지원하는 쓰기 지연을 수행한다.
- EntityManager는 트랜잭션을 commit 하기 직전까지 DB에 Entity를 저장하지 않고 영속성 컨텍스트 내부의 SQL 저장소에 생성 쿼리를 저장해둔다.
- 이 후 commit을 하게 되면 저장해두었던 쿼리를 DB에 보낸다.(Flush)
- Flush: 영속성 컨텍스트의 변경 내용을 DB에 동기화하는 작업(등록, 수정, 삭제한 Entity를 DB에 반영)이다.
- 변경을 감지한다.
- 영속성 컨텍스트에는 이전 flush() 때의 Entity 상태를 복사해서 저장해둔 스냅샷이 존재해서, JPA는 flush() 시점에 스냅샷과 Entity를 비교해 변경된 부분에 대해서 감지해서 update문이 날아가게 된다.
- 영속성 컨택스트에 없으면 아무리 수정이 되어도 변경을 감지 하지 못하기 때문에 병경 사항에 대한 update를 원한다면, find로 Entity를 영속성 컨텍스트에 넣어두고 변경을 주어야 한다.
- 지연 로딩을 수행한다.
- 지연 로딩(Lazy Loading)이란 실제 객체 대신 프록시 객체를 로딩해두고 해당 객체를 실제 사용할 때 영속성 컨텍스트를 통해 데이터를 불러오는 방법이다.
- REST API
- URI는 정보의 자원을 표현해야 한다.
- 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE)로 표현한다.
▶ 제 03장. 개발 환경 구성
정리 사항 없음