728x90
회원 등록
회원 등록 폼 객체
public class MemberForm{
@NotEmpty(message = "회원 이름은 필수입니다.")
private String name;
private String city;
private String street;
private String zipcode;
}
- 폼 객체를 사용해서 화면 계층과 서비스 계층을 명확하게 분리한다.
회원 목록 조회
회원 목록 컨트롤러
@GetMapping(value = "/members")
public String list(Model model){
List<Member> members = memberService.findMembers();
model.addAttribute("members",members);
return "members/memberList";
}
- 조회한 상품을 뷰에 전달하기 위해 스프링 MVC가 제공하는 모델(Model) 객체에 보관
- 실행할 뷰 이름을 반환
변경 감지와 병합(merge)
준영속 엔티티?
영속성 컨텍스트가 더는 관리하지 않는 엔티티를 의미
- 여기서는 itemService.saveItem(book)에서 수정을 시도하는 Book객체다. Book객체는 이미 DB에 한 번 저장되어서 식별자가 존재한다. 이렇게 임의로 만들어낸 엔티티도 기존 식별자를 가지고 있으면 준영속 엔티티로 볼 수 있다.
준영속 엔티티를 수정하는 2가지 방법
- 변경 감지 기능 사용
- 병합(merge) 사용
변경 감지 기능 사용
@Transactional
void update(Item itemParam){ //itemParam : 파라미터로 넘어온 준영속 상태의 엔티티
Item findItem = em.find(Item.class, itemParam.getId()); //같은 엔티티를 조회한다.
findItem.setPrice(itemParam.getPrice()); //데이터를 수정한다.
}
영속성 컨텍스트에서 엔티티를 다시 조회한 후에 데이터를 수정하는 방법
트랜잭션 안에서 엔티티를 다시 조회, 변경할 값 선택 -> 트랜잭션 커밋 시점에 변경 감지(Dirty Checking)이 동작해서 데이터베이스에 UPDATE SQL 실행
병합 사용
병합은 준영속 상태의 엔티티를 영속 상태로 변경할 때 사용하는 기능이다.
@Transactional
void update(Item itemParam){ //itemParam : 파라미터로 넘어온 준영속 상태의 엔티티
Item mergeItem = em.merge(item);
}
병합 : 기존에 있는 엔티티
병합 동작 방식
- merge()를 실행한다.
- 파라미터로 넘어온 준영속 엔티티의 식별자 값으로 1차 캐시에서 엔티티를 조회한다. - 만약 1차 캐시에 엔티티가 없으면 데이터베이스 엔티티를 조회하고, 1차 캐시에 저장한다.
- 조회한 영속 엔티티(mergeMember)에 member엔티티의 값을 채워 넣는다. (member 엔티티의 모든 값을 mergeMember에 밀어 넣는다. 이때 mergeMember의 "회원1"이라는 이름이 "회원명변경"으로 바뀐다.)
- 영속 상태인 mergeMember를 반환한다.
병합 시 동작 방식을 간단히 정리
- 준영속 엔티티의 식별자 값으로 영속 엔티티를 조회한다.
- 영속 엔티티의 값을 준영속 엔티티의 값으로 모두 교체한다.(병합)
- 트랜잭션 커밋 시점에 변경 감지 기능이 동작해서 데이터베이스에 UPDATE SQL이 실행
엔티티를 변경할 때는 항상 변경 감지를 사용
- 컨트롤러에서 어설프게 엔티티를 사용하지 않는다.
- 트랜잭션이 있는 서비스 계층에 식별자(id)와 변경할 데이터를 명확하게 전달(파라미터 or DTO)
- 트랜잭션이 있는 서비스 계층에서 영속 상태의 엔티티를 조회하고, 엔티티의 데이터를 직접 변경해라
- 트랜잭션 커밋 시점에 변경 감지가 실행된다.
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 인프런 | 강의
실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니다., - 강
www.inflearn.com
'Back-End > Inflearn 강의' 카테고리의 다른 글
[JPA 활용 - 웹 애플리케이션 개발] 주문 도메인 개발 (0) | 2022.09.12 |
---|---|
[JPA 활용 - 웹 애플리케이션 개발] 상품 도메인 개발 (0) | 2022.09.11 |
[JPA 활용 - 웹 애플리케이션 개발] 회원 도메인 개발 (0) | 2022.09.11 |
[JPA 활용 - 웹 애플리케이션 개발] 도메인 분석 설계 (0) | 2022.09.11 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 객체지향 쿼리 언어2 - 중급 문법 (0) | 2022.09.09 |