[트러블 슈팅] ⚠️ Spring Boot LocalDateTime 변환 에러 해결법 (@JsonFormat vs @DateTimeFormat)
·
프로젝트 트러블 슈팅 및 몰랐던점 정리/CommunityAPI
Spring Boot로 REST API를 개발하다 보면 LocalDateTime 객체를 JSON으로 변환하는 과정에서 오류를 겪곤한다. 특히 Jackson(ObjectMapper)을 사용할 때 별도 설정 없이 LocalDateTime을 직렬화하려고 하면 예외가 발생한다.  문제 상황게시글 등록 API를 호출하면서 LocalDateTime.now()로 생성 날짜를 지정한 후 DB에 저장하려 했지만, 아래와 같은 에러가 발생했다.2025-03-02T00:09:54.324+09:00 ERROR 73471 --- [free_community] [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dis..
[학습 포인트] 💡 JPA에서 update 시 @Modifying 애노테이션이 필요한 이유
·
프로젝트 트러블 슈팅 및 몰랐던점 정리/CommunityAPI
JPA의 기본 동작부터 알아보자!JPA에서 사용하는 @Query 애노테이션은 기본적으로 데이터를 **조회(SELECT)**할 때 사용된다. 그래서 UPDATE나 DELETE처럼 데이터를 변경할 때는 JPA에게 추가적으로 알려줘야 한다. 이때 JPA가 헷갈리지 않도록 명확히 알려주는 방법이 바로 @Modifying 애노테이션이다! 🚨 @Modifying이 꼭 필요한 이유 3가지① 변경 쿼리임을 명확히 알려주기 • JPA는 기본적으로 모든 @Query를 SELECT 쿼리라고 생각한다.• 그런데 UPDATE나 DELETE 쿼리는 데이터베이스에서 실제로 데이터를 변경하는 쿼리라서, JPA의 1차 캐시(영속성 컨텍스트)와 충돌이 생기며 이로인한 동기화 과정에서 동기화가 제대로 되지 않아 데이터의 정합성이 깨지는..
[Spring] @Transactional 사용 시 주의사항
·
스프링
스프링에서 제공하는 @Transactional은 PlatfromTransactionManager로 인해 DB가 바뀌어도 애노테이션 하나로 DB에 접근하여 커밋과 롤백을 할 수 있도록 도와주는 기능이다. 해당 기술을 사용하기 전에 기술의 단점과 주의사항에 대해서 살펴보자.프록시 내부 호출트랜잭션을 적용 했는데 트랜잭션 적용이 안되는 상황 그리고 나중에 롤백이 제대로 안돼가지고 데이터가 안맞는 상황이 발생할 수 있다.@Transactional을 적용하면 스프링의 트랜잭션 AOP가 적용된다.트랜잭션 AOP는 기본적으로 프록시 방식의 AOP를 사용한다. @Transactional을 적용하면 프록시 객체가 요청을 먼저 받아서 트랜잭션을 처리하고, 실제 객체를 호출 해준다. 따라서 트랜잭션을 적용하려면 항상 프록시..
[Spring] 스프링의 @Transactional, 트랜잭션 기능의 추상화
·
스프링
웹 개발을 함에 있어서, 우리는 스프링에서 제공하는 @Transactional을 통해 비즈니스 로직을 쉽고 안전하게 DB와 연동할 수 있다. 스프링이 왜 이런 기술을 냈는지, 그 전에는 어떻게 사용했는지 보면서 스프링의 트랜잭션 추상화에 대해서 알아보자MVC - Service 계층순수한 서비스 계층을 구현해내는 것이 가장 중요했다. 그 이유는 핵심적인 비즈니스 로직이 들어있기 때문인데, 시간이 흘러 Controller, Repository의 데이터 저장 기술이 변경되어도 비즈니스 로직은 최대한 변경없이 유지되어야만 했다. 근데 그럴려면 서비스 계층을 특정 기술에 종속적이지 않게, 순수한 자바 코드(POJO클래스)로 이루어져야 하며, 서비스 계층에서 DAO 계층을 이용하려고 할 때 직접 접근보다는 인터페이..
[Spring] 스프링이 DB 기술에 따라 예외를 제공하는 방법
·
스프링
웹 프로젝트를 진행하다 보면 어떤 기술을 사용하냐에 따라 DAO 클래스가 의존하는 DB기술 에 따른 예외 클래스가 존재하게 된다. 스프링에서 제공하는 예외 추상화 기술을 이용하지 않을 때 발생하는 문제점들을 먼저 알아보고, 이를 해결하기 위해 스프링에서 예외 클래스를 어떻게 추상화하여 개발자에게 제공하는지 알아보자  다양한 데이터 접근기술이 존재하는데 JDBC, JPA, H2, Hibernate등등 고유의 예외 클래스가 존재하는데, 이러한 예외를 추상화 하지 않으면 각 기술에 맞는 예외를 개별적으로 처리해야하며, 이는 코드의 복잡성을 증가시킨다. JDBC, JPA 예외를 개별적으로 처리하는 코드 예제로 알아보기문제점 1 다양한 기술에 따른 예외 처리의 복잡성 증가import java.sql.SQLExce..
[Spring] RuntimeException(UncheckExcpetion) 활용하기
·
스프링
해당 포스트에서는 CheckedException 발생 시 다른 계층에서 이에 대한 의존관계를 억지로 참조해야하며, 코드의 가독성 및 기술 변경시에 대한 파급효과를 최소화 하고, 예외처리를 한곳에서 관리할 수 있는 다양한 이점이 있는데 이에 대한 내용을 담고 있다. 기본적으로 자바에서 제공하는 예외는 CheckedExcpetion, UncheckedException이 있다.  Thorwable : 최상위 예외 그 밑에 Excpetion, Error가 존재하는데, Error의 OutOfMemoryError는 메모리 부족이나 심각한 시스템 오류와 같은 애플리케이션에서 복구 불가능한 시스템 예외이다. 개발자는 해당 예외를 처리하거나 잡을 수 없다. 그리고 Throwable을 catch할 수 없다.Throwabl..
[Spring] 서블릿의 Filter, 스프링의 Interceptor 예제 코드로 알아보기
·
스프링
Filter , InterceptorServlet의 Filter와 Spring의 인터셉터 둘 모두 웹과 관련된 요청을 처리할 때 사용한다. 웹과 관련된 공통 관심사를 처리할 때는 HTTP의 헤더, URL의 정보들이 필요할 수도 있다. 서블릿 필터 or 스프링 인터셉터는 HttpServletRequest를 제공하기 때문에 Http와 관련된 요청을 처리할 때는 다른 기능 보다는 둘의 기능을 이용하는것이 효과적이다. 이를 바탕으로 Filet와 Interceptor는 위에서 말했듯이 웹과 관련된 요청을 처리, 요청에 관한 로그 남기기, 인증과 인가에 대한 공통 로직 적용, 응답에 대한 공통적인 변경(모든 응답에 대한 특정 HTTP 헤더를 추가 or 변경), 이미지나 다른 파일의 압축 등등 이러한 공통된 작업들을..
[Spring] 애노테이션 파라미터를 처리하는 ArgumentResolver
·
스프링
Spring에서는 Http 요청 시 DispatcherServlet을 통해 해당 요청을 처리할 수 있는 핸들러를 찾게된다.이 후 반환된 Handler에 Http요청을 처리할 수 있는 메서드를 호출하는데, 파라미터에 여러개의 애노테이션 매개변수들이 존재한다. 단지 애노테이션 만으로 스프링은 어떻게 값을 읽고 바인딩하는 지 알아보자.@ResponseBody @RequestMapping("/response-test") public String responseTest(@PathVariable String user, HttpServletResponse response, HttpServletRequest request, @RequestHeader("host") String host,Model model) ..
cheolhyeon
'Spring' 태그의 글 목록