본문 바로가기

전체 글

Spring Cloud GateWay의 non-blocking server Spring Cloud GateWay를 사용한 프로젝트를 진행하면서 로깅을 통해 내부적으로 netty가 사용되는걸 확인했다. 하지만 netty가 무엇인지 정확한 개념이 없었다. 그래서 관련 내용을 공부했고 해당 내용을 공유하려한다. 공식문서에 따르면 Spring Cloud GateWay는 Spring WebFlux 위에서 동작한다. This project provides a library for building an API Gateway on top of Spring WebFlux Spring WebFlux의 중요한 특징 중 하나는 non-blocking server를 사용한다는 것이다. 여기서 궁금증이 생겼다. non-blocking server와 blocking server의 차이점은 무엇이고, sp.. 더보기
@SpringBootTest의 비밀! Spring과 JUnit을 사용해 개발하면서 통합 테스트를 위해 @SpringBootTest를 많이 사용해왔다. 하지만 누군가 @SpringBootTest에 대해 물어보면 Spring의 통합 테스트를 도와주는 애노테이션이라고 밖에 말할 수 없었다. 그래서 @SpringBootTest가 정확히 어떤 기능을 제공하고 내부적으로 어떻게 동작하는지 궁금해졌다. 이번 글을 통해 공부한 내용을 공유하겠다. 공식문서에서 설명하는 @SpringBootTest 가장먼저 공식문서를 통해 정확히 어떤 기능을 제공하는지 알아봤다. Annotation that can be specified on a test class that runs Spring Boot based tests. Provides the following fea.. 더보기
Git Submodule 이용해 중요 정보 관리하기 팀 프로젝트를 진행하다 보니 설정 파일에 AWS 비밀번호, JWT secret key와 같이 중요한 정보들이 들어가게 됐다. 우리 팀은 GitHub을 이용해 소스 코드를 관리하고 있었다. 이런 중요한 정보를 GitHub에 올리면 문제가 발생할 것 같았다. 문제를 해결하기 위해 프로젝트에서 중요한 정보를 관리하는 다양한 방법에 대해 알아봤다. 그 결과 Git Submodule을 이용해 중요 정보를 관리하게 됐다. 이 과정에서 한 고민과 Git Submodule 사용 꿀팁과 주의할 점을 공유하겠다. 중요 정보 관리하는 다양한 방법 중요 정보 관리하는 방법은 크게 4가지 존재한다. 첫 번째는 Jasypt(Java Simplified Encryption)를 이용해 중요 정보를 암호화할 수 있다. 중요한 정보를 .. 더보기
Linkocean 프로젝트 회고 2022.07.21 ~ 22022.8.16까지 기획과 첫 번째 버전의 Linkocean 서비스를 개발했다. Linkocean 서비스는 소셜북마킹 서비스다. Linkocean 서비스를 개발하면서 좋았던 경험과 아쉬웠던 경험을 공유하려 한다. 좋았던 경험 Querydsl 제대로 사용하기 (feat : 테스트 코드의 중요성) Linkocean은 사용자가 원하는 북마크를 쉽게 찾을 수 있게 하려면 다양한 필터링 기능을 개발해야 했다. 다양한 필터링 기능을 순수 JPQL을 이용하면 중복 코드가 많아지는 단점이 있어 Querydsl을 사용했다. 하지만 Querydsl에 익숙하지 않아 첫 버전의 코드는 Querydsl의 장점 중 하나인 동적 쿼리를 제대로 활용하지 못했다. 그 결과 아래 그림과 같이 수많은 메서드가 .. 더보기
[JWT 로그인 구현기] (3) Redis 도입하기 전편에서 refresh token을 MySQL에 저장했다. 그런데 내가 개발한 애플리케이션에서는 사용자 로그인, 토큰 재발급 요청이 들어올 때마다 refresh token 값이 수정된다. 쉽게 말해 MySQL IO 연산이 너무 자주 일어난다. 이는 성능적으로 문제가 있음을 느꼈고 개선하고 싶었다. 그래서 이번 편에서는 전편에서 생긴 성능 문제를 해결하기 위해 고민하고 공부한 내용을 공유하려 한다. Redis 성능에 대해 문제가 생길 것 같다고 생각한 이유는 MySQL은 데이터를 SSD, HDD에 저장하기 때문이다. 성능을 어떻게 올릴 수 있을까 고민하고 공부하면서 Redis를 알게 됐다. Redis? Redis는 Remote Dictionary Server로 key-value로 데이터를 저장하는 서버이다.. 더보기
[JWT 로그인 구현기] (2) JWT 로그인 개발하기 전 편에서 사용자 인증 방식으로 Token 기반 방식인 JWT를 이용해 로그인 기능을 개발했다. 그리고 멘토님께 받은 피드백으로 글을 마무리했다. 이번 글에서는 멘토님께 받은 피드백을 계기로 JWT를 이용한 로그인 기능을 고도화하면서 고민한 내용을 공유하려고 한다. Jwt 반환 방식 처음 개발한 JWT 로그인에서는 발급한 JWT를 어떻게 클라이언트로 보낼지 고민하지 않고 헤더에 'token'이라는 이름으로 반환했다. 이 부분을 멘토님께 피드백을 받고 관련 내용을 공부하면서 적합하다고 생각하는 방식으로 수정했다. JWT를 내려주는 방식으로 응답 메시지의 바디, 헤더, 쿠키로 3가지 선택지가 존재한다. 선택에 있어 중요한 부분은 JWT를 클라이언트가 안전하게 보관할 수 있을지다. 선택을 위해 3가지 방법의 .. 더보기
[JWT 로그인 구현기] (1) Session vs Token 팀 프로젝트를 진행하면서 사용자 인증, 인가 기능 개발을 맡았다. 맡은 부분을 개발하면서 많은 고민을 하고 코드를 점진적으로 개선했다. 이 과정에서 한 고민과 경험을 공유하기 위해 글을 작성하게 됐다. Session vs Token 첫 번째 만났던 문제는 사용자 인증 방식이었다. 사용자 인증 방식은 토큰 기반 방식과 세션 기반 방식이 있다. 이 중 어떤 방식으로 개발할지 고민했다. 현재 상황에 맞는 선택하기 위해 두 방식의 장단점을 이해하고 내 상황에 적절한 방식을 선택했다. Session 세션 기반 방식의 흐름은 다음 그림과 같다. 세션 기반 방식은 사용자가 인증되면 사용자와 관련된 세션을 만들고, 세션 아이디를 반환해 준다. 이때 세션은 서버 메모리 또는 DB에 저장할 수 있다. 그 후 사용자는 세션.. 더보기
Marbox 개인 회고 MarBox(팀 프로젝트) 개인 회고 프로젝트 간략 소개 프로그래머스 백엔드 데브코스에 참여하면서 약 2주간 팀 프로젝트를 진행했다.팀 프로젝트의 주제는 클론 코딩이었다. 우리 팀은 CGV의 예매 API를 클론했다. 개인적인 목표 프로젝트를 진행하면서 개인적인 목표를 설정했다. 단순한 기능 구현이 아닌 고민을 통한 기능 구현. 최대한 현업과 비슷한 프로세스로 개발. 그러면서 필요한 기술을 익히고 도입. 좋았던 점 단순 기능 구현이 아니라 하나의 기능을 구현하더라도 고민하고 구현했다. 안정적인 개발 프로세스를 위한 기술을 공부하고 도입했다. 그리고 소프트 스킬과 관련한 새로운 인사이트를 얻었다. 기능 고도화 프로젝트에서 로그인 기능 구현을 맡았다. 단순히 Jwt 토큰을 발급하고, 발급한 토큰으로 사용자를 .. 더보기