- 목표: 데이터 접근 기술에 대한 기본 이해와 전체 큰 그림을 그린다. (+각 기술들의 핵심 내용과 장단점)
데이터 접근 기술 - 시작
-
SQLMapper: JdbcTemplate, MyBatis
-
ORM 관련 기술: JPA, Hibernate, JPA, Querydsl
- ORM 기술이 데이터베이스에 해당 객체를 저장하고 조회해준다. (기본적인 SQL을 대신 작성하고 처리해준다.)
- JPA는 자바 진영의 ORM 표준이고, Hibernate는 JPA에서 가장 많이 사용하는 구현체이다. 자바에서 ORM을 사용할 때는 JPA 인터페이스를 사용하고 그 구현체로 하이버네이트를 사용한다고 생각하면 된다.
프로젝트 설정과 메모리 저장소
<item 검색, 추가, 수정.. 기능 웹페이지>
-
ItemRepository#findAll()에는 검색 조건이 들어간다.
-
수정할 때, ItemUpdateDto를 쓴다.
- DTO는 기능은 없고 데이털르 전달만 하는 용도로 사용되는 객체를 뜻한다. 참고로 DTO에 기능이 있으면 안되는 건 아니지만, 객체의 주 목적이 데이터를 전송하는 것이라면 DTO라고 할 수 있다.
-
Optional: 값이 있을 수도 있고 없을 수도 있다를 알려주는 통
-
MemberItemRepository#findAll(): stream()을 사용한 검색 조건(가격, 이름) 구현
-
MemberItemRepository#clearStore(): Item이 중복돼서 생겨날 에러를 미리 방지하기 위한 메소드 (test할 때만 이용)
-
itemService: repository에 위임만 하는 단순한 로직 이용, (interface로 구현)
-
redirect/items: localhost:8080이라고 쳤을 때 localhost:8080/items로 리다이렉트해줌
? DTO를 어느 위치에 놓냐
- ItemRepository에 ItemUpdateDto, ItemSearchCond가 속하는 게 기능 흐름상 맞다.
프로젝트 구조 설명2 - 설정
- MemoryConfig: ItemServiceV1, MemoryItemRepository를 스프링 빈으로 수동 등록하고 생성자를 통해 의존자를 주입한다.
- TestDataInit: 자동으로 샘플 데이터 주입시켜주는 기능 (샘플 데이터가 한 두개는 있어야 기능 구현 확인 가능하니까!)
- @EventListener(ApplicationReadyEvent.class): 스프링 컨테이너가 완전히 초기화를 다 끝내고, 실행 준비가 되었을 때 발생하는 이벤트이다. 스프링이 이 시점에 해당 애노테이션이 붙인 initData()메서드를 호출한다.
- 이 기능 대신 @PostConstruct를 사용할 경우, AOP 같은 부분이 아직 다 처리되지 않은 시점에 호출될 수 있기 때문에 간혹 문제가 발생할 수 있다. (@Transactional과 같은 문제..)
- scanBasePackages = "hello.itemservice.web": 여기서는 컨트롤러만 컴포넌트 스캔을 사용하고 나머지는 직접 수동 등록한다. 안 그러면 모든 게 컴포넌트 스캔 설정됨
프로필 기능
- application.properties: spring.profiles.active=local
- 스프링은 local이라는 프로필을 동작한다.
- @Profile("local")가 동작하고 'testDataInit'가 스프링 빈으로 등록된다.
- "test 프로필"
- application.properties: spring.profiles.active=test
- 프로필 기능 덕분에 테스트 케이스에는 "test" 프로필이 실행된다. 따라서 TestDataInit는 스프링 빈으로 추가되지 않고 따라서 초기 데이터도 추가되지 않는다. (main 데이터가 오염되지 않게!)
프로젝트 구조 설명3 - test
- #afterEach(): 테스트는 서로 영향을 주면 안된다. 따라서 각각의 테스트가 끝나고 나면 저장한 데이터를 제거한다. (#clearStore()를 통해!)
- @AfterEach는 각각의 테스트의 실행이 끝나는 시점에 호출된다.
- 인터페이스를 테스트하자!
- 다른 구현체로 변경되었을 때 그 구현체가 잘 작동하는지 확인 가능
데이터베이스 테이블 생성
- H2 데이터베이스에 item 테이블을 생성한다.
- PK로 사용되는 id는 값을 비워두면 알아서 데이터가 생성될 때마다 수가 늘어난다.
참고 - 권장하는 식별자 선택 전략
1) null 값은 허용하지 않는다.
2) 유일해야 한다.
3) 변해선 안 된다.