JPA(6)
-
Aspect로 JPA Auditing 구현하기
Auditing 테이블의 데이터를 생성하거나 변경했을 때, 우리는 생성자와 변경자를 기록합니다.이를 위해 보통 createdBy나 creator와 같은 파라미터를 추가해서 요청 데이터를 만들죠. 그러나 요청 파라미터명은 언제나 정해져있고, (예를 들어 어디는 createdBy를 사용하고 어디는 madeBy를 사용하지 않습니다.)보통 그 값이 동일하게 처리되기 때문에 (예를 들어 어디는 생성자가 A인데 어디는 B이고 하지 않습니다.)매번 핸들러 메소드로부터 서비스 로직까지 중복해서 파라미터를 전달하는 게 불편할 수 있습니다.특히 전달 과정에서 값이 변경될 우려도 있습니다. Spring JPA Auditing은 엔티티 클래스 내에서 어노테이션을 통해 알아서 값을 주입해줍니다.그래서 더이상 개발자가 서비스 ..
2025.11.25 -
JPA(Jakarta Persistence API) - Type Conversion
Converter 말 그대로 자료형을 적재할 때 또는 로드할 때 바꿔서 가져오는 것입니다.다만 그렇다고 숫자인데 굳이 문자열로 바꿔서 만들 필요는 없습니다.즉 기본형에 대해서는 그닥 쓸 필요가 없죠. 하지만 때로는 유용한 게, 바로 List, Map 입니다.예를 들어보죠. 여기 Tomato 엔티티가 있고 컬럼 중에 tags가 있습니다.@Entity@Table(name = "tomatoes")class Tomato( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val srl: Long = Long.MIN_VALUE, val tags: MutableList = mutableListOf()) 안타깝지만, JPA에서는 Collectio..
2024.08.02 -
JPA(Jakarta Persistence API) - Entity Operation
Persistence Context 영속성 컨텍스트(persistence context)는 엔티티 인스턴스들이 관리되는 장소입니다.그리고 엔티티 매니저(entity manager)는 영속성 컨텍스트를 방문해 상호작용 할 수 있는 인터페이스를 가지고 있고요.쉽게 말해 엔티티 매니저는 우리가 어플리케이션에서 생성한 엔티티 인스턴스들을영속성 컨텍스트에 방문해서 가져와, 이를 통해 실제 데이터베이스에 CRUD를 수행한다고 생각하면 됩니다. 그렇기에 당연히 엔티티 매니저는 쿼리(query)를 생성할 수 있습니다.예를 들어 JPA(Jakarta Persistence API) - Entity 글에서 작성한 코드 중 하나를 실행해보면val peach = entityManager.find(Peach::class.java..
2024.06.06 -
JPA(Jakarta Persistence API) - Entity
Entity 엔티티(entity)란 가벼운 영속성 도메인 객체를 의미합니다.An entity is a lightweight persistent domain object. 가볍다라는 건, 최소한의 노력과 자원을 써야된다는 말과 같습니다.Jakarta에서 가장 쉽게 엔티티를 표현할 수 있는 건 그저 클래스(class)입니다. 그리고 영속성(persistent)이라는 건 없어지지 않는 특성을 생각하면 됩니다.쉽게 이해하면 우리가 파일을 저장했을 때 컴퓨터를 껐다 켜도 파일 내용이 사라지지 않는 것처럼이죠. 바로 뒤에 도메인(domain)이라는 용어를 썼는데,이는 곧 엔티티를 수단으로써 데이터의 변경 사항을 어딘가에 기록해둔다는 것입니다.즉 엔티티 자체가 데이터를 영속화하지 않고, 무언가가 엔티티를 통해서 데이..
2024.05.22 -
Kotlin 플러그인 All-open 파헤치기 (feat, JPA Fetch)
All-open 코틀린의 클래스와 메소드들은 기본적으로 final 입니다.예를 들어 아래와 같은 Parent 클래스가 있다고 하면class Parent { fun hello() = "hello world!"} 이제 Parent 클래스를 상속하지 못합니다. 말 그대로 final 이기 때문에 건드릴 수 없죠 클래스를 open 시켜준다고 한들open class Parent { fun hello() = "hello world!"} 마찬가지입니다. 따라서 아래와 같이 모두 open 키워드를 달아주어야 상속하거나 오버라이드 할 수 있습니다.open class Parent { open fun hello() = "hello world!"} all-open 플러그인은 사전에 정해둔 어노테이션을 클래..
2024.05.18 -
Mockito를 이용해 JpaRepository 테스트하기
Mockito Mock이란 건 진짜를 흉내내는 가짜를 의미합니다.가령 아래 코드가 있다고 하면repository.save(entity)실행하고 싶으면 repository 구현부가 존재해야겠죠.하지만 테스트 단계에서 실제 데이터베이스를 연결해서 사용하기란 참 난감합니다.로컬의 데이터베이스를 사용한다고 해도, 테스트 자체가 실제 데이터베이스에 강하게 결합되어 있다는 건 여전합니다. 따라서 저 구현부를 그럴듯하게 흉내내주는 것이 필요하고, 이때 Mock 개념을 사용하는 것입니다.repository.save 함수에 어떤 걸 인자로 제공하면, 이걸 무조건 리턴하도록 하세요. 이렇게 코드에서 직접 주고 받고하는 것들을 작성하므로 다른 모듈에 의존하지 않는다는 장점이 있습니다. Mockito는 mocking 프레임..
2024.04.30