국비학원_68일차(Spring JPA2)

써니·2022년 10월 28일
0

spring

목록 보기
10/23

⭐Spring JPA2

🔎회원검색

🔻oBootJpa01

[templates.members]

  • memberList.html
<!DOCTYPE html>
<html xml:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- 회원조회 -->
	<h1>JPA 회원 조회</h1>
	<div class="nav">
		<form action="/members/search" method="post">
			회원검색이름 : <input type="text" name="name" placeholder="회원검색 이름을 입력하세요">
			<button type="submit">검색</button><p>
		</form>
	</div>
	
	<!-- 회원목록 -->
	<div class="container">
		<div>
			<table border="1">
				<thead>
				<tr>
					<th>No</th>
					<th>이름</th>
				</tr>
				</thead>
				<tbody>
				<tr th:each="member : ${members}">
					<td th:text="${member.id}"></td>
					<td th:text="${member.name}"></td>
				</tr>
				</tbody>
			</table>
		</div>
	</div>
</body>
</html>

[com.oracle.oBootJpa01.controller]

  • MemberController.java
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);
	@Autowired
	public MemberController(MemberService memberService) {
		this.memberService = memberService;
	}
	
	// 회원 가입 폼 이동
	@GetMapping(value = "/members/new")
	public String createFrom() {
		System.out.println("MemberController /members/new start...");
		return "/members/createMemberForm";
	}
	
	// 회원 가입 정보 저장
	@PostMapping(value = "/members/save")
	public String memberSave(Member member) {
		System.out.println("MemberController /members/save start...");
		System.out.println("member.getId()->"+member.getId());
		System.out.println("member.getName()->"+member.getName());
		memberService.memberSave(member);
		System.out.println("MemberController memberSave After...");
		return "redirect:/";
	}
	
	// 회원 목록
	@GetMapping(value = "/members")
	public String listMember(Model model) {
		List<Member> memberList = memberService.getListAllMember();
		logger.info("memberList.size() ->"+memberList.size());
		model.addAttribute("members", memberList);
		return "members/memberList";
	}
	
	// 회원 검색
	@PostMapping(value = "/members/search")
	public String membersSearch(Member member, Model model) {
		System.out.println("/members/search member.getName()->"+member.getName());
		List<Member> memberList = memberService.getListSearchMember(member.getName());
		System.out.println("/members/search memberList.size()->"+memberList.size());
		model.addAttribute("members", memberList);
		return "/members/memberList";
	}
}

[com.oracle.oBootJpa01.service]

  • MemberService.java
package com.oracle.oBootJpa01.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

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 memberSave(Member member) {
		System.out.println("MemberService memberSave member->"+member);
		memberRepository.memberSave(member);
		System.out.println("memberRepository memberSave After");
		return member.getId();
	}
	
	// 회원목록
	public List<Member> getListAllMember() {
		List<Member> listMember = memberRepository.findAllMember();
		System.out.println("MemberService getListAllMember listMember.size() ->"+listMember.size());
		return listMember;
	}
	
	// 회원검색
	public List<Member> getListSearchMember(String searchName) {
		System.out.println("MemberService getListSearchMember Start...");
		System.out.println("MemberService getListSearchMember searchName->"+searchName);
		List<Member> listMember = memberRepository.findByName(searchName);
		System.out.println("MemberService getListSearchMember listMember.size()->"+listMember.size());
		return listMember;
	}
	
}

[com.oracle.oBootJpa01.repository]

  • MemberRepository.java
package com.oracle.oBootJpa01.repository;

import java.util.List;

import com.oracle.oBootJpa01.domain.Member;

public interface MemberRepository {
	Member		memberSave(Member member);

	List<Member> findAllMember();

	List<Member> findByName(String searchName);
}
  • JpaMemberRepository.java
package com.oracle.oBootJpa01.repository;

import java.util.List;

import javax.persistence.EntityManager;

import org.springframework.stereotype.Repository;

import com.oracle.oBootJpa01.domain.Member;

@Repository
public class JpaMemberRepository implements MemberRepository {
	// DML 작업을 하기 위해서 필수
	private final EntityManager em;
	public JpaMemberRepository(EntityManager em) {
		this.em = em;
	}
	
