JPA 28

JPA Eager Loading VS Lazy Loading

JPA를 사용하다 보면 즉시로딩(Eager)과 지연로딩(Lazy)을 자연스레 접하게 됩니다. 사실 실무에서 모든 연관관계는 지연 로딩으로 설정하는 것이 좋지만, 이렇게 하는 설정하는 법이 왜 좋은지에 대한 의문이 생겨 공부하게 되었고 기록을 남기기 위해 포스팅하게 되었습니다. 개요 JPA에서는 테이블 간 연관 관계는 객체의 참조를 통해 이루어집니다. 실무에서는 서비스의 규모가 대부분 크기 때문에, 데이터의 양이 많은 것은 물론이거니와 각각의 데이터들끼리 참조하고 있기에, 연관된 데이터들을 한번에 가져오는 행동은 부담이 큽니다. 따라서 JPA는 참조하는 객체들의 데이터를 가져오는 시점을 정할 수 있는데, 이것을 Fetch Type이라고 합니다. Fetch Type에는 Eager와 Lazy 방식이 있습니다...

JPA 2022.09.05

SpringBoot JPA 게시판 CRUD 구현(예외 처리)

오늘은 지금까지 구현했던 WAS 단 로직들 안에서 예외처리들을 커스터마이징 하려 합니다. 로직 수정에 앞서 예외(Exception)와 오류(Error)에 대한 간단한 개념을 먼저 알아보겠습니다😀 에러(Error)📙 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것을 Error라고 합니다. Error는 JVM 실행에 문제가 생긴 것으로, 프로그램은 실행 불능이 됩니다. 즉, 시스템이 종료되어야 할 수준의 상황과 같이 수습할 수 없는 심각한 문제를 의미합니다. 📌Error는 개발자가 미리 예측하여 방지할 수 없습니다. 예외(Exception)📒 자바에서는 에러 이외에 예외라고 부르는 오류가 있습니다. 예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 오..

JPA 2022.07.27

SpringBoot JPA 게시판 CRUD 구현(Delete-TDD)

오늘은 지난번에 포스팅한 게시글 수정에 이어 CRUD의 마지막 Delete 기능의 WAS 단 로직을 포스팅하려 합니다. 패키지성 포스팅이기 때문에 이전 포스팅을 보지 않으셨다면 이해되지 않는 부분이 있을 수 있습니다. 글 맨 하단 링크를 통해 확인해주세요 :) Gradle 빌드나 폴더 구조는 깃허브 Bincolog를 참고해주세요. 게시글 삭제 로직은 따로 DTO 클래스를 분류할 필요가 없어서 이전에 만든 Create, Read, Update 기능보다는 훨씬 간단하게 로직이 구현됩니다. Controller 클래스와 Service 클래스만 구현하면 되고, 각각에 해당하는 Test 코드를 구현해보겠습니다. Controller 생성📘 @DeleteMapping("/posts/{postId}") public vo..

JPA 2022.07.25

SpringBoot JPA 게시판 CRUD 구현(Update-게시글 수정)

