본문 바로가기

FastCampus - 한번에 끝내는 Java|Spring 웹 개발/04 JPA

(28)
JPA Ch 11 - Dirty Check에 의한 batch 성능 이슈 - 패스트캠퍼스 챌린지 45일차 어쩌다가 마지막 강의가 쉬어가는 시간이 된 건지. JPA 강의의 마지막 내용은... 뒤에 더 없어요?... 자동으로 저장을 해주는 Dirty Check 기능에 의해서 성능적 이슈가 생기는 상황입니다. 한 줄로 정리하자면 다수의 내용을 읽을 때에는 @Transaction(readOnly=true) 를 설정하자는 거구요. JPA의 "자동 저장" JPA에는 dirty check 기능이 들어있어서 Persistence Context (영속 컨텍스트) 에서 관리되는 개체가 수정된 경우 세션(@Transactional) 종료 시 수정 여부를 파악해서(dirty check) 수정된 부분을 반영해줍니다. repo.save() 호출 없이도 반영되는 거죠. 예전 강의에서도 배웠던가요...? 이걸 확인하기 위해서 @Tran..
JPA Ch 11 - 캐시와 DB의 불일치 - 패스트캠퍼스 챌린지 44일차 어째 쉬어가는 시간이 되어버렸습니다. 저번에 양이 많았던 것도 있으니 쉬어가기로. 본래 강의 영상의 제목은 "Ch. 11 JPA 트러블슈팅" 챕터의 "02. 영속성 컨텍스트로 인해 발생하는 이슈" 인데, 강의 내용은 Persistence Context 나 실제 객체와 DB 간의 간극 등에 의해 차이가 생겨서 문제가 발생하는 경우에 대해 다룹니다. 뭐 비슷하죠? 결국은 캐시의 문제입니다. 3가지 정도의 사례가 나왔습니다. 이전 강의에서 봤던 문제: @Embedded 된 객체의 null 여부가 실제 DB와는 무관하게 객체가 있거나 없는 문제 -> 이전에 다뤘으니 생략합니다. 기성 데이터베이스가 있거나 해서 AutoDDL을 사용하지 않은 경우, 데이터베이스의 정의와 객체에 매핑된 타임스탬프의 정밀도가 달라서 ..
JPA Ch 11 "N+1 문제" - 패스트캠퍼스 챌린지 43일차 전날에는 환경 문제로 이 강의를 건너뛰고 스프링 시큐리티를 잠깐 봤습니다. 오늘은 원래대로 돌아와서 JPA 강의를 마저 봅니다. 실습 가능한 환경이 있는 곳으로 돌아왔건만 오늘은 별로 실습할 내용이 없습니다. 근데 강의 길이는 좀 깁니다... 한 동영상에 40분 뭐야... N+1 문제를 향해 이번 강의의 주제는 N+1 문제가 무엇인지, 그리고 어떻게 해결하는지 알아보는 것입니다. 많이 들어봤을 유명한 문제라고는 하셨는데 이게 무엇인지는 명확하게 짚어주지 않으신 채로 앞으로 나아갔습니다. 심지어 저도 찾아봤었는데 너무 오래전에 찾아봐서 뭔지 까먹었었거든요. 패캠 제발 강의 검수좀... 정리를 계속 하기 전에 이게 뭔지부터 다시 알아보고 갑시다. N+1 문제? https://stackoverflow.com/..
JPA Ch 10 @Embeddable - 패스트캠퍼스 챌린지 41일차 이번에 학습한 내용은 @Embeddable / @Embedded 필드입니다. 아, 오늘도 환경 설정 문제로 IDE에서 코드를 검증해보지는 않았습니다. 원격으로 작업하기 너무 번거로워서; 손코드인 점 양해 바랍니다. 내일은 원격이 아니라 코드를 복붙해서 진행해봐야겠네요. macOS에서 DB 쓰기 번거로운데... docker도 그렇고... @Embeddable / @Embedded 개념은 이렇습니다. 엔티티의 여러 필드를 묶어서 하나의 클래스로 다루겠다는 거구요. 거꾸로 생각해보자면 Embeddable 인 객체의 모든 필드들을 특정 @Entity 의 필드에 포함시키는 거라고 볼 수 있습니다. 그래서 어노테이션 이름이 @Embeddable / @Embedded 인 거겠죠. 문서와 함께 각 어노테이션의 의미를 ..
JPA Ch 9 @Converter - 패스트캠퍼스 챌린지 40일차 오늘의 주제는 ORM의 "객체 매핑"을 커스텀 타입으로 내맘대로 주무를 수 있는 @Converter 와 해당 사항을 지시하는 플래그 @Convert 입니다. 다만... 오늘은 사정상 기차 안에서 작업을 하고 있어서 실습은 어려울 것 같습니다. DB 설정이나 이런 게 원체 번거로워서 노트북에 하기도 좀 그렇구요, 이번 글에서는 IDE에서 실제로 돌아가는지는 확인하지 않은 손코드들을 보여드릴 예정이니 이 점은 감안 부탁드립니다. 저는 경고했습니다. Converter란? : 엔티티의 필드 "DB의 칼럼" 변환을 커스터마이징 ORM 은 프로그래밍 언어상의 자료구조를 DB로, DB에 있는 데이터를 프로그래밍 언어상의 자료구조로 상호변환해주는 역할을 합니다. JPA는 그 표준이구요. 상호변환하는 방법이 있다면, 그..
JPA Ch 9 @Query (3), NativeQuery - 패스트캠퍼스 챌린지 39일차 다행히도 어제 배운 내용을 까먹지는 않았습니다. 아니, 적어도 다음에 배울 게 뭐였는지는 안 까먹었습니다. 그래서 오늘의 주제는 다음 두 가지입니다. @Query (3강): 생뚱맞은 객체를 만들어 반환하기 (DTO 같은 거) 등 다음 강의 NativeQuery 써보기 @Query 에서 DTO 이전편에서 @Query(value="JPQL 쿼리문") 으로 존재하지 않는 DTO인 BookNameAndCategory 를 만들어서 반환하고자 했습니다. 방법은 다음 두 가지입니다. BookNameAndCategory 를 인터페이스로 바꾸기 (getter, setter 로 바꿔야 합니다.) interface IBookNameAndCateogory 를 만들었습니다. "select b.name, b.category fr..
JPA Ch 9 @Query (1, 2) - 패스트캠퍼스 챌린지 38일차 앞서 종종 썼던 @Query 에 대해 다룹니다. 아쉬운 점은 이 지점까지 왔는데도 현업에서 쓰인다는 Query DSL 을 다룬 챕터는 보이지 않는다는 건데... 뭐 이거 C#의 LINQ / Entity Framework 에서 쓰이는 fluent API랑 비슷하게 생겼으니 (저는 그걸 공부해본 적이 있으니) 나중에 필요하면 배우면 될 거 같긴 해요. 극단적인 예시 먼저, @Query(value = "JPQL 쿼리문") 처럼 쓰는 것의 유용성 중 한 가지를 보여주기 위해 Spring Data JPA 쿼리메소드로 이름 길이가 미쳐돌아가는 메소드를 만듭니다. // 테스트는 안 해봤으니, 맞는 이름인지는 직접 IDE에서 확인해주세요. List findByCategoryIsNullAndNameEqualsAndCre..
JPA Ch 8 remove cascade / soft delete - 패스트캠퍼스 챌린지 37일차 아직 살아있는 sftblw-chan 입니다. 몸 상태가 메롱해서 체온이 38도 근처로 올라갔다 내려갔다 아슬아슬하긴 한데 아직 쓰러질 정도는 아니라서 실습은 빼고 간단히 동영상만 보고 정리나 해두려구요. REMOVE cascade 옵션 저번 강의에서 추가해놨던 cascade = Cascade.ALL 을 다시 PERSIST와 MERGE로 원상복구한 뒤에, book 만 지웁니다. 당연히 publisher 가 남아있습니다. 여기에 REMOVE를 넣으면 book을 지우면 연결된 publisher 도 같이 지워짐을 확인할 수 있습니다. REMOVE 의 cascade 대상이 다른 것과도 연결된 경우 아.. .이건 코드 열어서 강의내용을 확인을 해봐야겠네... (귀차니즘에 애도를) 좀 강의에서 확실히 짚어주셨으면 좋..
JPA Ch 8 영속성 전이 (Cascade) - 패스트캠퍼스 챌린지 36일차 오늘 내용은 Cascade 입니다. DB의 그것과 비슷하면서도 완전히 다른 의미더라구요. Cascade ("영속성 전이") Cascade 는 아마 계단이 단계적으로 떨어지는 폭포를 의미할 겁니다 (*사전을 찾아봤지롱). Cascade는 데이터베이스에도 있는 개념이지만, (cascade drop 이나 cascade set null 같은 거), JPA에서의 의미와는 확연히 다릅니다. 같은...건가? 아무튼 JPA에서의 Cascade JPA 오퍼레이션의 관점으로 언급되어 있습니다. JPA의 Cascade 는 관계를 지정하는 @OneToOne, @OneToMany, @ManyToOne 등에 필드로 존재합니다. JPA에서 Cascade가 일어나는 상황 먼저 상황을 봅시다. JPA 의 Cascade는 JPA의 개념..
JPA Ch 7 트랜젝션 매니저의 propagation - 패스트캠퍼스 챌린지 35일차 트랜젝션 매니저의 마지막 영상입니다. 앞선 영상과 이어지는 @Transactional (Spring JPA) 의 두 가지 프로퍼티 알아보기 중 두 번째인 propagation 을 살펴보는 시간입니다. 다만 propagation 은 바꾸는 일이 정말 필요할 때 외에는 잘 없는 모양이라서, 이렇게 동작한다만 이해하면 될 것 같습니다. @Transactional 의 Propagation Spring JPA의 @Transactional 의 필드인 propagation 은 enum Propagation 이며, 7가지 종류의 값이 있습니다. 기본값은 REQUIRED 입니다. 강의 흐름에서 3종류로 묶였습니다. 묶어놓는 게 이해하기도 편하잖아요? 공식 문서도 이참에 같이 읽어봅시다. https://docs.sprin..