240814 내일배움캠프 백엔드 Java 6기 TIL : Spring 강의 (IoC & DI, JPA CORE)

박대현·2024년 8월 14일
0

IoC와 DI

1. IoC(제어의 역전), DI(의존성 주입) 이해하기

Spring의 IoC와 DI

  • DI라는 디자인패턴을 통해, IoC라는 설계원칙을 지킨다.

의존성이란?

  • 요소를 추가할때, 코드 변경사항 개수와 의존성은 비례

주입이란?

  • 필요로 하는 객체를 해당객체에 전달하는 것
    • 필드에 직접 주입
    • 메서드를 통한 주입
    • 생성자를 통한 주입

제어의 역전이란?

  • 코드소스를 수정하여 의존성을 낮추는 것

2. IoC Container와 Bean

Spring IoC 컨테이너

  • Bean : Spring이 관리하는 객체
  • Spring IoC 컨테이너 : 'Bean'을 모아둔 컨테이너

Spring 'Bean' 등록방법

  • Class위에 @Component

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이란?

  • 객체와 DB의 관계를 매핑

JPA란?

  • 자바 ORM기술에대한 표준 명세

2. Entity 이해하기

Entity란?

  • JPA에서 관리되는 객체

Entity 클래스 만들기

@Entity // JPA가 관리할 수 있는 Entity 클래스 지정
@Table(name = "memo") // 매핑할 테이블의 이름을 지정
public class Memo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // nullable: null 허용 여부
    // unique: 중복 허용 여부 (false 일때 중복 허용)
    @Column(name = "username", nullable = false, unique = true)
    private String username;

    // length: 컬럼 길이 지정
    @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)
    • auto increment와 동일
  • @Column : 컬럼 설정

영속성 컨텍스트란 무엇일까?

영속성 컨텍스트란?

  • Entity객체를 효율적으로 쉽게 관리하기 위해 만들어진 공간

EntityManagerFactory

  • Persistence.xml설정을 토대로 만들어져 동작
  • EntityManager를 만들어냄

EntityManager

  • 영속성 컨텍스트에 접근하여 Entity을 관리하는 관리자

JPA의 트랜잭션

  • 정합성&무결성을 유지하기위한 논리적 개념

영속성 컨텍스트의 기능

1차 캐시

  • 영속성 컨텍스트 내부에 존재
  • Map자료구조 형태로 되어있다
    • key : id값
    • value : 객체
  • 1차 캐시의 장점 : DB조회횟수 줄임, 객체 동일성 보장

A. Entity 저장

  • em.persist(객체);

B. Entity 조회

  • em.find(객체.class, id);
  • 캐시저장소에 해당값이 없다면, DB에 SELECT조회 후 가져옴

C. Entity 삭제

  • em.remove(객체);

쓰기 지연 저장소(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)

  • em.persist(객체);

준영속(Detached)

  • 영속되었다가 분리된 상태
    • detach(객체) : 매개변수에 있는 객체만 분리
    • clear() : 영속성 컨텍스트에있는 모든 객체를 분리
    • close() : clear() + 종료
  • merge : 준영속 -> 영속
    • 저장기능수행 : 지목한 객체가 DB에 없을때
    • 수정기능수행 : 지목한 객체가 DB에 있을때

삭제(Removed)

  • em.remove(객체);

0개의 댓글