IoC와 DI
1. IoC(제어의 역전), DI(의존성 주입) 이해하기
Spring의 IoC와 DI
- DI라는 디자인패턴을 통해, IoC라는 설계원칙을 지킨다.
의존성이란?
- 요소를 추가할때, 코드 변경사항 개수와 의존성은 비례
주입이란?
- 필요로 하는 객체를 해당객체에 전달하는 것
- 필드에 직접 주입
- 메서드를 통한 주입
- 생성자를 통한 주입
제어의 역전이란?
2. IoC Container와 Bean
Spring IoC 컨테이너
- Bean : Spring이 관리하는 객체
- Spring IoC 컨테이너 : 'Bean'을 모아둔 컨테이너
Spring 'Bean' 등록방법
Spring 'Bean' 사용방법
- 주입과 대입됨 : @Autowired 사용하기
- 필드에 직접 주입 : 필드위에 @Autowired
- 메서드를 통한 주입 : 메서드위에 @Autowired
- 생성자를 통한 주입 : 생성자위에 @Autowired(생성자 선언이 1개일때 생략가능)
3 Layer Annotation
- 3 Layer Architecture로 설계했다면 @Component를
- @Controller, @RestController
- @Service
- @Repository로 대체(@Component를 포함하고있음)해서 Bean으로 등록가능
JPA CORE
1. JPA란 무엇일까?
DB를 직접 다룰 때의 문제점
- SQL을 작성해서 직접 실행해줘야, 그 결과를 객체로 직접 만들어줘야
- SQL 의존적이라 변경에 취약
ORM이란?
JPA란?
2. Entity 이해하기
Entity란?
Entity 클래스 만들기
@Entity
@Table(name = "memo")
public class Memo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "username", nullable = false, unique = true)
private String username;
@Column(name = "contents", nullable = false, length = 500)
private String contents;
}
- @Entity : 클래스를 Entity로 지정
- @Entity(name = "Memo") : 이름지정가능(default:클래스명)
- JPA가 인스턴스화할때 기본생성자사용 -> 오버로딩 된게있는지 확인
- @Table : 매핑 테이블 지정
- @Table(name = "memo") : 이름지정가능(default:Entity이름)
- @Id : 기본키 지정
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- @Column : 컬럼 설정
영속성 컨텍스트란 무엇일까?
영속성 컨텍스트란?
- Entity객체를 효율적으로 쉽게 관리하기 위해 만들어진 공간
EntityManagerFactory
- Persistence.xml설정을 토대로 만들어져 동작
- EntityManager를 만들어냄
EntityManager
- 영속성 컨텍스트에 접근하여 Entity을 관리하는 관리자
JPA의 트랜잭션
영속성 컨텍스트의 기능
1차 캐시
- 영속성 컨텍스트 내부에 존재
- Map자료구조 형태로 되어있다
- 1차 캐시의 장점 : DB조회횟수 줄임, 객체 동일성 보장
A. Entity 저장
B. Entity 조회
- em.find(객체.class, id);
- 캐시저장소에 해당값이 없다면, DB에 SELECT조회 후 가져옴
C. Entity 삭제
쓰기 지연 저장소(ActionQueue)
- 트랜잭션 구현을 목적으로, SQL을 모아두다가 트랜잭션 commit후 한번에 DB에 반영하기위한 기능
- commit할때 자동으로 뒤이어 em.flush(); 메서드가 추가동작됨
- 실질적으로 flush가 DB에 반영하는 명령어임
- 트랜잭션 미설정상태에서 flush를 쓰면 오류가 난다.
- Insert, Update, Delete 와 같이 데이터 변경 SQL을 DB에 요청 및 반영하기 위해서는 트랜잭션이 꼭 필요(Select는 무관)
변경 감지(Dirty Checking)
- JPA가 update를 처리하는 방식(em.update(객체)같은건 없음)
- commit & flush가 호출되면, 현재상태와 최초저장한 상태인 LoadedState와 비교
- 변경내용있다면 Update SQL생성하고 액션큐에 저장.그 뒤는 일반적인 프로세스와 똑같이 진행
- 따라서 변경하고싶은 데이터가 있으면
- 조회 - 데이터변경만 하면, 자동으로 업데이트되고 반영됨
Entity의 상태
비영속(Transient)
- 단순히 new연산자를 통해 인스턴스화만 되고, 영속성 컨텍스트에 저장되지 않은 상태
영속(Managed)
준영속(Detached)
- 영속되었다가 분리된 상태
- detach(객체) : 매개변수에 있는 객체만 분리
- clear() : 영속성 컨텍스트에있는 모든 객체를 분리
- close() : clear() + 종료
- merge : 준영속 -> 영속
- 저장기능수행 : 지목한 객체가 DB에 없을때
- 수정기능수행 : 지목한 객체가 DB에 있을때
삭제(Removed)