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

JPA(Java Persistence API)
- 자바로 데이터 베이스를 영구히 기록할 수있는 API(메서드들의 모음)
자바 스프링 부트
의 데이터베이스 관리 기술- H2는 스프링 프레임워크와도 호환성이 뛰어나며, 스프링 부트를 사용하는 경우 기본적으로 내장형 H2 데이터베이스를 사용할 수 있습니다. 이를 통해 개발자는 별도의 데이터베이스 설치나 구성 없이 애플리케이션을 실행하고 테스트할 수 있습니다.
- ResultSet으로 받지 않고 자바 오브젝트로 바로 바꿔준다.
JPA를 사용하지 않았을 때 자바에서 DB로 데이터가 가는 과정
- ResultSet을 한다.(테이블 형태의 데이터)
- 커서를 내리면서 파싱한다.
- 자바 오브젝트에 넣는다.
JPA는 이러한 과정을 뛰어넘고 자바 오브젝트 단계로 바로 간다.
→ 엔티티 매니저(EntityManager)를 통해 쿼리 결과를 자동으로 자바 객체에 매핑
하이버네이트(Hibernate)
- 객체 지향 모델과 관계형 데이터베이스를 매핑 해주는 역할을 한다.
- SQL을 직접 작성하지 않고 객체를 다룰 수 있도록 해준다.
- JPA의 구현체 중 하나이다.
하이버네이트의 실행 과정
- 스프링이 실행 될 때 전체 스캔 해서 @Entity를 찾는다.(리플렉션)
- 테이블을 생성하는 쿼리를 만들어냄
- (@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;
}
예시 사진

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