[스프링부트- blogV1] 7. 글 목록 보기 쿼리와 테스트

silver's avatar
Dec 30, 2024
[스프링부트- blogV1]  7. 글 목록 보기 쿼리와 테스트
 
 

1. EntityManger

엔티티 객체와 데이터베이스 간의 매핑과 트랜잭션 관리를 도와준다.
ResultSet rs = em.prepareStatement("쿼리"); ResultSet으로 결과를 받으면, 데이터는 테이블 형태로 그대로 반환되며, 테이블의 각 행(row)은 객체 하나에 해당한다. rs.next()를 통해 반복문을 돌리면서 다음 행으로 이동하며 데이터를 하나씩 추출하며, 각각의 컬럼은 rs.getContent...와 같은 메서드를 이용하여 추출할 수 있다. 이 모든 작업을 간편하게 처리해주는 것이 바로 Spring에서의 EntityManager이다.
 
  • EntityManager는 엔티티 객체를 관리하며, 이를 통해 영속성 컨텍스트(Persistence Context)에서 객체를 추가하거나 제거한다.
  • 쿼리 실행: createQuery, createNamedQuery, createNativeQuery 등의 메서드를 통해 다양한 쿼리를 실행할 수 있다.
  • JPQL(Java Persistence Query Language)을 사용해 데이터베이스에서 복잡한 쿼리를 실행할 수 있다.
  • EntityManager는 트랜잭션 경계를 설정하며, 데이터 작업이 원자성을 유지하도록 보장한다.
 
package com.example.blogv1.board; import jakarta.persistence.EntityManager; import jakarta.persistence.Query; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import java.sql.ResultSet; import java.util.List; @RequiredArgsConstructor @Repository public class BoardRepository { //JPA는 EntityManager로 DB에 접근한다. private final EntityManager em; public List<Board> findAll() { Query q = em.createNativeQuery("select * from board_tb order id by desc",Board.class); return q.getResultList(); } }
 

BoardRepositoryTest

 
풀링 기술(Pooling Technology)
자원을 효율적으로 관리하고 재사용하기 위해 특정 자원을 미리 생성해(실행 시 @Bean으로 띄워놓는다) 놓고 필요할 때마다 가져다 쓰는 방식이다. 주로 데이터베이스 연결, 스레드, 객체 등 다양한 자원에서 사용된다.
<장점> - 자원 재사용: 자원을 매번 새로 생성하는 대신, 미리 생성해 놓은 자원을 재사용하여 성능을 향상시킨다. - 성능 개선: 자원을 생성하고 초기화하는 데 드는 비용을 줄여 애플리케이션의 응답 속도를 높일 수 있다. - 자원 관리: 자원의 수를 제한하여 시스템 자원의 과다 사용을 방지하고, 안정성을 높인다.
예시)
외부에서 요청이 들어오면 톰캣이 request객체로 만들어주는데 여러 요청이 많이 들어올 경우를 대비해 request객체를 여러 개를 만들어놓고 우선 띄워놓고 요청이 들어오면 request에 넣어 필요없어지면 request객체 전체를 버리는게 아니라 안의 data만 버리고 request 객체는 다시 대기….→ pooling기술
 
  1. @DataJpaTest : : DB와 관련된 자원들을 메모리(IoC)에 올린다. -> 최소한의 메모리로 부분적으로 테스트할 수 있다.
    1. @DataJpaTest는 JPA와 관련된 컴포넌트(예: Entity, Repository 등)만 로드
      로드되는 컴포넌트 JPA 관련 빈: EntityManager: JPA를 통해 데이터베이스와 상호작용하는 데 필요 JpaRepositories: Spring Data JPA에서 제공하는 리포지토리 인터페이스@EnableJpaRepositories가 자동으로 적용되어 JPA 리포지토리 구현체가 생성 리포지토리: @Repository가 붙은 인터페이스와 그 구현체가 자동으로 로드됩니다. 이를 통해 데이터베이스 연산을 테스트할 수 있다. 엔티티: JPA 엔티티 클래스 (@Entity가 붙은 클래스)가 사용. 이 클래스들은 데이터베이스 테이블과 매핑 Spring Data JPA의 설정: JPA 관련 설정 (예: Hibernate 설정)과 데이터베이스 연결 설정이 자동으로 구성 H2와 같은 인메모리 데이터베이스가 기본적으로 설정되어 테스트 중에 사용 트랜잭션 관리: @Transactional이 적용되어 각 테스트 메서드가 트랜잭션으로 감싸지고, 테스트가 끝난 후 롤백 로드되지 않는 컴포넌트 Spring MVC 관련 빈: @Controller, @RestController, @Service 등이 로드되지 않는다. 보안 관련 빈: Spring Security와 관련된 설정이나 빈은 포함되지 않는다. 기타 비JPA 관련 빈: 일반적인 Spring 컴포넌트 (예: 유틸리티 클래스, 외부 API 호출 등)는 로드되지 않는다.
       
  1. @Import(BoardRepository.class) 클래스 가져오기
  1. @Autowired
    1. notion image
      IoC에 있는 걸 가져오기위해 Dependency Injection이 필요하다. (DI는 IoC의 한 방식으로, 객체가 필요한 의존성을 외부에서 주입받는 방법) → 의존성 주입의 3가지 방법
      • 생성자 주입: 객체가 생성될 때 필요한 의존성을 생성자의 매개변수로 전달받는 방식 @RequiredArgsConstructor
      • 세터 주입: 객체가 생성된 후, 세터 메서드를 통해 의존성을 주입하는 방식
      • 인터페이스 주입: 특정 인터페이스를 구현하여 의존성을 주입받는 방식으로 잘 사용하지 않는다.
      • 필드 주입 : @Autowired이용해 필드에 직접 주입
      하지만 테스트 클래스는 IoC에 뜨지 않기 때문에 생성자 사용불가 → @AutoWired을 사용한다.
 

System.out.println이 아닌 디버그로 확인하기

notion image
Share article

silver