지난번에 구현한 페이징 처리까지 R(Read)에 해당됩니다. 오늘은 U(Update)에 해당되는 게시글 수정 WAS 단 로직을 포스팅하려 합니다. 약간 패키지성 포스팅이어서 게시판의 Create, Read 포스팅을 보지 않으셨다면 헷갈리실 수 있습니다. 맨 아래에 링크를 통해서 지난번 포스팅을 보시고 오시거나 깃허브 Bincolog를 참고하시는 것을 추천드립니다! Request 생성📗 첫번째로는 Request를 생성합니다. Create, Read와 동일하게 Entity를 사용하지 않고 따로 클래스를 만들어줍니다. 이유는 지난 포스팅에서 언급했습니다 :) @Getter @Builder public class PostEdit { @NotBlank(message = "제목을 입력해주세요.") private S..

JPA 2022.07.21

SpringBoot JPA 게시판 CRUD 구현(다중 조회/ Paging / TDD)

지난번에 포스팅한 게시글 단건 조회에 이어서 오늘은 전체 게시글을 조회하는 WAS 단 로직을 포스팅하려 합니다. 사실 JpaRepository에서 기본적으로 제공하는 findAll() 메서드를 사용하면 단건 조회와 큰 차이점은 없지만, 글이 너무 많은 경우에 비용이 너무 많이 들어가므로 페이징 처리도 함께 구현할 예정입니다. 페이징(Paging)? 우리가 웹사이트에서 흔히 볼 수 있는 페이징은 왜 필요할까요? 페이징 처리가 없다면 스크롤을 계속해서 내려야 하는 상황도 발생할 수 있고, 무엇보다 데이터 처리에 비용이 많이 발생합니다. 페이징 처리를 안 한 상황에서 글이 만약 몇십만 개가 있다면 한 번의 로직으로 DB에서 몇십만 개의 글을 모두 가져와야 할 것입니다. 물론 DB에서 데이터 사이즈로 인해 오류..

JPA 2022.07.21

SpringBoot JPA 게시판 CRUD 구현(Read 단건 조회 및 TDD)

지난번에 포스팅한 Create에 이어서 게시판을 조회하는 WAS 단 로직을 포스팅하려 합니다. 게시판 조회는 단건 조회와 전체 조회로 나뉩니다. 물론 검색 기능도 조회에 해당하지만, 검색 기능은 추후에 포스팅하겠습니다. Gradle 빌드나 프로젝트 구조는 깃허브 Bincolog를 참고해주세요! Response 생성📗 처음에는 PostResponse 클래스를 생성합니다. 저번에 언급했던 Entity와 Request, Response는 분류해야 하기 때문입니다. 못 보신 분들은 아래 사진을 참고해주세요😄 Response 클래스는 서비스 정책에 맞게 구현해야 합니다. 클라이언트에서 어떠한 결과 값을 원하는지에 대해서는 항상 다르기 때문입니다. 저는 게시글을 조회했을 때 해당 게시글의 id값, 제목, 내용을 가..

JPA 2022.07.20

SpringBoot JPA 게시판 CRUD 구현(Create - TDD)

오늘은 지난번에 구현한 게시판 Create 로직의 테스트 케이스를 작성해보려 합니다. 테스트 케이스는 Controller 테스트와 Service 테스트를 구현하려 합니다. 이전 포스팅을 보지 않았다면, 이번 포스팅을 이해하기는 힘드실 것 같아요. 꼭 이전 포스팅을 보고 와주세요! 테스트 디렉토리는 java 하위에 있는 폴더 구조와 동일하게 구조를 맞추셔야 합니다. 폴더 구조와 gradle 빌드는 깃허브를 통해 확인하실 수 있습니다 :) Controller Test 생성📗 로직 테스트에 앞서 기본 클래스를 먼저 생성해줍니다. 앞서 말씀드린 것처럼 build(gradle, maven)에 test 관련 dependency가 추가 되어 있어야 합니다. 테스트 케이스가 처음이신 분들을 고려하여 import 부분도..

JPA 2022.07.18

SpringBoot JPA 게시판 CRUD 구현(Create)

SpringBoot와 JPA를 사용하여 게시판을 구현하는 WAS 단 로직을 포스팅하려 합니다. 기본 프로젝트 설정과 데이터베이스 연결 및 View단은 생략할 예정입니다. Gradle 빌드나 프로젝트 구조는 깃허브 Bincolog를 참고하시면 됩니다. 개인적인 공부로 코드의 결함이 있을 수 있으니 참고만 해주세요 :) Entity 생성📗 처음으로는 Entity를 생성합니다. Entity 클래스는 실제 DB 테이블과 매핑되는 핵심 클래스로, 데이터베이스의 테이블에 존재하는 컬럼들을 필드로 가지는 객체입니다. Entity는 데이터베이스 영속성의 목적으로 사용되기 때문에, 요청이나 응답 값을 전달하는 클래스로 사용하는 것은 좋지 않습니다. 또한, 많은 비즈니스 로직들이 Entity를 기준으로 동작하기 때문에 추..

JPA 2022.07.18