본문 바로가기

분류 전체보기116

Redis로 Session Store 적용하기 Redis로 Session Store 적용하기 로그인 방식에 대한 고찰 : JWT vs Session JWT vs Session 보통 로그인 방식을 어떤 방식으로 구현했는지 보면 JWT를 사용한 토큰 기반 인증방식 또는 Session을 사용한 세션 기반 인증방식이 있다. 그리고 주위 개발자분들께 회사에서 어떠한 oneny.tistory.com 위 게시글에서 JWT 방식과 Session 방식 중 Session 방식을 선택했다. 세션은 간단히 말하면 서비스를 사용하는 클라이언트의 상태 정보를 의미하고, 어플리케이션은 현재 서비스에 로그인되어 있는 클라이언트가 누구인지, 그 클라이언트가 어떤 활동을 하고 있는지 저장하고 있으며, 유저가 서비스를 떠나면 세션 스토어에서 유저의 정보는 삭제한다. 하지만 Sessi.. 2023. 11. 27.
사용자 인증 방식에 대한 고찰 : JWT vs Session JWT vs Session 보통 사용자 인증 방식을 어떤 방식으로 구현했는지 보면 JWT를 사용한 토큰 기반 인증방식 또는 Session을 사용한 세션 기반 인증방식이 있다. 그리고 주위 개발자분들께 회사에서 어떠한 방식을 쓰는지 여쭤보면 JWT 방식을 사용하고 있다고 있다고 한다. 근데 왜 JWT를 사용하는지에 대해서는 쉽게 말씀해주시지 못하는데 이번 기회를 통해 각 방식의 장단점에 대해 비교해보고, 현재 하고 있는 프로젝트에 어떤 방식을 선택해 사용할지 고민해보자. JWT(Json Web Token) JSON Web Token(JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. Th.. 2023. 11. 25.
테스트 커버리지 확인을 위한 jacoco 설정 Jacoco JaCoCo(Java Code Coverage)는 Java 언어를 대상으로 하는 코드 커버리지 도구이다. 이 도구는 소스코드의 얼마나 많은 부분이 실행되었는지 측정하여 코드 커버리지를 제공한다. 코드 커버리지는 테스트 스위트 또는 특정 테스트 케이스가 소스코드의 어느 정도를 실행했는지를 나타낸다. JaCoCo는 Java 애플리케이션의 클래스, 메서드, 라인 등의 다양한 수준에서 코드 커버리지를 측정할 수 있다. JaCoCo는 다음과 같은 주요 기능을 제공한다. 라인 커버리지(Line Coverage): 소스 코드의 각 라인이 얼마나 실행되었는지 측정 브랜치 커버리지(Branch Coverage): 조건 분기의 각 부분이 얼마나 실행되었는지 측정 메서드 커버리지(Method Coverage):.. 2023. 11. 23.
MySQL 데드락 자동 감지 및 비활성화 시 대응 데드락 데드락(Deadlock)은 데이터베이스에서 여러 트랜잭션이 서로가 가진 잠금을 기다리면서 무한정 대기하게 되어 데이터베이스의 작업이 더 이상 진행되지 않는 상황을 의미한다. 멀티 스레드(Multi-threaded) 어플리케이션에서 발생하는 데드락은 해당 어플리케이션을 완전히 멈추게 해버리기 때문에 위험하다. 따라서 데드락이 발생하면 어떻게 대응할 수 있을지를 알아야 한다. 데드락이 발생하면 어플리케이션 단에서 커넥션을 계속 물고 있고, 클라이언트 입장에서는 5초 동안 응답이 안오면 재시도할 가능성이 높다. 그러면 똑같은 레코드에 똑같은 이유로 데드락이 걸릴 확률이 높고, 커넥션 풀의 커넥션이 점점 부족해지는 문제가 발생할 가능성이 높아진다. 실제 데드락 상황이 아닐지라도 락에 대한 대기시간이 설정.. 2023. 11. 21.
Logback 로깅과 MDCFilter로 로깅 식별자 적용하기 로깅 로깅은 프로그램 동작 시 발생하는 모든 일(서비스 동작 상태 및 장애)을 기록하는 행위를 말한다. 이를 통해 개발, 테스트, 운영 등 다양한 환경에서 애플리케이션의 동작을 이해하고 모니터링하는 데 도움이 된다. 서비스 동작 상태: 시스템 로딩, HTTP 통신, 트랜잭션, DB 요청, 의도를 가진 Exception, ... 장애(exception, error): I/O Exception, NullPointerException, 의도하지 않은 Exception, ... 로깅은 언제할까? 정답이 없다. 프로젝트의 성격에 맞게 팀에 맞게 정의하면 된다. 그리고 로깅 시점은 때에 따라 다르다. 언제 기록할지를 정했다면 어떻게 기록할지도 중요한 부분이다. 우리가 아는 가장 로깅하기 쉬운 방법에는 System... 2023. 11. 18.
슬로우 쿼리 로그(Slow Query Log) 슬로우 쿼리 로그(Slow Query Log) 슬로우 쿼리 로그는 데이터베이스 시스템에서 실행 속도가 느린 쿼리를 식별하고 기록하는 로그 시스템을 말한다. 슬로우 쿼리 로그는 다음과 같은 상황에서 사용된다. 성능 튜닝: 데이터베이스의 성능을 향상시키기 위해 느린 쿼리를 식별하고 최적화할 때 사용된다. 문제 진단: 어떤 쿼리가 성능 이슈를 일으키는지 파악하여 해결하는데 도움이 된다. 시스템 감지: 데이터베이스 시스템을 지속적으로 감시하여 성능 저하를 미리 감지할 수 있다. 보통 DBMS의 설정에서 이를 활성화하고 관련된 옵션을 구성할 수 있다. 설정 slow_query_log 시스템 변수를 통해서 on/off할 수 있고, slow_query_log_file 시스템 변수는 슬로우 쿼리 로그 파일 경로를 나타.. 2023. 11. 14.
옵티마이저와 힌트 (2/2) 쿼리 힌트 MySQL 서버는 우리가 서비스하는 비즈니스를 100% 이해하지 못하기 때문에 서비스 개발자나 DBA보다 MySQL 서버가 부족한 실행 계획을 수립할 때가 있을 수 있다. 이런 경우 옵티마이저에게 쿼리의 실행 계획을 어떻게 수립해야 할지 알려줄 수 있는 방법이 필요하기 때문에 이런 목적으로 옵티마이저 힌트가 제공된다. MySQL 서버에서 사용 가능한 쿼리 힌트는 다음과 같이 2가지로 구분할 수 있다. 인덱스 힌트 "STRAIGHT_JOIN"과 "USE INDEX" 등을 포함한 인덱스 힌트들은 SELECT 명령과 UPDATE 명령에서만 사용할 수 있다. 옵티마이저 힌트 STRAIGHT JOIN STRAIGHT_JOIN은 옵티마이저 힌트인 동시에 조인 키워드이기도 하다. STRAIGHT_JOIN은.. 2023. 11. 13.
상품 구매 트랜잭션으로 보는 부정합 문제 트랜잭션 이상 현상에 따른 정합성 문제 트랜잭션과 잠금 트랜잭션과 잠금 트랜잭션 트랜잭션은 꼭 여러 개의 변경 작업을 수행하는 쿼리가 조합됐을 때만 의미 있는 개념은 아니다. 트랜잭션은 하나의 논리적인 작업 셋에 하나의 쿼리가 있든 두 개 이 oneny.tistory.com 위 트랜잭션과 잠금에 대한 이론을 공부하고 프로젝트에 이 트랜잭션과 잠금을 어떻게 적용할 수 있을지 테스트해보려고 한다. 상품 구매 상황에서 발생 가능한 문제 두 명의 사용자가 동시에 하나의 상품을 구매했다고 가정해보면 다음과 같은 로직의 순서가 이루어진다. 구매하려는 상품 조회해서 재고가 있는지 확인 사용자의 주문 데이터 생성 구매하려는 상품 재고 차감 물론 결제 로직도 추가해야하지만 그것보다는 사용자가 상품 구매하는 상황에서 발생.. 2023. 11. 13.
옵티마이저와 힌트 (1/2) 옵티마이저와 힌트 어떤 DBMS든지 쿼리의 실행 계획을 수립하는 옵티마이저는 가장 복잡한 부분으로 알려져 있으며, 옵티마이저가 만들어 내는 실행 계획을 이해하는 것 또한 상당히 어려운 부분이다. 하지만 실행 계획을 이해할 수 있어야만 실행 계획의 불합리한 부분을 찾아내고, 더 최적화된 방법으로 실행 계획을 수립하도록 유도할 수 있다. 실행 계획을 살펴보기 전에 먼저 알고 있어야 할 몇 가지 사항을 살펴보자. 쿼리 실행 절차 MySQL 서버에서 쿼리가 실행되는 과정은 크게 세 단계로 나눌 수 있다. 사용자로부터 요청된 SQL 문장을 자게 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리(파스 트리)한다. SQL의 파싱 정보(파스 트리)를 확인하면서 어떤 테이블부터 읽고 어떤 인덱스를 이용해 테이블을 .. 2023. 11. 10.