08. MVC패턴(JPA, Hibernate, 의존성 주입)

박선규's avatar
Jan 26, 2024
08. MVC패턴(JPA, Hibernate, 의존성 주입)

mvc패턴 = 디자인 패턴

📌
mvc패턴은 기본적으로 model=DTO, DAO (데이터와 비즈니스 로직) view= 사용자의 인터페이스 담당 controller= 모델과 뷰 사이의 상호작용 관리 MVC패턴은 = 디자인 패턴이다.
notion image

JPA(Java Persistence API)

  • 자바로 데이터 베이스를 영구히 기록할 수있는 API(메서드들의 모음)
  • 자바 스프링 부트의 데이터베이스 관리 기술
    • H2는 스프링 프레임워크와도 호환성이 뛰어나며, 스프링 부트를 사용하는 경우 기본적으로 내장형 H2 데이터베이스를 사용할 수 있습니다. 이를 통해 개발자는 별도의 데이터베이스 설치나 구성 없이 애플리케이션을 실행하고 테스트할 수 있습니다.
  • ResultSet으로 받지 않고 자바 오브젝트로 바로 바꿔준다.
📌
JPA를 사용하지 않았을 때 자바에서 DB로 데이터가 가는 과정
  1. ResultSet을 한다.(테이블 형태의 데이터)
  1. 커서를 내리면서 파싱한다.
  1. 자바 오브젝트에 넣는다.
JPA는 이러한 과정을 뛰어넘고 자바 오브젝트 단계로 바로 간다. → 엔티티 매니저(EntityManager)를 통해 쿼리 결과를 자동으로 자바 객체에 매핑
 

하이버네이트(Hibernate)

  • 객체 지향 모델과 관계형 데이터베이스를 매핑 해주는 역할을 한다.
  • SQL을 직접 작성하지 않고 객체를 다룰 수 있도록 해준다.
  • JPA의 구현체 중 하나이다.
👉
하이버네이트의 실행 과정
  1. 스프링이 실행 될 때 전체 스캔 해서 @Entity를 찾는다.(리플렉션)
  1. 테이블을 생성하는 쿼리를 만들어냄
  1. (@Entity가 없으면 리플렉션이 아니다)
  • 하이버 네이트를 활용하여 만든 테이블 코드
    • 코드
      package shop.mtcoding.blog.user; import lombok.Data; import org.hibernate.annotations.CreationTimestamp; import javax.persistence.*; import java.time.LocalDateTime; @Data //getter,setter, to string @Entity @Table(name = "user_tb") //테이블명 public class User { @Id // prrimary @GeneratedValue(strategy = GenerationType.IDENTITY) //autoincrement (자동증가) private int id; @Column(unique = true) private String username; @Column(length = 60, nullable = false) private String password; private String email; @CreationTimestamp private LocalDateTime createdAt; }
       

      @Entity

      📌
      엔티티 매핑: @Entity가 붙은 클래스는 JPA가 관리하는 엔티티가 됩니다. 이 엔티티는 데이터베이스의 테이블과 매핑되며, 클래스의 각 인스턴스는 테이블의 행에 해당합니다. 데이터베이스 연산: JPA는 @Entity가 붙은 클래스의 인스턴스에 대해 CRUD(Create, Read, Update, Delete) 연산을 수행할 수 있습니다. 이는 JPA가 데이터베이스와의 상호작용을 대신 처리해주므로, 개발자는 SQL 쿼리를 직접 작성할 필요가 없습니다.영속성 컨텍스트 관리: JPA는 @Entity가 붙은 클래스의 인스턴스를 영속성 컨텍스트에서 관리합니다. 이는 엔티티의 생명주기를 관리하고, 데이터베이스와의 동기화를 처리합니다.
       
의존성 주입 (Dependency Injection)
  • 객체 간의 결합도를 낮추어 유지 보수와 테스트 용이성을 높인다.
  • 필요한 의존 객체를 외부(컨테이너 또는 프레임워크)에서 전달(주입)받는 방식한다. → IoC(제어 역전)의 데이터를 가져다 쓰는 것이다.
  • 사용방법: 생성자의 매개변수의 사용하려는 객체 주입
  • 의존성 주입 예시 코드 (간단)
📌
결론 UserRepository 파라미터에 EntityManager가 있으면 의존성 주입에 법칙에 따ioc컨테이너의 UserRepositoy가 new 될 때 EntityManger도 같이 new되는 걸로 인식
코드
package shop.mtcoding.blog.user; import jakarta.persistence.EntityManager; import jakarta.persistence.Query; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @Repository // IoC에 new할 수 있고, 데이터 베이스 연동 public class UserRepository { // DB에 접근할 수 있는 매니저 객체 // 스프링이 만들어서 IoC에 넣어둔다. // DI에서 꺼내 쓰기만 하면된다. private EntityManager em; // 생성자 주입 (DI 코드) //DI:의존성 주입 public UserRepository(EntityManager em) { this.em = em; }
예시 사진
notion image
 

@Repository

📌
예외처리: @Repository는 데이터 접근 중에 발생하는 예외를 스프링의 DataAccessException으로 변환합니다. 이는 코드의 일관성을 유지하고, 데이터 접근 계층에서 발생하는 예외를 추상화하여 DAO를 데이터베이스 기술(JDBC, Hibernate, JPA 등)에 독립적으로 만들 수 있게 합니다 .스프링 IoC 컨테이너의 빈으로 등록: @Repository 어노테이션이 붙은 클래스는 스프링 IoC 컨테이너에 의해 인스턴스화, 설정 및 생명주기를 관리받게 됩니다. 이를 통해 개발자는 객체 생성과 소멸 등의 과정을 직접 관리할 필요가 없습니다. 데이터베이스 연동: @Repository를 사용하면 데이터베이스 연동 작업을 보다 쉽게 처리할 수 있습니다. JDBC, Hibernate, JPA 등 다양한 데이터베이스 기술과의 연동을 지원하며, 이에 따른 CRUD 작업을 쉽게 수행할 수 있습니다.
 
 
Share article
RSSPowered by inblog