	// 회원정보 저장
	@Override
	public Member memberSave(Member member) {
		// 저장 method
		em.persist(member);
		System.out.println("JpaMemberRepository memberSave member After...");
		return member;
	}
	
	// 회원목록
	@Override
	public List<Member> findAllMember() {
		List<Member> memberList = em.createQuery("select m from Member m", Member.class)
									.getResultList();
		System.out.println("JpaMemberRepository findAllMember memberList.size()->"+memberList.size());
		return memberList;
	}
	
	// 회원검색
	@Override
	public List<Member> findByName(String searchName) {
		String pname = searchName + '%';
		System.out.println("JpaMemberRepository findByNames pname->"+pname);
		List<Member> memberList = em.createQuery("select m from Member m where name Like :name", Member.class)
									.setParameter("name", pname).getResultList();
		System.out.println("JpaMemberRepository memberList.size()->"+memberList.size());
		return memberList;
	}

}




🔻oBootJpa02

➕ 롬북 추가


📌JPA 연관관계 다중성

다대다나 대로 끝나는 것은 쓰지 않는게 좋다 / 다대일 권장!


📂 src/main/resources

  • index.html( oBootJpa01 복사 )

👩‍🏫 JPA 연관관계 예제

[com.oralce.oBootJpa02.domain]

@Data-> canEqual(), equals(), hashCode(), toString() 생성
시퀀스 쓴다면 Long 타입이 권장

  • 시퀀스를 만들 때
@SequenceGenerator(name = "member_seq_gen",				  // 자바 객체 SEQ
				   sequenceName = "member_seq_generator", // DB SEQ
				   initialValue = 1,
				   allocationSize = 1
				   )
  • id에 시퀀스를 걸어주고 싶을 때
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
				generator = "member_seq_gen")
  • 컬럼명을 지정하고 싶을 때
    -> precision, length : 데이터 크기 및 길이 지정
@Column(name = "member_id", precision = 10)
private Long   id;
@Column(name = "username", length = 50)
private String name;
private Long   sal;

  • Member.java
package com.oracle.oBootJpa02.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;

@Entity
@Data
@SequenceGenerator(name = "member_seq_gen",				  // 자바 객체 SEQ
				   sequenceName = "member_seq_generator", // DB SEQ
				   initialValue = 1,
				   allocationSize = 1
				   )
@Table(name = "member2")
public class Member {
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE,
					generator = "member_seq_gen"
					)
	@Column(name = "member_id", precision = 10)
	private Long   id;
	
	@Column(name = "username", length = 50)
	private String name;
	private Long   sal;
}
  • Team.java
package com.oracle.oBootJpa02.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;

import lombok.Data;

@Entity
@Data
@SequenceGenerator(name = "team_seq_gen",
				   sequenceName = "team_seq_generator", // 매핑할 DB 시퀀스 이름
				   initialValue = 1,
				   allocationSize = 1
				   )
public class Team {
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE,
					generator = "team_seq_gen"
					)
	private Long team_id;
	@Column(name = "teamname")
    private String name;
}

⭐JPA 다대일 관계 설정

member(다) - team(일)

// 관계 설정
@ManyToOne // 다대일
@JoinColumn(name = "team_id") // 조인할 테이블의 PK
private Team team;
  • Member.java
package com.oracle.oBootJpa02.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import lombok.Data;

@Entity
@Data
@SequenceGenerator(name = "member_seq_gen",				  // 자바 객체 SEQ
				   sequenceName = "member_seq_generator", // DB SEQ
				   initialValue = 1,
				   allocationSize = 1
				   )
@Table(name = "member2")
public class Member {
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE,
					generator = "member_seq_gen"
					)
	@Column(name = "member_id", precision = 10)
	private Long   id;
	
	@Column(name = "username", length = 50)
	private String name;
	private Long   sal;
	
	// 관계 설정
	@ManyToOne
	@JoinColumn(name = "team_id")
	private Team team;
}

테이블 + 시퀀스 생성

member 테이블에 FK(team_id)




🤝회원등록2

[templates.members]

  • createMemberForm.html
