Spring 16

JPA - N+1

JPA 에서 연관관계 @OneToMany를 사용하다보면 당연하게 만나게 될 수 있는 이슈이다. 하나에 객체(Board - 1) 을 조회하는 쿼리를 날리면 따라서 하위 객체(BoardImage - N)이 계속해서 쿼리가 호출된다. Board 와 BoardImage는 일대다 관계이다. 1. Board Board와 BoardImage는 양방향 관계이다. 그러므로 Board에서 imageSet 필드를 가지고 있음 2. BoardImage 서로 1대다 관계이다. 여기서 만약 Board에 PK를 참조하는 BoardImage 객체를 호출하는 테스트 코드를 실행해보자 지연로딩이기에 @Transactional로 묶어줘야한다. 테스트 성공하면 이렇게 Board를 조회하는 쿼리 하나와 그 Board에 PK를 참조하는(whe..

Spring 2022.09.19

JPA - @EntitiyGraph, @Transactional Database - NoSession 해결

연관관계가 지연(Lazy)로 되어있을 경우에 만약 하위 엔티티에 접근할 경우 @Transcational로 묶여있지 않는 한 DB연결이 끊기며 No session 에러가 나게 될 것이다. 이런 경우 join하여 값을 가지고 올때 @EntityGraph를 사용할 수 있다. 이렇게 있을 경우에 일반적으로 상위 엔티티를 불러와 하위 엔티티에 접근할 경우 코드를 보자 PK가 2인 값을 불러와서 하위 엔티티를 접근할 경우 org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:.....could not initialize proxy - no Session 이러한 에러가 나게된다. DB에 연결이 끊어진 상태에..

Spring 2022.09.15

JPA - Querydsl 정의(간단한 검색기능)

이 내용은 자바웹 개발 워크북을 학습후 정리한 내용입니다. 기본적으로 JPA나 JPQL을 이용하면 SQL을 작성하거나 쿼리를 처리하는 소스 부분이 줄어들기 때문에 무척 편리하다. 하지만 애노테이션을 이용해서 지정하기 때문에 고정된 형태라는 단점이 있다. 그리고 복합적인 조건이 걸릴 수 있는데 이런 상황에서 매우 까다롭기 때문에 Querydsl을 사용하는 것이 좋은 경우가 많다. Querydsl 사용을 위한설정 Q 도메인 클래스를 만들기 위한 설정이다. Querydsl은 Entitiy가 아닌 Q 도메인 클래스를 사용한다. 기존에 사용중이던 Repository와 Querydsl 연동하는 3가지 단계 Querydsl을 사용할 인터페이스를 먼저 구현한다. 위에서 지정한 인터페이스 이름 +Impl 형태로 클래스를..

Spring 2022.09.03

JSP/Spring (Mybatis - Mariadb) Paging 구현

이 글은 자바 웹개발워크북(구멍가게 코딩단) 책을 보고 공부한 내용입니다. 1. 먼저 요청을 받을 RequestDTO를 생성한다. 2. 응답을 보낼 ResponseDTO를 생성한다. 3. 컨트롤러에서 RequestDTO를 받아 Service 로직에 넘기는 걸 구현한다. RequestDTO 생성하기 @Builder.Default를 통해 객체를 생성할때 지정해주지 않으면 자동 으로 page는 1 size는 10이 들어가도록 설정함 getSkip은 limit 뒤에 skip에 넣을 값이다. page가 1일 경우 skip값은 0이 들어가기에 아무 값도 넘기지 않고 바로 보여준다. limt 뒤에 첫번째로 오는 숫자는 넘기는 값이다. 만약 데이터가 20개가 있다고 가정하고 select * from todo order..

Spring 2022.08.31

PRG(Post-Redirect-GET) 패턴

MVC 구조에서 흔하게 사용되는 패턴이 PRG 패턴이다. PRG의 흐름은 대충 - 사용자는 Controller에 원하는 작업(저장,수정,삭제)을 POST 방식으로 처리요청을 날린다. -POST 방식을 Controller에서 처리하고 브라우저는 다른 경로로 요청(GET)하라는 응답(Redirect)한다. -GET방식으로 지정한 곳으로 이동한다. Redirect를 사용하면 브라우저의 주소가 아예 변경되기 때문에 사용자의 새로고침과 같은 계속 되는 요청을 미리 방지할 수 있고 특저앟ㄴ 작업이 완전히 끝나고 새로 시작하는 흐름을 만들 수 있다. 게시판에서 대표적으로 사용되는 경우 -게시판에서 글을 쓸 경우 서버에 Post요청을 날리게 된다. 요청을 받은 서버에서는 원하는 작업(데이터 저장)을 수행하고 redir..

Spring 2022.08.22

Springboot(JPA)-Page 구현

1.Controller 컨트롤러에서는 파라미터로 @PageableDefault 애노테이션으로 간단하게 page(보여줄 페이지), size(몇개인지), sort(정렬기준),direction(내림차순,오름차순) 을 받을 수 있다. 이렇게 하지 않고 따로 page와 size를 받아 구현할 수 있지만 그러면 따로 Pageable에 구현체인 PageRequest.of를 사용해서 따로 구현해야한다. 그러기 보다는 파라미터로 바로 받는게 편한 것 같다. 값을 넘겨줄때는 이런 방식으로 줄 수도 있지만 이렇게 쿼리스트링으로 값을 주지 않는것이 일반적이고 이런 경우 @PagealbeDefault에 설정한 값이 자동으로 들어간다. 하지만 page에 값은 파라미터로 넘겨줘야한다 (page를 제외한 값들은 모두 위에 설정한 기..

Spring 2022.08.21