Spring & SpringBoot 10

InvalidDataAccessApiUsageException : detached entity passed to persist

JPA 엔티티가 영속성 컨텍스트에서 분리된 상태에서 persist를 호출해서 영속성 컨텍스트에 저장하려고 하니 발생한 오류다.memberPostRepository.saveAndFlush 메서드를 사용하여 MemberPost 엔티티를 영속성 컨텍스트에 저장해서 해결했다.2024-06-28T17:10:50.080+09:00 DEBUG 5097 --- [nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: com.backend.kiri.domain.MemberPost]20..

Spring & SpringBoot 2024.06.28

스프링부트 엔드포인트 무한루프 오류 (NoHandlerFoundException)

스프링부트로 프로젝트를 만들다가 완전 무섭게 생긴 오류를 만났다..... 아놔 완전 무시무시하다.. !ㅁ! 무엇보다 무한루프에 컴퓨터가 뻗어서 제대로 된 로그 확인이 어려웠고, 디버깅을 했더니 코드가 타고타고 저기 심해 바닥까지 내려가서 디버깅으로는 원인을 제대로 파악할 수 없었다...그래서 일단 이것저것 시도해봤다. 1. JPA 양방향 연관관계에서 순환참조가 발생해서 생긴 문제일까? 1-1 양방향 관계를 가지는 엔티티에서 toString 메서드를 사용하면 무한 루프가 발생할 수 있다!> 롬복 사용없이 toString메서드 오버라이딩해서 순환참조를 피해보았으나 실패 1-2 잭슨 라이브러리를 사용하는 해결 방법이 있다고 한다.> @JsonManagedReference와 @JsonBackReference를 ..

Spring & SpringBoot 2024.06.27

Springboot + jwt + web socket(STOMP) 채팅 구현

