JPA 25

[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

Spring Boot Project(5) - 게시글 페이징, 필터링하기

Pageable을 이용하면 간단하게 Pagination 와 Sorting을 처리할 수 있다. PostsRepository public interface PostsRepository extends JpaRepository { Page findAll(Pageable pageable); @Query(value="select p from Posts p where p.subject = :subject and p.division = :division and p.is_progress = :is_progress") Page findAllByFiltering(Pageable pageable, @Param("subject") String subject, @Param("division") String division, @P..

BACK/SPRING 2023.01.24

Spring Boot Project(4) - JPA Auditing으로 생성/수정 시간 자동화

JPA Auditing으로 생성시간/수정시간 자동화하기 domain 패키지에 BaseTimeEntity 클래스를 생성한다. 이 클래스는 모든 Entity의 상위 클래스가 되어 Entity들의 createdDate, modifiedDate를 자동으로 관리한다. @Getter @MappedSuperclass @EntityListeners(AuditingEntityListener.class) public abstract class BaseTimeEntity { @CreatedDate @Column(updatable=false) private String createdDate; @LastModifiedDate private String modifiedDate; @PrePersist public void onPr..

BACK/SPRING 2023.01.24