
이번 글은 우아한 테크코스에서 작성한 글 중 JPA Fetch Join에 관한 글입니다. JPA는 기본적으로 제공되는 쿼리에서 한계가 있기 때문에 QueryDSL이라는 의존성을 주입하여 더 상세하고 복잡한 쿼리를 생성해내고, 해당 엔티티의 Repository를 구현한 RepositoryImpl과 같은 형태로 사용하고 있습니다. 그래서 복잡한 파라미터 혹은 조인절이 들어가는 경우 대부분 QueryDSL내에서 로직화 시키고, 파라미터 별 분기 내용과 기존에 사용했던 쿼리를 버전 관리용도로 사용하기도 적합한 우수한 성질을 지녔습니다. 하지만 그럼에도 불구하고 QueryDSL 또는 JPA를 사용하는 와중 Fetch ON 이 되어도 데이터 조회가 이상하게 되거나, 데이터가 오히려 삭제가 되는 문제가 종종 발생하는..
오늘은 JPARepository 내에서 사용하는 방법에 대한 가이드를 적어볼까 합니다. 보통 아래와 같이 SQL 을 작성하게 됩니다. 아래의 findById로 조회하는 경우 JPARepository 의 Override를 하게 되는것이기 때문에 우선권을 갖게 됩니다. @Query(value = "SQL") Optional findById(@Param("id") Long id); 근데 이와 같은 엔티티에 또 다른 엔티티가 Join이 되어 있는데, FetchType=LAZY인 경우 데이터를 가져오는 경우 쿼리가 2번 호출됩니다. AClass.java @Entity public class AClass { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) publ..

오래전에 Java에서 JPA를 사용하는 글을 올려본 적이 있어요. 그래서 이번에는 Kotlin에서도 가능할 것인지 테스트 겸 프로젝트를 구성해보았습니다. 먼저 프로젝트를 만들어봐야겠죠? IntelliJ를 사용하였고, Spring Initializr를 사용했습니다! File -> New -> New Project에서 Spring Initializr를 선택합니다. 프로젝트명과 그룹도 정해주시고 Type은 Gradle Project, Language Kotlin으로 설정합니다. 다음으로 Dependency를 선택할 부분인데 API의 용도로만 사용하기 위해 심플하게 선택했습니다. 제가 잘못한 게 'Spring Web Starter'가 추가가 안되었습니다 ㅠㅠㅠ 추가해주세요. 프로젝트가 생성되고 build.gra..

어느 개발자들이나 신기술에 대한 갈망은 조금이나마 있을 것이다. 현재 우리나라에서 사용하고 있는 대부분의 프로그램 및 앱들은 SQL을 기반으로 작동하고 있다. 신기술이라고 얘기하기는 애매하지만 이번 글에서는 SQL을 되도록이면 최소화하여 (사용하지 않는 것이 아니다) 작동하는 프로그램의 원리에 대해 간단히 살펴보려고 한다. 가장 먼저 용어를 정리해보아야 한다. 글 제목에 적혀 있는 3개의 용어를 정리해보았다. 정의 ORM(Object Relational Mapping) : 객체와 DB 테이블이 매핑을 이루는 것 객체 하나는 하나의 테이블이 된다. JPA(Java Persistent API) : 자바 ORM 기술에 대한 API 표준 명세 (이 링크에서 JPA에 대한 어노테이션을 살펴볼 수 있어요) Hib..