스프링부트로 채팅을 구현하기 위해 STOMP 프로토콜을 사용해보기로 했다. 구현을 위해 공부하는 과정에서 헷갈렸던 부분이 있어 적어둔다. STOMP(Simple Text Oriented Messaging Protocol)란 http와 호환되는 양방향 통신을 제공하기 위한 프로토콜이다. @RequiredArgsConstructor @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { private final StompHandler stompHandler; @Override public void configureMessageBroker(Message..

Spring & SpringBoot 2024.02.12

io.jsonwebtoken.MalformedJwtException: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4.

Spring security와 jwt를 이용해서 토큰 재발급 api를 구현하고 프론트엔드와 연동해서 테스트하던중 오류가 발생했다. 로그인 과정에서 첫 토큰 세트(accessToken + refreshToken)는 발행이 잘되는데 재발급이 안되는 것이다. 일단 내가 생각했던 토큰 발급 로직은 이렇다. - 첫번째 토큰 발급 1. 클라이언트가 아이디, 패스워드를 /login 으로 넘긴다. 2. 내가 사용하는 로그인 필터가 spring security의 UsernamePasswordAuthenticationFilter를 상속하므로 그 정의에 따라서 /login경로로 들어온 요청을 해당 필터에서 검증함. 3. 검증하고 문제가 없으면 accessToken, refreshToken을 발급해서 헤더에 담아 클라이언트에..

Spring & SpringBoot 2024.01.25

SpringBoot&JPA : CommandAcceptanceException

스프링부트 프로젝트에서 JPA 엔티티를 만들고 데이터베이스에 반영하려고 하는데 이런 오류가 났다. 로그를 보다보니 Caused by: java.sql.SQLSyntaxErrorException이라고도 하고.. 그래서 순간 sql 예약어가 있나 하는 생각이 쎄하게 들었고 찾아봤더니 이게 맞다고 한다... .. https://dev.mysql.com/doc/refman/8.0/en/keywords.html#keywords-8-0-detailed-U MySQL :: MySQL 8.0 Reference Manual :: 9.3 Keywords and Reserved Words 9.3 Keywords and Reserved Words Keywords are words that have significance in..

Spring & SpringBoot 2024.01.21

실전 스프링부트와 JPA활용2 - 조회 API 성능 최적화, OSIV

Order 엔티티를 보면 아래와 같이 Member, Delivery과는 to one관계를, OrderItem과는 to many관계를 맺고 있는 것을 확인할 수 있다. @Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) //생성자 숨기기 public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy =..

Spring & SpringBoot 2024.01.11

400에러 HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `jpabook.jpashop.api.

DTO를 만들어서 api 요청, 응답을 처리하던 중 PUT메소드를 테스트하다가 400에러가 발생했다. 원인은 DTO로 사용하는 객체에 디폴트 생성자가 없어서 발생한 문제였다. 스프링부트를 사용한다고 해서 기본생성자가 꼭 필요한 것은 아니지만, JPA 엔티티를 사용하면 리플렉션을 이용하기 때문에 기본생성자가 꼭 필요하다. 그리고 생성자가 없는 클래스는 클래스 파일을 컴파일하는 시점에 자바가 디폴트 생성자를 자동으로 생성해주지만, 임의로 작성한 생성자가 있을 경우, 자동으로 디폴트 생성자를 만들어주지 않는다. 나는 내 임의대로 생성자를 만들어뒀기때문에 기본 생성자가 생성되지 못했고 따라서 요청을 받아서 객체로 전환하는 JSON Serialize 과정에서 오류가 발생한 것 같다. 나는 대체 언제 이 의미없는..

Spring & SpringBoot 2024.01.09

실전 스프링부트와 JPA활용1 - 변경 감지와 병합(merge)

준영속 엔티티를 수정하는 두가지 방법 영속성 컨텍스트가 더는 관리하지 않는 엔티티를 준영속엔티티라 한다. 쉽게 말해서 DB에 이미 한번 갔다와서 id와 같은 식별자가 이미 존재하는 엔티티를 뜻한다. 그리고 이러한 준영속 엔티티를 수정하는데에는 2가지 방법이 있다. 1. 변경 감지 기능 사용(Dirty Checking) 영속성 컨텍스트 안에서 엔티티를 다시 조회하고, 그 후에 데이터를 수정하는 방법이다. 예를 들어 같은 트랜잭션 안에서 엔티티의 값이 수정이 되고 해당 트랜잭션이 커밋되면, 트랜잭션이 커밋되는 그 순간에 update 쿼리가 나간다. (em.flush > 영속성 컨텍스트에서 바뀐 엔티티들을 다 찾아서 update함.) 그리고 이것을 dirty checking, 즉 변경감지가 동작한다고 한다. ..

Spring & SpringBoot 2024.01.08

스프링 MVC 1편

* 인프런 김영한님의 강의 "스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술"을 듣고 정리한 내용입니다. https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1 스프링의 전체구조 Dispatcher servlet? 스프링 mvc도 프론트 컨트롤러 패턴으로 구현되어있고 그 프론트 컨트롤러 역할을 하는것이 Dispatcher servlet이다. 스프링부트는 이 Dispatcher servlet을 서블릿으로 자동으로 등록하면서 모든 경로에 대해 매핑한다. (urlpatterns="/") 서블릿 호출 > FrameworkServlet에서 오버라이딩한 service()호출 > 여러 메서드가 호출 > DispacherServlet의 doDispatch..

Spring & SpringBoot 2023.03.29

좋은 객체지향 설계의 5원칙(SOLID)과 스프링

*인프런 김영한님 강의 [스프링 핵심원리 기본편]을 수강하며 작성한 글입니다. SOLID란? 클린코드로 유명한 로버트 마틴이 좋은 객체지향 설계의 5가지 원칙을 정리한 것. SRP = 단일 책임 원칙 (single responsibility principle) OCP = 개방-폐쇄 원칙 (open/closed principle) LSP = 리스코프 치환 원칙 (liscov substitution principle) ISP = 인터페이스 분리 원칙 (interface segregation principle) DIP = 의존관계 역전 원칙 (dependency inversion principle) SRP, 단일 책임 원칙 (single responsibility principle) 어떤 변경이 있을 때 파급..

Spring & SpringBoot 2023.01.25