백엔드개발 32

[JPA] 즉시로딩과 지연로딩, JPQL에서의 N+1 문제와 해결 방법

JPA에서 데이터를 조회할 때 즉시 로딩(EAGER)과 지연 로딩(LAZY) 두가지 방식이 있다. 이 두가지 방식을 간단하게 설명하면 즉시 로딩은 데이터를 조회할 때 연관된 데이터까지 한 번에 불러오는 것이고, 지연 로딩은 필요한 시점에 연관된 데이터를 가져오는 것이다.Fetch Type이란Fetch Type이란, JPA가 하나의 Entity를 조회할 때, 연관관계에 있는 객체들을 어떻게 가져올 것이냐를 나타내는 설정 값이다. JPA는 ORM 기술로, 사용자가 직접 SQL를 생성하지 않고 JPA에서 JPQL을 이용하여 쿼리문을 생성하기 때문에 객체와 필드를 보고 쿼리를 생성하게 된다. 따라서, 다른 객체와 연관관계가 매핑이 되어있으면 그 객체들까지 조회하게 되는데, 이때 이 객체를 어떤 시점에 불러올 것..

JPA 2024.07.21

[JPA] 연관관계 매핑 - 연관 관계를 매핑할 때 어떻게 해야하는 가(단방향, 양방향)

JPA를 공부하면서 학습 했던 내용을 정리해보고자 한다. 일단, RDB에서의 연관관계 매핑은 FK(외래키)로 이루어진다. 그치만 객체에서의 관계는 참조로 이루어진다. (연관관계의 주인이 꼭 있어야한다.) 여기서 RDB와 ORM의 패러다임의 불일치가 발생한다. 객체와 테이블의 연관관계에 대한 차이가 분명하게 있기 때문에, JPA에서는 이러한 연관관계를 매끄럽게 이용할 수 있도록 다양한 어노테이션를 제공해준다. RDB에서에의 관계는 일대일, 일대다, 다대다가 존재한다. 테이블간의 연관관계가 1:1이냐, 1:N이냐, N:M이냐에 따라 외래키를 필드를 추가하여 사용한다. 객체를 테이블에 맞추어서 모델링을 하게 되는 경우를 보면 참조 대신에 외래 키를 직접 필드에 주입을 하게 된다. Member라는 엔티티 안에 ..

JPA 2024.07.20

JPA와 영속성 컨텍스트 이해하기

