본문 바로가기

Spring33

[TroubleShooting] 브라우저 쿠키 이슈로 특정 계정 로그인 실패 해결 방안 목차마주한 문제문제 해결 과정성과결론1. 마주한 문제운영 서버의 특정 계정만 로그인 시 JWT쿠키가 생성되지 않아 로그인 실패가 발생하였다.로그인 시도 시 토큰을 갱신과정에서 JWT 토큰을 쿠키에서 읽지 못함.크롬/엣지 등 다른 브라우저에서도 동일 현상.운영 로그를 확인해보니 로그인 시도 시 NullPointerException 발생다른 OAuth 쿠키(access_token, refresh_token)는 정상 생성됨즉, JWT 토큰 자체는 생성되는데 쿠키로 저장되지 않아 로그인 흐름이 끊어지는 문제였다.2. 문제 해결 과정1. NPE 발생 지점 확인String token = CookieUtils.getCookie(request, CookieUtils.JWT_TOKEN).getValue();getCook.. 2025. 12. 9.
DTO는 어느 레이어까지 사용하는 것이 좋을까? 목차개요[AS-IS] Controller ↔ Service 레이어간 동일한 DTO[To-Be] Controller ↔ Service 레이어간 각각의 DTO결론1. 개요DTO(Data Transfer Object)는 레이어 계층 간 데이터를 전송하는데 사용되는 객체로 많은 사람들이 사용하고 있다. 이유는 다음과 같이 간단하다.DTO를 이용해 각 계층이 필요한 데이터만 전달 받아 처리할 수 있다.시스템의 결합도를 낮추고 유지보수성을 향상시킨다.따라서, “DTO를 사용할 때 어느 레이어까지 사용하는 것이 좋을지”에 대해서는 프로젝트 과정에서 반드시 고려해야 할 요소이다. 이를 통해 개발자는 유연하고 확장 가능한 시스템을 구축하고 더 나은 서비스를 제공해 줄 것이다.이번에 게시글을 작성하면서 DTO에 대한 레이.. 2024. 12. 29.
JPA를 사용하는 이유가 무엇일까? 목차개요순수 JDBCSQL Mapper(JdbcTemplate, Mybatis)JPA(Java Persitence Api)Jdbc vs SQL Mapper vs JPAJPA가 무조건 좋을까?결론1. 개요현재 많은 개발자들이 JPA를 사용하지만 JPA를 사용하는 이유와 장단점에 대해 정리해보려고 한다.먼저 코드를 통해서 눈에 띄는 차이를 살펴보자.2. 순수 JDBC과거에는 객체를 데이터베이스 저장 하려면 위와 같이 복잡한 JDBC API와 SQL을 한땀 한땀 작성해야 했다.3. SQL Mapper(JdbcTemplate, Mybatis)JdbcTemplate이나 Mybatis 같은 SQL Mapper가 등장하면서 위와 같이 개발 코드가 줄었지만 개발자가 SQL을 작성해야 하는 것은 변하지 않았다.4. JP.. 2024. 8. 7.
트랜잭션 전파 옵션을 이용해서 복구하기 목차개요복구 REQUIRE복구 REQUIRE_NEW복구 REQUIRES_NEW 사용X결론1. 개요회원 가입과 로그를 하나의 트랜잭션으로 묶은 기능이 있다. 이때 이력 로그를 DB에 남기는 작업에 문제가 발생해서 가입 자체가 안되는 경우가 발생한다고 하자.‘회원 가입을 시도한 로그를 남기는데, 실패하더라도 회원 가입은 유지되어야 한다.’이 요구사항을 만족하기 위해 REQUIRES_NEW 옵션을 사용해보자.2. 복구 REQUIRE개발자들이 많이 하는 실수 케이스이다.LogRepository 에서 예외가 발생하면 그것은 MemberService 에서 예외를 잡아서 처리하면 될 것 같다라고 생각한다.그러나 내부 트랜잭션에서 rollbackOnly 를 설정하기 때문에 결과적으로 정상 흐름 처리를 해서 외부 트랜잭.. 2024. 8. 3.
스프링 트랜잭션 전파에 대해 알아보자 목차개요전파 기본외부롤백내부롤백결론1. 개요트랜잭션이 둘 이상 있을때 어떻게 동작하는지 자세히 알아보고, 트랜잭션 전파에 대한 개념을 알아보려고 한다. 트랜잭션을 각각 사용하는 것이 아니라 트랜잭션이 이미 진행중인데, 여기에 추가로 트랜잭션을 수행하면 어떻게 될까?기존 트랜잭션이 별도의 트랜잭션을 진행해야 하는지? 아니면 기존 트랜잭션을 그대로 이어 받아서 트랜잭션을 수행해야 하는지? 이런 경우 어떻게 동작할지 결정하는 것을 트랜잭션 전파(propagation)라 한다.2. 전파 기본외부 트랜잭션이 수행중인데, 내부 트랜잭션이 추가로 수행됨.스프링에서 이 경우 외부 트랜잭션과 내부 트랜잭션을 묶어서 하나의 트랜잭션을 만들어준다. 내부 트랜잭션이 외부 트랜잭션에 참여하는 것이다. 이것은 기본동작이고 옵션을.. 2024. 7. 28.
@Transactional을 사용할때 어떤 점을 주의할까? 목차개요주의사항1 - 프록시 내부 호출주의사항2 - public 메서드만 트랜잭션 적용주의사항3 - 초기화 시점결론1. 개요보통 트랜잭션을 걸고 싶을때 간단하게 @Transactional 키워드를 자주 사용한다. 이 키워드를 사용하면 스프링의 트랜잭션 AOP가 적용된다.트랜잭션을 적용하다가 많은 개발자들이 이 문제를 실수 하는 경우가 많은데 아래 내용을 천천히 살펴보자.2. 주의사항1 - 프록시 내부 호출 @Transactional 을 적용하면 프록시 객체가 요청을 먼저 받아서 트랜잭션을 처리하고, 실제 객체를 호출해준다.따라서, 트랜잭션을 적용하려면 항상 프록시를 통해서 대상 객체를 호출해야 한다.AOP를 적용하면 스프링은 대상 객체 대신에 프록시를 스프링 빈으로 등록한다. 따라서 스프링은 의존관꼐 주.. 2024. 7. 11.