오늘은 코드카타 SQL 57번 문제와 알고리즘 55, 56번 문제를 풀고, 뉴스피드 프로젝트의 도전 기능을 시작했다!
오늘은 1개의 SQL 문제를 풀었는데, 오늘 푼 문제는 case-when을 사용해 특정 문자들을 다른 문자로 바꾸는 것이 주된 요구사항이었다.
이전에도 정리를 했었던 것 같은데,, MySQL 기준으로 case-when은
CASE WHEN 조건1 THEN 충족할 때 반환되는 값
WHEN 조건2 THEN 충족할 때 반환되는 값
WHEN 조건3 THEN 충족할 때 반환되는 값
ELSE 모든 조건 해당되지 않을 때 반환되는 값
END as ALIAS
이렇게 사용할 수 있다.
사용하는 방법이 어렵지는 않은데, 나도 모르게 then 뒤에 ,(쉼표)를 붙여버렸고... 그래서 자꾸 에러가 생겼다.
SQL syntax에 문제가 있다는데 아무리 봐도 무엇이 문제였는지 모르겠어서 대문자로도 바꿔보고, 이런저런 시도를 했다.
그런데 에러 메시지를 자세히 보니.. 쉼표 붙이는거 아니라고 친절하게 이야기를 해주더라...
에러가 생기면 에러 메시지부터 잘 확인해야겠다..
오늘은 알고리즘 문제를 2개나 풀었다!!
첫 번째 문제는 지난 번에 풀다가 결국 끝내지 못한 문제였는데..
두 개의 카드 뭉치가 있고, 각각의 카드 뭉치에서는 주어진 순서대로만 카드를 꺼낼 수 있을 때, 입력받은 문장을 만들 수 있는지, 없는지를 판단하는 문제였다.
처음에는 indexOf() 메서드를 사용하기 위해 주어진 배열들을 모두 Arrays를 통해 리스트로 바꾸고,
입력받은 문장의 각각의 글자를 카드 뭉치 배열에서 indexOf로 찾으려고 했다.
이렇게 풀었을 때, 내가 생각하기에도 논리적으로 맞는 것 같고, 테스트 케이스도 잘 통과했으니 이게 정답인 줄 알았지만,,
제출을 해보니 24번 케이스까지는 잘 통과가 되지만, 25번 케이스 하나에서만 계속해서 실패하였다..
25번 케이스가 무엇이고, 왜 안되는지 너무 궁금하지만,, 알 수 없었기에 접근 방식을 바꾸었다.
indexOf로 인덱스를 찾는 것이 아니라, int로 초기 인덱스를 0으로 설정해두고, 각각의 카드뭉치에서 같은 단어를 발견할 때마다 int를 1씩 증가시켰다.
만약 발견된 단어가 int보다 작다면, false를 반환하도록 수정하였다.
이렇게 바꾸니 25번 케이스에서도 잘 통과가 되긴 했지만,, 사실 아직도 무엇이 문제였는지 잘 모르겠다.
오늘 푼 두 번째 문제는 정수 배열을 입력받으면, 배열을 일정 숫자만큼 잘라서 나누고, 그중 최솟값과 각 배열의 요소 개수를 곱한 값을 합하는 것이다..
문제를 이해하는 것부터가 어려웠지만,, 막상 문제를 해결하려고 하니 쉽게 해결할 수 있었다.
그냥 입력받은 정수 배열을 내림차순으로 정렬하고, 만약 3을 입력받았다면, 정렬한 배열의 3번째, 6번째, 9번째, ... 숫자와 3을 곱한 값을 더하면 됐다.
나는 내림차순으로 정렬하여 진행했지만, 다른 사람들을 보니 오름차순으로 정렬하고 for문을 사용할 때 뒤에서부터 사용했더라.
내림차순으로 정렬하게 되면 Collection을 또 임포트해와야 하기 때문에,, 저 방법이 더 좋을 것 같다.
나중에 내림차순이 필요하게 된다면 둘 중 어떤 것을 사용해야할지 고민해봐야겠다.
오늘 푼 문제와 풀이는 깃허브를 통해 업로드해두었다.
GitHub 보러가기
오늘부터 뉴스피드 프로젝트의 도전 기능이 시작되었다!
사실 어제 필수 기능이 다 마무리가 안됐었다...
마무리를 잘 한 것 같았지만, 전체 테스트를 안 해봤었기 때문에 오늘 함께 전체 테스트를 하며 예외 상황이 잘 잡혔는지 보았는데,
수정해야 할 부분들이 좀 더 있더라..
내가 맡았던 팔로우 부분에서는 비활성화된 유저에게 팔로우 신청을 계속 할 수 있다는 문제가 있었는데,
팔로우 create에 팔로우 대상 유저가 비활성화된 상태인지 확인하고, 비활성화 되었다면 NOT_FOUND_USER 예외가 발생하도록 수정하였다.
또, 필터에도 치명적인 오류가 있었는데...
어제 필터를 구현할 때 2개의 if문을 써서 첫 번째 if문에서는 게시반의 GET을, 2번째 if문에서는 그 외의 API를 처리하도록 했었다.
그런데..!! if문과 if문으로 생성을 해두니 첫번째 if문에서는 잘 통과된 API들이 2번째 if문에서는 필터에 걸려버린다는 문제가 있었다.
그래서 처음에는 첫번째 if문에도 doFilter를 만들어봤지만, 이렇게 되면 실행은 되지만, 재귀함수(?)로 인해 경고 메시지가 떴다.
그래서 2번째 if문에도 첫번째 if문의 조건을 넣어야 하나 이런 저런 방법으로 시도를 해보다가 튜터님을 찾아갔는데..!!
else if문을 쓰면 된다고 하셨다...
else if...가 있다는 사실을 완전히 잊어버리고 있었다...
그래서 if와 else if로 두 if문을 이어주니 정상적으로 잘 작동이 되었다ㅎㅎ
그리고 다른 수정할 내용들의 수정을 마친 뒤에는 도전 기능을 구현하기 시작하였다!!
우리 팀은 댓글, 좋아요, 정렬/검색 기능을 도전 과제로 구현하기로 했다.
나는 그 중에서 정렬을 맡았는데, 사실 스프링의 페이지네이션에서 정렬을 너무 잘 지원해주고 있어서 큰 어려움 없이 해결할 수 있었다.
그런데 페이지네이션에서 지원하는 정렬의 가장 큰 함정은 해당 테이블의 필드에 있는 항목으로만 정렬이 가능하다는 것이다..!
도전 과제의 조건으로 게시글을 조회할 때 좋아요 수 기준으로 정렬을 하라는 요구 조건이 있었다.
원래 게시글의 테이블에는 댓글 수와 좋아요 수 등을 저장하는 항목이 없었는데, 이런 상태에서 정렬을 시도하려니 정말 답이 안나오더라..
if문에 if문에 if문을 사용해서 어떻게든 처리해보려고 했지만, 모든 방법에 다 실패하고 더 이상의 접근 방법이 생각나지 않았고...
결국은 게시글의 테이블에 댓글 수와 좋아요 수를 저장하는 필드를 추가하기로 했다ㅎㅎ
그러니 완전 완전 쉽게 해결할 수 있었다.
이제 도전 기능에서 내가 맡은 부분은 다 끝났다!!
내일 수준별 학습반에서 JWT를 사용하는 방법을 알려주신다고 해서, 내일 세션 이후에 JWT를 적용해보려고 한다.
우리 팀이 진행한 내용들은 깃허브를 통해 업로드해두었다.
GitHub 보러가기
오늘.. 깃허브에서 엄청난 실수를 해버렸다...
내가 작업하던 브랜치에 그 앞단의 브랜치를 머지시키려고 했는데.. 실수로 반대로 앞단의 브랜치에서 작업 중이던 브랜치를 땡겨와버렸다..
작업 중이던 브랜치는 미완성 상태였기에.. 어떻게든 머지시키기 전 단계로 되돌려놔야만 했다.
머지를 취소하는 revert가 있다고 해서 시도해봤지만.. 오히려 더 이상하게 바뀌기만 했다..
깃허브에 들어가서 원래 있던 파일들을 긁어와서 통째로 붙여넣기로 바꿔버릴까 생각도 해봤지만.. 이것도 제대로 되지 않더라..
그나마 다행히 커밋된 내용들을 원격에 푸시하지 않았고, 그래서 git reset HEAD^로 머지하며 커밋된 내용들을 하나하나 지워갔다...
그래도 이번에는 내가 어떻게든 해결할 수 있는 수준의 실수였기에 다행이었다..
앞으로 깃허브 쓸 때는.. 진짜 진짜 진짜 집중해서 사용해야겠다..