반응형
이전 블로그 글 : https://devjunyeok.tistory.com/181
JPA를 활용한 CRUD 구현하기
안녕하세요! 이번 시간에는 JPA 를 활용한 예제 프로젝트를 생성해보겠습니다. 들어가기 전에 JPA의 특징으로는 SQL문을 자동생성하는 것이 특징입니다. 💡 프로젝트 준비 및 환경설정 프로젝트
devjunyeok.tistory.com
📂 DeptService.java
package com.example.jpaexam.service;
import com.example.jpaexam.model.Dept;
import com.example.jpaexam.repository.DeptRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
/**
* packageName : com.example.jpaexam.service
* fileName : DeptService
* author : GGG
* date : 2023-10-16
* description : 부서 업무 서비스
* 요약 :
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* —————————————————————————————
* 2023-10-16 GGG 최초 생성
*/
@Service
public class DeptService {
@Autowired
DeptRepository deptRepository; // DI 객체 가져오기
/** 전체조회 */
public List<Dept> findAll() {
List<Dept> list = deptRepository.findAll(); // db 전체조회 함수 호출
return list;
}
/** 상세조회(1건조회) */
public Optional<Dept> findById(int dno) {
Optional<Dept> optionalDept = deptRepository.findById(dno);
return optionalDept;
}
/** 저장(수정)함수 */
public Dept save(Dept dept) {
// todo: jpa 저장함수 호출 ( 기본키 없으면 insert, 있으면 update )
Dept dept2 = deptRepository.save(dept);
return dept2; // 저장된 부서객체
}
/** 삭제함수 */
public boolean removeById(int dno){
// todo : existsById : jpa 함수 - 리턴값 있으면 true, 없으면 false
if(deptRepository.existsById(dno)) {
deptRepository.deleteById(dno); // db 삭제(dno)
return true;
}
return false;
}
}
📂 DeptController.java
package com.example.jpaexam.controller.exam01;
import com.example.jpaexam.model.Dept;
import com.example.jpaexam.service.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;
/**
* packageName : com.example.jpaexam.controller.exam01
* fileName : DeptController
* author : GGG
* date : 2023-10-16
* description : 부서 컨트롤러 : @RestController 사용
* 요약 :
* <p>
* ===========================================================
* DATE AUTHOR NOTE
* —————————————————————————————
* 2023-10-16 GGG 최초 생성
*/
@Slf4j
@RestController
@RequestMapping("/exam01")
public class DeptController {
@Autowired
DeptService deptService; // 객체 가져오기 (DI)
/** 전체조회 함수 */
@GetMapping("/dept")
public ResponseEntity<Object> getDeptAll() {
try {
// todo) 전체조회 함수 호출
List<Dept> list = deptService.findAll();
if (list.isEmpty() == false) {
// todo) 성공
return new ResponseEntity<>(list, HttpStatus.OK);
} else {
// todo) 데이터 없음
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
} catch (Exception e) {
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
/** 상세 조회 함수 */
@GetMapping("/dept/{dno}")
public ResponseEntity<Object> getDeptId(@PathVariable int dno){
try {
// todo) 전체조회 함수 호출
Optional<Dept> optionalDept = deptService.findById(dno);
if (optionalDept.isEmpty() == false) {
// todo) 성공
return new ResponseEntity<>(optionalDept.get(), HttpStatus.OK);
} else {
// todo) 데이터 없음
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
} catch (Exception e) {
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
/** 저장함수 */
@PostMapping("/dept")
public ResponseEntity<Object> createDept(@RequestBody Dept dept){
try {
// todo : jap 서비스 저장함수 호출 : dept2(DB 저장된 객체)
Dept dept2 = deptService.save(dept);
return new ResponseEntity<>(dept2, HttpStatus.OK);
} catch (Exception e) {
log.debug(e.getMessage());
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
/** 수정함수 */
@PutMapping("/dept/edit/{dno}")
public ResponseEntity<Object> updateDept(@RequestBody Dept dept, @PathVariable int dno){
try {
// todo : jap 서비스 수정함수 호출 : dept2(DB 저장된 객체)
Dept dept2 = deptService.save(dept);
return new ResponseEntity<>(dept2, HttpStatus.OK);
} catch (Exception e) {
log.debug(e.getMessage());
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
/** 삭제함수 */
@DeleteMapping("/dept/delete/{dno}")
public ResponseEntity<Object> deleteDept(
@PathVariable int dno
){
try {
// todo) 삭제 함수 호출
boolean bSuccess = deptService.removeById(dno);
if (bSuccess == true) {
// todo) 삭제성공
return new ResponseEntity<>(HttpStatus.OK);
} else {
// todo) 0건 삭제(삭제할 대상이 없을경우)
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
} catch (Exception e) {
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
📌 실행해보기
1) 상세조회
부서번호 10번을 조회


2) 저장함수
임의의 값을 지정해서 저장하기
저장함수 테스트시 기본키(dno)와 insertTime, updateTime 제외하고 입력


3) 수정함수


부서번호 10번 조회 - updateTime과 dname, loc가 수정된 것을 알 수 있습니다.

4) 삭제함수 - 부서번호 10번 삭제하기


전체조회해서 10번 부서에 해당하는 데이터가 삭제되었는지 확인

반응형
'Spring Boot > 스프링부트 예제' 카테고리의 다른 글
JPA 페이징 처리 (1) | 2023.10.18 |
---|---|
JPA - JPQL(Java Persistence Query Language) (1) | 2023.10.17 |
JPA를 활용한 CRUD 구현하기 (0) | 2023.10.16 |
JSTL 라이브러리 (0) | 2023.10.06 |
파라미터 방식의 매개변수 전달 어노테이션 (0) | 2023.10.05 |