Java/Spring 56

[Spring] N+1 문제를 해결하기 위한 방안 (fetch join, @EntityGraph)

코드를 보면서 N+1 문제와 이를 해결하기 위한 방안에 대해서 설명드리겠습니다. @Test public void findMemberLazy() throws Exception { //given //member1 -> teamA //member2 -> teamB Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); memberRepository.save(new Member("member1", 10, teamA)); memberRepository.save(new Member("member2", 20, teamB)); em.flush(); em.clea..

Java/Spring 2023.03.18

[Spring] Spring Data JPA Paging, Sort 기능

Spring Data JPA는 기본적으로 페이징 기능과 정렬 기능을 제공하고 있습니다. 이들을 사용하기 위해서는 Pageable, Sort 객체가 필요합니다. org.springframework.data.domain.Sort : 정렬 기능 org.springframework.data.domain.Pageable : 페이징 기능 (내부에 Sort 포함) Pageable 객체에는 페이지 번호, 페이지 크기, 정렬 정보를 가지고 있습니다. @GetMapping("/users") public ResponseEntity getUsers( @RequestParam(defaultValue = "0") Integer pageNo, @RequestParam(defaultValue = "10") Integer pageSi..

Java/Spring 2023.03.18

[Spring] Spring Data JPA 공통 인터페이스

구조적으로 JpaRepository는 공통 CRUD기능을 제공하고 있습니다. 그래서 생성한 Repository 인터페이스를 통해 기본적인 CRUD 기능을 구현하지 않아도 사용할 수 있습니다. 이제 공통 인터페이스에 대해 알아보겠습니다. JpaRepository 공통 기능 인터페이스 public interface JpaRepository extends PagingAndSortingRepository JpaRepository를 사용하는 인터페이스 public interface MemberRepository extends JpaRepository { } @Repository 어노테이션을 생략할 수 있는 이유는 Spring Data JPA가 자동으로 컴포넌트 스캔을 처리하고, JPA 관련 예외도 처리해 주기 때..

Java/Spring 2023.03.18

[Spring] Querydsl

Queryds이란 무엇인가? 백엔드 기술은 주로 스프링 부트, 스프링 데이터 JPA를 조합해서 사용합니다. 하지만, 이러한 기술들로도 해결하지 못한 문제들이 있습니다. 바로 복잡한 쿼리, 동적 쿼리와 같은 문제들을 해결할 수 없습니다. 이러한 문제들을 손쉽게 해결할 수 있는 기술이 Querydsl입니다. Querydsl은 HQL(Hibernate Query Language) 쿼리를 안전하게 생성 및 관리해 주는 프레임워크입니다. 또한 쿼리를 자바 언어의 한계를 넘어서 자바 코드로 작성함과 더불어, 문법 오류를 컴파일 시점에 시점에 잡아줍니다. 문법이 SQL과 유사하기에 쉽게 학습할 수 있고, 복잡한 쿼리도 손쉽게 작성할 수 있게 됩니다. JPQL과의 차이를 통해 장점을 설명드리겠습니다. @Test pub..

Java/Spring 2023.03.12

[Spring] OSIV[Open Session In View]를 적절히 사용하여 성능 최적화

OSIV란 무엇인가? 하이버네이트에서 Open Session In View라고 불렀고, 향후 JPA가 생기고 나서는 Open EntityManager In View라고 불렀습니다. 관례상 OSIV라고 합니다. OSIV는 하이버네이트를 뷰까지 열어두는 기능입니다. spring.jpa.open-in-view : true(기본 값) 다음과 같이 애플리케이션을 시작 시점에 warn로그를 뿌립니다. 이제 그 이유에 대해서 알아보겠습니다. OSIV 전략은 최초 데이터베이스 연결 시작 시점부터 API 응답이 끝나기 전 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지하게 됩니다. 그래서 View 템플릿이나 API 컨트롤러에서 지연로딩이 가능해왔습니다. (지연 로딩(LAZY)가 가능하려면 영속성 컨텍스트가 살아 있어야..

Java/Spring 2023.03.08

[Spring] 변경 감지(Dirty checking)와 병합(merge)

JPA에서 변경 감지와 병합 두 가지 요소를 알기 전에 준영속 엔티티를 알고 있어야 합니다. 준영속 엔티티에 대해 설명드리겠습니다. 준영속 엔티티란 영속성 컨텍스트가 더 이상 관리하지 않은 엔티티입니다. @PostMapping("items/{itemId}/edit") public String updateItem(@PathVariable String itemId, @ModelAttribute("form") BookForm form) { Book book = new Book(); book.setId(form.getId()); book.setName(form.getName()); book.setPrice(form.getPrice()); book.setStockQuantity(form.getStockQuanti..

Java/Spring 2023.03.08

[Spring] 애브리타임 게시판 부가기능 추가(댓글, 쪽지, 좋아요, 즐겨찾기, 페이징처리)

기능 추가한 패키지는 다음과 같습니다. (기존 틀에서 벗어나진 않지만, Spring Security와 도메인 추가, 이미지 처리, 페이징 처리 등 다양한 기능들을 추가하였습니다) 우선 시큐리티 부분부터 차근차근 설명드리겠습니다. SecurityConfig.class @EnableWebSecurity @Configuration @RequiredArgsConstructor public class SecurityConfig { private final TokenProvider tokenProvider; private final CorsFilter corsFilter; private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; private f..

Java/Spring 2023.02.11

[Spring] Spring Security + JWT를 이용한 토큰 발급 및 회원가입, 로그인 로직 구현

JWT란 무엇인가 ? RFC 7519 웹 표준으로 지정되어 있고, JSON 객체를 사용해서 토큰 자체에 정보들을 저장하고 있는 Json Web Token이다. 헤비 하지 않고, 아주 간편하고 쉽게 적용할 수 있어서 사이드 프로젝트를 진행할 때 매우 유용한 방식이다. 몇 가지 고려사항만 잘 대응하면, 대규모 프로젝트에도 충분히 이용 가능한 방식이다. JWT 구성요소 Header : Signature를 해싱하기 위한 알고리즘 정보들이 담겨있음. Payload : 서버와 클라이언트가 주고받는, 시스템에서 실제로 사용될 정보에 대한 내용들을 담고 있다. Signature : 토큰이 유효성 검증을 위한 문자열, 이 토큰이 유효한 토큰인지 확인 가능. JWT 장점 - 중앙의 인증서버, 데이터 스토어에 대한 의존성 ..

Java/Spring 2023.01.08

[Spring] Rest vs RestAPI

Rest란 무엇인가? Representational State Transfer라는 용어의 약자이다. 자원을 URI로 표시하고 현재 자원에 대한 상태를 주고 받는 것이다. 클라이언트는 HTTP URI를 통해서 자원을 구별하고, URI를 통해 서버에 요청을 보낸다. 클라이언트와 서버간의 통신 방식 중 하나이다. REST의 구성 요소 : 자원(Resource), 행위 : HTTP METHOD(GET, POST, UPDATE, DELETE) 표현으로 이루어져있다. 표현(verb) 다음과 같이 클라이언트는 서버측에 요청을 보낼때, HTTP URI를 통해 자원을 구별한다. @PostMapping("/users/{userId}/boards") 그러면 Restful은 무엇일까? Rest와 동일하지만, 기존 Rest보다..

Java/Spring 2022.11.23

[Spring] MVC Pattern

MVC Pattern이 무엇이고 왜 생겨났을까?? MVC 패턴은 간략하게 설명하면, 유지보수가 편해지는 코드 구성 방식이다. 사용하는 이유는 도메인이나, 각종 구성요소들의 재사용을 할 수 있음(중복 코딩 방지)과 더불어 확장성이 매우 증가하였다. 더불어 Model, View, Controller로 요소를 나누었고, 이를 구분하기에 각 요소들이 스스로의 기능에 집중할 수 있고 분업화할 수 있다.. 어떠한 어플리케이션이 있을 때, MVC 패턴을 사용하지 않고 구현하였다면 전반적인 코드를 싹 다 고쳐야 한다. 하지만, MVC 패턴으로 구현하였으면 잘못된 컴포넌트의 기능만 찾아 이를 리팩토링하면 손쉽게 해결할 수 있다. 이를 통해 유지 보수가 편해질 수 있게 된다. MVC 패턴 동작 과정 1. 클라이언트가 필요..

Java/Spring 2022.11.23