1. JPA의 영속성 컨텍스트
1) JPA : 자바 진영에서 ORM 기술 표준으로 사용되는 인터페이스의 모음, 실제적으로 구현된 것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크
2) 영속성 컨텍스트
- 엔티티를 영구 저장하는 환경
- 애플리케이션과 DB 사이에서 객체를 보관하는 논리적 개념
3) 엔티티의 생명주기
- 비영속(new/transient): 영속성 컨텍스트와 전혀 관계가 없는 상태
- 영속(managed): 영속성 컨텍스트에 저장된 상태
- 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제(removed): 삭제된 상태
4) 영속성 컨텍스트의 특징
- 식별자 값 : 연속성 컨텍스트는 엔티티를 식별자 값으로 구분하며, 영속 상태는 반드시 식별자 값이 있어야 한다.
- flush : 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터 베이스에 반영하는데 이것을 flush라고 한다.
- 장점
- 1차 캐시 : 1차 캐시의 키는 식별자 값이고 값은 텐티티 인스턴스이다.
- 동일성 보장 : 엔티티의 동일성을 보장한다.
- 트랜잭션을 지원하는 쓰기 지연 : 트랜잭션이 끝날때 모아둔 쿼리를 한번에 DB에 보낸다.
- 변경 감지 : JPA로 엔티티 수정 시 단순히 엔티티를 조회해서 데이터를 변경하면 된다.
- 지연 로딩 : 불필요한 쿼리 안날림
2. 제네릭과 제네릭을 사용하는 이유
- 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 탑이이 지정된는 것
- 특정 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입
1) 장점
- 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지
- 클래스 외부에서 타입을 지정해주어 타입을 체크하고 변환해줄 필요가 없다. 관리가 편하다
- 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.
3. LIst, Set, Map, HashMap의 차이
1) LIst : 저장공간이 필요에 의해 자동으로 늘어난다(순서가 있는 저장공간)
- 특징 : 순서가 있고, 중복을 허용
- 장점 : 가변적인 배열, 배열이 자동으로 늘어난다.
- 단점 : 원하는 데이터가 뒤쪽에 위치하는 경우 검색 속도가 느려진다.
- 방식 : equals()를 이용한 데이터 검색
2) Set : 집합, 순서가 없고 중봅 데이터를 허용하지 않는다.
- 특징 : 순서가 없고, 중복을 허용하지 않는다.
- 장점 : 빠른 속도
- 단점 : 정렬하기 위해선 별도의 처리가 필요하다.
- 방식 : equals()를 이용한 데이터 검색
3) Map : 키와 데이터를 같이 저장
- 특징 : 키와 값으로 데이터를 저장하며, 순서가 없고, 키는 중복이 안된다.
- 장점 : 빠른 속도
- 단점 : key 검색 속도가 검색 속도를 좌우
- 방식 : equals()를 이용한 데이터 검색
1) HashMap : index번호 대신 키값으로 값을 찾는 맵형태의 자료구조도 iterator 클래스를 이용해 키값을 순서대로 iterator에 저장해두면 순서대로 데이터 추출이 가능
- Map을 implements한 클래스로서 중복을 허용하지 않는다.
- key와 value의 쌍으로 이루어지며 key또는 value값으로써 null을 허용한다.
4. Spring Container
1) 스르링 컨테이너란?
- 스프링에서 자바 객체들을 관리하는 공간
- 자바 객체는 스프링에서는 빈(Bean)이라고 한다.
- 빈의 생성부터 소멸까지 개발자 대신 관리해주는 곳
2) 컨테이너의 종류
- BeanFactory와 ApplicationContext가 있다.
- ApplicationContext 컨테이너가 BeanFactory의 기능을 포괄하면서 추가적인 기능을 제공하기에 대부분 ApplicationContext를 사용한다.
5. Rest Client
- Spring에서 제공하는 HTTP 통신에 사용할 수 있는 템플릿
- 쉽게 말하면 HTTP 통신을 할 수있는 Rest한 Client이다.
- RestTemplate와 WebClient 두 타입의 빈을 등록해 주는 것이 아니라 빌더를 등록해준다.
- 빌더를 주입받아서 필요할 때 마다 REST 클라이언트를 빌드해서 사용해야한다.
1)RestTemplate
- Blocking I/O 기반의 Synchronous API
- RestTemplateAutoConfiguration
- 프로젝트에 spring-web 모듈이 있다면 RestTemplateBuilder를 빈으로 등록
2)WebClient
- Non-Blocking I/O 기반의 Asynchronous API
- WebClientAutoConfiguration
- 프로젝트에 spring-webflux 모듈이 있다면 WebClient.Builder를 빈으로 등록
6. @SpringBootTest와 @WebMvcTest의 차이
1)@SpringBootTest
- 어플리케이션 전체를 로드하고 테스트를 실행하는데 사용
- 모든 구성 요소를 로드하기 때문에 느릴 수 가 있다.
2)@WebMvcTest
- 웹 계층에 대한 테스트를 위해 사용된다.
- 컨트롤러, 플터, 컨버터, 유효성 검사 등과 같은 웹 계층 관련 구성 요소만 로드 된다.
- 따라서 비교적 빠르게 테스트를 수행 할 수 있다.