SQL을 사용할 때 연관관계가 있는 다른 테이블의 정보를 이용하려고 한다면 JOIN을 사용해야 합니다. INNER JOIN, OUTER JOIN과 같은 JOIN 형태가 존재합니다. 그렇다면 FETCH JOIN은 무엇을 의미할까요? Fetch Join 페치 조인은 SQL에서 이야기하는 조인의 종류는 아닙니다. JPQL에서 성능 최적화를 위해 제공하는 조인의 종류입니다. 이를 설명하기 전에 JPQL에 대해 간략히 설명하겠습니다. JPQL(Java Persistence Query Language) SQL이 DB에 있는 테이블을 조회하는 쿼리라고 한다면 JPQL은 엔티티 객체를 조회하는 객체지향 쿼리를 의미합니다. 문법은 SQL과 비슷하고 SQL이 제공하는 기능을 유사하게 지원합니다. public class M..
문제 자바 프로젝트에서 JPA에 대해 실습하던 도중 JPA가 Entity를 인식하지 못하는 문제가 발생하였습니다. hibernate와 h2 의존성도 잘 가져오고 persistence.xml도 참고하던 강의의 내용을 복사하였기에 잘 작성하였습니다. @Entity 어노테이션도 잘 작성하였지만 public class Main { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(..
프록시는 무엇을 의미할까요? 이 질문에 앞서 프록시가 등장하게 된 배경에 대해 먼저 알아보도록 하겠습니다. Proxy 등장 배경 객체는 객체 그래프로 연관된 객체들을 자유롭게 탐색할 수 있습니다. 하지만 데이터베이스 매핑을 하는 엔티티 객체에서는 자유도가 떨어집니다. 연관된 테이블의 데이터를 조회하기 위해서는 JOIN을 사용하여 조회를 진행해야 하기 때문입니다. 자유로운 객체 그래프 탐색의 가능성으로 인해 연관된 모든 테이블을 조회하는 것은 비용이 따릅니다. 실제로 연관된 테이블을 사용하지 않는다면 쓸데없이 JOIN을 하여 조회한 결과를 가져오기 때문입니다. 이 문제를 해결하기 위해 프록시가 등장하게 되었습니다. 연관된 객체를 처음부터 데이터베이스에서 조회하는 것이 아니라, 실제 사용하는 시점에 데이터베..
JPA를 공부할 때 영속성 컨텍스트만큼 중요한 개념 중 하나가 연관관계입니다. 객체는 참조를 사용해 다른 객체와 연관관계를 가지고 연관된 객체를 조회합니다. 하지만 테이블은 외래 키를 사용해 다른 테이블과 연관관계를 가지고 조인을 통해 연관된 테이블을 조회합니다. 객체가 테이블처럼 외래 키를 가지도록 설계한다면 객체 지향적인 설계를 포기해야 합니다. 이러한 패러다임의 불일치를 중간에서 해결해 줄 매개체가 필요한데 JPA가 이 역할을 수행합니다. 객체 그래프 탐색 다음과 같은 객체 연관관계가 존재한다고 가정할 때, 연관되어 있으면 참조를 통해 탐색이 보장되어야 합니다. 이를 객체 그래프 탐색이라고 합니다. 아래의 코드의 신뢰성이 보장되어야 함을 의미합니다. Professor professor = unive..
JPA SQL 중심적인 개발을 진행하다 보니 다음과 같은 문제를 확인할 수 있었습니다. 반복적이고 지루한 작업 객체와 테이블 사이의 패러다임 불일치 문제를 해결하기 위해 객체를 자바 컬렉션에 저장하듯 DB에 저장할 수 없을까 하는 생각으로 새로운 방법을 찾게 되었고 JPA가 등장하게 되었습니다. JPA(Java Persistence API)는 자바 진영의 ORM 표준 기술로 애플리케이션과 DB 사이에서 동작하게 됩니다. Java 코드로 JPA에 접근하게 되고 JPA는 내부적으로 JDBC API를 이용해 DB에 접근합니다. JPA를 간단히 말하면 인터페이스의 모음입니다. 기존 JPA 없이 JDBC API를 사용할 때는 SQL을 다음과 같이 일일이 작성해야 했습니다. public Member createMe..