Java, Spring/JPA, MyBatis

    [JPA] 특정 상황에서 Lazy Fetch Type 변경하기 (@EntityGraph)

    | 스프링 부트 Test 중, 아래와 같이 오류가 나타났다. C:\sebinSample\cms\order-api\src\main\java\org\zerobase\cms\order\domain\model\Product.java:33: warning: @Builder will ignore the initializing expression entirely. If you want the initializing expression to serve as default, add @Builder.Default. If it is not supposed to be settable during building, make the field final. private List productItems = new ArrayList..

    [JPA] CascadeType : 상위 -> 하위 엔터티 전파 타입

    | CascadeType ALL - 상위 엔터티에서 하위 엔터티로 모든 작업을 전파 모두 전파 PERSIST - 상위 엔터티에서 저장을 하면 하위 엔터티도 저장 (영속성 전파) x.persist() 전파 MERGE - 하위 엔터티까지 병합 작업을 지속 ...(?) x.merge() 전파 REMOVE - 하위 엔터티까지 제거 작업을 지속 x.remove() 전파 REFRESH - 하위 엔터티까지 인스턴스 값 새로 고침 (다시 조회) x.refresh() 전파 DETACH - 하위 엔터티까지 엔터티 제거 x.detach() 전파 * persist() 는 리턴값이 없는 insert, merge() 는 리턴값이 없는 update @Transactional public S save(S entity) { if (t..

    [JPA] Lazy Loading 개념

    | 관련 용어 용어 What? How? Lazy Loading 사용자가 보지 않는 리소스는 차후에 로딩하는 기술 - 프론트 : 무한 스크롤, placeholder 등 - 백엔드 : JPA의 지연 로딩 | JPA의 Lazy Loading - 개발자는 JPA를 통해 프록시를 만들 수 있다. - 프록시란, 가짜 객체를 말하는 것으로, 실제 엔터티에 대한 참조값을 가진다. - 하나의 엔터티가 다른 엔터티와 연관관계를 맺고 있을 때 (oneToMany) , 연관된 객체들을 처음부터 DB에서 조회하지 않고, 실제 사용하는 시점에 DB에서 조회하면 속도를 향상시킬 수 있다. - JPA에서는 프록시가 참조하는 객체들의 데이터 조회 시점을 정하는 타입을 Fetch Type이라 하는데, 즉시로딩 - 한 객체를 조회할 때,..

    [Entity] 중복데이터 저장 방지 (Unique Key, Index)

    | 관련 SQL 개념 (1) Unique Key : 중복 데이터 저장을 방지하기 위한 제약조건 - 단일 칼럼 뿐 아니라, 복합 칼럼을 지정할 수도 있다. - 아래와 같이 복합 키를 생성할 경우, DB 조회 속도를 향상시킬 수 있다. -- MySQL 기준 create table member( email varchar(50), name varchar(255), unique key member_uk_email (email, name) ) - 중복 데이터 저장을 막기 위한 방법으로 아래 두가지를 사용할 수 있다. * 단순 insert into 문의 경우 에러를 발생하지만, 아래 두 가지는 에러를 발생시키지 않는다. INSERT IGNORE unique key가 걸린 칼럼에 중복 데이터가 이미 있는 경우 삽입 X..

    [Transaction] Transaction에 대한 이해 (& 스프링의 @Transactionl)

    | 개요 - 서비스에서 @Transactional 을 사용할 때와 사용하지 않을 때 수정과 삭제 시 차이를 보이는 걸 경험했다. @Transactional update delete 사용 repository.save() 불필요 repository.delete() 시 삭제됨 미사용 repository.save() 필요 repository.delete() 시 삭제되지 않음 - 더불어 테스트에서 아래와 같이 @Transactional을 작성할 때, DB에 영구반영이 되지 않는 걸 확인했었다. // 아래는 TEST 코드 @SpringBootTest @Transactional public class JpaMemoRepositoryTest{ // 테스트 작성 } - 왜 그럴까? (1) 수정 시 save하지 않아도 수..

    [JPA] 인텔리J에서 JPA Entity 기반 ERD 그리기

    https://gmlwjd9405.github.io/2019/10/28/intellij-jpa-erd.html [IntelliJ] intellij에서 JPA Entitiy 기반의 ERD 그리기 - Heee's Development Blog Step by step goes a long way. gmlwjd9405.github.io

    [JPA] repository.save()의 반환값이 안 들어올 때

    | 상황 - repository.save()를 하면 Entity타입의 객체가 반환되어야 하는데 아래와 같이 null이 반환됐다. /*Q14*/ // 트러블 슈팅 : 어? 뭐지? 데이터가 저장은 됐는데, Response값이 안온다. // -- 원인 ) Entity 인스턴스 비교(equals)를 위해 equals, hashcode 필요 @PostMapping("/api/notice4") public Notice addNotice4(@RequestBody NoticeRegister noticeRegister){ return noticeRepository.save( Notice.builder() .title(noticeRegister.getTitle()) .contents(noticeRegister.getCon..

    JPA란 무엇인가?

    | JPA - JPA란, 자바에서 사용하는 ORM 기술 표준을 말한다. * ORM : 객체와 RDBMS를 매핑해주는 기술 - JPA는 인터페이스의 모음으로, Hinernate / EclipseLink / DataNucleus가 이 명세를 구현했다. | JPA를 왜 쓸까? 1. SQL 중심 개발 -> Object 중심 개발 2. 생산성 : 데이터의 CRUD가 훨씬 쉬워진다. 저장 : jpa.persist(entity) 조회 : jpa.find(pk) 수정 : entity.setName(" ") 삭제 : jpa.remove(entity) 3. 유지보수 : 필드 변경 시 모든 SQL 수정 --> 필드를 하나만 더 추가 4. 패러다임 불일치 해결 rf. 객체와 관계형 DB의 차이 객체 SQL 상속 객체 상속 관..