스프링 DB - 1강

동동주·2024년 4월 29일
0

인프런_스프링 DB

목록 보기
1/3
  • 목표: 데이터 접근 기술에 대한 기본 이해와 전체 큰 그림을 그린다. (+각 기술들의 핵심 내용과 장단점)

데이터 접근 기술 - 시작

  • 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) 변해선 안 된다.

  • 테이블의 기본 키를 선택하는 전략은 크게 2가지가 있다.

    • 자연 키(natural key)
      • 비즈니스에 의미가 있는가
      • 예: 주민등록번호, 이메일, 전화번호
    • 대리 키(surrogate key)
      • 비즈니스와 관련 없는 임의로 만들어진 키, 대체 키로도 불린다.
      • 예: 오라클 시퀀스, auto_increment, identity, 키생성 테이블 사용
  • "자연키보다는 대리키를 권장한다."

    • 자연 키인 전화번호를 기본키로 선택한다면 그 번호가 유일할 수는 있지만, 전화번호가 없을 수도 있고 전화번호가 변경될 수도 있다. 주민등록번호도 null이 아니고 유일하며 변하지 않는다고 생각할 수 있지만 주민등록번호조차도 변경할 가능성이 있다. (미래를 생각해야한다..)
    • 대리키는 비즈니스와 무관한 임의의 값이므로 요구사항이 변경되어도 기본키가 변경되는 일은 드물다. 대기키를 기본키로 사용하되 주민등록번호나 이메일처럼 자연키의 후보가 되는 컬럼들은 필요에 따라 인덱스를 설정해서 사용하는 걸 권장한다.

0개의 댓글