<!DOCTYPE html>
<html xml:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>JPA 회원등록2</h1>
	<div class="container">
		<form action="/memberSave" method="post">
			회원이름 : <input type="text" id="name" name="name" placeholder="회원이름을 입력하세요"><p>
			팀   이름 : <input type="text" id="name" name="teamname" placeholder="팀이름을 입력하세요">
				<button type="submit">등록</button>
		</form>
	</div>
</body>
</html>

[com.oracle.oBootJpa02.controller]

  • MemberController.java
package com.oracle.oBootJpa02.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import com.oracle.oBootJpa02.domain.Member;
import com.oracle.oBootJpa02.service.MemberService;

@Controller
public class MemberController {
	private static final Logger logger = LoggerFactory.getLogger(MemberController.class);
	
	private final MemberService memberService;
	@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";
	}
	
	// 회원저장
	@PostMapping(value = "/memberSave")
	public String memberSave(Member member) {
		System.out.println("MemberController /members/save Start...");
		System.out.println("member.getTeamname()->"+member.getTeam());
		System.out.println("member.getName()->"+member.getName());
		memberService.memberSave(member);
		System.out.println("MemberController memberSave After");
		return "redirect:/";
	}
}

[com.oracle.oBootJpa02.service]

  • MemberService.java
package com.oracle.oBootJpa02.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.oracle.oBootJpa02.domain.Member;
import com.oracle.oBootJpa02.repository.MemberRepository;

@Service
@Transactional
public class MemberService {
	@Autowired
	public final MemberRepository memberRepository;
	public MemberService(MemberRepository memberRepository) {
		this.memberRepository = memberRepository;
	}
	
	public Member memberSave(Member member) {
		System.out.println("MemberService memberSave Start...");
		System.out.println("MemberService join member.getName()->"+member.getName());
		memberRepository.memberSave(member);
		System.out.println("MemberRepository memberSave After");
		return member;
		
	}
}

[com.oracle.oBootJpa02.domain]

  • Member.java
package com.oracle.oBootJpa02.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;

import lombok.Data;

@Entity
@Data
@SequenceGenerator(name = "member_seq_gen",				  // 자바 객체 SEQ
				   sequenceName = "member_seq_generator", // DB SEQ
				   initialValue = 1,
				   allocationSize = 1
				   )
@Table(name = "member2")
public class Member {
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE,
					generator = "member_seq_gen"
					)
	@Column(name = "member_id", precision = 10)
	private Long   id;
	
	@Column(name = "username", length = 50)
	private String name;
	private Long   sal;
	
	// 관계 설정
	@ManyToOne
	@JoinColumn(name = "team_id")
	private Team team;
	
	// 실제 Column(X) / Buffer 용도(O)
	@Transient
	private String teamname;
}

[com.oracle.oBootJpa02.repository]

  • MemberRepository.java
package com.oracle.oBootJpa02.repository;

import com.oracle.oBootJpa02.domain.Member;

public interface MemberRepository {

	Member memberSave(Member member);
}
  • JpaMemberRepository.java

    em.persist(team);
    -> private Team team; 에 데이터를 넣어줌
    다대일로 들어가서 FK를 맞춰짐
    그리고 알아서 insert 컬럼을 찾아서 들어감

package com.oracle.oBootJpa02.repository;

import javax.persistence.EntityManager;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.oracle.oBootJpa02.domain.Member;
import com.oracle.oBootJpa02.domain.Team;

@Repository
public class JpaMemberRepository implements MemberRepository {
	private final EntityManager em;
	
	@Autowired
	public JpaMemberRepository(EntityManager em) {
		this.em = em;
	}

	@Override
	public Member memberSave(Member member) {
		// 팀 저장
		Team team = new Team();
		team.setName(member.getTeamname());
		// team.setName(member.getTeam().getName()); 될까?
		em.persist(team);
		
		// 회원 저장
		member.setTeam(team);
		em.persist(member);
		System.out.println("JpaMemberRepository memberSave");
		return member;
	}

}




📝회원목록2

[com.oracle.oBootJpa02.controller]

  • MemberController.java
package com.oracle.oBootJpa02.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.oBootJpa02.domain.Member;
import com.oracle.oBootJpa02.service.MemberService;

