Today I Learned
(24.05.16)[5주차] Spring 입문 강의 02
개인 과제를 마무리하면서 동시에 Spring 학습까지 진해을 해야했기 때문에 시간도 많이 들고,
고민도 많이 해야하는 부분이라
실제로 몇번 더 사용을 해서 익숙해지려고 해야할듯
Spring 입문 강의 간단정리
- 두번째 강의 내용은 JPA 중심이기 때문에 이를 유의 하여 학습
- 실습도 두번 반복했어도 개념이 계속 헷갈려서 한번더 검토하는 겸 적을 수 있도록 정리.
더보기
3계층 3 Layer Architecture
- API 처리 코드의 추가가 계속 이뤄진다면, 관리가 어려워지기 때문에 3개의 계층
Controller
- 클라이언트에게 요청을 받아선 서비스가 로직처리를 해주기 위해 데이터를 전달, 그리고 그 반대로 클라이언트에게 데이터 다시 응답 역할
Service
- 비지니스 로직의 실제로 구현 부분
- 서비스에 따라 코드가 방대해지는 것
Repository
- DB 관리 (연결, 해제, 자원 관리)
- DB CRUD 작업을 처리
IoC(제어의 역전) & DI(의존성 주입)
- 객체지향의 SOLID 원칙 그리고 GoF 의 디자인 패턴과 같은 설계 원칙 및 디자인 패턴
IoC
- 설계 원칙
- DI 패턴을 이용해서 설계
DI
- 디자인 패턴
주입
- 객체를 해당 객체에게 전달하는 것
구분
- 필드에 직접 주입
- 메서드를 통한 주입
- 생성자를 통한 주입
IoC(제어의 역전)
- Food를 오히려 Consumer에게 전달을 해서 코드를 변경 없이 어떤 음식도 Consumer가 먹을 수 있도록 자연스럽게 Food → Consumer 흐름으로 바뀌는 것
- DI 패턴을 통해서 역전이 발생했다고 할 수 있음
- 기존의 Consumer → Food 방식은 강한 결합이라고도 볼 수 있음
3 Layer Architecture 강한 결합 해결
- 3 Layer Architecture에 의해서 Complier → Service → Repository 로 순서대로 생성을 시키고 있는 강한 결합방식
- 생성자 주입을 통해 객체를 주입하는 방식으로 해결!
IoC Container& Bean
- 빈 (Bean): Spring이 관리하는 객체
- Spring IoC 컨테이너: '**Bean'**을 모아둔 컨테이너
Spring ‘Bean’ 사용
@Autowired
- 생성자주입
- 메서드주입
- 필드주입
- @RequiredArgsConstructor 활용
- final 변수에 대한 생성자를 만들어주는 annotaion 활용
ApplicationContext
- 해당 ApplicationContext 을 통해서 직접 IoC Container 에서 Bean 이름이나 클래스로 직접 꺼내와서 주입해주는 형태
3 Layer Annotation
- Controller, Service, Repository 역할 구분된 클래스를 Bean 등록 시, 해당 Bean 역할을 명시 해주기 위해 사용하는 것
ORM, Object-Relational Mapping
- ORM은 이름 그대로 객체와 DB의 관계를 매핑 해주는 도구
JPA, Java Persistence API
- 자바 ORM 중에서 대한 표준 명세
- Application과 JDBC 사이에서 동적하면서 자동으로 처리하면서 간접적이 DB를 다룰 수 있음
Hibernate 하이버네이트
- JPA 는 표준 명세지만, 구현한 프레임워크 중 사실상 표준
- 따라서, Spring Boot는 Hibernate 구현체를 통해서 JPA를 쓸 수 있게 함
Entity
- DB의 Table과 그냥 매핑되는 똑같은 것
- JPA에 의해 관리가 역시 됨
- Spring Boot에서는 다르게 쓰임 주의
영속성 컨텍스트
- Persistence를 객체의 관점으로 해석해 보자면 ‘객체가 생명(객체가 유지되는 시간)이나 공간(객체의 위치)을 자유롭게 유지하고 이동할수 있는 객체의 성질’
EntityManager
- 영속성 컨텍스트에 접근하여 Entity 객체들을 조작하기 위해 필요한 관리자, 존재 (사람아님)
EntityManagerFactory
- EntityManager가 EntityManagerFactory를 통해 생성하여 사용
- 단, DB하나에 하나만 생성 사용
트랜잭션 Transaction
- DB 데이터들의 무결성과 정합성을 유지하기 위한 하나의 논리적 개념
JPA의 트랜잭션
- 하나의 TRANSACTION에 모든 쿼리 진행을 담아두다가 마지막에 영구적으로 반영하는 영속석 컨텍스트 관리
영속성 컨텍스트 기능
- 효율적으로 어떻게 관리하는지를 확인
1차 캐시
- 영속성 컨텍스트의 내부적인 저장소
- Entity 저장 조회 삭제가 가능
쓰기 지연 저장소 ActionQueue
- Transaciton 에서 한번에 Commit 전에 저장하는 그 공간
- 단, Insert Update Delete가 담겨져 있고 반드시 Transaction 환경이 필요
변경 감지 Dirty Checking
- ActionQueue에 Update SQL을 매번 추가하면서 DB에 요청하는 비효율성을 해결
- 하나의 Update SQL에 넣었다가 한번에 커밋 flush 시키는 방법
Entity 상태
비영속(Transient)
- new 연산자를 통해 인스턴스화 된 Entity 객체
영속(Managed)
em.persist((entity객체));
- Entity를 EntityManager를 통해 영속성 컨텍스트에 저장하여 관리되고 있는 상태
준영속(Detached)
- 영속성 컨텍스트에 저장되어 관리되다가 분리된 상태
merge()
- 준영속→영속 상태로 변환
삭제(Removed)
SpringBoot JPA
- Java Spring Boot 는 application.properties의 내용을 가지고 자동으로 EntityManagerFactory, EntityManager 둘다 자동으로 생성해줌
Spring Transaction
@Transactional
- Spring Boot 에서는 Entity Manager 의 Transaction을 가지고 올 필요 없이 환경을 쉽게 조성할 수 있음
영속성 컨텍스트 & Spring Transaction 생명주기
- 스프링 컨테이너 환경에서는 영속성 컨텍스트와 트랜잭션의 생명주기가 일치
Transaction 전파
- 자식 메서드가 끝나도 부모 메서드의 Transaction까지 모두 합쳐져서 마치고 Commit이 된다는 것
Spring Data JPA
- JPA를 쉽게 사용할 수 있게 만들어놓은 하나의 모듈
- JpaRepository 인터페이스는 Hibernate와 같은 JPA구현체를 사용해서 구현한 클래스를 통해 사용
- Entity, Entity Manager, EntityManagerFactory, persist() 등 모두 Raw한 JPA였음
SimpleJpaRepository
- Spring Data JPA 에서 JpaRepository 인터페이스를 구현하는 클래스를 자동으로 생성
Spring Data JPA 사용
JpaRepository 등록
- JpaRepository<"@Entity 클래스", "@Id 의 데이터 타입">를 상속받는 interface 로 선언해서 사용
- JPA 로직이 모두내부에서 도는데 단, Optional 타입으로 반환
- null체크 필수로 해줘야하는 것
Timestamped
- Spring Data JPA에서 제공되는 자동 시간 값을 넣어주는 JPA Auditing 기능
Query Methods
- JpaRepository 인터페이스의 메서드
- 메서드 이름으로 SQL을 생성할 수 있는 기능의 메서드
코드도 세번이나 날려먹어서 헛수고를 너무 많이 한것 같아 짜증이 났지만, 그래도 복습을 세번 한걸로 긍정적으로 생각하기..
FE부분의 HTML로 완성하려고 했으나, 뭐 알턱이 었어서 괜히 시도를 했나 싶었다.
'Today I Learned' 카테고리의 다른 글
(24.05.18)[5주차] WIL (0) | 2024.05.18 |
---|---|
(24.05.17)[5주차] Spring 입문 마무리(SpringBoot JPA @ExceptionalHandler) (0) | 2024.05.17 |
(24.05.14)[5주차] Spring 입문 강의 01 (0) | 2024.05.14 |
(24.05.13)[5주차] 런타임 이슈 by NumberFormatException 예외 (0) | 2024.05.13 |
(24.05.10)[5주차] n진수로 바꾸기 & StringBuffer (0) | 2024.05.10 |