JPA에 따라오는 꼬리표, N+1 최근들어 가장 많이 사용하는 API 중 하나인 JPA, 항상 JPA를 쓰면 따라오는 이야기가 있습니다. JPA를 쓰면 N+1 문제가 발생하는데 어떻게 해결해야하나요? JPA를 사용한다라고 하면 항상 나오는 질문입니다. 그때마다 머릿속에 정리가 잘 되지 않아 당황했던 기억이 있는데, 이 기회에 JPA에서 N+1이 발생하는 일반적인 케이스들을 모두 정리해보고자 글을 쓰게 되었어요 :) 흔히 알고있는 즉시로딩, 이 해결책으로 지연로딩 + fetch join을 해도 N+1이 생기는데요. 같이 모든 케이스를 확인해보면서 이야기를 이어나갈까 합니다 😀 모든 예제는 spring boot + spring data jpa환경으로 구성되어있습니다. 가장 많이 사용하는 조합이고, 많은 사람..
자바에서 예외 처리 방법 (try, catch, throw, throws, finally) try - catch - finally 자바 내에서는 Exception을 처리하기 위해서 흔히 말하는 try - catch - finally구문을 활용한다. 말그대로 실행, 에러잡기, 최종 결과라는 뜻인데 다음 예제 코드를 보자. try { 실행 코드 } catch (NullPointerException e1) { e1 발생 시 실행되는 코드 } catch (ClassCastException e2 || IllegalArgumentException e3) { e2 혹은 e3 발생 시 실행되는 코드 } catch (RunTimeException e4) { e4 발생 시 실행되는 코드 } ... finally { 실행코..
객체 지향에서 연관관계를 만드는 목표가 뭘까? "객체 지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다" -(객체지향의 사실과 오해) 일단 먼저 테이블에서 두 테이블의 연관관계를 매핑하기 위해서는 어떻게 매핑할까? FK(외래키)를 한 테이블에 두어서 각각의 테이블을 검색할 때 join을 하면 검색할 수 있다. 다음과 같은 테이블이 있을 때 우리는 두 테이블의 연관관계를 검색하고 확인할 수 있다. SELECT m.*, t.* FROM MEMBER m JOIN TEAM t ON m.TEAM_ID = t.TEAM_ID; SELECT m.*, t.* FROM TEAM t JOIN MEMBER m on t.TEAM_ID = m.TEAM_ID; 즉 하나의 테이블에 fk하나만 설정되어 있으면 서로의 ..
@Entity @Entity가 클래스단에 붙은 클래스는 JPA가 관리하는 Entity라고 지정할 수 있다. JPA에서는 entity를 리플렉션으로 관리하기 때문에 항상 기본 생성자가 필수이다. 접근 제어자의 경우 public과 protected까지만 허용되며 보통은 protected를 많이 쓰는 추세이다. final 클래스, enum 클래스, interface, inner 클래스 모두에 사용이 불가능 하며 필드에는 final 상수로 지정하면 안된다. property name JPA에서 사용할 entity의 이름을 지정할 수 있다. default: class name 가급적 default값을 사용하도록 하자. 동일한 네이밍의 entity 클래스를 사용할 경우에만 건드는 것을 추천. @Table entity..
JPA에서 가장 중요한 두가지 객체와 RDB 매핑하기 영속성 컨텍스트 영속성 컨텍스트 엔티티를 영구 저장하는 환경 엔티티의 생명주기 비영속 (new / transient) 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 영속 (managed) 영속성 컨텍스트에 관리되는 상태 준영속 (detached) 영속성 컨텍스트에 저장되었다가 분리된 상태 삭제 (removed) 삭제된 상태 1. 비영속 Member member = new Member(); member.setId(1L); member.setName("hello"); 즉, 객체만을 만들어두고 다른 행위를 하지 않은 상태이다. 2. 영속 EntityManager em = emf.createEntityManager(); em.getTransaction()...
우리가 만드는 대부분의 어플리케이션은 객체 지향적인 언어를 사용한다. (Java, Scala ...) 하지만 데이터베이스에서는 아직은 RDB가 시장 대부분을 차지하고 있다. (Mysql, Oracle ...) 그래서 어떻게보면 객체를 RDB에 저장하여야하고 RDB에서 데이터를 꺼내서 객체에 매핑해서 사용해야한다. 즉, SQL 중심적인 개발을 진행해야한다. 누구나 한번쯤 느낄 수 있다. CRUD가 반복되는 무한반복 지루한 코딩 자바 객체를 SQL로, SQL를 자바객체로 변환하는 무수히 반복되는 코딩으로 인해서 SQL개발자인지 JAVA 개발자인지 분간이 되지 않는 상황이 오게 된다. 그 과정에서 겪을 수 있는 예를 보자. 객체 CRUD - 필드 추가 회원을 설계하고 회원을 저장하는 개발을 했다고 치자. pu..
인터페이스 정의하는 방법 인터페이스는 결국 앞전에 상속에서 배웠던 "추상클래스"이다. 추상클래스란 추상화한 메소드를 가진 메소드 즉, 아직 구현되지 않은 메소드들을 가진 클래스였다. 인터페이스는 이 추상클래스에서 추상화 정도가 매우 높아서 오로지 추상 메소드와 상수만을 멤버로 가진 클래스를 말한다. 추상클래스가 조금 만들어둔 설계도라고하면 인터페이스는 아예 아무것도 안만든 설계도라고 할 수 있다. interface 인터페이스이름{ public static final 타입명 변수이름 = 값; public abstract 메소드명 (매개변수, ...); } 이때 모든 상수는 반드시 public static final 이어야하며, 생략하여 사용할 수 있다. 메소드도 마찬가지로 public abstract 이어..
package 키워드 클래스를 모아둔 폴더 자바에서 패키지는 비슷한 성격을 가진 자바 클래스들을 한군데 모아놓은 디렉토리의 개념으로 사용된다. 단, 자바 클래스를 모아놓은 디렉토리이지 일반 디렉토리와는 다른 기능을 제공한다. 같은 이름의 클래스를 선언하더라도 구분지어서 사용할 수 있다. 비슷한 기능의 클래스를 묶어서 보관하여 편리하게 관리할 수 있다. 같은 패키지내에서는 같은 클래스명을 사용할 수 없지만 다른 패키지내에 있다면 클래스 선언이 가능하다. 바뀐건 경로뿐인거 같은데 구분이 되는 이유는 클래스가 물리적으로 하나의 클래스파일(.class)인 것과 같이 패키지도 마찬가지로 물리적으로 하나의 디렉토리로 정해져있기 때문이다. 따라서 개별적인 패키지 체계를 만듦으로써 따로 개발된 클래스 라이브러리이더라도..
- Total
- Today
- Yesterday