School Visitor 개요, 설계, 고민

이지우·2021년 10월 4일

School Visitor

일부 대학교에는 신입생 모집기간에 교수님들께서 학교에 직접 방문하여 학생들을 모집하는 절차가 있다. 이 때 교수님들 간 정보공유가 제때 되지 않아, 서로 다른 교수님들이 같은 고등학교에 방문할 수 있기 때문에 때로는 시간이 허비되기도 한다.
이런 불편함을 해소하기 위해 School Visitor(비정식명칭)라는 이름으로 모집관리시스템을 만들고자 한다. 작은 규모의 개인프로젝트로 진행될 것이므로, 아마 BE, FE 둘 다 담당해야할 것 같다!

요구사항

처음에 말해주신 요구사항은 아래와 같다.

  • 경상북도의 모든 학교들을 가지고 있어야 한다.
  • 학교의 기본적인 정보를 가지고 있었으면 좋겠다.
  • 학교 목록이 모두 나오고, 그 학교들이 일정 기간 내 방문되었는지, 방문되지 않았는지 여부가 교수님들 간 실시간으로 공유가 되어야 한다.
  • 모집은 여러 차례 가능하기때문에 1차일지, 3차일지... 알 수 없다.
  • 모집기간 후 설명회 일시를 정하는데, 설명회 날짜와 그때 모집된 인원 등을 기록해둘 비고란 정도가 있으면 좋겠다.

시스템 환경

  • BE : Java, Spring boot, Jwt, JPA(Hibernate), Mysql
  • FE : React

인터페이스

위 요구사항들을 받은 후 기능을 추가하여, 작성되어야 할 기능들을 뽑아보았다.
기능을 뽑아내기 위해 인터페이스를 대애애충 이런식으로 나올것이다~하며 작성했으므로 누군가.. 내 꼬질한 인터페이스를 본다면 좀 부끄러울 것 같다.🙂

  • 로그인 페이지로, 로그인된 회원만 사용 및 조회가능하다
  • 메인페이지이다.
    기본적으로는 6개월 이내 학교목록을 방문되지 않은 학교 가나다순으로 보여준다.
    지역, 키워드, 기간 등을 설정하면 필터링된 학교만 볼 수 있다.
  • 목록에 있는 '금오고등학교'를 선택했을 때 나오는 학교 상세정보와, 일정기간 내 방문기록을 볼 수 있다. 여기서 새로운 방문을 기록할 수 있는데, 설명회 일시, 모집인원, 비고란을 채울 수 있다.
  • 마이페이지에서는 교수님이 자신의 정보와, 나의 활동기록을 볼 수 있다.

🤔❓

현재 가진 엔티티는 회원, 학교, 방문 엔티티이다.
비교적 작고 간단한 프로젝트이므로 대부분의 백엔드 기능은 구현되었다.
문제는 메인페이지의 목록을 DB에서 한 번에 리스트로 뽑아오기 위해 뇌를 짜내고있는데, 생각했던 방법은 이렇다.

  • 학교방문 엔티티 left join을 하고 방문된 컬럼 수를 세면 count 수로 방문되었는지 아닌지 판별할 수 있을 것 같았다.
    • 문제가 있었다.
      학교에 방문이 한 번 되었을 때도 count=1,
      방문되지 않은 학교와 조인되었을 경우에도 count=1 이 된다는 것이다.
  • 학교와 방문 엔티티를 outer join 해 가져온 학교들의 이름을 count하면 1개가 아닌 2개 이상부터는 방문된 학교라고 판별된다고 생각했다.
    • 근데 이것도 이상하게 학교가 distinct되어서 나오는것같다ㅠ mysql에는 outer join이 없어서 left join + right join을 union하는데 요것도 더 생각해봐야할 것 같다😂

BE기능을 다 완성시키고 나서 FE를 진행하고 싶었는데, 우선 FE 일부 페이지를진행해본 후에 마저 하는것도 기분전환으로 괜찮을 것 같다!😊
혼자하는 프로젝트의 장점


+) 2021-10-05
프로그래머스 mysql문제를 풀다가 '입양 시각 구하기(2)' 문제에 대해 찾아보는데 어떤 블로그에서
union은 지정된 컬럼의 중복을 제거해서 나오는 것이고,
union all은 지정된 컬럼의 중복을 무시하고 모든 컬럼을 표시한다는 정보를 얻었다.

그래서 혹시나 하고 union all로 수정했는데 원하던 결과가 나왔다 ! 이 쿼리를 QueryDSL로 잘 빌드하면 백엔드 관련해서 생각했던 모든 기능들은 마무리된다 👏 !

어딘가에는 더 효율성좋은 쿼리가 존재할거같은데 지금으로서는 잘 모르겠다.
쿼리를 짜면서 버벅거렸던 부분은 다 mysql에 존재하는 예약어들에 대해 잘 모르기 때문인 것 같다.

++) 2021-10-06
union이라는 예약어를 queryDSL에서 지원하지 않는다는 정보를 얻었다... 그래서 native query를 사용하려고 마음먹고, 어제 짰던 코드에 조건문을 추가하려고 했다. 그런데 다시 처음과 같은 상황이 발생했다. [방문]테이블에 '방문일자'조건을 걸면 내가 원하는대로 '어떤 결과에서든 모든 학교가 기본적으로 출력'되어야하는 결과가 나오지 않았다.
약간 상심해서 잠깐 일어나서 바람 좀 쐬다가 다시 자리에 앉아서 차분하게 종이를 꺼내서 내가 원하는 정보들을 낙서처럼 끄적거렸다.

그러다 머리속에서 정리가 되어서 바로 쿼리를 날려보니 원하는 결과가 나왔다.
원하던 것은 학교 전체 목록 + 해당 학교 방문횟수 + 학교 및 지역 키워드 + 방문일자 이다.
방문 테이블에 방문일자 조건을 주고 학교아이디로 그룹화한 목록을 새 테이블로 만들어, 학교와 새로 만든 테이블을 학교 중심으로 left join한 뒤 키워드 조건을 넣어 해결했다.

profile
개발 관찰일지

0개의 댓글