@Controller
public class MemberController {
	private static final Logger logger = LoggerFactory.getLogger(MemberController.class);
	
	private final MemberService memberService;
	@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";
	}
	
	// 회원저장
	@PostMapping(value = "/memberSave")
	public String memberSave(Member member) {
		System.out.println("MemberController /members/save Start...");
		System.out.println("member.getTeamname()->"+member.getTeam());
		System.out.println("member.getName()->"+member.getName());
		memberService.memberSave(member);
		System.out.println("MemberController memberSave After");
		return "redirect:/";
	}
	
	// 회원목록
	@GetMapping(value = "/members")
	public String listMember(Model model) {
		List<Member> memberList = memberService.getListAllMember();
		System.out.println("MemberController memberList.size()->"+memberList.size());
		model.addAttribute("members", memberList);
		return "members/memberList";
	}
}

[com.oracle.oBootJpa02.service]

  • MemberService.java
package com.oracle.oBootJpa02.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.oracle.oBootJpa02.domain.Member;
import com.oracle.oBootJpa02.repository.MemberRepository;

@Service
@Transactional
public class MemberService {
	@Autowired
	public final MemberRepository memberRepository;
	public MemberService(MemberRepository memberRepository) {
		this.memberRepository = memberRepository;
	}
	
	public Member memberSave(Member member) {
		System.out.println("MemberService memberSave Start...");
		System.out.println("MemberService join member.getName()->"+member.getName());
		memberRepository.memberSave(member);
		System.out.println("MemberRepository memberSave After");
		return member;
		
	}

	public List<Member> getListAllMember() {
		List<Member> listMember = memberRepository.findAll();
		System.out.println("MemberService getListAllMember listMember.size->"+listMember.size());
		return listMember;
	}
}

[com.oracle.oBootJpa02.repository]

  • MemberRepository.java
package com.oracle.oBootJpa02.repository;

import java.util.List;

import com.oracle.oBootJpa02.domain.Member;

public interface MemberRepository {

	Member memberSave(Member member);

	List<Member> findAll();
}
  • JpaMemberRepository.java
package com.oracle.oBootJpa02.repository;

import java.util.List;

import javax.persistence.EntityManager;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.oracle.oBootJpa02.domain.Member;
import com.oracle.oBootJpa02.domain.Team;

@Repository
public class JpaMemberRepository implements MemberRepository {
	private final EntityManager em;
	
	@Autowired
	public JpaMemberRepository(EntityManager em) {
		this.em = em;
	}
	
   	// 회원 저장
	@Override
	public Member memberSave(Member member) {
		// 팀 저장
		Team team = new Team();
		team.setName(member.getTeamname());
		// team.setName(member.getTeam().getName()); 될까?
		em.persist(team);
		
		// 회원 저장
		member.setTeam(team);
		em.persist(member);
		System.out.println("JpaMemberRepository memberSave");
		return member;
	}
	
    // 회원 목록
	@Override
	public List<Member> findAll() {
		List<Member> memberList = em.createQuery("select m from Member m", Member.class)
									.getResultList();
		System.out.println("JpaMemberRepository findAll memberList.size()->"+memberList.size());
		return memberList;
	}

}

[templates.members]

  • memberList.html
<!DOCTYPE html>
<html xml:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- 회원목록 -->
	<div class="container">
		<div>
			<table border="1">
				<thead>
				<tr>
					<th>No</th>
					<th>회원이름</th>
					<th>팀 이름</th>
				</tr>
				</thead>
				<tbody>
				<tr th:each="member : ${members}">
					<td th:text="${member.id}"></td>
					<td><a th:href="@{/memberModifyForm(id=${member.id})}" th:text="${member.name}"></a></td>
					<td th:text="${member.team.name}"></td>
				</tr>
				</tbody>
			</table>
		</div>
	</div>
</body>
</html>




✍회원정보수정폼


[com.oracle.oBootJpa02.controller]

  • MemberController.java
package com.oracle.oBootJpa02.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.oBootJpa02.domain.Member;
import com.oracle.oBootJpa02.service.MemberService;

