티스토리 뷰

Spring Data JPA에서 Id의 @GeneratedValue 이슈

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
  • 위의 코드로 익숙한 Entity에서 Id 부분, 우리는 GenerationType.AUTO가 DB 벤더에 알맞은 전략을 선택해주기 때문에 DB 종속성이 약해져 GenerationType.Identity(MySQL의 auto increment 역할)보다 적절하다고 알고있었다.
  • 그러다 리팩토링을 진행하며, GenerationType.Identity 일땐 잘 작동하던게 GenerationType.AUTO로 바꾸니 에러가 나기 시작했다.
  • 검색해보니 오늘도 jojoldu님에게 도움을 받을수있었다. https://jojoldu.tistory.com/295
  • 링크에 정리 잘 되어있어 읽으면 되지만, 간략히 요약해보면 다음과 같다.
  • (rough한 요약) Hibernate 예전 버전은 알던대로 AUTOIdentity였다. 하지만 Hibernate 버전이 올라가며 특정 버전부터 AUTOTable로 바뀌었다. (MySQL의 경우)
  • 이에 대한 해결책은 2가지를 제시해주셨다. 단순히 Identity로 바꾸거나, application.properties 또는 yml 파일에 해당 Hibernate 옵션 설정을 끄는 방법.
  • 우린 첫 문단에 언급한대로 Identity는 피하고싶어서 후자의 방법을 택해, 설정파일을 수정해 해당 이슈를 해결했다.
  • https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.4-Release-Notes#generator-mappings

Mockito를 사용하기 위한 @ExtendWith 추가

  • 서비스 테스트에 Mockito를 사용하는 과정에서, Mockito는 기본 스프링 부트 test 의존성에 들어있어서 바로 사용할 수 있었다.
  • testImplementation 'org.springframework.boot:spring-boot-starter-test'
  • 테스트를 짜고 돌리니 이번에도 터지기 시작했다. 찾아보니 Spring의 빈들과 Mockito는 서로 모른다, 이들을 통합시켜주기위해 @ExtendWith(SpringExtension.class) 를 테스트 클래스에 추가해줘야했다.
  • @ExtendWith(SpringExtension.class) 도 되고, @ExtendWith(MockitoExtension.class) 도 된다.
  • 이 과정에서 추가로 @RunWith@ExtendWith 의 차이도 덤으로 알게되었다. JUnit 버전 차이였다.
  • https://stackoverflow.com/questions/55276555/when-to-use-runwith-and-when-extendwith

Mockito를 활용한 서비스 레이어 테스트

  • 오랜만에 서비스 테스트를 짜며 Mockito를 활용했다. 기억이 하나씩 되살아났다.
  • 우리 프로젝트에선 서비스 메소드의 로직이 여전히 너무나 간단해서, 서비스 테스트의 의미가 크진 않은것 같다. 동시에 모킹하며 테스트하는게 '짜고치는 고스톱'이라는 느낌을 여전히 벗을수없었다.
  • 하지만 나중에 서비스 로직이 복잡해지면 이는 해결될거라 생각.
  • 이 과정에서 하나 오해했던걸 풀수있었다. givenBDDMockito꺼, whenMockito꺼다. 별개다. given-when-then이 given()-when()-verify()로 매칭되는거란건 착각이엇다. 각각 상황에 맞게 사용하자. 재밌는 메소드들도 많이 발견했다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함