BACK 95

[JPA] JPA 프록시의 특징

프록시 JPA는 em.find() 말고도 참조를 가져오는 em.getReference() 라는 메소드가 있다. em.find() : 데이터베이스를 통해 실제 엔티티 객체를 바로 조회 em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 (DB쿼리 안나감) Member member = new Member(); member.setUsername("hello"); em.persist(member); em.flush(); em.clear(); Member findMember = em.find(Member.class, member.getId()); System.out.println("findMember.getUsername() = " + findMember.getUserna..

BACK/JPA 2024.04.02

[JPA] TIL 6일차 - 엔티티 매핑

@ Entity @Entity가 붙은 클래스는 JPA가 관리하는 엔티티이다. 테이블과 매핑하려면 꼭 필수로 달아줘야 한다. JPA 스팩상 기본 생성자(public or protected) 가 필수로 있어야 한다. final 클래스, inner클래스, enum, interface로 사용할 수 없다. DB에 저장할 필드는 final을 사용하면 안된다. 엔티티 이름은 기본 값으로 클래스 이름을 그대로 사용한다. @Table 엔티티와 매핑할 테이블을 지정한다. @Table(name=”DB에서 매핑할 테이블 이름”) 기본값: 엔티티 이름을 사용 데이터베이스 스키마 자동 생성 JPA는 애플리케이션 로딩 시점에 DB테이블을 생성하는 기능을 지원해준다. 객체 매핑을 해놓으면 자동으로 테이블을 create 해준다. 데이..

BACK/JPA 2024.04.02

[JPA] TIL 5일차-영속성 관리(1차 캐시, 쓰기 지연, 변경 감지)

영속성 컨텍스트 고객의 요청이 올 때마다 EntityManagerFactory는 EntityManager를 생성한다. Entity Manager는 내부적으로 데이터베이스 커넥션을 사용해 DB를 사용하게 된다. 엔티티매니저를 생성하면 그 안에 1:1로 눈에 보이지 않는 영속성 컨텍스트란 공간이 생성된다. 영속성 컨텍스트는 엔티티를 영구 저장하는 환경이다. 논리적인 개념이고, 눈에 보이지 않는다. 엔티티 매니저를 통해 영속성 컨텍스트에 접근한다. EntityManager.persist(entity)로 엔티티를 영속성 컨텍스트에 저장해 영속화 한다. 엔티티의 생명 주기 -비영속 : 영속성 컨텍스트와 관계 없는 새로운 상태 객체만 생성되고 영속 컨텍스트에 저장되지 않은 상태 -영속: 객체 생성 후 엔티티 매니저..

BACK/JPA 2024.04.01

[JPA] JPA 연관관계 매핑

연관관계 매핑 객체의 참조와 테이블의 외래키를 매핑하는게 핵심이다. 방향(Direction): 단방향, 양방향 다중성(Multiplicity): 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 연관관계의 주인(Owner): 객체 양방향 연관관계는 관리 주인이 필요 단방향 연관관계 회원은 하나의 팀에만 소속될 수 있다.(N : 1) 하나에 팀에 여러 회원이 소속될 수 있다. Team team = new Team(); team.setName("TeamA"); em.persist(team); Member member = new Member(); member.setUsername("member1"); member.setTeamId(team.getId()); em.persist(member)..

BACK/JPA 2024.03.31

[JPA] TIL 4일차 - JPA 시작하기, 동작 방식

JPA 시작하기 JPA 구동 방식 Persistence.xml 설정 정보를 읽어서 EntityManagerFactory라는 클래스를 만든다. 여기서 필요할 때마다 EntityManager를 사용한다. EntityManagerFactory는 하나만 생성해서 애플리케이션 전체에서 공유해야 한다. 앤티티매니저는 쓰레드 간에 공유하면 안된다. JPA의 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다. 회원 저장 EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); // 데이터베이스 연결 // 애플리케이션 로딩 시점에 딱 하나만 만들어야 한다. EntityManager em = emf.createEntityManager(); //..

BACK/JPA 2024.03.31

[JPA] TIL 3일차 - JPA 소개

JPA 소개 과거에는 객체를 데이터베이스에 저장, 조회 하려면 복잡한 JDBC API와 SQL을 직접 작성해야 했다. JdbcTemplate이나 Mybatis 같은 sql mapper 가 등장해 개발 코드는 많이 줄었지만, sql은 직접 다 작성을 해야 했다. JPA를 사용하면 SQL을 작성할 필요가 없다. 자바 컬렉션에 객체를 저장하고 조회하는 것처럼 단순하게 JPA를 사용한다. JPA가 개발자 대신에 적절한 SQL을 생성하고, 데이터베이스에 실행을 해 객체를 저장하거나 불러온다. JDBC → MyBatis, JdbcTemplate → JPA *JDBC: Java 프로그램이 데이터베이스와 통신할 수 있도록 해주는 Java API *MyBatis: SQL 쿼리와 Java 객체 간의 매핑을 쉽게 할 수 있..

BACK/JPA 2024.03.30

[JPA] 실무 활용 - 스프링 데이터 JPA 와 Querydsl

스프링 데이터 JPA 리포지토리로 변경 public interface MemberRepository extends JpaRepository { List findByUsername(String username); // select m from Member m where m.username=? } @SpringBootTest @Transactional class MemberRepositoryTest { @Autowired EntityManager em; @Autowired MemberRepository memberRepository; @Test public void basicTest(){ Member member = new Member("member1", 10); memberRepository.save(me..

BACK/JPA 2024.03.15

[JPA] 실무 활용 - 순수 JPA 와 Querydsl

순수 JPA 리포지토리와 Querydsl 순수 JPA 리포지토리로 Querydsl을 사용해보자 @Repository public class MemberJpaRepository { private final EntityManager em; // 순수 JPA 접근 private final JPAQueryFactory queryFactory; // querydsl 사용 위함 public MemberJpaRepository(EntityManager em) { this.em = em; this.queryFactory = new JPAQueryFactory(em); } public void save(Member member){ em.persist(member); } public Optional findById(Lon..

BACK/JPA 2024.03.15

[JPA] Querydsl 중급 문법 (프로젝션, 동적 쿼리, 벌크 연산, SQL function)

중급 문법 프로젝션 대상이 하나면 타입을 명확하게 지정할 수 있음 프로젝션 대상이 둘 이상이면 튜플이나 DTO로 조회 프로젝션: select 대상 지정 프로젝션과 결과 반환 - 기본 @Data public class MemberDto { private String username; private int age; public MemberDto() { } public MemberDto(String username, int age) { this.username = username; this.age = age; } } @Test public void simpleProjection(){ // 프로젝션이 하나 List result = queryFactory .select(member.username) .from(m..

BACK/JPA 2024.03.15

[JPA] Querydsl 기본 문법 (검색, 조회, 정렬, 페이징, 집합, 조인등)

기본 문법 JPQL vs Querydsl @SpringBootTest @Transactional public class QuerydslBasicTest { @Autowired EntityManager em; JPAQueryFactory queryFactory; @BeforeEach public void before(){ queryFactory = new JPAQueryFactory(em); // 필드로 뺄 수도 있다. Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1", 10, teamA); Member me..

BACK/JPA 2024.03.15