@Controller
public class MemberController {
	private static final Logger logger = LoggerFactory.getLogger(MemberController.class);
	
	private final MemberService memberService;
	@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";
	}
	
	// 회원저장
	@PostMapping(value = "/memberSave")
	public String memberSave(Member member) {
		System.out.println("MemberController /members/save Start...");
		System.out.println("member.getTeamname()->"+member.getTeam());
		System.out.println("member.getName()->"+member.getName());
		memberService.memberSave(member);
		System.out.println("MemberController memberSave After");
		return "redirect:/";
	}
	
	// 회원목록
	@GetMapping(value = "/members")
	public String listMember(Model model) {
		List<Member> memberList = memberService.getListAllMember();
		System.out.println("memberList.get(0).getName()->"+memberList.get(0).getName());
		System.out.println("memberList.get(0).getTeam().getName()->"+memberList.get(0).getTeam().getName());
		System.out.println("MemberController memberList.size()->"+memberList.size());
		model.addAttribute("memberList", memberList);
		return "members/memberList";
	}
	
	// 회원 수정 폼
	@GetMapping(value = "/memberModifyForm")
	public String memberModify(Long id, Model model) {
		System.out.println("MemberController memberModify id->"+id);
		Member member = memberService.findByMember(id);
		System.out.println("member.getId()->"+member.getId());
		System.out.println("member.getName()->"+member.getName());
		System.out.println("member.getTeam().getName()->"+member.getTeam().getName());
		model.addAttribute("member", member);
		return "members/memberModify";
	}
}

[com.oracle.oBootJpa02.service]

  • MemberService.java
package com.oracle.oBootJpa02.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.oracle.oBootJpa02.domain.Member;
import com.oracle.oBootJpa02.repository.MemberRepository;

@Service
@Transactional
public class MemberService {
	@Autowired
	public final MemberRepository memberRepository;
	public MemberService(MemberRepository memberRepository) {
		this.memberRepository = memberRepository;
	}
	
	// 회원등록
	public Member memberSave(Member member) {
		System.out.println("MemberService memberSave Start...");
		System.out.println("MemberService join member.getName()->"+member.getName());
		memberRepository.memberSave(member);
		System.out.println("MemberRepository memberSave After");
		return member;
		
	}
	
	// 회원목록
	public List<Member> getListAllMember() {
		List<Member> listMember = memberRepository.findAll();
		System.out.println("MemberService getListAllMember listMember.size->"+listMember.size());
		return listMember;
	}
	
	// 회원수정폼
	public Member findByMember(Long memberId) {
		Member member1 = memberRepository.findByMember(memberId);
		System.out.println("MemberService findByMember member1.getId()"+member1.getId());
		System.out.println("MemberService findByMember member1.getName()"+member1.getName());
		System.out.println("MemberService findByMember member1.getTeam().getName()"+member1.getTeam().getName());
		return member1;
	}
}

[com.oralce.oBootJpa02.domain]

  • Member.java

    @Transient private Long teamid; 추가
    -> 동시에 수정하기 위함

package com.oracle.oBootJpa02.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;

import lombok.Data;

@Entity
@Data
@SequenceGenerator(name = "member_seq_gen",				  // 자바 객체 SEQ
				   sequenceName = "member_seq_generator", // DB SEQ
				   initialValue = 1,
				   allocationSize = 1
				   )
@Table(name = "member2")
public class Member {
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE,
					generator = "member_seq_gen"
					)
	@Column(name = "member_id", precision = 10)
	private Long   id;
	
	@Column(name = "username", length = 50)
	private String name;
	private Long   sal;
	
	// 관계 설정
	@ManyToOne
	@JoinColumn(name = "team_id")
	private Team team;
	
	// 실제 Column(X) / Buffer 용도(O)
	@Transient
	private Long teamid;
	
	@Transient
	private String teamname

}

[com.oracle.oBootJpa02.repository]

  • MemberRepository.java
package com.oracle.oBootJpa02.repository;

import java.util.List;

import com.oracle.oBootJpa02.domain.Member;

public interface MemberRepository {

	Member memberSave(Member member);

	List<Member> findAll();

	Member findByMember(Long memberId);
}
  • JpaMemberRepository.java
