CRUD(CREATE, READ, UPDATE, DELETE)
https://ko.wikipedia.org/wiki/CRUD
CRUD는 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말이다. 사용자 인터페이스가 갖추어야 할 기능(정보의 참조/검색/갱신)을 가리키는 용어로서도 사용된다.
개발 환경
- intellij
- Spring boot
CREATE
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 CreateController {
@Autowired
private UserService userService;
@GetMapping("/create")
public String createPage(){
return "CRUD/create";
}
@PostMapping("/create")
public String create(UserEntity user){
userService.createUser(user);
System.out.println(StatusDefine.SUCCESS.getCode());
return "redirect:/";
}
}
create 메소드를 post/get 두개로 나눠 사용하였습니다.
post를 만들때 한가지 이슈가 있었습니다.
데이터를 입력하고 java로 받아오는 과정에서 나타난 에러입니다.
Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
찾아보니 json 관련 에러였는데 처음에 @RequestBody annotation을 붙여서 생긴 에러였습니다. web에선 json으로 주지 않으니 에러가나는게 당연했습니다. 결국 @RequestBody Annotation을 삭제하고난 뒤 에러가 없어졌습니다.
@PostMapping("/create")
public String create(@RequestBody UserEntity user){
userService.createUser(user);
System.out.println(StatusDefine.SUCCESS.getCode());
return "redirect:/";
}
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> {
}
아직까지는 @Repository에 포함하고 있는 기능으로 충분하기 때문에 추가로 함수를 정의 하진 않습니다.
com.example.root.service.UserServiceInterface.java
import com.example.root.dao.UserEntity;
public interface UserServiceInterface {
int createUser(UserEntity user);
int read(UserEntity user);
int updateUser(UserEntity user);
int Delete(UserEntity user);
}
앞으로 개발할 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 int read(UserEntity user) {
return StatusDefine.SUCCESS.getCode();
}
@Override
public int updateUser(UserEntity user) {
return StatusDefine.SUCCESS.getCode();
}
@Override
public int Delete(UserEntity user) {
return StatusDefine.SUCCESS.getCode();
}
}
실질적으로 create 기능을 구현할 class입니다. Controller에서 전달해준 UserEntity객체를 사용해서 Mysql에 Insert하는데 Insert를 대신 해주는 라이브러리가 JPA입니다. .save(newUser);로 객체를 실제로 저장하게 됩니다.
※ spring security관점에서 작성할 때는 위에 코드와 같이 password를 encoding해야 합니다. 평문으로 저장을 시도하면 security가 차단하기때문에 실제로 데이터가 저장되지 않습니다.
resources.templates.CRUD.create.html
<!DOCTYPE html>
<html lang="en">
<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] update, (0) | 2021.04.04 |
[Spring CRUD] read, (0) | 2021.03.24 |
댓글