Advance I/Spring

22.04.22

kinggora 2022. 4. 22. 17:17

스프링 통합 테스트(스프링 컨테이너+DB)

@SpringBootTest

Test는 반복적인 환경이어야 한다.

@Transactional: insert query 후 commit 작업을 해야 DB에 반영되는데, 해당 에노테이션이 테스트 케이스에 있으면 테스트가 끝나면 commit을 하지 않고 rollback하여 테스트 데이터가 DB에 반영되지 않게 해준다.

<->@Commit

 

순수한 자바 테스트(단위 테스트)가 좋은 테스트일 확률이 높다. 관련 훈련을 하는 것이 중요하다. 

 

*이전 실행 다시 실행: ctrl+R

 

JPA

JPA: 자바 ORM 기술에 대한 API 표준 명세. 일종의 인터페이스. ORM(Object Relational Mapping)

Hibernate: JPA 구현체. 라이브러리.

spring.jpa.hibernate.ddl-auto=none   (in application.properties)

JPA는 데이터 객체를 보고 테이블을 자동으로 생성한다. 예제에서는 테이블이 만들어져 있기 때문에 해당 기능을 끄고 시작한다.

에노테이션을 통해 자바 클래스(@Entity)의 인스턴트 변수와 DB내 컬럼명 mapping

 

EntityManager: 스프링 부트가 생성해서 넘겨주는 객체로 Entity 정보+DB 커넥션+Data Source 등을 포함

PK(primary key) 기반으로 찾는 query문은 Entitymanager의 find문으로 대체 가능하나, 더 복잡한 검색은 jpql문을 작성해야 한다.

jpql: 테이블이 아닌 객체를 검색하는 객체지향 쿼리.

 

JPA를 사용할 때는 항상 @Transaction 에노테이션이 필요

 

스프링 데이터 JPA

스프링 데이터 JPA가 JpaRepository를 받은 인터페이스의 구현체를 자동으로 생성하여 스프링 Bean으로 등록한다.

JpaRepository는 CRUD와 관련된 메서드를 제공한다. 통용되지 않는 메서드는 규칙에 맞는 이름의 추상메서드를 정의해주면 쿼리를 생성하여 제공한다.

 

AOP (Aspect Oriented Programming)

공통 관심 사항 ex. 모든 메서드 호출시간 측정

핵심 관심 사항 ex. 회원가입, 회원 찾기

공통 관리 사항과 핵심 관리 사항이 섞여있을 때 유지보수가 어렵다.

이것들을 분리하는 기술 -> AOP

 

공통 관심 사항을 클래스(@Aspect)로 작성

@Around("execution(해당 공통 관심 사항을 적용할 범위 지정)")

 

스프링 컨테이너에서 프록시(실제 Bean이 아닌 복제)를 의존시킨다.

 

*Database

가벼운 H2는 로컬용으로 많이 사용,

운영은 mysql 기반의 AWS 오로라DB를 많이 사용

JPA를 쓰면 DB를 갈아끼우는데 편리하기 때문

 

 

다음으로...

거대한 스프링의 모든 것을 세세하게 알 필요는 없다.

스프링을  활용해서 실무에서 발생하는 문제를 잘 해결하는 것이 중요