BACK/JPA 21

[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

[JPA] Querydsl 프로젝트 환경설정 - 설정과 검증

Querydsl 이란? 쿼리를 자바 코드로 작성할 수 있게 도와준다. 문법 오류를 컴파일 시점에 잡아준다. 동적 쿼리 문제도 해결해준다. Querydsl 설정과 검증 build.gradle plugins { id 'java' id 'org.springframework.boot' version '3.2.0' id 'io.spring.dependency-management' version '1.1.4' } group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } de..

BACK/JPA 2024.03.15

[JPA] Dirty Checking(변경 감지)

변경 감지란, 트랜잭션 커밋(종료)시 영속화된 엔티티에서 가지고 있었던 최초 정보(스냅샷)와 바뀐 엔티티 정보를 비교해서 바뀐 부분을 update해주는 기능이다. JPA에서는 엔티티를 조회하면 해당 엔티티의 조회 상태를 스냅샷을 만든다. (*스냅샷: DB에서 데이터를 가져와 영속성 컨텍스트에 저장해 엔티티를 영속화할 때의 최초 정보들) 트랜젝션이 끝나는 시점에 이 스냅샷과 비교해서 엔티티에 변경이 있으면 Update Query가 발생한다. Dirty Checking 대상은 영속성 컨텍스트가 관리하는 엔티티에만 적용된다. 준영속, 비영속 상태의 엔티티는 대상에 포함되지 않는다. ex) Detech된 엔티티(준영속), DB에 반영되기 전 처음 생성한 엔티티(비영속)

BACK/JPA 2023.04.11

[JPA] Executing an update/delete query 에러 해결

Executing an update/delete query; nested exception is javax.persistence. TransactionRequiredException: Executing an update/delete query with root cause 에러문 그대로 JPA에서 update/delete 쿼리를 사용할 때는 Transaction 처리를 해줘야 한다. @Transactional @Modifying(clearAutomatically = true) @Query("UPDATE Share s SET s.progress= :progress WHERE s.user.userId= :userId and s.post.id = :postId") void updateProgress(Long u..

BACK/JPA 2022.08.31