[ElectionPJT] 3. City Service 개발

Jake·2022년 3월 16일
0

프로젝트

목록 보기
3/9

도시 서비스는 회원(Member)에게 노출되는 기능은 아니고, 서비스 제공자에게만 노출되는 기능

1. 지원 기능

  • 도시(선거구) 등록

2. City Repository

@Repository
@RequiredArgsConstructor
public class CityRepository {

    private final EntityManager em;

    public void save(City city) {
        em.persist(city);
    }

    public City findOne(Long id) {
        return em.find(City.class, id);
    }

    public List<City> findAll() {
        return em.createQuery("select c from City c", City.class).
                getResultList();
    }

    public List<City> findByDistrict(District district) {
        List<City> cityList = em.createQuery("select c from City c where c.district = :district", City.class)
                .setParameter("district", district)
                .getResultList();

        return cityList;
    }
}

3. City Service

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class CityService {

    private final CityRepository cityRepository;

    @Transactional
    public Long join(City city) {
        validateDuplicateCity(city);
        cityRepository.save(city);
        return city.getId();
    }

    public void validateDuplicateCity(City city) {
        List<City> cityList = cityRepository.findByDistrict(city.getDistrict());
        if(!cityList.isEmpty()) {
            throw new IllegalStateException("이미 존재하는 도시입니다.");
        }
    }
}

4. City Service Test

테스트 요구사항

  • 도시 등록에 성공해야 한다.
  • 구역으로 도시를 찾을 수 있어야 한다.
  • 도시를 등록할 때, 이미 같은 District의 도시가 있으면 예외가 발생해야 한다.

테스트 코드

@SpringBootTest
@Transactional
class CityServiceTest {

    @Autowired CityRepository cityRepository;
    @Autowired CityService cityService;

    /**
     * 도시 추가
     */
    @Test
    public void join() throws Exception {
        //given
        District district = new District("s1", "s2", "s3");
        City city = new City(district);

        //when
        Long cityId = cityService.join(city);

        //then
        assertEquals(city, cityRepository.findOne(cityId));
    }

    @Test
    public void 구역으로_찾기() throws Exception {
        //given
        District district = new District("s1", "s2", "s3");
        City city1 = new City(district);

        //when
        cityService.join(city1);

        //then
        assertEquals(city1, cityRepository.findByDistrict(district).get(0));
    }

    @Test
    public void 도시_중복_확인() throws Exception {
        //given
        District district = new District("s1", "s2", "s3");
        City city1 = new City(district);
        cityService.join(city1);

        //when
        City city2 = new City(district);
        try{
            cityService.join(city2);
        } catch (IllegalStateException e) {
            return;
        }

        //then
        Assertions.fail();


    }
}

테스트 결과


테스트 성공!

테스트 코드는 Spring과 독립적으로, 순수 자바 코드만으로 동작하는 테스트 코드가 좋다고 하는데
거기까지는 아직 감이 안 잡힌다.

profile
Java/Spring Back-End Developer

0개의 댓글