전체 글 676

[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

[TIL] 2일차 - 백준 1946 신입사원

https://www.acmicpc.net/problem/1946 1946번: 신입 사원 첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성 www.acmicpc.net import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; class Test implements Comparable{ int a, b; public Test(int a, int b){ this.a = a; this.b = b; } @..

ALGORITHM 2024.03.29

[Docker] TIL 1일차 - 도커 엔진 시작과 종료, 도커 컨테이너 실행

도커 엔진 시작/종료 도커 엔진은 설치와 함께 실행되며, 동작 상태로 남아있지만 컨테이너를 실행 중이 아니라면 컴퓨터의 리소스를 거의 차지하지 않으므로 문제는 없다. 도커 테스크톱은 도커 엔진을 자동으로 실행하도록 설정돼있다. 도커 엔진이 한번 종료되면 모든 컨테이너는 정지 상태가 된다. => 도커 엔진은 컴퓨터를 켰을 때 함께 자동으로 실행할 수 있지만, 컨테이너는 그렇지 않다. *Mac 환경 도커 엔진 시작 도커 데스크톱 애플리케이션을 클릭하면 자동으로 도커 엔진은 구동된다. 도커 엔진 종료 상태막대에서 도커를 클릭하여 "Quit Docker Desktop"을 클릭 컨테이너 사용 방법 컨테이너 사용의 기본은 도커 명령어이다. docker ⇒ docker 명령어 뒤에 오는 '무엇을' '어떻게' 에 해당..

DEVOPS/DOCKER 2024.03.27

[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