You will be fine

<Spring & JPA 웹서비스 만들기 > 구현 (1) - 엔티티's

by BFine
반응형

가. User 엔티티

a. 테이블에 데이터 추가하기

  • TDD를 제대로 본적이 없어서 이렇게 하는게 맞는지는 모르겠다...
  • 일단 유저이름으로 등록하는 테스트 코드를 먼저 작성해보았다.

  1. @DataJpaTest 로 들어가보면 오직 JPA와 관련된 컴포넌트만 로딩한다고 써있다.
  2. @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());
       
    }
}
반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기