SpringBoot 클론코딩 - 2일차

김재현·2022년 9월 14일
0

Programmers 프로젝트

목록 보기
3/9

Repository 구성하기

ProductRepository 구성

  • 인터페이스로 ProductRepository를 생성.
    상품을 추가하거나 수정할 수 있는 insertupdate,
    Id, Name, Category로 상품을 찾을 수 있으니 findBy~를 구성해준다.
    Id, Name은 없을수도 있으니 Optional로, Category는 해당 카테고리에 대한 제품을 다건으로 검색하는 메서드니 List로 구성한다.
  • delete 기능을 갖는 메서드까지, 메서드 7개를 정의해준다.

  • Jdbc 템플릿을 이용해서 인터페이스를 구현해준다.
  • NamedParameterJdbcTemplate을 이용해주자.

  • 상품 검색 findAll()을 만들어준다.
    productRowMapper를 사용하고, 이를 정의해주자.

productRowMapper 정의

  • productRowMapper을 사용하기 위해 메서드를 정의해준다.
  • DB 스키마를 생성하자.

  • product 스키마를 만들었다면 맵핑을 해주어야 한다.

  • DB내용과 맵핑을 해준다.
  • Category는 Category.valueOr( )를 사용한다.
    price는 getLong( )
  • createdAt과 updatedAt의 경우 getTimeStamp( )를 로컬데이터로 변환하면서 null 처리를 해야하고, LocalDateTime으로 변환해주는 메서드를 하나 만들어준다.

  • timestamp != null ? timestamp.toLocalDateTime()
    타임스탬프가 null이 아니면 timestamp.toLocalDateTime()으로 반환.
    null이면 null로 반환.

Utils 처리

  • toUUIDtoLocalDateTime를 따로 정의했는데, 같은 곳에 두는 것보다는 다른 클래스를 생성해 자리를 옮겨주고 주입받게 만들자.

Insert 구현하기

  • 데이터를 전달해준다.
  • insert된 것이 한 건이 아니라면 예외를 throw하게 설정한다.
  • ParamMap을 메서드로 정의해준다.
  • NamedParameter로 전달해주기 위해서 UUID_TO_BIN을 사용한다.

  • 내용은 이후 추가.
  • 파라미터 맵을 전달해야하는데, 이중중괄호로 사용해서 초기화를 할 수도 있다. 하지만, 여러 문제가 있다.
  • 대체하기 위해서 Map.of() 메서드를 쓸수도 있지만, null 때문에 에러가 발생한다. (null값이 예상되면 사용 불가.)
  • 때문에 HashMap을 사용해서 만드는 것이 제일 무난하다.

  • paramMap을 정의.

Insert 테스트 만들기

  • SpringBootTest 어노테이션을 붙이면 알아서 스프링부트 애플리케이션을 찾아 세팅해줌.
    빈 설정을 읽어서 컨테이너를 자동으로 생성해줌.

  • pom.xml에 가서 embedded DB설정을 해준다.

  • 테스트 세팅을 해준다.
  • TestMethodOrder( )로 순서를 보장해준다.

  • ProductRepository를 오토와이어링 해주고, newProduct를 새로운 필드로 생성해준다.
  • 에러가 발생하는데, h2 DB로 접속을 하려고 한다. 스프링부트를 실행할 때 데이터소스를 정의하지 않으면, 자동으로 설정된 정보가 추가되어 컨넥션을 맺으려고 한다.
    따라서 테스트 할 때 사용할 접속정보를 전달해주어야한다.

  • test 안에 resources 디렉토리를 만들고 application-test.yaml 파일을 생성해준다.

  • 접속정보를 설정해주어야지 접속을 한다.

에러 수정하기

  • 하지만 또 오류가 발생한다.
    내용을 읽어보니, startstop에서 오류가 발생한다.

(UNHEX(REPLACE(:productId, '-', '')

  • 참고
    참고2
  • 여기 저기 참고해보니, 윈도우에서는 wix DB의 최신버전에 문제가 있다고 한다.
    wix DB의 버전을 다운그레이드 시키고, 그에 맞게 문법을 고쳐 사용해야한다.

  • 버전을 낮추고

  • 문법을 수정해준다.

  • 테스트가 성공적으로 종료되었다.

다른 메서드 구현하기

  • findById findByName findByCategory를 구현하자.
    null이 발생할수도 있기 때문에 try-catch문을 기본적으로 사용해준다.
  • Category의 경우 Enum 타입이기 때문에 .toString()을 사용해 스트링으로 바꿔서 전달해준다.

테스트 작성하기

  • 오류 수정하기

  • 테스트가 실패했다.

  • 이유 : 인스턴스가 매번 테스트 할때마다 새로 랜덤하게 생성됨. 따라서 static으로 주어야한다. static으로 해주어야 new Product가 매번 새로 생성되지 않는다.
  • 테스트가 호출될 때 하나의 인스턴스가 같이 사용되게 바꿔줘야한다.

  • 아니면, TestInstancePER_CLASS로 바꿔주어야 한다.
    이렇게 하면, 메서드 하나마다 인스턴스가 생성되게 된다.

  • 제대로 성공했다.

0개의 댓글