<Spring & JPA 웹서비스 만들기 > 구현 (1) - 엔티티's
by BFine반응형
가. User 엔티티
a. 테이블에 데이터 추가하기
- TDD를 제대로 본적이 없어서 이렇게 하는게 맞는지는 모르겠다...
-
일단 유저이름으로 등록하는 테스트 코드를 먼저 작성해보았다.
@DataJpaTest
로 들어가보면 오직 JPA와 관련된 컴포넌트만 로딩한다고 써있다.@AutoConfigureTestDatabase(replace=Replace.NONE)
하면 H2가 아닌 실제DB연동
-
위의 테스트는 당연히 실패한다. → User 클래스를 만들자!
@Builder @Getter @NoArgsConstructor @AllArgsConstructor @Entity @EntityListeners(AuditingEntityListener.class) // @CreatedDate, @LastModifiedDate를 사용할때 설정해주어야한다. @Table(name = "USERS") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column(unique = true) private String name; @ColumnDefault("0") private int amount; @CreatedDate private LocalDateTime createdDate; @LastModifiedDate private LocalDateTime lastModifiedDate; }
-
Error executing DDL "drop table if exists user cascade" via JDBC Statement
- Postgresql 에서 user라는 명칭은 예약어기 때문에 Users로 변경해야함
-
테스트 코드를 다시 실행해 보면.. 통과가 된다. Repository Class를 만들어본다
@Slf4j @RequiredArgsConstructor @Repository public class UserRepository { private static final int FAIL = 0; private final EntityManager em; @Transactional public void save(String name) { try { User userEntity = User.builder().name(name).build(); em.persist(userEntity); } catch (Exception e) { log.error( "유저 생성에 실패했습니다." , e.toString()); } }
-
테스트도 만들어본다 (뭔가 TDD가 변질된 느낌이 든다..)
@SpringBootTest @AutoConfigureTestDatabase(replace=Replace.NONE) public class UserRepositoryTest { @PersistenceContext EntityManager em; @Autowired UserRepository userRepository; @Test public void 유저생성테스트() { String name = "김철수"; userRepository.save(name); User user = em.find(User.class, 1L); assertEquals(name, user.getName()); }
-
굳이 JPA 테스트를 안만들고 UserRepositoryTest 만 만드는 편이 더 나을뻔 했다..\
- 사실 Data Jpa의 interface를 사용하는게 편하지만 공부할겸해서 EntityManager로 만들었다.
- 중복되는지도 테스트 클래스를 만들어보자
@Test
public void 유저중복테스트() {
String name = "김철수";
userRepository.save(name);
assertThrows(DataIntegrityViolationException.class, ()->{
userRepository.save(name);
});
}
=== 결과(성공)
2021-01-31 15:34:51.635 ERROR 15224 --- [
오류: 중복된 키 값이 "uk_3g1j96g94xpk3lpxl2qbl985x" 고유 제약 조건을 위반함
Detail: (name)=(김철수) 키가 이미 있습니다.
b. 누적금액업데이트 테스트
- 랜덤으로 뽑은 이름이 있다고 가정하고 해당 컬럼에 누적금액을 업데이트 해본다
@Transactional
public int updateAmount(List<String> pickList,DrawRequestDTO drawRequestDTO) {
String jpql = "UPDATE User u SET u.amount = u.amount + :bet WHERE u.name IN :pickList";
try {
Query createQuery = em.createQuery(jpql);
createQuery.setParameter("bet", drawRequestDTO.getBet());
createQuery.setParameter("pickList", pickList);
return createQuery.executeUpdate();
} catch (Exception e) {
log.error("결과업데이트에 실패했습니다.",e);
}
return FAIL;
}
- JPQL을 사용해서 해당 name을 가진 컬럼에 걸린 금액만큼 추가해준다.
- 테스트 코드를 작성해본다.
@Test
public void 누적금액업데이트() {
List<String> pickList = Arrays.asList("김철수","김영희");
DrawRequestDTO requestDTO = DrawRequestDTO.builder().bet(1000).build();
int result = userRepository.updateAmount(pickList, requestDTO);
assertNotEquals(0,result);
}
나. Calendar 엔티티 & Log 엔티티
a. 테이블에 데이터 추가하기
- Calendar 테이블에는 년월일에 추첨한 결과를 Insert해서 보여주는 부분이다.
- Log 테이블에는 기록을 남겨야하니 어떤추첨, 제목, 걸린사람, 가격을 Insert해서 가지고 있는다.
- 마찬가지로 JPA 테스트를 해본다. 크게 처리해줄 부분은 없는것 같다.
@DataJpaTest
public class CalendarJpaTest {
@Autowired
EntityManager em;
@Test
public void 캘린더JPA테스트() {
int year = 2020;
int month = 1;
int day = 16;
Calendar calendar = Calendar.builder()
.year(year).month(month).day(day)
.build();
em.persist(calendar);
Calendar actualCalender = em.find(Calendar.class,calendar.getId());
assertEquals(year,actualCalender.getYear());
}
}
@DataJpaTest
public class LogJpaTest {
@Autowired
EntityManager em;
@Test
public void 로그JPA테스트() {
String subject = "아침 스타벅스 커피값 추첨";
Log log = Log.builder().title(subject).build();
em.persist(log);
assertEquals(subject, log.getTitle());
}
}
반응형
'공부 > JPA' 카테고리의 다른 글
<Spring & JPA 웹서비스 만들기 > 구현 (4) - 화면 구성 (0) | 2021.02.06 |
---|---|
<Spring & JPA 웹서비스 만들기 > 구현 (3) - Redis 자동완성 (0) | 2021.01.31 |
<Spring & JPA 웹서비스 만들기 > 구현 (2) - 서비스's (0) | 2021.01.31 |
<Spring & JPA 웹서비스 만들기 > 설계 (2) - DB & TDD (0) | 2021.01.15 |
<Spring & JPA 웹서비스 만들기 > 설계 (1) (0) | 2021.01.14 |
블로그의 정보
57개월 BackEnd
BFine