- 데이터베이스
- DBMS(Database managements system)
- 데이터베이스 관리 및 운영
- MySQL, 오라클
- 관계형 DBMS(RDBMS)
- 테이블 형태로 이루어진 데이터 저장소
- 각 행은 고유의 키(아이디)를 가지고 있고 값들이 들어간다.
- DBMS(Database managements system)
- ORM(object-relational mapping)
- 자바의 객체와 데이터베이스를 연결하는 프로그래밍 기법
- SQL을 직접 작성하지 않고 데이터베이스에 접근
- JPA(Java Persistence API)
- 자바에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
- 사용시 ORM 프레임워크 사용(hibernate, 내부적으로는 JDBC API 사용)
- 데이터베이스- JDBC- 하이버네이트- JPA- 스프링데이터JPA- 애플리케이션
- 엔티티(Entity)
- 데이터베이스의 테이블과 매핑되는 객체 (직접 연결)
- 스프링 부트는 내부에서 엔티티 매니저 팩토리를 하나만 생성해서 관리하고 @PersistenceContext 또는 @Autowired 어노테이션을 사용해서 엔티티 매니저를 사용
- 영속성 컨테스트
- 영속성 컨테스트는 엔티티를 관리하는 가상의 공간이다.
- 엔티티 매니저는 엔티티를 영속성 컨테스트에 저장한다는 특징이 있다.
- 1차 캐시
- 영속성 컨텍스트는 내부의 1차 캐시를 가지고 있다.
- 캐시의 키는 엔티티의 @Id 어노테이션이 달린 기본키 역할을 하는 식별자이며 값은 엔티티이다.
- 엔티티를 조회하면 1차 캐시에서 데이터를 조회하고 값이 있으면 반환, 없으면 DB에서 조회 후 1차 캐시에 저장한 다음 반환. 캐시된 데이터를 조회할 때는 DB를 거치지 않아서 빠르게 조회 가능
- 쓰기 지연
- 트랜잭션을 커밋하기 전에는 DB에 실제로 질의문을 보내지 않고 쿼리를 모았다가 트랜잭션을 커밋하면 모았던 쿼리를 한번에 실행하는 것을 의미
- 변경 감지
- 트랜잭션을 커밋하면 1차 캐시에 저장되어 있는 엔티티의 값과 현재 엔티티의 값을 비교해서 변경된 값이 있다면 변경 사항을 감지해 변경된 값을 DB에 자동 반영
- 지연 로딩
- 쿼리로 요청한 데이터를 애플리케이션에 바로 로딩하는 것이 아니라 필요할 때 쿼리를 날려 데이터를 조회하는 것
- 엔티티의 상태
- 엔티티는 4가지의 상태를 가지며, 특정 메서드를 호출해 변경 가능하다.
- 분리 상태(detached)
- 영속성 컨텍스트가 관리하고 있지 않은 상태
- 관리 상태(managed)
- 영속성 컨텍스트가 관리하고 있는 상태
- 비영속 상태(transient)
- 영속성 컨텍스트와 전혀 관계가 없는 상태
- 삭제된 상태(removed)
- 엔티티 상태 변경 예)
public class EntityManagerTest { @Autowired EntityManager em; public void example() { // 엔티티 매니저가 엔티티를 관리하지 않는 상태(비영속 상태) Member member = new Member(1L, "홍길동"); // 엔티티가 관리되는 상태 em.persist(member); // 엔티티 객체가 분리된 상태 em.detach(member); // 엔티티 객체가 삭제된 상태 em.remove(member); } }
- Repository
- 레포지토리란 엔티티에 있는 데이터들을 조회, 저장, 변경, 삭제를 할 때 사용하는 인터페이스로 스프링 데이터 JPA에서 제공하는 JpaRepository 클래스를 상속받아 간단하게 구현할 수 있다.
- 스프링 데이터 JPA(JpaRepository 인터페이스)
- JpaRepository 인터페이스를 내가 만든 인터페이스에서 상속받고, 제네릭에는 관리할 <엔티티 이름, 엔티티 기본키의 타입>을 입력하면 기본 CRUD 메서드 사용 가능
- JpaRepository 상속 예)
public interface MemberRepository extends JpaRepository<Member, Long> { }
- Service 사용 예)
@Service
public class MemberService {
@Autowired
MemberRepository memberRepository;
public void test() {
// 생성
memberRepository.save(new Member(1L, "A")); // 데이터 객체 저장
// 조회
Optional<Member> member = memberRepository.findById(1L); // 단건 조회
List<Member> allMembers = memberRepository.findAll(); // 전체 조회
// 삭제
memberRepository.deleteById(1L);
}
}
728x90
'Back-end > Spring Boot' 카테고리의 다른 글
[Spring Boot] Spring Bean 생성, 주입 방법, @Controller (0) | 2024.03.31 |
---|---|
[Spring Boot] Directory 환경, Architecture, Dependencies 종류, POJO (0) | 2024.03.31 |
스프링부트3 백엔드개발자되기 / 4장 스프링 부트 3와 테스트 (0) | 2023.11.18 |
스프링부트3 백엔드개발자되기 / 3장 스프링 부트 3 구조 이해하기 (0) | 2023.11.18 |
스프링부트3 백엔드개발자되기 / 2장 스프링 부트 3 시작하기 (0) | 2023.11.18 |