CRUD(CREATE, READ, UPDATE, DELETE)
https://ko.wikipedia.org/wiki/CRUD
CRUD는 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말이다. 사용자 인터페이스가 갖추어야 할 기능(정보의 참조/검색/갱신)을 가리키는 용어로서도 사용된다.
개발 환경
- intellij
- Spring boot
UPDATE
단순히 DB에 있는 데이터를 읽어 오는 기능입니다.
개발할 패키지 구조, java 파일
- DAO
- Service
- Controller
- Entity
- Repository
com.example.root.controller.CreateController.java
import com.example.root.dao.UserEntity;
import com.example.root.error.StatusDefine;
import com.example.root.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UpdateController {
@Autowired
private UserService userService;
@GetMapping("/update")
public String readPage() {
return "CRUD/update";
}
@PostMapping("/update")
public String readPage(UserEntity user) {
userService.updateUser(user);
return "CRUD/read";
}
}
update메소드는 데이터를 읽어와서 입력을 넣을 화면에 해당하는 view와 처리를 담당할 메소드가 필요합니다
getmapping = view
postmapping = 정보처리의 역할을 담당하게 됩니다.
read를 테스트 하기위해 작성한 간단한 테이블 구조입니다.
com.example.root.dao.UserEntity.java
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Data
@Entity
@Table(name = "users")
public class UserEntity {
@Id
@GeneratedValue
private Long id;
private String email;
private String password;
}
Spring JPA와 Lombok 라이브러리를 사용하였습니다.
@data
Lombok의 @Getter @Setter를 한번에 선언하기 위해 사용했습니다. 실질적으로 @ToString @EqualsAndHashCod... 등이 더 포함되어 있습니다.
@entitiy
springJPA가 데이터베이스와 테이블을 매핑할 때 @entity 를 찾게 되는데 이때 @Table(name = "{name}")을 사용해서 테이블 이름을 찾게 된다. @Table이 없을때는 class이름으로 찾는다.
@Id, @GeneratedValue
@Id 로 테이블에서 PK를 찾고 설정할 수 있으며 @GeneratedValue로 자동으로 값을 gener해줄 수 있습니다. 이 기능은 mysql에 autoincrement와 비슷한 기능을 합니다.
com.example.root.repo.UserRepo.java
import com.example.root.dao.UserEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepo extends JpaRepository<UserEntity, Long> {
UserEntity findByEmail(String email);
}
아직까지는 @Repository에 포함하고 있는 기능으로 충분하기 때문에 추가로 함수를 정의 하진 않습니다.
read항목에 대해서 전체유저를 검색할때는 jpa 라이브러리가 제공하는 readAll() 메소드로 충분하지만 추후 특정 유저를 검색할때 findBy{entity}를 사용해서 데이터를 검색할 수 있습니다. findBy의 경우 findByName, findByEmail처럼 entity이름을 넣어주면 jpa가 알아서 함수를 만들어 줍니다.
com.example.root.service.UserServiceInterface.java
import com.example.root.dao.UserEntity;
import java.util.List;
public interface UserServiceInterface {
int createUser(UserEntity user);
List<UserEntity> readAllUser();
int updateUser(UserEntity user);
int Delete(UserEntity user);
UserEntity myPage(String email);
}
앞으로 개발할 UserService class는 최소 4개의 method를 기본틀로 사용됩니다.
com.example.root.service.UserService.java
import com.example.root.dao.UserEntity;
import com.example.root.error.StatusDefine;
import com.example.root.repo.UserRepo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
@Service
public class UserService implements UserServiceInterface {
@Autowired
private UserRepo userRepo;
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public int createUser (UserEntity user) {
UserEntity newUser = new UserEntity();
newUser.setEmail(user.getEmail());
newUser.setId(user.getId());
newUser.setPassword(passwordEncoder.encode(user.getPassword()));
userRepo.save(newUser);
return StatusDefine.SUCCESS.getCode();
}
@Override
public List<UserEntity> readAllUser() {
try {
log.info("read success");
List<UserEntity> UserList = userRepo.findAll();
return UserList;
} catch (Exception e) {
log.error(e.getMessage());
return null;
}
}
@Override
public int updateUser(UserEntity user) {
if (userRepo.findByEmail(user.getEmail()) != null){
UserEntity newUser = new UserEntity();
newUser.setEmail(user.getEmail());
newUser.setPassword(passwordEncoder.encode(user.getPassword()));
userRepo.save(newUser);
return StatusDefine.SUCCESS.getCode();
}
return StatusDefine.SUCCESS.getCode();
}
@Override
public int Delete(UserEntity user) {
return StatusDefine.ERROR_NOT_FOUNT.getCode();
}
}
사실 update또한 data를 database에 입력하는 것과 비슷합니다. 먼저 persistent객체라고 부르는데 유저의 정보를 검색해서 유저가 있는지 없는지 부터 판단합니다.
유저가 있다고 판단되면 해당유저의 정보를 다시 db에 저장하는 작업을 진행합니다. jpa는 유저의 primary key인 id 값으로 저장을 시도하기 때문에 데이터가 중복되지 않습니다.
혹시나 불안하시다면 repository에서 직접 sql을 작성해서 사용할 수 있습니다.
resources.templates.CRUD.create.html
<!DOCTYPE html>
<html lang="en"
xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>create</h2>
<div>
<h1>input</h1>
<form action="/create" method="post">
<div><input type="email" id="email" name="email"></div>
<div><input type="password" id="password" name="password"></div>
<div><input type="submit" value="check"></div>
</form>
</div>
</body>
</html>
간단한 테스르를 위해 작성한 HTML이라 view 적인 측면에선 보기 좋지 않습니다.
'IT 이야기 > CRUD' 카테고리의 다른 글
[Spring] Thymeleaf template적용 (0) | 2021.05.16 |
---|---|
[Springboot] JPA적용 (0) | 2021.05.02 |
[Spring] QueryDsl 적용 (0) | 2021.04.21 |
[Spring CRUD] read, (0) | 2021.03.24 |
[Spring CRUD] create, (0) | 2020.12.27 |
댓글