Spring 17

LocalDate 와 String

오늘 작성한 알고리즘 문제는 개인정보 보호기간에 대한 문제였다. String -> LocalDate 가장 먼저 시작한 문제는 today가 제공되는데 반해서 데이터의 형식이 "yyyy.MM.dd" 형식의 String으로 제공한다는 점이였다. 기본 LocalDate 타입의 형태는 "yyyy-MM-dd" 타입이기 때문에 LocalDate.parse(today) 를 사용하면 런타입 오류가 발생하였다. Why error? 무엇으로 인하여 오류가 생기는가 하면 변환하려는 String의 형태 때문였다. 위에서 언급했듯이 "." 을 기준으로 구분하기 때문에 "-" 형태로 구분하는 LocalDate와 형태가 달라 바로변환하는 것이 불가능 하기 때문이다. 그렇다면 어떤 방식을 이용하여야 할까? DateTimeFormatt..

Spring 2023.12.05

Java 알고리즘 학습

신나는? 알고리즘 오늘은 알고리즘을 통해 아스키 코드를 활용하는 방법을 중심으로 문제를 해결햇다. 아스키 코드 아스키 코드란, "미국정보교환표준부호" 라고하며 영문 알파벳을 사용하는 대표적인 문자 인코딩이다. 예를 들어 int 97이 있다고 할때, 이는 (char) 97을 통해 변환하면 a 라는 알파벳이 나오는 것을 말한다. 이에따라 List alphabet = new ArrayList(); for (int i = 97; i + index 생락된 글자에서 +1 씩 하는 것을 통해 풀었다.

Spring 2023.12.04

알고리즘 풀이 - 자료구조

달리기 시합 알고리즘 오늘은 알고리즘을 풀면서 자료구조에 대한 여러가지 생각을 했다. 기본적으로 사용하는 List를 바탕으로 set, map을 이용하여 문제풀이를 시도하였다. - 처음 시도 최초로 시도한 방식은 주어진 배열을 List를 사용하여 .remove를 통해 삭제하고 .add를 통해서 값을 추가하는 방식을 통해서 결과를 도출하려 하였다. 이를 통해 주어진 예시와 같은 결과를 얻을 수 있었다. 실패 이유 하지만 결과를 해보니 케이스 9~13애서 시간초과로 오류가 발생했다. 이 근본적인 원인은 처음 순서를 알기위해서 indexOf를 사용하여 순회를 하였기 때문에 자료가 길고, 후순위에 있을 수록 오래걸리기 때문에 성공에서도 6000ms 이상의 사싱이 걸리는 케이스가 있었다. 즉, 이를 개선하여야 할 ..

Spring 2023.11.27

기능 구현 - 비회원 기능

"비회원 해줘" 우리 프로젝트의 주된 기능 중 하나인 비회원 기능... 사실 해야하는 건 알았지만 어떤 식으로 해야하나? 라는 식으로 고민하다 뒤로 미루고 미루다 " 이제 슬슬 비회원 해야지요? 해줘! " 라는 느낌으로 시작하게 되었습니다. 기능 선택 그렇다면 어떤 식으로 구현할 것인가 라는 문제의 쟁점이 생겼다. 여러가지 방식이 있겠지만 그 과정에서 찾아본 방식은 2가지이다. 세션을 활용한 방식, 레디스를 활용하여 사용하는 방식 이렇게 2가지이다. 세션 현재 JWT를 이용한 회원인증 방식을 사용하고 있기 때문에 세션을 활용한다는 점에서 뭔가 이상함을 조금 느끼긴 했지만 찾아보니, 유저의 권한과 비유저의 권한을 비교하는 방식에서는 자주 이용하는 방식이라고 한다. 그러나 해당 방식은 프론트 측에서, 세션을..

Spring 2023.11.08

트러블 슈팅 - 중복 저장 문제

문제 발생 - 막 여러개 씩 저장 가능한거 같아요! " 맥북에서 사용하는데 문제를 저장하려고 하면 2개씩 저장되는거 같다는 말을 들었다. 때문에 이를 직접 사용해보니 급하게 와다다다 누르면 중복으로 저장되는 것을 알 수 있었다. 위 사진이 바로 그 예시인데, 연속으로 클라이언트에서 클릭하면 많이 나온다는 것을 알 수 있다. 즉, 같은 것을 보내려고 하는데 클라이언트가 화면 전환이 되기전에 연속적으로 클릭이 된다면 api가 추가적으로 요청된다는 것이다. 이는 서버에 불필요한 데이터를 남기는 것이며, 필요이상으로 요청이 많이 들어가는 경우가 생기기 때문에 해결해야 할 문제였다. 해결방안 - 락 걸어두기 (스레드 슬립, RateLimiter, 버킷) 결국 위의 문제를 해결하려면 요청에 제한을 두는 것으로 방지..

Spring 2023.11.06

항해 99 - 트러블 슈팅 Optional(Likes)

금일의 작업 중 Likes 부분에서 오류가 발생하였다. 그 이유를 둘러보니 그냥 로직이 이상했다... likesRepositoy.findByMemberId(Long) // 이와 같은 부분에서 오류가 발생하였다. 이 부분이 문제가 된 이유는 해당 코드를 Optional로 사용하고 있는데 MemberId로 찾아오는 값이 단일 값을 찾아오지 못한다는 저번고 같은 오류를 발생시키고 있는 것이였다. 이 이유는 기초적으로 봤을 때, 1번 퀴즈에 좋아요를 누르고 2번 퀴즈에 좋아요를 누를 경우 까지만 가능하고 3번째 누를 때, findBy로 찾아오는 값이 유니크 값이 아닐 때 발생하는 지난번과 같은 오류가 발생하는 구조였다. 근데 진짜 문제는 이게 해당 하는 것이 아니였다. 즉, 위에 해당하는 코드는 문제가 맞지만,..

Spring 2023.10.25

항해 99 - 서비스와 RDB

우리의 프로젝트에서 섬세하게 터치한 부분중 하나는 RDB이다. 초기에 코드를 작성하기 좋은 방식으로 우선 작성하고 여러가지 변화를 거쳐왔다. 여기서 작성하기 편함이라고 한다면, 테이블 간에 관계에서 무조건 적으로 참조를 하며 Many To One관계를 활용하여 빠르게 작성한 것을 말한다. 이때는 기존의 관계는 작성은 편하게 가능하지만 반대로 삭제를 요하는 단계에서는 참조하는 연관관계로 인하여 삭제 불가능한 현상이 일어나는 사고가 있었다. 때문에 이 관계에서 불편점을 찾아 개선점을 마련하였다. 1. 퀴즈의 삭제 불가 현상 퀴즈를 삭제하려고 했지만, 현재 퀴즈는 여러가지 분야에서 참조당하고 있는 문제가 있다. 너무 복잡한 관계로 인하여 삭제가 불가능한 현상이 발견된다. 댓글, 문제, 선택지, 좋아요, 등의 ..

Spring 2023.10.21

항해 99 실전 프로젝트 - 트러블 (Optional)

이번에 있었던 문제 과정이다. 이번 프로젝트에서 담당한 부분 중 하나인 퀴즈에서 문제가 있다는 소식이 갑자기 새벽에 들려왔다. " ??님 이거 퀴즈를 여러개 못만드는 데요?" 때문에 즉시 노트북을 키고 코드를 봤다. 바로 작동을 돌려보니 문제가 생기는 지점은 Optional quizOptional = quizRepository.findByMemberId(member.getId()); if(quizOptional.isEmpty()){ MemberDetail memberDetail = member.getMemberDetail(); memberDetail.gainMileagePoint(100); memberDetailRepository.save(memberDetail); } 이 지점이였다. 해당 값에서 fin..

Spring 2023.10.19

항해 99 실전 프로젝트 - 문제발생 및 해결

금일, 관계의 방향성을 cascade를 통하여 관리하려 하였으나. cascade는 영속성을 이용한 관계로 부모 Entity의 변화가 자식에게도 영향을 끼치게 하는 영속성 기능을 활용하여 제공하는 강력한 기능이다. 그러나 너무 유용하기 때문에 너무 남발하면 부작용이 많은 기능이다. 때문에 어중간하면 사용을 미하지만 유저의 상세 정보가 등록 내역에 대하여 완전하게 데이터를 소유하고 있다는 점, 헙업이기 때문에 내 코드를 남이 신경쓰이게 하는 것을 방지하려는 점 이 두가지 이유를 가지고 cascade를 통해 데이터를 관리하려 하였다. 그러나 실제로 사용해보니 아래와 같은 이유로 오류가 발생했다. 1. cascade.ALL관계로 인하여 Entity를 저장하는 과정에서 문제 발생 엔티티에 저장된 데이터와 저장하려..

Spring 2023.10.16

항해 99 실전 프로젝트 - CRUD

금일 프로젝트 중 생긴 트러블 1. 문제가 생길 만큼 너무 느린 성능의 삭제 프로세스 public MsgResponse deleteQuiz(Long id) { //이전의 것과 마찬가지 입니다. Quiz quiz = findQuiz(id); List comments = getComment(id); List quizQuestionList = quizQuestionRepository.findAllByQuiz(quiz); List quizChoicesList = new ArrayList(); for (QuizQuestion quizQuestion : quizQuestionList) { List quizChoices = quizChoicesRepository.findAllByQuizQuestion(quizQues..

Spring 2023.10.09