썸네일 눈 씻고 로그인 로직 버그 찾기 지난 이슈 트래커 프로젝트를 진행하다가 아주 기묘한 버그를 마주했다. 아래는 문제가 되었던 Oauth 로그인 코드. public JwtResponseDto loginWithOauth(OauthLoginRequestDto requestDto) { // (1) Oauth 클라이언트 구현체 선택 OauthClient oauthClient = oauthClientMapper.getOauthClient(requestDto.getOauthClientName()) .orElseThrow(() -> new InvalidOauthClientNameException()); // (2) 유저 정보 가져오기 OauthUserInfo userInfo = oauthClient.getUserInfo(requestDto.getAut..
썸네일 그래서 다익스트라는 얼마나 걸리는 거예요? 알고리즘 공부를 하다가, 다익스트라 알고리즘 관련한 부분에서 다음과 같은 내용을 마주했다. 다익스트라의 최초 구현에서는 시간 복잡도가 O(V^2)였으나, 현재는 너비 우선 탐색 시 가장 가까운 순서를 찾을 때 우선순위 큐를 적용하여 이 경우 시간 복잡도는 O((V+E)log V), 모든 정점이 출발지에서 도달이 가능하다면 최종적으로 O(E log V)가 된다. 372p 어... 음... 최단경로 뿐만 아니라 전반적인 그래프 활용 알고리즘에서 시간복잡도 표기가 잘 이해가 안 되는 느낌이었는데, 그냥 대충 이런 느낌이네~ 하고 넘어갔더니 이렇게 자료구조 활용에 따른 최적화 같은 중요한 내용도 잘 안 와닿게 된다. 그래서 위 문장을 하나하나 뜯어보면서 풀이해 보려고 한다. 이 글에서는 다익스트라 알고리즘의 기..
썸네일 뭔지는 알고 쓰자 WebClient! 지난 코드스쿼드 프로젝트에서 JWT + Oauth로 로그인 구현하기를 시도했다. 클라이언트 단에서 보낸 Github auth 코드를 받아서, 그 코드를 다시 1) Github authorization 서버에 보내서 access token을 받고, 2) 그렇게 받은 access token을 다시 Github resource 서버에 보내면 유저의 정보를 얻어올 수 있다. 근데 이렇게 하려면 서버 어플리케이션에서 깃헙 서버에 HTTP 요청을 보내고 그 응답을 받아서 처리할 수 있어야 한다. 그럴 때 뭘 써야 하지? 하고 검색해 보니까 나온 게 WebClient였다. WebClient 이전에는 RestTemplate라는 게 있었다고 한다. 그런데 WebClient가 뭔가 개선된 버전이래! 그럼 당연히 새로 나온..
관계형 모델은 DB를 어떻게 바꾸었을까? MIT OpenCourseWare의 강의 자료와 과제를 수행하면서 공부하고 고민한 내용들을 정리합니다. 우선은 제가 이해한 만큼 정리하고 공부를 계속해 나가면서 수정할 예정입니다. 읽으시면서 잘못된 부분들은 언제든지 지적해 주세요! 관계형 모델 이전의 데이터베이스 관계형 모델이 등장하기 전의 데이터베이스는 계층형(hierachical) 모델을 기반으로 했다. IMS는 계층형 모델의 대표주자로, 트리 구조로 데이터를 저장한다. 이 과정에서 필연적으로 데이터의 중복이 발생하게 된다. 예를 들어서 사육사 | 우리(Cage) | 동물 와 같은 구조의 데이터베이스가 있다면 같은 우리를 공유하지만 사육사가 다른 동물의 경우에는 우리에 관한 데이터는 사실상 중복되게 된다. 또한 IMS의 트리 구조로는 Parent를 ..
썸네일 삽질기록 #8 Optional, 스프링 예외처리 (2022.03.15) 스프링 == 김영한님 강의인 것처럼 많은 사람들이 영한님 강의를 보고 스프링 프로젝트를 만든다. 물론 나도 그렇다. 스프링 입문 강의를 열심히 따라가면서 이렇게 하는 거구나 하고 슥슥 만들다 보면, "이거 왜 이렇게 짰어요?" 하는 리뷰어들의 질문이 들어온다. 짧게 심호흡 한 번 하고 진짜 공부는 이 때부터 시작. 그니까 Optional 왜 쓰는 거예요 특정 ID 값에 해당하는 유저를 찾는다고 해 보자. 사실 지금 내가 만들고 있는 건 아주 기본적인 어플리케이션이라서 Repository에 findById()가 있고 Service에도 아이디로 유저를 찾는 메서드가 있다. 기본적으로 Controller에서 Service의 findById()를 호출하면 내부적으로는 Repository의..
썸네일 삽질기록 #7 html form의 속성들(method, action) (2022.03.03) 스프링 공부를 시작한 뒤로 반쯤은 신기하고 반쯤은 잘 이해가 안 되는 채로 우선은 큰 흐름들을 잡아가고 있다. 우선 아무리 기초적인 것이라도 내가 궁금한 것들, 내가 고민했던 것들을 정리해 본다. POST가 안 돼 회원가입 기능을 간단하게 구현하다가 삽질을 좀 했다. 미리 주어진 회원가입 폼 페이지 파일인 form.html을 컨트롤러와 연결해서 폼에서 id, 이름 등의 정보를 받아서 POST해서 넘겨주는 작업이었는데, 그냥 간단하게 될 줄 알았는데 잘 안 됐다! 가장 먼저 갸우뚱했던 문제는, 분명히 id, 이메일, 비밀번호 같은 개인정보를 입력해서 가입하는 과정인데 주소창에 해당 정보들이 param이 되어서 뜬다는 점이었다. 이렇게 입력하면 주소창에 내가 입력한 정보들이 다 떠버린..