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..
HELLO SHOP 회원 기능 회원 가입 회원 목록 상품 기능 상품 등록 상품 목록 주문 기능 상품 주문 주문 내역 th:replace로 인클루드를 할 수 있다. 예를 들어 resouces/templates/fragments 아래 경로의 header.html 설정을 이렇게 잡을 때에 인클루드 시킬 코드에 th:fragment="header"로 이름을 정해주면 home.html에서는 th:replace="경로 :: 이름"으로 사용이 가능해진다. 그 외에 tiles와 비슷하게 미리 템플릿을 짠 후에 사용이 가능하게 만들 수도 있다. 참고: Hierarchical-style layouts** 예제에서는 뷰 템플릿을 최대한 간단하게 설명하려고, `header` , `footer` 같은 템플릿 파일을 반복해서 포..
/** * 취소 */ @Transactional public void cancel(Long orderId){ //주문 엔티티 조회 Order order = orderRepository.findOne(orderId); //주문 취소 order.cancel(); } 주문을 취소하는 메소드를 만들었다. cancle(); 안의 메소드를 보면 //==비지니스 로직 ==// /** * 주문 취소 */ public void cancel(){ if(delivery.getStatus() == DeliveryStatus.COMP){ throw new IllegalStateException("이미 배송완료 된 상품은 취소가 불가능합니다."); } this.setStatus(OrderStatus.CANCEL); for(Ord..
- Total
- Today
- Yesterday
- exception
- HTTP
- 백엔드 개발자 역량
- rejectValue
- SpringBoot
- 백엔드 개발자 공부
- 로그인
- hypertexttransferprotocol
- 컨트
- filter
- ArgumentResolver
- reject
- BindingResult
- thymleaf
- Java
- 항해99
- 리터럴
- 향해99
- 인터셉터
- 스프링부트
- 향해플러스
- JPA
- react실행
- 항해플러스
- React
- Intercepter
- jpa api
- 향해플러스백엔드
- 예외처리
- 스프링공부
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |