Sekkison SpringBoot project - 06

ILCHAN AHN·2023년 3월 20일
0

Sekkison

목록 보기
5/13

Sekkison Project

Appoint

이제 우리 새끼손 프로젝트에서 가장 중요한 약속을 만들어보도록 하겠다.
약속을 만드는 과정에서 가장 중요하게 생각하는 것은 방장이 방을 만들고 사람들이 참여하며, 정보표시, 인원조정, 강퇴, 수정을 중점으로 로직을 작성해보았다.

약속만들기

AppointController

@ResponseBody
    @PostMapping("/{user_id}")
    // 약속 만들기
    public ResponseForm create(
            @PathVariable("user_id") Long user_id,
            Appoint appoint,
            Integer typeInteger,
            String date,
            String time) {
        return appointService.createAppoint(user_id, appoint, typeInteger, date, time);
    }

user_id를 기준으로 방을 만들며, 사람들과의 약속인지 나 혼자만의 약속여부인지, 날짜와 시간을 매개변수로 받는다.

AppointService

public ResponseForm createAppoint(Long user_id, Appoint appoint, Integer typeInteger,
                                      String date, String time) {
        ResponseForm res = new ResponseForm();

        // title이 비어있다면 에러
        if (appoint.getTitle() == null || appoint.getTitle().trim().equals(""))
            return res.setError("제목이 비어있습니다");
        // d-day가 비어있다면 에러
        if (date == null || "".equals(date) || time == null || "".equals(time))
            return res.setError("날짜와 시간이 비어있습니다");

        // content가 null 이면 content를 빈 문자열로 초기화
        if (appoint.getContent() == null) appoint.setContent("");
        // head_cnt를 1로 세팅 (최초 생성이기 때문)
        appoint.setHeadCnt(1);
        // 나만의 약속이라면 maxCnt 1, isPublic null로 세팅
        if (typeInteger == 2) {
            appoint.setMaxCnt(1);
            appoint.setIsPublic(null);
        }

        // dday 세팅
        appoint.setDday(makeDateTime(date, time));

        // type 세팅
        C.appointType type;
        if (typeInteger == 0) type = C.appointType.FTF;
        else if (typeInteger == 1) type = C.appointType.NFTF;
        else type = C.appointType.SOLO;
        appoint.setType(type);

        // appoint 저장
        appoint = appointRepository.save(appoint);

        // myAppoint 세팅
        MyAppoint myAppoint = MyAppoint.builder()
                .userId(user_id)
                .appointId(appoint.getId())
                .isMaster(true).build();

        // myAppoint 저장
        myAppointRepository.save(myAppoint);
        setHeadCnt(appoint.getId());
        return res.setSuccess(appoint.getId());
    }
    private LocalDateTime makeDateTime(String date, String time) {
        String[] dates = date.split("\\.");
        String[] times = time.split(":");
        Integer y = Integer.parseInt(dates[0]);
        Integer m = Integer.parseInt(dates[1]);
        Integer d = Integer.parseInt(dates[2]);
        Integer hh = Integer.parseInt(times[0]);
        Integer mm = Integer.parseInt(times[1]);
        return LocalDateTime.of(y, m, d, hh, mm, 00);
    }

기본적인 유효성 검사부터 시작하여 type과 방장여부를 통해 myAppoint에 내 약속을 저장하면서 생성해주었다.

public class C {
   public enum appointType {
       FTF, NFTF, SOLO
   }
}

여기서 type이란 약속의 종류를 분류하는데 쓰이는데, common 패키지에 enum으로 만들어 주었다. java에서의 enum은 형변환이 되지 않기 때문에 따로 지정해주었다.

FTF(0) : Face TO Face, 만남을 목적으로 하는 약속
NFTF(1) : Not Face TO Face, 온라인 상에서의 약속
SOLO(2) : SOLO, 나 자신과의 약속

이러한 기본 구조를 통해 수정, 삭제, 약속 가져오는 기능을 구현해주었고, 새부적으로 약속멤버별명 가져오기, 약속멤버 강퇴, 약속 인원조정 등의 기능을 만들어주었다.

처음 프로젝트를 기획했을떄는 친구끼리만 약속을 할 수 있는 기능만 구현하려고 하였지만, 친구가 아니어도 방을 검색해서 참여할 수 있는 플랫폼적인 성격을 갖게 되는 것도 구현하고 싶어 검색 기능을 추가하였다.

약속검색하기

AppointController

	@ResponseBody
    @GetMapping("/search/{is_public}/{is_recruit}/{is_ftf}/{page}")
    // 약속 검색
    public ResponseForm searchAppointList(
            String search,
            @PathVariable("is_public") Integer is_public,
            @PathVariable("is_recruit") Integer is_recruit,
            @PathVariable("is_ftf") Integer is_ftf,
            @PathVariable("page") Integer page) {
        return appointService.getSearchAppointList(search, is_public, is_recruit, is_ftf, page);
    }

@PathVariable 어노테이션을 통해 공개방여부, 모집중인지, 대면만남여부, 페이지를 매개변수로 받아 리스트로 출력한다.

AppointService

public ResponseForm getSearchAppointList(String search, Integer isPublic, Integer isRecruit, Integer isFtf, Integer page) {
        ResponseForm res = new ResponseForm();

        Boolean is_public = isPublic == 1 ? true : false;
        Boolean is_recruit = isRecruit == 1 ? true : false;
        C.appointType is_ftf = isFtf == 1 ? C.appointType.FTF : C.appointType.NFTF;
        
        // 페이징 설정
        int pageSize = 10;
        Pageable pageable = PageRequest.of(page, pageSize, Sort.by("id").descending());

        // 조건에 맞는 appoint리스트 생성
        Page<Appoint> appointList =
                appointRepository.findByIsPublicAndIsRecruitAndTypeAndTitleContainsAndDdayAfter(
                        is_public, is_recruit, is_ftf, search, LocalDateTime.now() ,pageable);

        // 불러올 약속이 없으면 에러
        if (appointList.getContent().size() == 0) return res.setError("더이상 약속이 없습니다");

        // 방장 이름 세팅
        for(Appoint a : appointList.getContent()) {
            List<MyAppoint> ma = myAppointRepository.findByAppointIdAndIsMaster(a.getId(), true);
            if (ma == null || ma.size() == 0) {
                a.setMemo("0&unknown");
                continue;
            }
            User u = userRepository.findById(ma.get(0).getUserId()).orElse(null);
            if (u == null) {
                a.setMemo("0&unknown");
                continue;
            }
            a.setMemo(u.getId() + "&" + u.getName());
        }

        return res.setSuccess(appointList.getContent());
    }

공개여부 1: 공개, 0: 비공개
모집여부 1: 모집중, 0: 모집완료
만남여부 1: 만남, 0: 온라인

profile
백엔드 개발자를 꿈꿉니다

0개의 댓글