Backend 8

여러 플랫폼에 대응할 수 있는 OAuth 코드로 개선하기

이전 글에서 SpringSecurity가 OAuth 로그인을 처리하는 과정을 디버깅을 통해 학습했습니다. 학습경험을 바탕으로 식도락 프로젝트의 기존 OAuth 로그인 코드를 개선한 과정에 대해 글을 써보려 합니다. 기존의 문제점 카카오 로그인에 의존적이며 확장에 닫혀있는 코드. 새로운 플랫폼을 지원하도록 확장하기 위해서는 요청을 보내는 클라이언트뿐만 아니라 비즈니스로직이 담긴 서비스 클래스까지 변경이 발생합니다. 또한 추가적으로 작성해야되는 클래스가 너무 많이 필요합니다. Properties 클래스의 주입. 기존의 서비스 코드에서는 카카오api 사용에 필요한 정보를 담은 KakaoProperties 클래스를 직접 주입받아서 사용하고 있었습니다. 즉, 새로운 플랫폼을 지원할때마다 주입받아야하는 클래스가 늘..

Backend/Spring 2023.06.04
SpringSecurity가 OAuth 로그인을 처리하는 과정 파헤치기

서론 저는 이전에 참여했던 사이드 프로젝트 에서 OAuth 로그인 개발을 담당했습니다. 그리고 이번에 프로젝트 리팩토링을 계획하면서 가장 마음에 안들던 로그인 관련 코드를 개선하기로 결정했습니다. 최초 기획에서는 카카오 로그인만을 사용하기로 했기 때문에 카카오 로그인에 맞게 코드를 작성하였고, 현재 로그인 관련 코드는 카카오 로그인에 종속적인 코드입니다. 때문에 새로운 로그인 방식을 도입하기에도 까다로운 상황이라 이번 기회에 OAuth 로그인 관련 코드를 개선하기로 했습니다. OAuth 관련 클래스들을 추상화하기 위해 고민하던 중 SpringSecurity에서는 어떻게 여러개의 플랫폼에 쉽게 대응할 수 있도록 했는지, 실제 내부 동작은 어떻게 동작하는지 궁금해졌고 그래서 디버깅을 통해 내부 동작을 학습해..

Backend/Spring 2023.03.05
offset과 no offset을 사용한 페이징 성능 차이 분석

서론 최근 진행했던 식도락 프로젝트에서 유저의 피드 목록을 페이징 처리를 하여 제공하는 api를 개발했습니다. 해당 api는 sns 특성상 페이지 단위로 제공하기보다는 무한 스크롤 형식에 최근 작성한 순서로 데이터를 제공해야 했습니다. 페이징 방식을 고민하던 중 offset과 no-offset 방식이 있고 offset 방식을 사용하면 매번 full-scan을 하여 성능적으로 좋지 않다는 것을 알게 되어 개발 당시에는 곧바로 no-offset 방식을 도입하여 개발하였습니다. 하지만 실제로 offset 방식과 no-offset 방식의 성능 차이가 얼마나 나는지 눈으로 확인하기 위해 두가지 방식을 모두 적용하여 성능을 비교해보기로 하였습니다. offset이란? offset 이란 sql에서 조회를 시작할 기준점..

Backend/Database 2023.01.06
Gradle 맛보기

이번에 식도락 프로젝트를 진행하는 과정에서 빌드 시 submodule의 파일들을 복사하는 task를 추가하는 작업을 맡았습니다. 쿠킴의 레퍼런스 덕분에 작업 자체는 수월했지만, gradle에 대해 거의 모르다보니 build와의 의존관계설정을 설정해주지 않아서 동작하지 않았던 경험이 있었습니다. 또한 Jay가 작성한 restdocs 관련 task도 설명없이는 이해하지 못했고 답답함을 느껴 이번 기회에 정리해보았습니다. 빌드란 무엇인가요? 개발자가 만든 애플리케이션을 컴퓨터에서 구동하기 위해서는 변환작업이 필요합니다. Java 애플리케이션의 경우 2가지 단계를 거치게 됩니다. 컴파일 : 소스코드를 바이트코드로 변환 링킹 : 바이트코드를 의존하고 있는 라이브러리들과 함께 하나의 파일로 압축하는 과정 빌드 도구..

