1. Config 작성
º JDBC-> dataSource
º JPA -> EntityManager 사용
package com.oracle.oBootJpa01;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
private final DataSource dataSource;
private final EntityManager em;
public SpringConfig(DataSource dataSource, EntityManager em) {
this.dataSource = dataSource;
this.em = em;
}
}
2. Member Entity
- 테이블과의 매핑
- @Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라고 불림 -> 기반으로 테이블 생성
- @Id Primary key
package com.oracle.oBootJpa01.domain;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Member {
@Id
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
* 모든 설정 후 스프링 실행 시 처음 화면은 static의 html이 나타나게 된다.
3. Member 신규생성 선택시(/members/new) ->createForm 메소드 실행 -> /members/createMemberForm.html
package com.oracle.oBootJpa01.controller;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import com.oracle.oBootJpa01.domain.Member;
import com.oracle.oBootJpa01.service.MemberService;
@Controller
public class MemberController {
private final MemberService memberService;
private static final Logger logger = LoggerFactory.getLogger(MemberController.class);
//객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection), 의존성 주입이라 함
//생성자에 @Autowired 가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어줌
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
@GetMapping(value = "/members/new")
public String createForm() {
System.out.println("MemberController /members/new start..");
return "/members/createMemberForm";
}
}
4. JPA 회원 등록
- id 와 이름 작성 후 등록 버튼 누르면 action:"/members/save" 호출
1) Controller
@PostMapping(value = "/members/save")
public String create(Member member) {
System.out.println("MemberController create start..");
System.out.println("member.getId() -> " + member.getId());
System.out.println("member.getName() -> " + member.getName());
memberService.join(member);
return "redirect:/";
}
2) memberService.join(member)
-Transactional(최소의 수행단위)
< 트랜잭션 성질 >
① 원자성(Atomicity) - 한 트랜잭션 내에서 실행한 작업들은 하나로 간주한다. 즉, 모두 성공 또는 모두 실패.
② 일관성(Consistency) - 트랜잭션은 일관성 있는 데이타베이스 상태를 유지한다. (data integrity 만족 등.)
③ 격리성 (Isolation) - 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리해야한다.
④ 지속성(Durability) - 트랜잭션을 성공적으로 마치면 결과가 항상 저장되어야 한다.
package com.oracle.oBootJpa01.service;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.oracle.oBootJpa01.domain.Member;
import com.oracle.oBootJpa01.repository.MemberRepository;
@Service //빈등록
@Transactional
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
//회원가입
public Long join(Member member) {
System.out.println("MemberService join member.getId() -> " + member.getId());
memberRepository.save(member);
return member.getId();
}
}
3) memberRepository.save(member);
- em.persist(member) -> 영속성 컨텍스트에 저장 -> Service에서 트랜잭션 때 DB에 들어감.
- insert 문을 따로 작성하지 않아도 기본적인 sql JPA 메소드로 실행 가능.
package com.oracle.oBootJpa01.repository;
import javax.persistence.EntityManager;
import org.springframework.stereotype.Repository;
import com.oracle.oBootJpa01.domain.Member;
@Repository //빈등록
public class JpaMemberRepository implements MemberRepository {
//JDBC dataSource 사용
//JPA EntityManager 사용
private final EntityManager em;
public JpaMemberRepository(EntityManager em) {
this.em = em;
}
@Override
public Member save(Member member) {
System.out.println("JpaMemberRepository save Start..");
em.persist(member);
return member;
}
}
'IT > SpringDay' 카테고리의 다른 글
Lombok설치 (0) | 2022.05.19 |
---|---|
05.JPA③-Member List 조회 (0) | 2022.05.19 |
05.JPA①-프로젝트 생성 및 기본 세팅 (0) | 2022.05.19 |
05.JPA 개념 (0) | 2022.05.19 |
02. Spring MVC 게시판 구현⑤ - 답글작성★ (0) | 2022.05.18 |