EntityManager.persist(entity)는 사실 db에 저장하는게 아니라, entity를 영속성 컨텍스트라는 곳에 저장한다는 것이다. 엔티티매니저? 영속성 컨텍스트? - 영속성 컨텍스트는 논리적인 개념 - 눈에 보이지 않는다. - 엔티티 매니저를 통해서 영속성 컨텍스트에 접근 J2SE 환경 엔티티매니저와 영속성 컨텍스트가 1:1 (엔티티매니저를 생성하면 영속성 컨텍스트가 1:1로 생성된다.) ex) EntityManager -> 1:1 PersistenceContext (눈에 보이지 않는 공간) 엔티티 조회, 1차캐시 1. 만약 find를 이용해 조회를 한다면 jpa는 1차 캐시를 먼저 찾는다. @Id값이 키값이 되고 entity는 객체 자체가 된다. db를 먼저 찾는 것이 아니다. 2. 만..
- 비영속 (new/transient) ㄴ 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 //객체를 생성한 상태(비영속) Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); - 영속(managed) (persistence) 같은 느낌 ㄴ 영속성 컨텍스트에 관리되는 상태 //객체를 생성한 상태(비영속) Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); //객체를 저장한 상태(영속) e..
package helloJpa; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import java.util.List; public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");// 유닛네임을 넣어주면 된다. EntityManager entityManager = e..
Persistence라는 클래스에서 persistence.xml의 설정 정보를 조회하고 EntityManagerFactory라는 것을 만들어 준다. 그리고 필요할 때마다 EntityManager를 뽑아내면 된다. package helloJpa; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = P..
String memberId = 100; Member member1 = jpa.find(Member.class,memberId); //sql Member member2 = jpa.find(Member.class,memberId); //캐시 member1 == member2 (같은 인스턴스로본다) Jpa에서 중요한 점은 같은 트랜잭션 안에서 조회를 2번 해도 같은 객체로 본다. 같은 트랜잭션 안에서 처음 객체를 조회하면 jpa가 들고있다가 2번째로 부르는 경우 그것을 반환해 준다. 쓰기지연 (버퍼라이팅) transaction.begin(); //트랜잭션 시작 em.persist(member1); em.persist(member2); em.persist(member3); // 여기까지 sql insert를 ..
기존에 merge를 이용해서 데이터를 update 하도록 만들었다. 하지만 merge에는 큰 주의점이 존재한다. update를 하는 방법에는 2가지의 방법이 있다. 1. merge 2. 변경감지 이용 merge @Transactional public void saveItem(Item item){ itemRepository.save(item); } public void save(Item item){ if(item.getId() == null){ em.persist(item); }else{ em.merge(item); } } 이렇게 기존에 존재하던 id가 있으면 EntityManager(em)을 사용해 merge를 날린다. 다른 데이터가 있을 경우 데이터를 변경해준다. 변경감지 @Transactional p..
@GetMapping("/members") public String list(Model model){ model.addAttribute("members", memberService.findMembers()); //control + t 에 인라인으로 코드를 줄일 수 있다. return "members/memberList"; } # 이름 도시 주소 우편번호 소스를 봤을 때에 컨트롤러 model에 담아 html에 뿌려줬다. 여기에서 주의점이 있다. 지금 model에는 members 엔티티 그 자체를 담아 뿌려줬다. 실무에서는 화면에 뿌릴 데이터가 일정하지 않은 경우가 있어 반환을 할 때에는 form 객체나 dto를 만들어 set해준 후에 model에 뿌려주는 것이 좋다. 엔티티는 그 자체로 최대한 변경이 없게..
package jpabook2.jpashop2.controller; import jakarta.validation.constraints.NotEmpty; import lombok.Getter; import lombok.Setter; @Getter @Setter public class MemberForm { @NotEmpty(message = "회원 이름은 필수입니다.") private String name; private String city; private String street; private String zipcode; } package jpabook2.jpashop2.controller; import jakarta.validation.Valid; import jpabook2.jpashop2.do..
- Total
- Today
- Yesterday
- 컨트
- Java
- HTTP
- reject
- 예외처리
- ArgumentResolver
- 향해99
- filter
- 백엔드 개발자 공부
- 항해99
- 스프링공부
- React
- JPA
- 스프링부트
- hypertexttransferprotocol
- 향해플러스
- 향해플러스백엔드
- 인터셉터
- rejectValue
- exception
- thymleaf
- 백엔드 개발자 역량
- 항해플러스
- jpa api
- react실행
- Intercepter
- 리터럴
- SpringBoot
- 로그인
- BindingResult
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |