본문으로 바로가기

05.JPA②-Member 신규 생성

category IT/SpringDay 2022. 5. 19. 17:06

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