jpa 6

연습용 주문 서버 만들기 02 멤버십 발급 API 작성하기

연습용 주문 서버 만들기 git repository 01 Kotlin/Spring 멀티모듈 프로젝트 구성 02 멤버십 발급 API 작성하기 03 메뉴 목록 조회 API 가장 간단한 아이디 발급 API부터 만들겠습니다. 지난 번 글에도 말했듯이 편의상 회원가입없이 아이디 발급 요청하면 임의의 UUID를 발급하겠습니다. 이 아이디를 membership이라고 하겠습니다. 사용자는 나중에 발급받은 membership를 가지고 포인트를 충전하거나 결제할 수 있습니다. 구현할 요구사항은 아래와 같습니다. 사용자는 누구나 membership 발급 API를 통해 멤버십 번호를 발급받을 수 있다. 따로 무엇을 검증하지 않을 것이므로 매우 간단한 구현이 되겠습니다. 아이디 발급은 실패하는 케이스가 없다고 가정하겠습니다. ..

Spring 2023.01.15

Springboot + JPA + Querydsl로 좋아요 기능 만들기 1 - 등록

Springboot + JPA + Querydsl로 좋아요 기능 만들기 1 - 등록 개인 프로젝트에 좋아요 기능을 추가했다. Springboot2.3.1, SpringDataJPA, Querydsl을 사용하여 구현했다. 테스트는 JUnit5로 진행했다. 코드는 전체 코드는 github에서 확인할 수 있다. 화면 처리나 환경설정은 이 글에서 다루지 않는다. 내가 생각한 요구사항은 다음과 같다. 사용자는 게시물에 좋아요를 누를 수 있다. 사용자는 자신의 좋아요를 취소할 수 있다. 사용자는 자신이 좋아요를 누른 게시물을 조회할 수 있다. 사용자는 게시물 당 한 번만 좋아요를 누를 수 있다. 사용자는 전체 게시물을 조회할 때 좋아요 카운트를 확인할 수 있다. 우선 구현을 위해 세 개의 엔티티(테이블)가 필요하다..

Spring 2021.02.07

[JPA] 연관관계를 가진 엔티티 save 하기

연관관계를 가진 엔티티 save 하기 insert하려는 테이블이 여러 테이블과 연관관계를 가지고 있을 때 어떻게 해야 할까? Recipe를 추가할 때, 재료는 Ingredient에, 요리 과정은 CookingMethod 테이블에 보관해야 한다. 유형이나 분류는 이미 정해져있는 것을 가져다 사용하면 되므로 제외했다. 프로세스를 짜보자. 사용자 입장에서. 등록하려는 레시피가 어떤 유형인지 선택한다. 등록하려는 레시피가 어떤 분류인지 선택한다. 요리 이름 완성된 요리 썸네일 삽입 간략한 설명 재료를 입력.(여러 개) 요리 과정 입력.(여러 개) 요리 과정 이미지 삽입(여러 개) 이렇게 입력하고 등록했을 때 서버에서 일어나는 일은 입력 받은 데이터를 분류한다. Ingredient를 등록한다. CookingMet..

JPA 2021.01.16

JPA 연관관계 매핑

다양한 연관관계 매핑 연관관계 매핑할 때 고려해야 할 세 가지가 있다. 다중성 먼저 연관이 있는 두 테이블의 관계를 파악해야 한다. 1:1관계인지 1:N관계인지, 다중성을 고려해야 한다. 방향 두 엔티티 중 한쪽만 참조하는 단방향인지, 양쪽 모두 참조하는 양방향인지 고려해야 한다. 연관관계 주인 단방향 관계라면 관계를 설정하는 쪽이 주인이 된다. 하지만 양방향이라면 관계의 주인을 정해야 한다. 보통 '다(N)'가 되는 쪽이 외래 키를 가지고 있기 때문에 연관관계의 주인이 된다. 다중성 연관관계가 가진 다중성 다대일(N:1) @ManyToOne 일대다(1:N) @OneToMany 일대일(1:1) OneToOne 다대다(N:N)@ManyToMany 다중성을 판단하기 어려울 때는 반대방향을 생각하면 된다. 일..

JPA 2020.11.14

JPA Auditing으로 생성 시간/수정시간 자동화

JPA Auditing으로 생성 시간/수정시간 자동화 Java8버전부터 LocalDate와 LocalDateTime이 등장했다. LocalDate가 나오기 전 Date나 Calendar클래스에는 다음과 같은 문제가 있었다. 불변 객체가 아니어서 멀티 쓰레드 환경에서 문제가 발생할 수 있었다. Calendar는 월(month) 설계가 잘못 되었다. 10월을 나타내는 Calendar.OCTOBER의 숫자 값이 10이 아니고 9였다. 이러한 문제점을 LocalDate가 해결했다. JPA Auditing사용하기 @Getter @MappedSuperclass @EntityListeners(AuditingEntityListener.class) public class BaseTimeEntity { @CreatedDa..

Spring 2020.09.15

Spring Data JPA

JPA 스프링 레거시 프로젝트에서는 MyBatis를 이용해 Mapper를 만들고 직접 쿼리를 만들었다. 쿼리를 만들 때는 그 쿼리가 제대로 작동하는 지, 우선 해당 데이터베이스에서 직접 테스트하고, 코드에 적용했다. 간단한 CRUD 정도는 문제가 되지 않았지만, 그것도 쌓이면 나름 시간이 걸리는 일이다. 무엇보다 여러 개의 테이블을 join해서 작업하는 경우에는 쿼리를 짜는 데에만 꽤 오랜 시간이 걸렸다. 책에서도 "실제 개발 시간보다 SQL을 다루는 시간이 더 많았"다. "테이블 모델링에만 집중하고 객체를 단순히 테이블에 맞추는 기형적인 형태"였다고 설명한다. 내가 생각하기에 데이터는 거의 모든 것이다. 복잡하게 생각할 것도 없이 자명하다. 객체를 이용해 데이터를 운반하지만, 객체는 할 일을 마치면 가..

Spring 2020.09.14