Backend/Spring 2022.11.20
Wiremock을 이용한 테스트 작성기

지난 Feign Client 적용기에 이어서 WireMock을 이용한 테스트 경험을 소개합니다. 서론 이번 프로젝트에서는 기능 개발 시 인수테스트, 통합테스트, 단위테스트를 먼저 작성하고 개발을 진행하려고 노력하고 있습니다. 저는 OAuth 로그인 기능을 맡았고 해당 기능에 대한 인수테스트를 작성하는 과정에서 "어떻게하면 외부 api에 대해 실제 상황에 가까운 테스트를 할 수 있을지"에 대해 고민하게 되었습니다. 일반적으로 사용되는 Mockito를 사용하여 테스트를 진행할 수 있었지만 이 방식은 한계가 있다고 느꼈습니다. 외부 api를 사용할때는 http 요청과 응답, 응답값에 대한 역직렬화 과정 등이 발생하는데 Mockito는 단순히 목객체를 주입받아서 메서드를 호출하는 방식으로 동작하기 때문입니다...

Backend/Spring 2022.11.20
FeignClient 적용기

서론 현재 진행하고 있는 식당 리뷰 sns 프로젝트에서 유저 로그인 기능의 구현을 담당하고 있다. 카카오 로그인을 구현하던 중, 카카오에서 제공하는 api에 Http 요청을 보내기 위해서는 클라이언트 객체를 사용해야했고 흔히 알고 있는 RestTemplate과 WebClient를 후보에 두고 고민하고 있었다. 그러던 중 쿠킴의 소개로 Feign Client의 존재를 알게 되었다. 💫 Feign Client란? Feign Client란 Netflix에서 개발한 Http Client다. (HttpClient는 Http 요청을 간편하게 만들어서 보낼 수 있도록 돕는 객체라고 생각하면 될것 같다.) 처음에는 Netflix에서 자체적으로 개발을 진행했지만 현재는 오픈소스로 전환했으며 SpringCloud 프레임워..

Backend/Spring 2022.11.20
OSIV란?

서론 이번 글은 IssueTracker 프로젝트를 진행하면서 겪었던 영속성 컨텍스트와 관련된 문제를 맞닥트리면서 알게 된 OSIV라는 개념을 정리해보기 위해 작성하게 되었다. 고민 : 미션을 진행하며 대부분의 api에서 유저의 정보가 필요할것이라고 판단했고, 매번 유저를 조회하는 코드의 중복을 제거하고 싶었다. 해결책 : jwt 토큰을 통해 받은 유저의 id를 사용해 인터셉터에서 미리 유저 객체를 조회한 뒤, ArgumentResolver 를 사용해서 해당 유저 객체를 컨트롤러에서 파라미터로 받아서 사용하기로 했다. 하지만 예상하지 못한 문제가 발생했다. 인터셉터에서 조회해서 컨트롤러에서 넘겨받은 유저 객체는 영속성 컨텍스트에서 관리해주지 않았다. 원인은 영속성 컨텍스트가 생성되는 시점이 우리가 등록한 ..

Backend/Spring 2022.11.20
Test에서는 왜 @Autowired 없이는 의존성 주입이 안될까?

스프링 카페 미션 3단계를 진행하며 Repository에 대한 테스트코드를 작성하며 했던 삽질에 대해 정리한 내용이다. 테스트코드에는 @JdbcTest 어노테이션을 추가했고, 생성자가 하나밖에 없었기 때문에 의존성 주입이 자동으로 이루어질 줄 알았지만 실행해보니 아래와 같은 에러가 발생했다. 처음 보는 에러에 헤매다가 결국 쿠킴의 도움을 받아서 필드에 @Autowired를 붙여주니까 의존성 주입이 되었고 문제는 해결이 됐다. 하지만 분명 스프링에서는 생성자가 하나면 @Autowired를 생략할 수 있다고 배웠는데 대체 왜 안되는지 이해가 안되서 자료를 찾아보게 되었다. 주입하는 주체가 다르다 SpringApplication의 경우 빈을 주입해주는 역할을 스프링이 담당한다. 하지만 테스트의 경우 Junit..

Backend/Spring 2022.11.19