나와바리 - 회원구역 설정 로직

Sungmin·2023년 4월 11일
0

나와바리 앱은 회원한명당 최대 영역수가 2개로 제한되어있고 동일한 영역은 추가 할 수 없다.

먼저, 하나의 구역설정 메소드를 만들고 그 안에 중복체크와 초과 체크를 한 뒤 만약 초과일 경우 MaximumZoneLimitException예외를 발생 시키고 중복일 경우 ZoneAlreadySetException예외를 발생시킨다.
두 예외에 걸리지 않으면 새 구역 추가 메소드를 실행한 뒤 새로운 영역을 추가하고 저장 한다.

구역설정 메소드

구역 설정 초과 메소드

설정 구역 중복체크 메소드

새 구역 추가 메소드


테스트 코드

class MemberZoneServiceTest {

    @Autowired
    private MemberZoneService memberZoneService;

    @Autowired
    private MemberRepository memberRepository;

    @Autowired
    private ZoneRepository zoneRepository;

    @Autowired
    private MemberZoneRepository memberZoneRepository;

    @Test
    public void 구역초과체크() throws Exception {
        // Given
        MemberDTO memberDTO = new MemberDTO();
        memberDTO.setKakao_id("123");
        memberDTO.setProfile_nickname("Kim");
        memberDTO.setProfile_image("url");
        memberDTO.setGender("male");
        memberDTO.setAge("15");

        ZoneDTO zoneDTO1 = new ZoneDTO();
        zoneDTO1.setCig_cd(10L);
        zoneDTO1.setGu("GangNam");
        zoneDTO1.setDong("Sang");
        zoneDTO1.setLat(11.11);
        zoneDTO1.setLng(22.22);

        ZoneDTO zoneDTO2 = new ZoneDTO();
        zoneDTO2.setCig_cd(20L);
        zoneDTO2.setGu("GangDong");
        zoneDTO2.setDong("Young");
        zoneDTO2.setLat(33.33);
        zoneDTO2.setLng(44.44);

        ZoneDTO zoneDTO3 = new ZoneDTO();
        zoneDTO3.setCig_cd(22L);
        zoneDTO3.setGu("GangBook");
        zoneDTO3.setDong("Sung");
        zoneDTO3.setLat(55.55);
        zoneDTO3.setLng(66.66);



        Member member = Member.toMemberEntity(memberDTO);
        Zone zone1 = Zone.toZoneEntity(zoneDTO1);
        Zone zone2 = Zone.toZoneEntity(zoneDTO2);
        Zone zone3 = Zone.toZoneEntity(zoneDTO3);

        memberRepository.save(member);
        zoneRepository.save(zone1);
        zoneRepository.save(zone2);
        zoneRepository.save(zone3);


        Member findMember = memberRepository.findOne(member.getId());
        Zone findZone1 = zoneRepository.findOne(zone1.getId());
        Zone findZone2 = zoneRepository.findOne(zone2.getId());
        Zone findZone3 = zoneRepository.findOne(zone3.getId());

        //when

        MemberDTO memDTO = MemberDTO.toMemberDTO(findMember);
        ZoneDTO zonDTO1 = ZoneDTO.toZoneDTO(findZone1);
        ZoneDTO zonDTO2 = ZoneDTO.toZoneDTO(findZone2);
        ZoneDTO zonDTO3 = ZoneDTO.toZoneDTO(findZone3);


        //Then
        memberZoneService.setMemberZone(memDTO, zonDTO1);
        memberZoneService.setMemberZone(memDTO, zonDTO2);

        assertThrows(MaximumZoneLimitException.class, () -> {
            memberZoneService.setMemberZone(memDTO, zonDTO3);
        });
    }

먼저 Member에 @NoArgsConstructor(access = AccessLevel.PROTECTED)로 설정했기 때문에 회원 한명과 구역 3개를 dto로 만들어주었다. (dto로 생성하지않고 만드는 방법도 있을 것 같은데 찾아 볼 예정이다.) 한명의 회원에 3개의 구역을 넣어주면 예외가 발생하고

assertThrows는 두 번째 인자인 MemberZoneService.setMemberZone(memDTO, zonDTO3);를 실행하여 첫 번째 인자인 예외 타입과 같은지(혹은 캐스팅이 가능한 상속 관계의 예외인지) 검사한다.


   @Test
    public void 구역중복체크() throws Exception {
        // Given
        MemberDTO memberDTO = new MemberDTO();
        memberDTO.setKakao_id("123");
        memberDTO.setProfile_nickname("Kim");
        memberDTO.setProfile_image("url");
        memberDTO.setGender("male");
        memberDTO.setAge("15");

        ZoneDTO zoneDTO1 = new ZoneDTO();
        zoneDTO1.setCig_cd(10L);
        zoneDTO1.setGu("GangNam");
        zoneDTO1.setDong("Sang");
        zoneDTO1.setLat(11.11);
        zoneDTO1.setLng(22.22);

        ZoneDTO zoneDTO2 = new ZoneDTO();
        zoneDTO2.setCig_cd(20L);
        zoneDTO2.setGu("GangDong");
        zoneDTO2.setDong("Young");
        zoneDTO2.setLat(33.33);
        zoneDTO2.setLng(44.44);

        ZoneDTO zoneDTO3 = new ZoneDTO();
        zoneDTO3.setCig_cd(22L);
        zoneDTO3.setGu("GangBook");
        zoneDTO3.setDong("Sung");
        zoneDTO3.setLat(55.55);
        zoneDTO3.setLng(66.66);


        Member member = Member.toMemberEntity(memberDTO);
        Zone zone1 = Zone.toZoneEntity(zoneDTO1);
        Zone zone2 = Zone.toZoneEntity(zoneDTO2);
        Zone zone3 = Zone.toZoneEntity(zoneDTO3);

        memberRepository.save(member);
        zoneRepository.save(zone1);
        zoneRepository.save(zone2);
        zoneRepository.save(zone3);


        Member findMember = memberRepository.findOne(member.getId());
        Zone findZone1 = zoneRepository.findOne(zone1.getId());
        Zone findZone2 = zoneRepository.findOne(zone2.getId());
        Zone findZone3 = zoneRepository.findOne(zone3.getId());

        //when

        MemberDTO memDTO = MemberDTO.toMemberDTO(findMember);
        ZoneDTO zonDTO1 = ZoneDTO.toZoneDTO(findZone1);
        ZoneDTO zonDTO2 = ZoneDTO.toZoneDTO(findZone2);
        ZoneDTO zonDTO3 = ZoneDTO.toZoneDTO(findZone3);


        //Then
        memberZoneService.setMemberZone(memDTO, zonDTO1);

        assertThrows(ZoneAlreadySetException.class, () -> {
            memberZoneService.setMemberZone(memDTO, zonDTO1);
        });

    }

중복체크는 위의 초과체크에서 zon의 값만 같은걸로 바꿔주면 예외를 확인할 수 있었다.


배운점

테스트 코드를 처음부터 직접 짜보는건 처음이라 시간도 오래 걸렸고 시행착오도 많았다.
기본적인 자바개념부터 다시 돌아가서 공부하였고, 전반적인 로직흐름과 스프링 구조를 이해하는데 도움이 되었다. 역시 직접 하나하나 겪어보면 실력이 금방 늘수 있을것 같다.

profile
Let's Coding

0개의 댓글