option + command + N
: Inline
📌 sql과 jpql 차이
- sql: 테이블을 대상으로 쿼리
- jpql: 엔티티를 대상으로 쿼리
기능
save()
findOne()
: 단건 조회findAll()
: 리스트 조회findByName()
기술
@Repository
: 스프링 빈으로 등록해 JPA 예외를 스프링 기반 예외로 예외 변환@PersistenceContext
: 엔티티 매니저(EntityManager) 주입@PersistenceUnit
: 앤티티 매니저 팩토리(EntityManagerFactory) 주입 (em이 있어 거의 사용 안할듯)
👩🏻💻 주석으로 설명해놨으니 코드를 보는 것이 좋음
기술
@Service
@Transactional
: 트랜잭션, 영속성 컨텍스트
- readOnly=true: 데이터 변경이 없는 읽기 전용 메소드에 사용. 영속성 컨텍스트를 플러시 하지 않으므로 약간 성능을 향상시킬 수 있음
- 데이터베이스 드라이버가 지원하면 DB에서 성능 향상@Autowired
: 생성자 Injection 많이 사용. 생성자가 하나면 생략도 가능한.
기능
join()
findMembers()
findOne()
// MemberService.java
private final MemberRepository memberRepository;
// setter 인젝션(필드에 바로 주입하는 것이 아니라 setter를 통해 주입)
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
// MemberService.java
private final MemberRepository memberRepository;
// 생성자 인젝션 방법. 스프링이 뜰 때 생성자에서 인젝션 해줌(이후 변경될 위험이 사라짐)
// 생성자가 지금처럼 딱 하나만 있는 경우에는 스프링이 자동으로 인젝션 해줘서 어노테이션 생략해도 됨
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
를 생략할 수 있다.@RequiredArgsConstructor // final이 있는 필드만 가지고 생성자를 만들어줌
public class MemberService {
- 회원가입에 성공하기
- 회원가입시 동일 이름 가입 불가
command + shift + T
: 테스트케이스 생성
persist()한다고 데이터베이스에 insert query가 날아가진 않음.
em.flush();
: 영속성 컨텍스트에 있는 변경된 내용들을 데이터베이스에 반영
기술
@RunWith(SpringRunner.class)
: 스프링 테스트 통합@SpringBootTest
: 스프링부트 띄우고 테스트(이게 있어야@Autowired
가 작동)@Transactional
: 반복 가능한 테스트 지원. 각각의 테스트를 실행할 때마다 트랜잭션을 시작하고 테스트가 끝나면 트랜잭션을 강제로 롤백 (이 어노테이션이 테스트 케이스에서 사용될 때만 롤백)
기능
- 회원가입 테스트
- 중복 회원 예외처리 테스트
오,, 나 지금까지 파일 구조 이상하게 두고 있었네,,
domain안에 repository 디렉토리, service 디렉토리가 들어가 있어서 자꾸 테스트 케이스가 실패했었다,,
테스트는 케이스 격리된 환경에서 실행, 끝나면 데이터 초기화를 해두는 것이 좋다.
그런 면에서 메모리 DB를 사용하는 것이 가장 이상적이다.
추가로 테스트 케이스를 위한 스프링 환경과 일반적으로 애플리케이션을 실행하는 환경은 보통 다르므로 설정 파일을 다르게 사용하면 좋다.
test/resources파일 만들기/application.yml복사해 넣기
그리고 주석처리해도 동작하는 이유는 아무 조건이 없다면 그냥 메모리 모드로 자동 작동하기 때문에 잘 동작할 수 있었던 것이다.
driver-class
도 현재 등록된 라이브러리를 보고 찾아주며 ddl-auto
도 create-drop
모드로 동작한다.
따라서 데이터소스나 JPA 관련 별도의 추가 설정을 하지 않아도 된다.