@Where Deprecated되고 새로 쓰이는 @SQLRestriction
·
Spring/JPA
Soft Delete 방식으로 데이터를 관리중이던 나는 @Where 메서드가 Deprecated된 것을 발견하였다...!이제 뭘 써야 고민하던 중에 Cursor AI 툴로 리팩터링을 참고하며 진행하던중 @SQLRestriction 이라는 어노테이션을 발견할 수 있었다.보자마자 이건 누가봐도 동일한 방식으로 사용하 수 있겠다 싶어서 내부 소스코드에 대한 설명을 읽어보았다. Specifies a restriction written in native SQL to add to the generated SQL for entities or collections. For example, @SQLRestriction could be used to hide entity instances which have been so..
JPA - DB 연결 예외 : 'url' attribute is not specified and no embedded datasource could be configured.
·
Spring/JPA
프로젝트를 만들다 보면 항상 발생하는 이 오류... 도대체 어디서 항상 발생하는건지 문제를 직접 이해하고 다음에는 이 문제가  발생하지 않도록 설정해보려고 한다.예외에서는 항상 entityManagaer관련 예외가 발생한다. 내 yml 설정은 아래와 같다.spring: messages: basename: messages encoding: UTF-8 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/[DB이름]?serverTimezone=Asia/Seoul username: [Id] password: [Password] jpa: properties: ..
JPA - 지연로딩과 즉시로딩
·
Spring/JPA
즉시 로딩과 지연 로딩 이전 포스트에서 프록시에 대해 배웠다. 해당 객체와 연관된 다른 객체를 어떤 시점에 불러올지 , 어떤 타입으로 형성되는지 알아봤다. JPA는 이런 프록시 기술을 사용해서 지연로딩을 사용한다. 객체 생성 코드 @Entity @Data @NoArgsConstructor(access = AccessLevel.PROTECTED)//기본생성자 protected @ToString(of = {"id","username","age"}) public class Member extends BaseEntity { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; private int age;..
JPA - Proxy
·
Spring/JPA
프록시 객체란? 해당 엔티티와 연관된 다른 엔티티를 한 번에 조회하지 않고 실제로 필요할 때 프록시 객체를 초기화시켜 사용한다. 프록시 객체를 사용하면 자원 낭비를 막을 수 있다. 지연 로딩을 이해하기 위해 필요한 기초 개념 em.getReference()라는 메서드로 프록시 객체인지 확인 가능 em.find()는 실제 엔티티 객체를 조회하는 메서드 프록시의 특징 실제 클래스를 상속받아서 만들어진다. 하이버네이트가 내부적으로 상속받음 실제 클래스와 동일한 타입처럼 보인다. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용한다. 프록시 객체는 실제 객체의 참조대상을 보관한다. 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다. 프록시 객체의 초기화 Member객체를 e..
JPA - MappedSuperClass
·
Spring/JPA
@MappedSuperclass란? 객체의 입장에서 공통 매핑 정보가 필요할 때 사용 예를 들어 공통으로 작성일, 작성자, 수정일, 수정자를 공통으로 집어넣고 싶을때 사용한다. 공통 매핑 정보가 필요할 떄 부모 클래스에 선언하고 속성만 상속받아서 사용하고 싶을 때 사용한다. 객체에 적용하기 import lombok.Data; import javax.persistence.MappedSuperclass; import java.time.LocalDate; import java.time.LocalDateTime; @Data @MappedSuperclass public abstract class BaseEntity { /** * 작성자 및 작성일 */ private String createdBy; private ..
JPA - 상속관계매핑
·
Spring/JPA
상속관계 매핑 객체는 상속관계가 존재하지만, 관계형 DB에는 상속 관계가 없다. 상속관계 매핑이라는 것은 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑하는 것 슈퍼타입과 서브타입 논리 모델 → 물리모델로 구현하는 방법 3가지 방법이 존재한다. JPA가 이 3가지 방법과 매핑하려면 @Inheritence(strategy=InheritanceType.XXX)의 strategy를 설정해주면 된다. XXX = ‘JOINED’,’SINGLE_TABLE’,’TABLE_PER_CLASS’로 구성되어 있다. @DiscriminatorColumn(name=”DTYPE”) 부모 클래스에서 선언, 하위 클래스를 구분하는 용도의 컬럼을 생성 관례는 default=DTYPE @DiscriminatorValue(”XX..