JPA는 간단하게 말하자면 자바 ORM(Object-Relatinal Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다.즉, 실제적으로 구현된 것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크인 것이다.JPA를 구현한 대표적인 오픈소스는 Hibernate가 있다. 주로 사용해 왔던 JPA지만 지나간 이론적인 내용들을 다시 한번 살펴보겠다. JPA에서 가장 중요한 2가지는 다음과 같다객체와 관계형 데이터베이스를 어떻게 매핑할 것인가? (Object Relational Mapping)영속성 컨텍스트그럼 여기서 영속성 컨텍스트가 무엇이냐? 영속성 컨텍스트를 이해하기전 엔티티 매니저 팩토리와 엔티니 매니저를 알아야 한다. (그림)영속성 컨텍스트란?JPA를 이해하는데 가장 중요한 용어..

JPA 2024.07.05

나의 첫 해커톤 개발 회고록(24.06.24~26)

처음으로 개발 회고록을 적어보는 것 같다. 기술적인 부분들이 이번에 새롭게 해본 것들이 많아 기록을 하기 위해 이렇게 적어본다. 나는 이번에 대학교에서 진행하는 해커톤 대회에 참가하게 되었다. 해커톤 대회는 작년에도 나가려고 했으나 대회가 무산되어나가지 못했는데, 이번 여름방학을 맞아 해커톤 대회에 참가 하게 되었다. 우리는 단순한 익명 채팅 웹서비스를 생각했고, WebSocket을 활용하여 실시간 채팅 웹 서비스를 구현하려고 했다.🧑🏻‍💻 Day 1 (웹 소켓 연동)해커톤 1일차에 10시에 학교에 와서 개발 환경 세팅을 했다. 고등학교때 자바를 이용한 TCP 통신 실습을 할 때 빼곤 웹소켓통신을 해본적이 없어서 듣기만 했던 웹소켓을 내가 구현하게 되었다. 처음에는 채팅? 단순히 채팅이라는 이름만 ..

개발 회고 2024.06.26

[JPA] [Trouble Shooting] Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters 에러 해결

팀 프로젝트를 하던 중에 팀원이 작업이 완료돼서 pull을 받고 실행을 돌려보았는데, 이런 오류를 마주치게 되었다.  오류원문더보기For queries with named parameters you need to provide names for method parameters; Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters 구글링을 해본 결과 레포지토리에서 JPQL을 사용한 부분에서 파라미터를 전달받을때 @Param("") 어노테이션을 쓰지 않고 파라미터를 받아와서 생긴 문제였다. 친절하게도 로그에 해결 방법을 알려주고 있다.Use @Param for query method parameter..

JPA 2024.06.01

[Spring-Boot] 세션 URL 리라이팅 해결 방법 /;jsessionid=

SSR 방식으로 프로젝트를 진행하고 있어서 토큰 방식을 사용하지 않고 세션 방식으로 로그인을 구현 해두었는데, 로그인이 완료되면 게시글이 조회되지않고 http://localhost:8080/;jsessionid=F59911518B921DF62D09F0DF8F83F872 이런 url로 리라이팅이 되는 현상을 발견했다. 이유를 알아보았는데, 로그인을 처음 시도하면 URL을 위와 같이 jsessionid를 포함하여 보내게 된다. - 웹 브라우저가 쿠키를 지원하지 않을 때, 쿠키 대신 URL을 통해서 세션을 유지하는 것 - 사용하려면 URL에 이 값을 계속 포함하여 전달 해야 한다. 🔎 URL 전달 방식 끄기 옵션 application.properties server.servlet.session.tracking..

Spring-Boot 2024.04.15

[JPA] [Trouble Shooting] 에러 Cannot delete or update a parent row: a foreign key constraint fails 참조 무결성 제약 조건 ON DELETE CASCADE

글 작성을 한 후, 댓글이 달려있는 상태에서 글 삭제 테스트를 하던 중 이런 에러를 보았다. 더보기 Cannot delete or update a parent row: a foreign key constraint fails (`learningmate`.`tb_reply`, CONSTRAINT `FKsxgehpxyljiiatkcutvuahw13` FOREIGN KEY (`board_no`) REFERENCES `tb_board` (`board_no`)) 일단 에러가 발생한 이유는 ✓ 데이터 삭제 시 해당 테이블에 연관관계가 설정 되어 있기 때문에 부모를 삭제 할 경우 부모 엔티티를 참조하는 자식 엔티티가 불안정한 상태가 되어 사전에 방지해주기 위해 에러가 발생하는 것이다. Trouble Shooting! ..

JPA 2024.04.13

Spring Data JPA를 활용한 Update 처리(변경감지, 더티체킹)

최근 Spring Data JPA를 사용하며 SSR 방식으로 개발중이다. 게시글 정보를 수정하는 Update 로직을 처리 하려고 한다 JPA에서 Update 처리 로직을 보기 전에 변경감지(더티체킹)이 뭔지 알아보자 더티체킹이란? Transaction안에서 엔티티의 변경이 일어나면 변경내용을 자동으로 데이터베이스에 반영하는 JPA 특징이다. 게시글을 관리하는 BoardService의 updateBoard 메서드이다. 우리가 생각하는 JPA를 활용한 쿼리 처리는 JPARepository를 상속받고 있는 boardReporitory 인터페이스에서 JPA에서 제공해주는 기본 메서드인 findAll(), deleteById() 등 이런 메서드를 사용하여 update도 똑같이 처리를 할거라고 생각하겠지만, 소스를..

Spring-Boot 2024.04.13

[Spring-Boot] no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) 에러 해결 방법

문제 컨트롤러에서 /search GET 요청이 들어오면 SearchBoadRequest 라는 DTO를 requestBody로 받아와 boardService에 searchBoard() 메서드에 request를 보내주고 요청을 처리하게 되어있다. 여기서 문제는 DTO 사용에서 문제가 생긴 것이다. com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `board.dto.SearchBoardRequest` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property..

Spring-Boot 2024.02.07

[Java] ORM의 탄생, SQL 중심적인 개발의 문제점

패러다임의 불일치 우리가 가장 많이 사용하는 프로그래밍 패러다임은 단연 객체지향이다. 내가 공부하고 있는 언어인 자바도 객체지향 언어이다. 그리고 우리가 가장 많이 사용하는 데이터베이스는 관계형 데이터베이스이다. MySQL, MariaDB, Oracle 등 모두 다 관계형 데이터 베이스이다. 우리는 지금 객체를 관계형 데이터베이스에 저장하고 관리하는 시대이다. 이런 패더라임의 불일치로 인한 SQL 중심적인 개발은 많은 문제점이 있다. SQL 중심적인 개발의 문제점 1. 반복적인 객체-테이블 매핑과 CRUD 객체지향, 관계형 데이터베이스는 패러다임의 불일치로 우리는 추가적인 작업을 해야한다. 객체를 관계형 데이터베이스에 저장하고 꺼내오기 위해서는 객체를 테이블로, 테이블은 객체로 매핑하는 작업을 우리 개발..

Java 2024.02.06