package com.oracle.oBootJpa02.repository;

import java.util.List;

import javax.persistence.EntityManager;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.oracle.oBootJpa02.domain.Member;
import com.oracle.oBootJpa02.domain.Team;

@Repository
public class JpaMemberRepository implements MemberRepository {
	private final EntityManager em;
	
	@Autowired
	public JpaMemberRepository(EntityManager em) {
		this.em = em;
	}

	// 회원 저장
	@Override
	public Member memberSave(Member member) {
		// 팀 저장
		Team team = new Team();
		team.setName(member.getTeamname());
		// team.setName(member.getTeam().getName()); 될까?
		em.persist(team);
		
		// 회원 저장
		member.setTeam(team);
		em.persist(member);
		System.out.println("JpaMemberRepository memberSave");
		return member;
	}
	
	// 회원 목록
	@Override
	public List<Member> findAll() {
		List<Member> memberList = em.createQuery("select m from Member m", Member.class)
									.getResultList();
		System.out.println("JpaMemberRepository findAll memberList.size()->"+memberList.size());
		return memberList;
	}
	
	// 회원 정보 수정 폼
	@Override
	public Member findByMember(Long memberId) {
		Member member = em.find(Member.class, memberId);
		return member;
	}
}

[templates.members]

  • memberModify.html
<!DOCTYPE html>
<html xml:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>JPA 회원수정</h1>
	<form action="/members/memberUpdate" method="post">
		<input type="hidden" name="id" 	   th:value="${member.id}">
		<input type="hidden" name="teamid" th:value="${member.team.team_id}">
		회원이름 : <input type="text" id="name" name="name" 	 th:value="${member.name}"> <p>
		팀  이름 : <input type="text" id="name" name="teamname" th:value="${member.team.name}">
			<button type="submit">회원 수정 처리</button>
	</form>
</body>
</html>




✍회원최종수정


[com.oracle.oBootJpa02.controller]

  • MemberController.java
package com.oracle.oBootJpa02.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.oBootJpa02.domain.Member;
import com.oracle.oBootJpa02.service.MemberService;

@Controller
public class MemberController {
	private static final Logger logger = LoggerFactory.getLogger(MemberController.class);
	
	private final MemberService memberService;
	@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";
	}
	
	// 회원저장
	@PostMapping(value = "/memberSave")
	public String memberSave(Member member) {
		System.out.println("MemberController /members/save Start...");
		System.out.println("member.getTeamname()->"+member.getTeam());
		System.out.println("member.getName()->"+member.getName());
		memberService.memberSave(member);
		System.out.println("MemberController memberSave After");
		return "redirect:/";
	}
	
	// 회원목록
	@GetMapping(value = "/members")
	public String listMember(Model model) {
		List<Member> memberList = memberService.getListAllMember();
		System.out.println("memberList.get(0).getName()->"+memberList.get(0).getName());
		System.out.println("memberList.get(0).getTeam().getName()->"+memberList.get(0).getTeam().getName());
		System.out.println("MemberController memberList.size()->"+memberList.size());
		model.addAttribute("memberList", memberList);
		return "members/memberList";
	}
	
	// 회원 수정 폼
	@GetMapping(value = "/memberModifyForm")
	public String memberModify(Long id, Model model) {
		System.out.println("MemberController memberModify id->"+id);
		Member member = memberService.findByMember(id);
		System.out.println("member.getId()->"+member.getId());
		System.out.println("member.getName()->"+member.getName());
		System.out.println("member.getTeam().getName()->"+member.getTeam().getName());
		model.addAttribute("member", member);
		return "members/memberModify";
	}
	
	// 회원 수정
	@PostMapping(value = "/members/memberUpdate")
	public String memberUpdate(Member member, Model model) {
		System.out.println("MemberController memberUpdate member->"+member);
		System.out.println("MemberController memberUpdate member->"+member.getId());
		System.out.println("MemberController memberUpdate member->"+member.getName());
		System.out.println("MemberController memberUpdate member->"+member.getTeamname());
		memberService.memberUpdate(member);
		return "redirect:/members";
	}
}

[com.oracle.oBootJpa01.service]

  • MemberService.java
