SPRING BOOT
Rate limit 알고리즘의 종류
https://www.mimul.com/blog/about-rate-limit-algorithm/ 서비스 가용성 확보에 필요한 Rate Limiting Algorithm에 대해 | Mimul Tech logRate Limit 알고리즘(Leaky bucket, Token bucket, Fixed window counter, Sliding window log, Sliding window counter)과 주요 서비스들의 Rate Limit 정책 등에 정리한 글.www.mimul.com 기록용
[SpringBoot] MapStruct에 대하여
대부분의 애플리케이션에서 POJO를 다른 POJO로 변환하는 코드를 많이 볼 수 있다. 예를 들어 일반적인 유형의 변환은 엔티티와 클라이언트의 DTO 간에 발생한다. 이것이 바로 MapStruct가 해결하는 문제이다. 매퍼를 수동으로 만드는 것은 대부분 반복적이고, 시간이 많이 소요되며, 실수의 여지가 많다. 비즈니스 로직에 섞이게 되면 소스 또한 빌더의 호출로 인해 가독성이 떨어지게 된다. 해당 라이브러리는 빈 매퍼 클래스를 자동으로 생성해준다. 어노테이션 기반으로 작성되며 Bean으로 등록할 수 있어 여러 프레임워크의 DI를 활용하여 사용할 수도 있다. 같은 기능의 라이브러리인 modelMapper에 비해 리플렉션이 없이 메서드 호출만 하기 때문에 성능에 대한 영향이 없다. 리플렉션이란? 클래스, 필..
[SpringBoot] 실행환경에 따른 설정파일 변경 ( @EnableConfigurationProperties , @ConfigurationProperties )
어플리케이션의 실행환경이 계속 달라질 수 있다. 다른 서버, 다른 포트를 사용해야 할 때 마다 어플리케이션을 새로 빌드해야 한다면 정말 불편해진다. 웹 애플리케이션의 실행 환경에 따른 구성설정의 외부화를 이용해 설정파일(yml, properties)을 사용했다. 먼저 알아볼 것은 @EnableConfigurationProperties와 @ConfigurationProperties다. @ConfigurationProperties 는 Spring Boot 에서 properties 파일에 정의된 프로퍼티 중 주어진 prefix 를 가지는 프로퍼티들을 매핑하여 Bean 으로 만들수 있게 해주는 어노테이션이다. yml또는 properties 파일의 값을 bean으로 만들어 사용할 수 있게 된다. @EnableCo..
카카오로그인과 OAuth2
이번에 소셜로그인을 진행하면서 , 그간 한두번 해봤던 소셜로그인을 다시 해보았다. 항상 구글검색으로 나온 코드를 맞는지 틀리는지도 모르고, 대충 복붙하여 오류범벅으로 사용하곤 했는데, API를 여러번 사용하며 Http로 데이터를 주고 받는 것에 익숙해지니, 정말로 쉽게 느껴졌다. 소셜로그인 제공업체의 API명세를 보며 직접 코드를 짜다보니, 예전에 복붙하던 코드에는 내 프로젝트엔 필요없는, 쓸데없는 게 많았구나 하고 느끼기도 했고, 이렇게 간단한게 왜 그 당시에는 그렇게 어려웠을까... 하고 생각이 났다. 물론 아직도 한참 부족하지만, 전보다는 성장함을 느끼게 해준 부분이라 참 뿌듯했다. 일단, OAuth란 무엇일까? 각자의 경험으로 생각해봐도 소셜로그인, 즉 카카오나 네이버, 구글로그인 등이 웹에서 보..
HttpURLConnection을 이용한 API 데이터 받아오기
이번 프로젝트에 OPEN API에서 GET방식으로 파라미터를 전달하고, 데이터를 가져와야 하는 부분이 있었다. js를 사용한 프론트단에선 ajax로 컨트롤러를 호출하듯이 쉽게 값을 가져올 수 있었지만, 백단에선 조금 다르게 호출한 다음 String값으로 오는 데이터를 처리해줘야 한다. Http를 연결을 사용하기위해 필요한 것이 HttpURLConnection이다. HttpURLConnection은 ? URL 내용을 읽어오거나 , URL에 GET,POST 방식으로 데이터를 전달할 때 사용한다. 웹페이지나 서블릿에 데이터를 전달 할 수 있다. URL url = new URL(https://api주소?파라미터1=111&파라미터2=222); ObjectMapper mapper = new ObjectMapper(..
[스프링부트] 에디터 이미지업로드 시 임시폴더로 분리하기
기존 CK에디터를 이용해서 이미지를 업로드 할 때는 js script 에디터부분에서 컨트롤러 호출 - multipart로 가져온 파일명을 중복되지않게 난수값을 포함해서 저장 - 로컬의 특정위치에 바꾼파일명으로 파일을 저장 - 파일경로를 표시하는 특정문자열을 붙여서 에디터로 리턴 - 에디터에서 로 이미지 출력 의 로직으로 이미지를 업로드 했다. 여기서 문제점은 일단 글을 작성하든 안하든 에디터로 이미지를 업로드 하는 순간, 사용자가 이미지를 보기 위해선 일단 로컬에 업로드를 시켜야 한다는 것이다. 지금까지는 사용자가 있는 웹을 생각하지 않았기 때문에, 그냥 하나의 폴더를 이용해서 이미지 업로드를 구현했지만 사용자가 다수 있을 때 이런식으로 구현하는건 꽤나 큰 서버 저장공간의 낭비를 만들 것 같아서 저장되는..
스프링부트 Scheduler
Scheduler 설정한 시간마다 특정한 동작을하는 스케쥴러를 활용해보았다. 현재 프로젝트중인 구인게시판이다. 카풀, 동호회, 같이타요 등 스키장과 관련된 구인을 할 수 있는 게시판인데, 글작성 중 제공일자를 선택할 수 있다. 제공일자를 경과하거나 마감버튼을 따로 누르면 마감글포함 버튼을 누르지 않으면 표시되지않고, 파란색으로 따로 표시되고 연락처칸이 블라인드처리 된다. 마감이 됐는지 안됐는지 따로 컬럼을 만들어서, 구분자를 만들어 분류를 해줬다. 일일이 게시글을 확인해 마감처리를 해줄수는 없으니 스케쥴러를 사용해서 매일오전 0시에 제공일자를 경과한 게시글은 자동적으로 마감처리를 해줘야겠다. import org.springframework.beans.factory.annotation.Autowired; ..
CK에디터로 올린 이미지에서 썸네일 뽑아내기 ( 정규식 )
CK에디터를 사용중, 이미지 올리기를 이용해 올린 이미지를 썸네일로 사용하고 싶었다. 단, 글작성을 해야 PR KEY가 생성되어 글을 구분할 수 있게되는데, 에디터를 사용해 이미지를 출력할때는 ResponsBody를 이용해 비동기 방식으로 로컬에 이미지를 올리고, 해당 경로를 리턴해줘서 에디터가 올린 이미지를 출력할 수 있게 해준다. 즉, 생성된 글의 PR이 없고 에디터로 올린 이미지는 그저 저장된 경로만 알 수 있는 것이다 ( 분류 불가능 ) 그렇다고 썸네일 사진을 따로 등록하라고 input type=file 과 mutipart를 이용해 구현하기에는 귀찮 ;;;;; 기도하고 무엇보다! 사용자가 썸네일 이미지를 따로 업로드 해야하니 불편하다... 그래서 에디터로 등록한 이미지를 뽑아서 썸네일로 사용하고 ..
지도 API 좌표값 소숫점 자르기 ( double형 소수값 자릿수 자르기 )
지도 API를 활용해 키워드 검색 후, 가게 정보를 가져올 수 있었다. 사진에는 보이지 않지만 input hidden으로 선택한 업체의 x 좌표와 y 좌표를 가져온다. 문제는 x좌표와 y좌표를 소수점 뒤 10자리수 까지 가져온다는 것이다. ex) 37.13254642344 , 127.2132132143 DB에 넣기에는 자릿수가 너무 길어져서 부담이 되어, 뒤의 소수점자리를 자르고 싶었다. 좌표에서 소수점뒤의 6자리수 이상부터는 실제로 10cm정도의 차이정도만 있다고 하니, 소수점 뒤에 6자리까지만 잘라주면 되겠다. Java 1. Math.round() double num = 123.4567891011; double test = Math.round(num); double result1 = Math.roun..
WhiteRecord 프로젝트 시작
SpirngBoot와 Jpa&Mybatis를 이용한 WhiteRecord 프로젝트를 시작하려고 한다. 다음 프로젝트는 어떤 주제를 선택할까 고민하다가, 가장 관심있는걸 하는게 가장 깊게 생각할 수 있고, 퀼리티 있게 만들 수 있을 것 같아 취미인 스노우보드, 스키장과 관련 된 웹을 만들어보기로 했다. 이번 목표는 jpa와 Springboot를 사용하는 것도 있었지만, 실제 사용자를 기준으로 제작하고 실용성이 있다면 서비스까지 하고 싶은 마음이 있었다 ( 무료배포 ) 뭘 하면 사용자를 받을 수 있을까... 거의 2주에 걸쳐 알고리즘과 jpa를 공부하면서 계속 생각했다.. 한번은 내가 스노우보드를 시작하게 됐을 때부터 생각해보자. 라는 생각이 들어서, 쭉.. 회상을 해봤더니 스노우보드를 처음 시작하면서 이곳..