본문 바로가기

SpringBoot

SpringBoot(14) - Server, JPA, DB 예제(특정 회원 정보 삭제 / 전체 회원 조회 결과 출력), 추가 정리 사항

728x90
반응형

1) SpringBoot

   1-1) Server, JPA, DB 예제

      1-1-1) 특정 회원 정보 삭제

      1-1-2) 전체 회원 조회 결과 출력

   1-2) 추가 정리사항

 

 

 

 

 

1) SpringBoot

1-1) Server, JPA, DB 예제

[src/main/resources] - [templates] 안에 home.html 파일 생성 후 아래와 같이 작성

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>web3</title>
</head>
<body>
	<h1>[ web3 ]</h1>
	
	<p>
		<a href="test">저장 테스트</a>
	</p>
	
	<p>
		<a href="save">사용자 입력값을 저장</a>
	</p>
	
	<p>
		<a href="select">사용자 정보 조회</a>
	</p>
	
	<p>
		<a href="delete">사용자 정보 삭제</a>
	</p>
	
	<p>
		<a href="selectAll">모든 회원 보기</a>
	</p>
</body>
</html>

 

 

 

1-1-1) 특정 회원 정보 삭제

(1) [src/main/java] - [net.datasa.web3] 안에 PersonController.java 파일 생성 후 아래와 같이 작성

package net.datasa.web3;

import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RequiredArgsConstructor
@Controller
public class PersonController {
	
	private final PersonService personService;
	
	@GetMapping("test")
	public String test() {
		personService.test();
		return "redirect:/";
	}
	
	/**
	 * 입력 폼으로 이동
	 * @return Form이 있는 HTML 파일 경로
	 * */
	@GetMapping("save")
	public String save() {
		return "inputForm";
	}
	
	/**
	 * form의 입력값을 받아서 저장
	 * */
	@PostMapping("save")
	public String save(@ModelAttribute PersonDTO dto) {
		log.debug("전달된 값 : {}", dto);
		
		personService.save(dto);
		
		return "redirect:/";
	}
	
	/**
	 * 검색 form으로 이동
	 * @return HTML 파일 경로
	 * */
	@GetMapping("select")
	public String select() {
		return "selectForm";
	}
	
	@PostMapping("select")
	public String select(@RequestParam("id") String id, Model model) {
		PersonDTO dto = personService.select(id);
		
		model.addAttribute("id", id);
		model.addAttribute("person", dto);
		
		return "select";
	}
	
	// 삭제 form으로 이동
	@GetMapping("delete")
	public String delete() {
		return "deleteForm";
	}
	
	// 삭제
	@PostMapping("delete")
	public String delete(@RequestParam("id") String id, Model model) {
		boolean result = personService.delete(id);
		
		// 삭제 여부와 삭제한 아이디를 모델에 저장하고 HTML로 포워딩
		// 1. XXX : 없는 아이디입니다.
		// 2. XXX 회원정보를 삭제했습니다.
		
		model.addAttribute("id", id);
		model.addAttribute("result", result);
		
		return "delete";
	}

}

 

 

(2) [src/main/resources] - [templates] 안에 deleteForm.html 파일 생성 후 아래와 같이 작성

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>삭제</title>
</head>
<body>
	<h1>[ 삭제 ]</h1>
	
	<form action="delete" method="post">
		삭제할 아이디    <input type="text" name="id"><br>
		<input type="submit" value="삭제"><br>
	</form>
</body>
</html>

 

 

(3) [src/main/java] - [net.datasa.web3] 안에 PersonService.java 파일 생성 후 아래와 같이 작성

package net.datasa.web3;

import java.util.ArrayList;
import java.util.List;

//import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Service
@Transactional
public class PersonService {
	
//  이렇게 작성해도 되지만 아래의 방식이 더 권장된다!
//	@Autowired
//	PersonRepository PersonRepository;
	
	private final PersonRepository personRepository;
	
	public void test() {
		PersonEntity entity = new PersonEntity();
		entity.setId("abcde2");
		entity.setName("김길동");
		entity.setAge(22);
		
		personRepository.save(entity);
	}

	public void save(PersonDTO dto) {
		PersonEntity entity = new PersonEntity();
		entity.setId(dto.getId());
		entity.setName(dto.getName());
		entity.setAge(dto.getAge());
		
		personRepository.save(entity);
	}

