본문 바로가기

Java59

세션은 어느 계층에서 처리해야 할까? 세션은 어느 계층에서 처리해야 할까? 세션을 통해 사용자 관련 로그인, 로그아웃 기능을 구현하고 있을 때 현재 어떤 문제가 있는지에 대해서 살펴보고, 리팩토링해보자! 리팩토링 전 코드 먼저 리팩토링을 하기 전에 로그인은 어떻게 동작하고 있는지에 대해서 살펴보자. @MemberLoginCheck @Target(ElementType.METHOD) @Retention(value = RetentionPolicy.RUNTIME) public @interface MemberLoginCheck { } 먼저, @MemberLoginCheck 어노테이션을 생성해줬다. Controller 레이어에서 @MemberLoginCheck 어노테이션이 붙어있는 메서드는 실행 전에 로그인 검증이 일어날 수 있도록 Aspect 클래스.. 2023. 11. 30.
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.
Logback 로깅과 MDCFilter로 로깅 식별자 적용하기 로깅 로깅은 프로그램 동작 시 발생하는 모든 일(서비스 동작 상태 및 장애)을 기록하는 행위를 말한다. 이를 통해 개발, 테스트, 운영 등 다양한 환경에서 애플리케이션의 동작을 이해하고 모니터링하는 데 도움이 된다. 서비스 동작 상태: 시스템 로딩, HTTP 통신, 트랜잭션, DB 요청, 의도를 가진 Exception, ... 장애(exception, error): I/O Exception, NullPointerException, 의도하지 않은 Exception, ... 로깅은 언제할까? 정답이 없다. 프로젝트의 성격에 맞게 팀에 맞게 정의하면 된다. 그리고 로깅 시점은 때에 따라 다르다. 언제 기록할지를 정했다면 어떻게 기록할지도 중요한 부분이다. 우리가 아는 가장 로깅하기 쉬운 방법에는 System... 2023. 11. 18.
상품 구매 트랜잭션으로 보는 부정합 문제 트랜잭션 이상 현상에 따른 정합성 문제 트랜잭션과 잠금 트랜잭션과 잠금 트랜잭션 트랜잭션은 꼭 여러 개의 변경 작업을 수행하는 쿼리가 조합됐을 때만 의미 있는 개념은 아니다. 트랜잭션은 하나의 논리적인 작업 셋에 하나의 쿼리가 있든 두 개 이 oneny.tistory.com 위 트랜잭션과 잠금에 대한 이론을 공부하고 프로젝트에 이 트랜잭션과 잠금을 어떻게 적용할 수 있을지 테스트해보려고 한다. 상품 구매 상황에서 발생 가능한 문제 두 명의 사용자가 동시에 하나의 상품을 구매했다고 가정해보면 다음과 같은 로직의 순서가 이루어진다. 구매하려는 상품 조회해서 재고가 있는지 확인 사용자의 주문 데이터 생성 구매하려는 상품 재고 차감 물론 결제 로직도 추가해야하지만 그것보다는 사용자가 상품 구매하는 상황에서 발생.. 2023. 11. 13.
DTO <-> Entity 어디서 변환해야 할까? DTO Entity 어디서 변환해야 할까? 프로젝트를 진행하면서 DTO와 Enity를 어디서 변환하면 좋을지 생각했고, 이 주제는 개발에 있어 다들 많이 하는 고민 중 하나인 것 같다. 데이터베이스 Entity와 클라이언트 또는 API에서 사용하는 DTO(Data Transfer Object) 변환 과정은 데이터 구조 및 비즈니스 로직 차이를 해결하는 데 도움이 된다. 따라서 변환 과정은 개발에 중요한 요소 중 하나라고 생각한다. 그러면 먼저 DTO는 무엇이고, Entity가 무엇인지부터 간단히 살펴보자. Entity Entity는 데이터 모델링에서 레코드 또는 데이터베이스 테이블에서 식별 가능한 하나의 항목을 나타내는 개념이다. Entity는 특정 도메인에서 중요한 정보 단위를 나타내며 데이터베이스에서.. 2023. 11. 3.
회원가입 동시성 이슈 테스트 - DB Unique 활용하기 회원가입 동시성 이슈 테스트 절대 흔한 일은 아니지만 만약 동시에 두 명의 사용자가 같은 이메일로 회원가입을 하게 되면 어떻게 될까? 이에 대한 궁금증을 해결하기 위해 직접 테스트를 진행해보고자 한다. 회원가입 비즈니스 로직 Service 계층에 위치한 signUp 메서드는 말그대로 회원가입을 진행하는 비즈니스 로직을 담고 있다. 순서는 다음과 같다. validateMemberDto(_): 사용자가 입력한 정보에 대해 유효성을 검사한다. if (isDuplicatedMember(_)) { ... }: 만약 이미 가입한 이메일이 있으면 EmailDuplicationException 예외가 발생한다. signUpMemberDto.toEntity(): DTO -> Entity로 변환한다. setBcryptPa.. 2023. 10. 30.
빈 후처리기(BeanPostProcessor) 빈 후처리기 스프링에서 빈 후처리기(BeanPostProcessor)는 컨테이너에 의해 생성된 빈 객체의 초기화 과정에서 커스텀 동작을 수행할 수 있도록 해주는 용도로 사용된다. 빈 후처리기는 스프링의 AOP(Aspect-Oriented Programming)와 관련된 작업, 빈 초기와나 소멸 시 추가 작업, 그리고 빈의 커스텀 로직 적용과 같은 다양한 작업을 수행할 때 유용하다. BeanPostProcessor 인터페이스 postProcessBeforeInitialization(Object bean, String beanName): 빈 객체가 초기화되기 전에 호출되는 메서드이다. 이 메서드를 통해 빈 객체를 수정하거나 빈 객체가 초기화되기 전 추가 작업을 수행할 수 있다. postProcessAfter.. 2023. 10. 17.