BE/Spring Boot

현재 뮤피에서 소셜 로그인을 OIDC를 사용해서 구현하고 있다. 카카오, 구글, 애플 로그인을 제공하는데, OIDC도 OAuth2.0의 확장 스펙이다 보니 각 로그인의 구현 방식이 서로 같다. 현재 코드가 구현에만 신경을 쓰다 보니 카카오 로그인 먼저 구현하고 나머지는 복붙해서 변경 부분만 바꿔둔 상태였다. “객체 지향과 디자인 패턴”이라는 책을 읽는 중에 디자인 패턴 중 하나인 “템플릿 메서드 패턴” 파트를 읽다가 소셜 로그인 부분에 적용할 수 있을 것 같아서 미뤄놨던 리팩토링을 해보려고 한다. OIDC를 어떻게 구현했는지는 아래의 링크에 자세히 설명해두었다. https://aodtns.tistory.com/124 Open ID Connect 으로 구글 로그인 구현하기 (feat. SpringBoot)..
뮤피에서 홈 화면에 우리가 직접 선정한 곡을 매주 월요일에 추천해 주는 “이 주의 추천 곡”이라는 컨텐츠가 있다. 기본적으로 RestTemplate로 Spotify API를 호출하여 곡 정보를 불러오는데, “이 주의 추천 곡”은 현재 홈 화면에 있어서 조회를 많이 할 확률이 높기 때문에 불필요한 Spotify API 호출을 줄여야 했다. 1. 기존 방식 성능 측정하기 1.1 기존 방식 [사용자] 이 주의 추천 곡에 있는 곡들 중 하나 클릭 [클라이언트] 해당 곡의 track id로 곡 정보 조회 요청 [서버] RestTemplate으로 Spotify API 호출하여 정보 조회 곡 정보와 사용자의 평점 정보 등을 함께 응답 곡 정보 요청에 사용자의 평점 정보 등을 함께 제공하기 때문에, 단순히 요청에 대한..
뮤피에서는 기존에 OAuth를 사용하여 소셜 로그인을 구현하였다. 소셜 로그인 구현 방식은 다음과 같다. Client가 Authroization Code를 받아서, Server에 보낸다. Server는 받은 Code로 Resource Server에 접근하기 위한 Access Token을 Authorization Server로부터 발급받는다. 발급받은 Access Token으로 Resource Server에게서 정보를 가져온다. 로그인 혹은 회원가입 처리를 한다. OAuth의 문제점 OAuth를 사용하면 발급받은 Access Token이 뮤피에게서 받은 것인지는 알 수가 없다. 단순히 Resource Server에 접근하기 위한 Access Token이기 때문이다. 이는 OAuth가 인증이 아닌 “인가”에..
서론 현재 React와 SpringBoot를 사용하여 프론트엔드와 백엔드 개발을 하고 있다. Jwt 토큰( Access Token, Refresh Token)을 사용하여 인증하고 있고, Interceptor를 사용하여 요청이 Controller 단에 도착하기 전에 인증을 한다. 그런데 요청을 보내면 react의 url인 localhost:3000을 allow 해주었는데도 CORS 에러가 발생한다. 이유가 뭘까? 문제 상황 CORS 에러 발생 위와 같이 React(localhost:3000) 에서 SpringBoot(localhost:8080)로 요청을 보낼 때 CORS 에러가 발생한다. 백엔드 로그 확인 서버에서는 JwtInterceptor에서 에러가 발생했다고 한다. JwtInterceptor 코드 ..
서론 이번 프로젝트는 특히 코드, 네이밍, 구조에 신경을 많이 쓰면서 개발을 하다 보니 기존에 했던 방식에 의문이 생겼다. 로그인 시에 사용자가 입력한 id를 백 단에서 조회할 때 해당 id가 없다면, 해당 id가 없다는 것을 성공적으로 확인했으니 클라이언트에게 status code를 200(ok)으로 응답하는 게 맞는 걸까? 아니면 해당 id가 없기 때문에 404(not found)로 응답하는 게 맞는 걸까? 영한님 강의에서도 200을 던지는 것도 방법 중 하나라는 것을 얼핏 들었던 것 같기도 하고 서버에서 정상적으로 처리를 한 것이기 때문에 200을 던져도 무방하다고 생각은 했지만 뭔가 찝찝해서 이번 기회에 개발 오픈 채팅방에 물어봤다. 200인가 404인가 질문을 잘..한 것 같진 않지만 뭐 XY..
서론 웹에 대해 아무것도 모를 때는 로컬에서는 실행되는 걸 확인했는데, 이걸 다른 사람이 확인하려면 나랑 똑같이 인텔리제이를 설치해서 실행해봐야 되는 건가 하는 의문이 있었다. 똑같은 환경을 구축하여 실행해도 되지만 Docker로 image를 만들고 run하면 정말 쉽게 로컬에 서버를 구축할 수 있다. 프로젝트 Jar 파일 만들기 jar 파일은 여러 개의 클래스 파일들과 관련 리소스 및 메타 데이터를 하나의 파일로 모아서 배포를 위해 만들어진 소프트웨어 패키지 파일 포맷이다. (jar은 zip으로 이루어진 압축 파일이다.) 대부분의 스프링부트 사용자들은 인텔리제이를 사용할 텐데, 오른쪽에 보면 Gradle이 보일 것이다. 눌러보면 Tasks -> build -> bootjar 이 보일 것이다. 클릭하자 ..
서론 우리 프로젝트에서 소셜 로그인으로만 로그인을 구현할 예정이고, REST가 아닌 flutter sdk를 이용한 로그인으로 구현하기로 정해서 REST에서의 카카오 로그인과 flutter sdk를 이용한 카카오 로그인의 차이가 뭔지 찾아보았다. REST api REST API의 방식은 우리 서버가 클라이언트와 카카오 서버 사이에서 받은 token으로 유저 정보를 가져오는 방식이다. 즉, 카카오에서 준 정보를 DB에 저장한다. Flutter SDK 하지만 flutter sdk를 이용하면 모바일은 카카오 서버에게서 유저 정보를 받고 받은 유저 정보를 우리 서버로 전달하는 식으로 진행된다. 즉, 카카오에서 준 정보는 모바일이 받고 그 정보를 모바일에서 서버로 던져주면 서버가 받아서 DB에 저장하는 방식이다. ..
의존관계 주입은 크게 4가지로 나눌 수 있다. 생성자 주입 수정자 주입(setter 주입) 필드 주입 일반 메서드 주입 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입받는 방법이다. 생성자 호출 시점에 딱 한 번만 호출되는 것이 보장된다. "불변, 필수" 의존관계에 사용된다. 생성자가 1개만 있다면 @Autowired를 지정해주지 않아도 자동 주입된다! 수정자 주입 (setter 주입) setter라고 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존 관계를 주입하는 방법이다. "선택, 변경" 가능성이 있는 의존 관계에 사용한다. 자바 빈 프로퍼티 규약의 수정자 메서드 방식을 사용한다. @Autowired의 기본 동작은 주입할 대상이 없으면 오류가 발생한다. 주입할 대상이 없어도 동작하..
aodtns
'BE/Spring Boot' 카테고리의 글 목록