Spring

    [JPA] merge 동작방식과 기타 어노테이션

    @PersistenceContext : 엔티티 매니저(EntityManager) 주입 스프링 데이터 JPA를 사용하면 EntityManager도 주입 가능하다. @PersistenceUnit : 엔티티 매니저 팩토리(EntityManagerFacotry) 주입 @Transactional : 트랜잭션, 영속성 컨텍스트 readonly = true : 데이터의 변경이 없는 읽기 전용 메서드에 사용, 영속성 컨텍스트를 플러시 하지 않으므로 약간의 성능이 향상된다. (읽기 전용에는 다 전용) @SpringBootTest : 스프링 부트 띄우고 테스트 한다.(이게 없으면 @Autowired 실패 한다) merge 의 동작 방식 merge(member) 호출 파라미터로 넘어온 준영속 엔티티의 식별자 값으로 1차 캐..

    [JPA] API 성능 끌어올리기(N+1 문제 등)

    API 성능 끌어올리기(n+1 문제 등) 본 내용은 김영한 님의 스프링 부트와 JPA 활용2 강의 내용을 토대로 정리했습니다. 지연로딩과 컬렉션이 없는 경우 @GetMapping("/api/v1/members") public List membersV1(){ return memberService.findMembers(); } 응답 값으로 엔티티를 직접 외부에 노출한 경우의 문제점 엔티티에 프레젠테이션 계층을 위한 로직이 추가된다. 기본적으로 엔티티의 모든 값이 노출된다. 응답 스펙을 맞추기 위해 로직이 추가된다.(@JsonIgnore, 별도의 뷰 로직 등등) 실무에서는 같은 엔티티에 대해 API가 용도에 따라 다양하게 만들어지는데, 한 엔티티에 각각의 API를 위한 프레젠테이션 응답 로직을 담기는 어렵다...

    [JPA] 값 타입에 대해

    JPA 값 타입에 대해 JPA의 데이터 타입 분류 엔티티 타입 @Entity로 정의 하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 EX) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입 int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경 시 추적 불가 값 타입 분류 기본값 타입 자바 기본 타입 (int, double) 래퍼 클래스(Integer, Long) String 임베디드 타입(embedded type, 복합 값 타입) 컬렉션 값 타입(collection value type) 임베디드 타입 임베디드 타입을 사용하면 여러 필드들을 묶어서 표현할 수 있다. public class Member{ @Id ..

    [JPA] 영속성 전이(CASCADE)와 고아 객체에 대해

    영속성 전이(CASCADE)와 고아 객체에 대해 본 내용은 자바 ORM 표준 JPA 프로그래밍 책을 토대로 정리했습니다. 영속성 전이(CASCADE) Child child1 = new Child(); Child child2 = new Child(); Parent parent = new Parent(); parent.addChild(child1); parent.addChild(child2); em.persist(child1); em.persist(child2); em.persist(parent); Parent 안에 Child를 갖고 있고 addChild를 통해서 집어넣어주었다. 하지만 이 3개를 다 persist 해줘야 하는데, 이것을 영속성 전이를 통해서 편리하게 할 수가 있다. @OneToMany(ma..

    [JPA] 즉시로딩과 지연로딩에 대해

    JPA 즉시로딩과 지연로딩에 대해 본 내용은 자바 ORM 표준 JPA 프로그래밍 책을 토대로 정리했습니다. JPA는 즉시로딩과 지연로딩이 있다. 즉시 로딩: 엔티티를 조회할 때 연관된 엔티티도 함께 조회한다. ex) em.find(Member.class, "member1") 를 호출할 때 Member 엔티티와 연관된 팀 엔티티도 함께 조회한다. @ManyToOne(fetch = FetchType.EAGER) 이렇게 EAGER를 이용해서 설정해준다. 지연 로딩: 연관된 엔티티를 실제 사용할 때 조회한다. ex) membet.getTeam().getName() 처럼 조회한 Team 엔티티를 실제 사용하는 시점에서 JPA가 SQL을 호출해서 팀 엔티티를 조회한다. @ManyToOne(fetch = FetchT..

    [JPA] 기본 키 매핑 전략에 대해

    JPA 기본 키 매핑 전략에 대해 본 내용은 자바 ORM 표준 JPA 프로그래밍 책을 토대로 정리했습니다. @Id 에 대한 기본키 매핑 전략은 여러 방법이 있다. 크게는 직접할당하는 방법과 자동생성 방법이 있다. 직접할당 방법 @Id @Column(name = "id") private String id; 다음의 경우는 그냥 직접 할당하는 방법이다. 식별자 값을 반드시 넣고 저장을 해야한다. 자동할당 방법 IDENTITY 전략 이 전략은 기본 키 생성을 데이터베이스에 위임하는 전략이다. 주로 MySQL, PostgreSQL, SQL Server, DB2 에서 사용한다. 예로 들어 MySQL 의 AUTO_INCREMENT 기능은 데이터베이스가 기본 키를 자동으로 생성해준다. @Entity public cla..

    [JPA] 연관관계 매핑에 대해

    JPA 연관관계 매핑에 대해 본 내용은 자바 ORM 표준 JPA 프로그래밍 책을 토대로 정리했습니다. 이 글은 기존에 JPA 연관관계 매핑에 대해 알고 있다는 가정하에 내용을 간단히 복기하기 위한 글입니다. 단방향 연관관계 @Entity public class Member { @Id @GeneratedValue private String id; @Column(name = "USERNAME") private String name; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; } @Entity public class Team { @Id @GeneratedValue private Long id; private String name; } Member..

    [JPA] 프록시와 연관관계에 대해

    JPA 프록시와 연관관계에 대해 본 내용은 자바 ORM 표준 JPA 프로그래밍 책을 토대로 정리했습니다. Member findMember1 = em.find(Member.class, member.getId()); Member findMember2 = em.getReference(Member.class, member.getId()); System.out.println("findMember.id=" + findMember.getId()); System.out.println("findMember.username=" + findMember.getUsername()); 첫째 줄의 코드는 바로 query를 실행하는 반면, 두번째 줄의 코드는 실행을 하지않다가 print 에서 getId와 username을 만나고 나..