JPA

    [JPA] JPA의 장점과 그 원리

    [JPA] JPA의 장점과 그 원리

    이전 포스팅에서 객체지향프로그래밍과 데이터베이스간 패러다임 불일치로 발생하는 문제들을 알아봤다. 이번에는 JPA가 이런 문제를 어떻게 해결하는지 알아보자. 새로운 계층: JPA 레이어 JPA는 데이터베이스와 애플리케이션 사이에서 동작한다. 계층이 하나 더 있기 때문에 최적화 관점에서 시도해 볼 수 있는 것이 많다. 1. 지연 로딩 Customer를 조회할 때 Orders속성에 명시적으로 액세스할 때까지 SELECT 쿼리가 나가지 않는다. @Entity public class Customer { @OneToMany(mappedBy = "customer") private List orders; } 2. Batch Fetching 관련 엔티티를 일괄적으로 로드하여 쿼리 수를 최소화한다. @Entity publ..

    [JPA] JPA의 필요성: 객체와 데이터베이스 간의 격차 해소하기

    객체 지향 프로그래밍의 도전 과제 객체 지향 프로그래밍의 영역에서는 추상화, 상속, 다형성이라는 3박자가 복잡한 시스템의 제어를 조율한다. 그러나 이러한 원칙을 데이터 저장으로 확장하면 수많은 과제가 발생한다. JDBC API 사용 시 불편한 점을 고려하여 그 복잡성을 자세히 살펴보자. 예를 들어 User객체를 조회해보자. // 저장 class UserJdbcTemplate { public User findUserByUsername(String username) { String sql = "SELECT * FROM users WHERE username = ?"; return jdbcTemplate.queryForObject(sql, new Object[]{username}, (resultSet, rowN..

    [JPA] QueryDsl Gradle 설정

    QueryDsl 설정하는데 삽질을 많이해서 정리합니다. 환경은 다음과 같습니다. - 자바 : 17 - spring boot : 3.0.0 - gradle : 7.5.1 [Gradle 설정] 주석 처리 밑으로 4줄 plugins { id 'java' id 'org.springframework.boot' version '3.0.0' id 'io.spring.dependency-management' version '1.1.0' } group = 'com' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCen..

    [JPA] 영속성 컨텍스트의 생명주기(feat.OSIV)

    [JPA] 영속성 컨텍스트의 생명주기(feat.OSIV)

    [문제 상황] 사용자 회원가입이 잘 되는지 확인하기 위해 다음과 같은 테스트 코드를 작성했다. "영속성 컨텍스트에 user 정보가 저장되어서 같은 영속성 컨텍스트에 있는 user와 newUser는 같은 객체가 된다"라고 생각했는데 테스트 케이스가 실패하였다. 확인해보니 user가 null로 나온다. ??? 그렇다면 왜 이 테스트 케이스는 실패하는가? 이를 위해 userService.save()의 코드를 살펴보았다. [분석] 먼저 내가 알고 있는 지식이 잘못된 것인지 확인하였다. [JPA의 객체 비교] 객체를 비교하는 방식에는 총 2가지가 있다. 1. 동일성 비교 (== 비교) 2. 동등성 비교 (equals()) JPA에서는 같은 트랜잭션일 때는 같은 객체임이 보장된다. 따라서 다음은 동일성 비교에서 t..

    [JPA] 연관관계의 주인이 '다'쪽에 있는 이유

    [JPA] 연관관계의 주인이 '다'쪽에 있는 이유

    연관관계의 주인이 '다'쪽에 있는 이유에 대해 살펴보자. 이를 위해 먼저 객체지향세계와 DB의 차이에 대해 알아야 한다. 🔍 객체지향과 DB, 연관관계의 주인이 필요한 이유 Member와 Team이라는 클래스 또는 테이블이 있다고 해보자. 여기서 이 둘은 다대일 단방향 관계이다. 객체지향에서 Member Team은 다음과 같이 표현될 수 있다. public class Member { int id; String memberName; Team team; } public class Team { int id; String teamName; } RDBMS에서는 다음과 같이 표현이 된다. DB와 객체지향의 큰 차이점은 객체지향 프로그래밍에서는 Member에서 Team으로의 조회는 가능하지만, Team에서는 Mem..