스프링 부트 REST API 개발일지
[Redis] 조회수를 캐시를 적용했지만 속도가 느린 문제 해결
문제 https://github.com/sendOwlOrganization/SendOwl/issues/17 을 통해 Redis로 조회수를 갱신하도록 개선함 그러나 실제 스트레스 테스트를 진행하면 sql을 2번 날리는 경우가 더 빠르다. sql update쿼리를 통해 hit를 매번 갱신하는 경우 redis를 통해 hit를 갱신하는 경우 해결방법 1. 해당 문제를 개선하기 위해 @Async를 통해 비동기로 Redis의 함수 동작을 바꾸었다. Redis + Async처리한 경우 결과적으로 비동기 처리를 추가하면 조금 더 빨라지는것을 확인가능하다. 그러나 mysql 쿼리를 2번 날리는 것보다는 빠르지 않다. 2. Redis 시간복잡도 줄이기 https://www.notion.so/dayparallax/Redis..
[스프링] spring MVC life cycle
Spring MVC life cycle Filter Web Application의 전역적인 로직을 담당한다. 전체적인 필터링 설정을 하는 곳이다. DispatchServlet에 들어가기 전인 Web Application단에서 실행된다. DispatchServlet (Controller 매핑) *Dispatcher==”배치 담당자” ⇒ Request에 대해서 어느 컨트롤러로 매핑시킬것인지 배치하는 역할 *요청되는 모든 Request를 받아 처리해주는 서블릿HandlerMapping에게 Request에 대해 매핑할 Controller 검색을 요청한다. HandlerMapping으로부터 Controller 정보를 반환받아 해당 Controller와 매핑시킨다. HandlerMapping(알맞은 Controll..
JWT (Json Web Token)
인증 vs 인가 인증 : 로그인, 내가 서비스의 권한을 가지고 있다는 것을 확인받는다. 인가 : 이미 인증을 받은 사용자가 서비스의 여러 기능을 사용하기 위해 자신의 권한을 사용하는 일. 로그인 후 일어나는 일 그럼 매번 요청을 보낼때마다 아이디와 패스워드를 같이 보내서 인증과 인가를 한번에 해결할 수는 없는가? ⇒ 보안상 위험하기도 하고 로그인에 필요한 암호화, 데이터베이스 통신 등등 다양한 검증 과정이 꽤 비용이 크기 때문에 이러한 방식은 비효율적이다. 따라서 쿠키, 세션, jwt 등의 다양한 방식을 활용하여 인증과 인가를 분리한다. 우선 JWT를 알아보기 전에 서버에서 자주 사용되는 세션을 간단히 이해하면 좋다. Session 세션은 서버에서 인증을 관리하는 것을 의미한다. 세션이랑 표를 끊어서 반..
[SpringBoot] DTO를 어떻게 관리해야할까?
문제 api별로 req,res DTO들을 사용하다 보니 너무 많은 DTO를 생성하게 된다. 향후 프로젝트를 더 진행하게 되면 관리가 더 어려울 것이라 판단하여 이를 해결하고자 한다. 해결방법 Inner Class로 바꾸어 관리한다. 도메인의 이너 클래스로 관리하여 DTO 관리 편의성을 높인다. import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.Setter; public class User { @Getter @AllArgsConstructor @Builder public static class Info { private int id; private String name; private int..
[고민] public repository에 application.properties(.yml)의 정보를 어떻게 관리해야할까?
예전에 공모전에 참가하며 설정파일에 모든 주소들이 공개되어 해커가 db를 싹다 암호화해버린 경험이 있었다. 그래서 당시에는 결국 repository를 private로 진행했고 이후 공모전이 끝나고 나서 public으로 전환한 기억이 있다. 사실 이러한 문제를 알고 있었기 때문에 과연 프로젝트를 공개적으로 배포하기 위해서는 무엇을 해야하는지 여러가지 방안을 고민해보게 되었다. 이때 사용가능한 방법을 몇개 생각해보았다. ${key}사용하여 환경변수로 application.properties를 작성한다. 이 방법을 사용하는 경우 로컬에서 매번 실행시 java -jar -Dusername=root target/SendOwl-0.0.1-SNAPSHOT.jar 식으로 실행해주어야 한다. 나는 intellij를 사용..