본문 바로가기

Spring&IntelliJ

(57)
n+1문제에 대해서 N+1 문제는 JPA에서 연관관계 데이터를 조회할 때 SQL이 예상보다 많이 실행되는 문제입니다. 특히 FetchType.EAGER(즉시 로딩)에서 자주 발생합니다.쉽게 말하면:한 번 조회하면 될 것을, N개의 데이터를 추가로 조회해서 총 N+1번의 SQL이 실행되는 문제입니다.1. 예시로 이해하기다음과 같은 엔티티가 있다고 가정해 보겠습니다.Member 엔티티 @Entitypublic class Member { @Id private Long id; private String name; @ManyToOne(fetch = FetchType.EAGER) private Team team;} Team 엔티티 @Entitypublic class Team { @Id privat..
protected기본생성자를 사용하면 왜 개발자는 함부로 생성하지 못하고 JPA같은 프레임워크는 접근이 가능한거야? 김영한 ⇒“기본적으로 JPA를 사용한다면 리플렉션이나 프록시 같은 기술을 사용해야 하는데 기본생성자가 없으면 리플랙션 혹은 프록시같은 기술을 사용할 수 없습니다. 기본생성자를 public 으로 설정하면 실수가 발생할수 있기 때문에 protected까지 허용해 줍니다.“좋은 질문입니다. 이 부분은 Java의 접근 제어자(access modifier)와 JPA의 리플렉션(reflection)을 이해해야 합니다.결론부터 말하면:protected 기본 생성자는 일반 개발 코드에서는 접근을 제한하지만, JPA는 Java Reflection을 사용하기 때문에 객체 생성이 가능하다.입니다.1. protected의 기본 의미Java 접근 제어자는 다음과 같은 순서로 접근 범위를 가집니다.접근 제어자같은 클래스같은 패키..
@Embeddable에 대해서 @Embeddable은 JPA에서 값 타입(Value Type)을 정의할 때 사용하는 어노테이션입니다.쉽게 말하면:"이 클래스는 독립적인 테이블로 만들지 말고, 다른 엔티티의 컬럼에 포함시켜서 사용해라"라는 의미입니다.1. 일반적인 엔티티(Entity)와 비교예를 들어 회원(Member)이 있다고 해보겠습니다. @Entitypublic class Member { @Id @GeneratedValue private Long id; private String name; private String city; private String street; private String zipcode;} DB 테이블은:MEMBER------------------idnamecitystre..
@Inheritance에 대해서 (3가지 전략) 다음코드에서 InheritanceType.JOINED에 대해 알려줘. 자바 객체의 상속 구조를 JPA가 데이터베이스 테이블 구조로 어떻게 매핑할지 결정하는 어노테이션입니다. 1. 실제로 테이블을 생성하는 역할은 누가 할까?테이블 생성은 @Inheritance가 아니라 Hibernate의 DDL 자동 생성 기능이 담당합니다.예를 들어 persistence.xml에서: 또는 Spring Boot에서: spring: jpa: hibernate: ddl-auto: create 이 설정이 있으면 Hibernate가:엔티티 클래스를 분석하고JPA 어노테이션을 읽고SQL CREATE TABLE 문을 만들고DB에 실행합니다.2. 그러면 @Inheritance는 무엇을 제공할까?예를 들어: @Entit..
cascade = CascadeType.ALL은 어떨때 주로 쓰이고 왜 쓰여? cascade = CascadeType.ALL의 의미:부모 엔티티의 저장, 수정, 삭제 같은 상태 변화를 자식 엔티티에게 자동으로 전파한다.주로 사용하는 경우:✅ 부모와 자식의 생명주기가 동일할 때✅ 자식이 부모 없이 의미가 없을 때대표적인 예:Order | ├── OrderItem | └── Delivery 같은 도메인입니다.반대로:Member |Order 처럼 독립적으로 관리해야 하는 데이터에는 신중하게 사용해야 합니다.cascade = CascadeType.ALL은 부모 엔티티의 상태 변화를 자식 엔티티에게 자동으로 전파하기 위해 사용합니다.쉽게 말하면:"부모를 저장하거나 삭제할 때, 연결된 자식도 같이 처리해줘"라는 의미입니다.1. Cascade가 필요한 상황예를 들어 주문 시스템을 생각해보겠습니..
h2 파일 생성 실패시, Database not found 애러 해결방법 Database "C:/Users/dhfle/jpashop2" not found, either pre-create it or allow remote database creation (not recommended in secure environments) jdbc:h2:~/jpashopp;AUTO_SERVER=TRUE 를 입력했더니 해결되었어. 이것의 의미가 뭐야?해결됐다니 다행이야.AUTO_SERVER=TRUE는 H2의 자동 서버 모드(Auto Mixed Mode) 를 활성화하는 옵션이야.네가 입력한 URL:jdbc:h2:~/jpashopp;AUTO_SERVER=TRUE 의 의미를 분해하면:1. jdbc:h2:~/jpashopp~=C:\Users\dhfle 따라서 실제 DB 파일은C:\Users\dhfl..
JPA 지연로딩과 프록시객체 지연로딩을 비롯하여 왜 JPA에서는 원래의 객체를 생성하여 반환하지 않고 프록시 객체를 생성하여 반환하는거야?좋은 질문입니다.사실 JPA가 프록시 객체를 사용하는 이유는 단 하나로 요약할 수 있습니다."당장 필요 없는 데이터를 나중에 가져오기 위해서"입니다.만약 프록시가 없다면?예를 들어: @Entitypublic class Order { @ManyToOne private Member member;} 주문을 조회합니다. Order order = em.find(Order.class, 1L); 그러면 Order 객체 안에는 Member가 있어야 합니다.프록시가 없는 세상에서는:Order 조회↓Member도 조회 해야 합니다.즉 SQL이: SELECT *FROM ORDERSWHERE ID = 1 뿐..
1. 쓰기 지연과 지연 로딩에 대해서, 2.로우(ROW)락과 쓰기지연에 대해서 1. 쓰기 지연과 지연 로딩에 대해서JPA에서 쓰기지연과 지연로딩은 다른거야? 네, 완전히 다른 개념입니다.쓰기 지연은 INSERT·UPDATE·DELETE SQL 실행을 트랜잭션 커밋 시점까지 미루는 기능이고, 지연 로딩은 연관된 엔티티를 실제로 사용하는 시점까지 SELECT 조회를 미루는 기능이다. 둘 다 "지연"이라는 단어가 들어가지만 전혀 다른 기능이다. 이름이 비슷해서 헷갈리기 쉽지만, 적용되는 대상도 다르고 목적도 다릅니다.구분쓰기 지연(Write-Behind)지연 로딩(Lazy Loading)대상INSERT, UPDATE, DELETESELECT목적SQL 실행을 모아서 성능 향상필요한 시점에만 조회발생 시점데이터를 저장/수정할 때연관 객체를 조회할 때관련 기능영속성 컨텍스트, 쓰기 지연 SQ..