	public PersonDTO select(String id) {
		// findById() : Primary Key 기준으로 검색을 하는 메서드
		// orElse(null) : 결과가 없으면 "null" 값을 대입하는 메서드
		PersonEntity entity = personRepository.findById(id).orElse(null);
		
		if (entity == null) {
			return null;
		}
		
		PersonDTO dto = new PersonDTO();
		dto.setId(entity.getId());
		dto.setName(entity.getName());
		dto.setAge(entity.getAge());
		
		return dto;
	}

	public boolean delete(String id) {
		boolean result = personRepository.existsById(id);
		
		if (result) {
			personRepository.deleteById(id);
		}
		
		return result;
	}

}

 

 

(4) [src/main/resources] - [templates] 안에 delete.html 파일 생성 후 아래와 같이 작성

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>삭제 결과 보기</title>
</head>
<body>
	<h1>[ 삭제 결과 ]</h1>
	 
	<div th:if="${result}">
		<p><span th:text="${id}"></span> 회원정보를 삭제했습니다.</p>
	</div>
	 
	<div th:unless="${result}">
		<p><span th:text="${id}"></span> : 없는 아이디입니다.</p>
	</div>

</body>
</html>

 

 

(5) 결과 화면

첫 접속 화면

 

 

"사용자 정보 삭제" 문구 클릭 시 화면

 

 

 

삭제할 아이디 입력 후 "삭제" 버튼 클릭 시 화면(삭제할 아이디가 존재할 경우, 아이디가 존재하지 않을 경우)

 

 

 

1-1-2) 전체 회원 조회 결과 출력

(1) [src/main/java] - [net.datasa.web3] 안에 PersonController.java 파일 생성 후 아래와 같이 작성

package net.datasa.web3;

import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RequiredArgsConstructor
@Controller
public class PersonController {
	
	private final PersonService personService;
	
	@GetMapping("test")
	public String test() {
		personService.test();
		return "redirect:/";
	}
	
	/**
	 * 입력 폼으로 이동
	 * @return Form이 있는 HTML 파일 경로
	 * */
	@GetMapping("save")
	public String save() {
		return "inputForm";
	}
	
	/**
	 * form의 입력값을 받아서 저장
	 * */
	@PostMapping("save")
	public String save(@ModelAttribute PersonDTO dto) {
		log.debug("전달된 값 : {}", dto);
		
		personService.save(dto);
		
		return "redirect:/";
	}
	
	/**
	 * 검색 form으로 이동
	 * @return HTML 파일 경로
	 * */
	@GetMapping("select")
	public String select() {
		return "selectForm";
	}
	
	@PostMapping("select")
	public String select(@RequestParam("id") String id, Model model) {
		PersonDTO dto = personService.select(id);
		
		model.addAttribute("id", id);
		model.addAttribute("person", dto);
		
		return "select";
	}
	
	// 삭제 form으로 이동
	@GetMapping("delete")
	public String delete() {
		return "deleteForm";
	}
	
	// 삭제
	@PostMapping("delete")
	public String delete(@RequestParam("id") String id, Model model) {
		boolean result = personService.delete(id);
		
		// 삭제 여부와 삭제한 아이디를 모델에 저장하고 HTML로 포워딩
		// 1. XXX : 없는 아이디입니다.
		// 2. XXX 회원정보를 삭제했습니다.
		
		model.addAttribute("id", id);
		model.addAttribute("result", result);
		
		return "delete";
	}
	
	// 모든 회원 보기
	@GetMapping("selectAll")
	public String selectAll(Model model) {
		List<PersonDTO> dtoList = personService.selectAll();
		
		// 리스트를 모델에 저장하고 selectAll.html로 포워딩
		// 결과를 화면에 표 형태로 출력한다.
		model.addAttribute("personList", dtoList);
		
		return "selectAll";
	}
}

 

 

(2) [src/main/java] - [net.datasa.web3] 안에 PersonService.java 파일 생성 후 아래와 같이 작성

package net.datasa.web3;

import java.util.ArrayList;
import java.util.List;

