리프레시 토큰 저장소 Redis 적용
·
개발기록/SweetBalance
이번 프로젝트에서는 인증/인가를 JWT를 통해 진행하였다. 초반 구현 단계에서는 MariaDB 내에 RefreshToken 테이블을 추가하여 리프레시 토큰을 관리하였지만 이후 Redis로 토큰 저장소를 변경하여 적용하였다.기존 RDBMS 토큰 저장소에서의 변경 이유 Redis로 리프레시 토큰 저장소를 변경한 가장 큰 이유는 TTL이었다. 리프레시 토큰의 경우 생성 시 만료 시간을 설정해주는데, RDBMS 사용 시 스케쥴러를 통해 수동으로 DB 내부 리프레시 토큰 값을 삭제시켜주어야 했기에 Redis의 TTL(Time To Live) 기능을 활용하여 Redis 내에서 자동으로 리프레시 토큰을 삭제하도록 해주었다. 추가적으로, Redis는 인메모리 저장 방식을 사용하기에 응답 속도가 RDBMS 보다 10배 ..
셀레니움을 활용한 크롤링 시스템 구현
·
개발기록/SweetBalance
브랜드별 음료에 대한 데이터를 관리하고, 그와 연결되어 정보 및 기능이 제공되는 애플리케이션이었기에 크롤링 로직의 구현이 필수적이었다. 관리자용 페이지를 제공하고 따로 데이터를 생성 및 수정하는 방향도 생각해 보았지만 지속적인 데이터의 추가와 사람이 관여하지 않는 자동화된 데이터 관리를 위해 크롤링 시스템을 구축하였다.Jsoup과 Selenium정적인 문서를 파싱하고 크롤링하는것이 목적이라면, Jsoup을 사용하여도 상관없지만 크롤링 대상 브랜드인 스타벅스, 메가커피, 빽다방의 경우 개발자 도구에서 Disable JavaScript를 체크하면 음료의 정보가 정상적으로 로딩되지 않는다. 즉, 음료 정보가 JavaScript에 의해 동적으로 로드된다는 의미이기에 동적 크롤링을 진행해야 했다. 위 이유로 동적..
SecurityConfig 설정
·
개발기록/SweetBalance
지난 포스팅인 인증/인가 로직 구현에 이어 Spring Security의 핵심 설정 클래스인 SecurityConfig에 대해 간단히 정리해보고자 한다.필드 및 생성자하단 CORS에 적용할 프론트 측 오리진 문자열은 yml 파일로 부터 가져오도록 작성하였고, AuthenticationConfiguration의 경우 Spring Security의 기본 인증 설정이 주입된다.@Configuration@EnableWebSecuritypublic class SecurityConfig { @Value("${spring.front.origin-http}") private String frontOriginHttp; @Value("${spring.front.origin-https}") privat..
Spring Security와 JWT를 통한 인증/인가 로직 구현
·
개발기록/SweetBalance
학기 중에 진행했던 KUIT 동아리 스터디 활동의 연장선으로, 방학 기간 동안 프로젝트를 진행하게 되어 그 이야기를 블로그에 차근차근 담아보고자 한다.일반 로그인 & 소셜 로그인 통합 구현프로젝트 요구사항에 따라, 일반 로그인과 소셜 로그인 기능을 동시에 구현하여야 했다.개발자 유미님의 영상들을 보며 인증&인가 로직의 전반적인 구조를 잡을 수 있었다. (압도적 감사드립니다..)https://www.youtube.com/@xxxjjhhh/playlists 개별적으로 올라온 일반 로그인과 소셜 로그인의 통합과, 프로젝트 요구사항에 맞춘 로직의 추가 및 수정이 필요했다.통합 과정에서 가장 헷갈렸던 개념은, `authentication.getPrincipal()` 메소드의 반환 객체 타입이 다르다는 점이었다.A..
NoSQL : MongoDB & Redis
·
개념정리
MongoDBmongo는 humongous를 줄인 표현이다. 즉 '매우 큰 DB'라는 뜻장점1. Schema-less 구조를 사용 >> 다양한 형태의 데이터를 저장 가능 / 데이터 모델의 유연한 변화 가능2. Read / Write 성능이 뛰어남3. JSON 구조의 활용으로 데이터를 직관적으로 이해 가능하다단점1. 많은 인덱스 사용 시, 충분한 메모리 공간 확보가 필요하다2. 데이터 공간 소모가 RDBMS에 비해 많다(비효율적인 Key 중복 입력)3. 복잡한 JOIN 사용 시 성능 제약이 따른다4. 트랜잭션 지원이 RDBMS 대비 미약하다특징1. Memory Mapped(데이터 쓰기 시에 OS의 가상 메모리에 데이터를 넣은 후 비동기로 디스크에 기록하는 방식)를 사용방대한 데이터를 빠르게 처리 가능하다2..
CRUD API ++
·
개발공부
코드 https://github.com/kisusu115/CRUD_Node-MongoDB HTTP 메서드 라우터 구현 부분에서, 문득 든 생각이 이 4개의 메서드가 사실상 POST로 모두 대체 가능한 것은 아닌가 생각이 들었다.. GET은 URL에서 간단한 문자열을 통해 데이터를 요청하고, POST는 body를 통해 상대적으로 다량의 데이터를 전송받는다. PUT은 리소스를 생성하거나 수정하기위해 사용하나, 주로 전체 업데이트에 사용되나, 사실상 POST와 같은 기능을 하기에 분기를 나누는 용도를 제외하고는 비슷한 메서드가 아닌가 라는 생각이 들었다 DELETE는 문자 그대로 리소스의 삭제에 사용되는데, DELETE로 받았어도 내가 처리를 어떻게 하냐에 따라 삭제의 기능을 수행하지 않을 수도 있기에, GE..
CRUD API Tutorial
·
개발공부
freeCodeCamp.org - CRUD API Tutorial with Node, Express, MongoDB https://www.youtube.com/watch?v=_7UQPve99r4 >> 최신강의 / Node.js CRUD / MongoDB 적용 이라는 수요에 딱 맞는 외국 강의가 있어서 수강하였다. 코드 https://github.com/kisusu115/CRUD_Node-MongoDB VSCode 설정 빈 폴더 프로젝트 생성 후 터미널에 npm init -y로 package.json 파일 생성시켜준다 main이 되는 index.js 생성 node index.js 로 실행 package.json의 “scripts”에 “serve”: “node index.js”라고 등록해두면 (명령어 설정)..
API, JSON
·
개념정리
API ( Application Programming Interface ) : 응용 프로그래밍 인터페이스 API는 웹기반 데이터 반환 시스템이며 데이터베이스나 서버로 쉽게 접근 할수 있도록 수 많은 함수들을 관리 하는 코드이다. API를 왜 사용하는가? API를 사용하여 개발자가 공공 데이터 및 오픈 데이터를 활용한다는 개념은 익히 들어왔다. 예시) KAKAO, FACEBOOK 로그인 KAKAO, FACEBOOK 등 공공데이터에 이미 저장 되어있는 가입자의 고유 정보들을 KAKAO나 FACEBOOK에 직접 접속하지 않고도 외부로 정보 접근이 가능하도록 API형태로 개발 하여 배포를 하기 때문에 활용 할 수 있는 것이다. >> 요청하는 서버 데이터를 API 함수 호출을 통해서 전달 받은 후 신규 서비스에 ..
[백준] 12865 : 평범한 배낭
·
알고리즘
https://www.acmicpc.net/problem/12865 DP를 이용하여 Top-down 방식으로 해결해보았다. f(i, kg)는 i번째 물건을 넣을지 말지 판별 시에, 현재 배낭에 kg만큼 무게가 차있을 때의 최대 가치값을 리턴하는 함수이다. 처음에는 최초 함수 호출을 f(0, 0) 호출 대신 f(N-1,K) 호출로 생각하여 Base 조건을 찾는게 까다롭게 느껴졌으나, f(0, 0)로 첫 함수 호출을 하여 i가 N 이상일 때, kg가 K 초과 시 0을 리턴하며 함수 호출이 끝나도록 조건을 거꾸로 생각하니 처음보다 수월하게 구현되었다. 아직 dp배열을 유지하는 레퍼런스 타입 변수 ret의 사용이 익숙치 않아서 DP 문제를 해결하며 숙련도를 높여야 한다. #include #include usin..