본문 바로가기
Backend - Java Spring/Spring Boot 입문(완)

[SpringBoot3] 데이터베이스

by VictorMeredith 2023. 10. 20.

1. DBMS

- 관리 시스템이다.

- 이미 MySQL을 사용한 적이 있으므로

 

2. H2, MySQL

- H2는 자바로 작성되어 있는 RDBMS이다. 스프링 부트가 지원하는 인메모리 관계형 DB이다.

- H2는 데이터를 다른 공간에 따로 보관하는 것이 아니라 앱 자체 내부에 데이터를 저장하는 특징이 있다.

- H2는 실제 서비스에서는 사용하지 않고, 개발 시 테스트용도로 많이 사용한다.

- 실제 서비스로 올릴 때는 MySQL을 사용한다

 

3. ORM

- Sequelize같은 거다. 자바에서는 JPA를 표준으로 사용한다. JPA는 ORM 인터페이스다.(자바 객체와 DB를 연결한다.)

- 실제 사용을 위해서는 구현을 위해 ORM 프레임워크를 추가로 선택해야 한다. 여기서는 Hibernate를 사용한다.

 

4. 엔티티

- 엔티티 : DB의 테이블과 매핑되는 객체를 의미한다. 본질적으로는 자바 객체이나, DB의 테이블과 직접 연결된다는 특별한 특징이 있다.

- 엔티티 매니저 : 엔티티를 관리해 DB와 앱 사이에서 객체를 생성/수정/삭제 등의 역할을 한다. 엔티티 매니저를 만드는 곳이 엔티티 매니저 팩토리다.

- 엔티티매니저 팩토리에서 생성된 엔티티매니저는 필요한 시점에 DB와 연결한 뒤 쿼리한다.

- 스프링부트는 내부에서 엔티티 매니저 팩토리를 하나만 생성해서 관리하고 @PersistenceContext 또는 @Autowired 를 이용해 엔티티매니저를 사용한다.

- 스프링부트는 기본적으로 빈은 하나만 생성해서 공유하므로, 동시성 문제 제어를 위해 실제 엔티티 매니저가 아닌 연결하는 프록시 엔티티매니저를 사용한다. 필요할 때 DB 트랜잭션과 관련된 실제 엔티티 매니저를 호출한다.

 

5. 영속성 컨텍스트

- 엔티티 매니저는 엔티티를 영속성 컨텍스트에 저장한다.

- 영속성 컨텍스트는 JPA의 중요한 특징으로, 엔티티를 관리하는 가상의 공간이다.

- 1차캐시, 쓰기지연, 변경감지, 지연로딩의 특징이 있다.

1) 1차 캐시

  - 영속성 컨텍스트는 내부에 1차 캐시를 가지고 있다. 이 때 캐시의 키는 엔티티의 @Id 애너테이션이 달린 기본키 역할을 하는 식별자이며, 값은 엔티티이다. 1차캐시에서 데이터를 선조회하고 값이 있으면 반환한다. 없으면 DB에서 조회 후 1차캐시에 저장한 후 반환한다. 빠르게 데이터를 조회할 수 있는 방식이다.

2) 쓰기 지연

  - 트랜잭션을 커밋하기 전까지는 DB에 실제로 질의문을 보내지 않고 쿼리를 모았다가 한번에 보내는 것을 의미한다.

3) 변경 감지

  - 트랜잭션을 커밋하면 1차 캐시에 저장된 엔티티의 값과 현재 엔티티의 값을 비교해서 변경된 값이 있다면 감지해 변경된 값을 자동으로 DB에 반영한다. 적당한 묶음으로 쿼리를 요청해서 DBMS의 부담을 덜어준다.

4) 지연 로딩

- 쿼리로 요청한 데이터를 앱에 바로 로딩하지 않고 필요할 때 쿼리를 날려 데이터를 조회하는 것을 의미한다.

 

6. 엔티티의 상태

- 4가지의 상태를 가진다. 

- 분리 : 영속성 컨텍스트가 관리하고 있지 않는 상태 (.detach()메서드)

- 관리: 관리 상태 (.persist() 메서드)

- 비영속 : 전혀 관계가 없는 상태 (처음 생성 시)

- 삭제된: 삭제된 상태 (.remove()메서드)

- 필요에 따라 상태를 조절해 데이터를 올바르게 유지하고 관리할 수 있다.

 

7. 스프링데이터와 스프링데이터 JPA

- 스프링 데이터에서 제공하는 인터페이스를 통해서 스프링 데이터를 사용할 수 있다.

- CRUD를 포함한 여러 메서드가 포함되어있고, 알아서 쿼리를 만들어준다.

1) Spring Data JPA

- 스프링 데이터의 공통 기능에서 JPA의 유용한 기술들이 추가된 기술이다.

- 이를 사용하면 Repository 역할을 하는 인터페이스를 만들어 DB의 테이블 조회/수정/생성/삭제 작업을 간단히 할 수 있다.

- 아래와 같이 JpaRepository 인터페이스를 내가 만든 인터페이스에서 상속받고 제네릭에는 관리할 <엔티티이름, 엔티티 기본키의 타입>을 입력하면 기본 CRUD 메서드를 사용할 수 있다.

전에 만든거

2) 실습

 

3) 예제코드 어노테이션 살펴보기

- Member.java

- @Entity : Member 객체를 JPA가 관리하는 엔티리로 지정한다. Member클래스와 실제 DB테이블을 매핑한다. @Entity의 속성 중 name을 사용하면 name의 값을 가진 테이블 이름과 매핑되고, 테이블 이름을 지정하지 앟으면 클래스 이름과 같은 이름의 테이블과 매핑된다.(여기서는 member테이블). @Entity(name = "member_list") 와 같이 name 속성을 지정해줄 수 있다.

 

- @NoArgsConstructor(access = AccessLevel.PROTECTED) : protected 기본 생성자. 엔티티는 반드시 기본 생성자가 있어야하고, 접근제어자는 public / protected 여야 한다. 

 

- @Id : Long 타입의 id 필드를 테이블의 기본키로 지정한다.

 

- @GeneratedValue(strategy = GenerationType.IDENTITY) : 기본키 생성방식을 결정한다. AUTO, SEQUENCE, TABLE 등이 있다. IDENTITY는 DB에 위임한다. (=AUTO_INCREMENT)

 

- @Column : DB의 컬럼과 필드를 매핑한다. 

  - name : 필드와 매핑할 컬럼 이름 (설정하지 않으면 필드 이름으로 지정해준다.)

  - nullable : 필드의 null 허용 여부

  - unique : 컬럼의 유일값 여부

  - columnDefinition : 컬럼 정보 설정

 

 

- MemberRepository.java

- Repositoty는 엔티티에 있는 데이터를 조회하거나 저장, 변경, 삭제를 할 때 사용하는 인터페이스로, 스프링데이터 JPA에서 제공하는 인터페이스인 JpaRepository 클래스를 상속받아 간단히 구현할 수 있다.

- 엔티티 Member와 기본키 타입 Long을 인수로 넣어준다. 

댓글