//import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Service
@Transactional
public class PersonService {
	
//  이렇게 작성해도 되지만 아래의 방식이 더 권장된다!
//	@Autowired
//	PersonRepository PersonRepository;
	
	private final PersonRepository personRepository;
	
	public void test() {
		PersonEntity entity = new PersonEntity();
		entity.setId("abcde2");
		entity.setName("김길동");
		entity.setAge(22);
		
		personRepository.save(entity);
	}

	public void save(PersonDTO dto) {
		PersonEntity entity = new PersonEntity();
		entity.setId(dto.getId());
		entity.setName(dto.getName());
		entity.setAge(dto.getAge());
		
		personRepository.save(entity);
	}

	public PersonDTO select(String id) {
		// findById() : Primary Key 기준으로 검색을 하는 메서드
		// orElse(null) : 결과가 없으면 "null" 값을 대입하는 메서드
		PersonEntity entity = personRepository.findById(id).orElse(null);
		
		if (entity == null) {
			return null;
		}
		
		PersonDTO dto = new PersonDTO();
		dto.setId(entity.getId());
		dto.setName(entity.getName());
		dto.setAge(entity.getAge());
		
		return dto;
	}

	public boolean delete(String id) {
		boolean result = personRepository.existsById(id);
		
		if (result) {
			personRepository.deleteById(id);
		}
		
		return result;
	}
	
	public List<PersonDTO> selectAll() {
		List<PersonEntity> entityList = personRepository.findAll();
		List<PersonDTO> dtoList = new ArrayList<>();
		
		for (PersonEntity entity : entityList) {
			PersonDTO dto = new PersonDTO();
			dto.setId(entity.getId());
			dto.setName(entity.getName());
			dto.setAge(entity.getAge());
			dtoList.add(dto);
		}
		
		return dtoList;
	}
}

 

 

(3) [src/main/resources] - [templates] 안에 selectAll.html 파일 생성 후 아래와 같이 작성

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 전체조회 결과</title>
<style>
	div {
		width: 100%
	}

	h1, table {
		width: 600px;
		margin: 0 auto;
		text-align: center;
	}
	
	h1 {
		padding-bottom: 50px;
	}

	table, th, td {
		border: 1px solid black;
		border-collapse: collapse;
		font-weight: bold;
	}
	
	th, td {
		width: 150px;
		text-align: center;
	}
	
	th {
		background-color: orange;
		color: white;
	}
	
	th:nth-child(1) {
		width: 50px
	}
	
	td:nth-child(1) {
		width: 50px
	}
</style>
</head>
<body>
	<div>
		<h1>[ 회원 전체조회 결과 ]</h1>
		
		<table>
	      <tr>
	      	<th>NO.</th>
	        <th>ID</th>
	        <th>이름</th>
	        <th>나이</th>
	      </tr>
	      <tr th:if="${personList == null or personList.isEmpty()}">
	      	<td colspan="4">조회 결과가 없습니다.</td>
	      </tr>
	      <tr th:if="${personList}" th:each="list, num : ${personList}">
			<td th:text="${num.count}"></td>
			<td th:text="${list.id}"></td>
			<td th:text="${list.name}"></td>
			<td th:text="${list.age}"></td>
		  </tr>
	    </table>
	</div>
	
</body>
</html>

 

 

(4) 결과 화면

첫 접속 화면

 

 

"모든 회원 보기" 문구 클릭 시 화면(아이디가 하나 이상 존재할 경우, 아이디가 하나도 존재하지 않을 경우)

 

 

 

 

1-2) 추가 정리사항

Table의 행 하나가 Entity이다!

 

@Id : 해당 Annotation이 붙은 변수가 Primary Key임을 나타낸다!

 

public interface PersonRepository extends JpaRepository<PersonEntity, String> {

}

바로 위의 코드 상 “String”“Primary Key”에 해당하는 변수(Entity 파일의 변수)의 데이터 타입을 나타낸다!

 

DTO에서는 계산되어 변하는 값들을 추가하는 곳이고, 이러한 값들은 DB에 추가될 필요가 없기 때문에

Entity에는 추가하지 않는다!

 

인터페이스(Interface)는 하위 클래스의 사용법을 일관성 있게 강요하는 것이다!

 

~ById(“Primary Key에 해당하는 변수명”)

deleteById(“id”);