본문 바로가기
IT 이야기/CRUD

[Spring CRUD] create,

by Dblog 2020. 12. 27.
728x90

CRUD(CREATE, READ, UPDATE, DELETE)

https://ko.wikipedia.org/wiki/CRUD

 

CRUD - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. CRUD는 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말이다. 사용자 인터

ko.wikipedia.org

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 적인 측면에선 보기 좋지 않습니다.

 

728x90

'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

댓글