본문 바로가기
Today I Learned 2024. 5. 16.

(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로 완성하려고 했으나, 뭐 알턱이 었어서 괜히 시도를 했나 싶었다.