package com.oracle.oBootJpa02.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.oracle.oBootJpa02.domain.Member;
import com.oracle.oBootJpa02.repository.MemberRepository;

@Service
@Transactional
public class MemberService {
	@Autowired
	public final MemberRepository memberRepository;
	public MemberService(MemberRepository memberRepository) {
		this.memberRepository = memberRepository;
	}
	
	// 회원등록
	public Member memberSave(Member member) {
		System.out.println("MemberService memberSave Start...");
		System.out.println("MemberService join member.getName()->"+member.getName());
		memberRepository.memberSave(member);
		System.out.println("MemberRepository memberSave After");
		return member;
		
	}
	
	// 회원목록
	public List<Member> getListAllMember() {
		List<Member> listMember = memberRepository.findAll();
		System.out.println("MemberService getListAllMember listMember.size->"+listMember.size());
		return listMember;
	}
	
	// 회원수정폼
	public Member findByMember(Long memberId) {
		Member member1 = memberRepository.findByMember(memberId);
		System.out.println("MemberService findByMember member1.getId()->"+member1.getId());
		System.out.println("MemberService findByMember member1.getName()->"+member1.getName());
		System.out.println("MemberService findByMember member1.getTeam().getName()->"+member1.getTeam().getName());
		return member1;
	}
	
	// 회원 최종 수정
	public void memberUpdate(Member member) {
		memberRepository.updateByMember(member);
		System.out.println("MemberService updateMember member1->"+member);
		return;
	}
}

[com.oracle.oBootJpa02.repository]

  • MemberRepository.java

package com.oracle.oBootJpa02.repository;

import java.util.List;

import com.oracle.oBootJpa02.domain.Member;

public interface MemberRepository {

	Member memberSave(Member member);

	List<Member> findAll();

	Member findByMember(Long memberId);

	int updateByMember(Member member);
}
  • JpaMemberRepository.java
package com.oracle.oBootJpa02.repository;

import java.util.List;

import javax.persistence.EntityManager;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.oracle.oBootJpa02.domain.Member;
import com.oracle.oBootJpa02.domain.Team;

@Repository
public class JpaMemberRepository implements MemberRepository {
	private final EntityManager em;
	
	@Autowired
	public JpaMemberRepository(EntityManager em) {
		this.em = em;
	}

	// 회원 저장
	@Override
	public Member memberSave(Member member) {
		// 팀 저장
		Team team = new Team();
		team.setName(member.getTeamname());
		// team.setName(member.getTeam().getName()); 될까?
		em.persist(team);
		
		// 회원 저장
		member.setTeam(team);
		em.persist(member);
		System.out.println("JpaMemberRepository memberSave");
		return member;
	}
	
	// 회원 목록
	@Override
	public List<Member> findAll() {
		List<Member> memberList = em.createQuery("select m from Member m", Member.class)
									.getResultList();
		System.out.println("JpaMemberRepository findAll memberList.size()->"+memberList.size());
		return memberList;
	}
	
	// 회원 정보 수정 폼
	@Override
	public Member findByMember(Long memberId) {
		Member member = em.find(Member.class, memberId);
		return member;
	}

	@Override
	public int updateByMember(Member member) {
		int result = 0;
		System.out.println("JpaMemberRepository updateByMember member.getId()->"+member.getId());
		Member member3 = em.find(Member.class, member.getId());
		if( member3 != null) {
			// 팀 저장
			System.out.println("JpaMemberRepository updateByMember member.getTeamid()->"+member.getTeamid());
			Team team = em.find(Team.class, member.getTeamid());
			if( team != null ) {
				System.out.println("JpaMemberRepository updateByMember member.getTeamname()->"+member.getTeamname());
				team.setName(member.getTeamname());
				em.persist(team);
			}
			// 회원 저장
			System.out.println("JpaMemberRepository updateByMember member.getName()->"+member.getName());
			member3.setTeam(team);
			member3.setName(member.getName());
			em.persist(member3);
			result = 1;
		} else {
			result = 0;
			System.out.println("JpaMemberRepository updateByMember No Exist...");
		}
		return result;
	}

}

0개의 댓글