JPA에서 @Query 애너테이션을 사용할 때, 일반적으로 @Param 애너테이션을 사용하여 파라미터명과 매핑할 이름을 지정해주어야 합니다. 하지만 다음과 같은 경우에는 @Param을 생략할 수 있습니다. 파라미터명과 매핑할 이름이 동일한 경우 예를 들어, 다음과 같이 파라미터명과 매핑할 이름이 모두 "name"인 경우에는 @Param을 생략할 수 있습니다. @Query("SELECT u FROM User u WHERE u.name = :name") User findByName(String name); 파라미터가 하나인 경우 파라미터가 하나뿐인 경우에는 @Param을 생략할 수 있습니다. 이 경우에는 파라미터명과 매핑할 이름이 자동으로 "0", "1", "2" 등으로 지정됩니다. @Query("SELEC..
DB에서 물리적으로 데이터를 지우는 것이 아니라 논리적으로 삭제하는 방법이 있습니다. 많이 사용하는 방법 중 하나가 바로 삭제 여부를 판단하는 컬럼을 사용하는 것인데요, 삭제 된 날짜가 존재하면 정확한 삭제 시기를 알 수 있으므로 deleted_at과 같은 컬럼을 사용할 수 있습니다. 하지만 이런 컬럼이 존재할 경우 정상 데이터를 조회하기 위한 모든 쿼리에 where deleted_at is null과 같은 조건절이 필요합니다. 이럴 때 @Where 애너테이션을 활용하면 간단히 해결할 수 있습니다. 먼저 BaseEntity를 생성해줍니다. package io.lcalmsky.wheredemo; import java.time.LocalDateTime; import javax.persistence.Colum..
Overview 개인정보 보호 등을 위해 컬럼을 암호화하는 경우가 있습니다. JPA 사용이 너무나도 당연해진 요즘, 암호화 필드를 검색하기 위해서는 where절에 평문을 비교해야 할까요? 아니면 암호화 된 값을 비교해야 할까요? 뭔가 당연히 이거 겠지! 싶었던 건데 막상 답을 하려니 헷갈리시죠? 확인하기 위해 테스트를 해보았습니다. AES256 등의 알고리즘을 이용해 개인을 특정할 수 있는 항목을 암호화하게 되는데, salt를 사용하면 암호가 계속 바뀌게 되기 때문에 검색이 어려워집니다. 따라서 여기서는 고정된 IV를 사용해 암호화를 하더라도 항상 같은 값을 이용하도록 설정하였습니다. Implementation 앞서 언급했듯이 JPA를 이용해야하기 때문에 spring boot 프로젝트를 생성하였습니다. ..
Overview JPA의 데이터 타입은 크게 엔터티 타입(Entity Type)과 값 타입(Value Type)으로 나뉩니다. 각각 어떤 특징을 가지는지 알아보도록 하겠습니다. Entity Type @Entity로 정의하는 객체로 식별자(@Id)로 계속 추적할 수 있습니다. 식별자를 제외한 속성들은 설정에 따라 얼마든지 변경 가능합니다. Value Type int, Integer, String 처럼 단순히 값으로 사용되는 primitive 타입이나 refenrece 타입을 말합니다. 식별자가 없고 값만 있기 때문에 변경시 추적이 불가능합니다. Value Type은 세 가지로 분류됩니다. Primitive Type primitive 타입과 primitive 타입을 감싸는(boxing) wrapper typ..
고아 객체란? 부모 엔터티와 연관관계가 끊어진 자식 엔터티를 말합니다. 잔인하게도 JPA에서는 고아가 된 객체를 보육원에 맡기는 게 아니라 흔적도 없이 제거해 버릴 수 있습니다. 동작 방식 매핑 애너테이션의 속성 중 orphanRemoval을 true로 지정하면 됩니다. import java.util.ArrayList; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.p..
소스 코드는 여기 있습니다. (commit hash: 85838b8) > git clone https://github.com/lcalmsky/jpa > git checkout 85838b8 Warning: 최종 커밋 기준으로 작성되어 있어 모든 테스트 결과를 정확히 확인할 순 없으니 참고 부탁드립니다. Overview 즉시 로딩(EAGER)과 지연 로딩(LAZY)에 대해 알아봅니다. 지연 로딩(Lazy Loading) Unit를 조회하면서 Factory의 정보가 필요하지 않을 때 굳이 Factory를 같이 조회할 필요가 없습니다. 그럴 때 지연 로딩을 사용합니다. 사용법은 간단합니다. 매핑관계를 지정한 애너테이션에 fetch 속성을 FetchType.LAZY로 설정하시면 됩니다. package com.t..
소스 코드는 여기 있습니다. (commit hash: 85838b8) > git clone https://github.com/lcalmsky/jpa > git checkout 85838b8 Warning: 최종 커밋 기준으로 작성되어 있어 모든 테스트 결과를 정확히 확인할 순 없으니 참고 부탁드립니다. Overview 즉시 로딩(EAGER)과 지연 로딩(LAZY)에 대해 알아봅니다. 지연 로딩(Lazy Loading) Unit를 조회하면서 Factory의 정보가 필요하지 않을 때 굳이 Factory를 같이 조회할 필요가 없습니다. 그럴 때 지연 로딩을 사용합니다. 사용법은 간단합니다. 매핑관계를 지정한 애너테이션에 fetch 속성을 FetchType.LAZY로 설정하시면 됩니다. package com.t..
소스 코드는 여기 있습니다. (commit hash: ba15d2d) > git clone https://github.com/lcalmsky/jpa > git checkout ba15d2d Warning: 최종 커밋 기준으로 작성되어 있어 모든 테스트 결과를 정확히 확인할 순 없으니 참고 부탁드립니다. Overview 객체간 상속을 이용하지만 실제로는 Entity나 Table과 관계가 전혀 없을 때 사용하는 @MappedSuperclass에 대해 알아봅니다. @MappedSuperclass 객체에서 공통 속성을 추상 객체로 이동시키고 자식 객체들이 해당 속성을 공통으로 사용하는 것은 매우 흔한 일입니다. 이전 포스팅에서는 Entity 간 관계(슈퍼타입, 서브타입)도 중요했었는데요, 여기서 다룰 내용은 E..
소스 코드는 여기 있습니다. (commit hash: c93b796) > git clone https://github.com/lcalmsky/jpa > git checkout c93b796 Warning: 이번 소스 코드는 최종 커밋 기준으로 작성되어 있어 모든 테스트 결과를 정확히 확인할 순 없으니 참고 부탁드립니다. Overview 객체의 상속관계를 테이블로 어떻게 표현할 수 있는지 알아봅니다. 슈퍼타입, 서브타입 관계 관계형 데이터베이스에는 상속 관계가 존재하지 않습니다. 반면 객체는 상속관계를 나타낼 수 있는데요, 이 상속과 유사한 방법이 DB 모델링 기법에도 존재합니다. 바로 슈퍼타입, 서브타입 관계인데 확장된 ER 모델이라고 부릅니다. 슈퍼-서브 타입이 도출되는 과정은 다음과 같습니다. 공통된..
소스 코드는 여기 있습니다. (commit hash: 6695e56) > git clone https://github.com/lcalmsky/jpa > git checkout 6695e56 Overview 다양한 연관관계에 대해 알아봅니다. 연관관계 매핑시 고려해야할 사항이 3가지가 있습니다. 방향(단방향, 양방향) 연관관계의 주인 다중성 이중 두 가지는 이미 이전 포스팅에서 살펴보았으므로 다중성에 대해 알아보겠습니다. 다중성 사실 다중성도 이전 포스팅에서 다루긴했지만 다시 한번 개념을 정리해보겠습니다. DB 관점에서의 다중성을 말합니다. JPA는 객체를 테이블에 매핑하기 위해 다양한 애너테이션을 사용하는데 이 중 다중성에 해당하는 애너테이션은 다음과 같습니다. @ManyToOne: 다대일 @OneToM..
- Total
- Today
- Yesterday
- Spring Boot JPA
- Spring Boot Tutorial
- 함께 자라기
- Linux
- Spring Boot
- proto3
- Java
- 스프링 데이터 jpa
- 알고리즘
- QueryDSL
- gRPC
- spring boot application
- JPA
- 스프링 부트 애플리케이션
- 헥사고날 아키텍처
- JSON
- 스프링 부트 튜토리얼
- 스프링부트
- 스프링 부트
- leetcode
- Jackson
- spring boot app
- intellij
- r
- Spring Data JPA
- 함께 자라기 후기
- 스프링 부트 회원 가입
- spring boot jwt
- 클린 아키텍처
- @ManyToOne
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |