Java Spring Boot 004-4 | CRUD에 데이터베이스 적용

Yunny.Log ·2022년 2월 18일
0

Spring Boot

목록 보기
22/80
post-thumbnail

Service, Repository를 이용하여 CRUD 데이터 다루기

  • 이전에 하던 파일에 Controller 추가

1) PostController 생성 & 작성

@RestController
public class PostController {
    private static final Logger logger = LoggerFactory.getLogger(PostController.class);
}

2) PostService 생성 & 작성

@Service
public class PostService {
    private static final Logger logger = LoggerFactory.getLogger(PostService.class);
}
  • service : 비즈니스 로직, repository : 데이터 액세스, 컨트롤러 : 프론트 게이트웨이

3) Post레포지토리 - PostDao 명으로 생성 & 작성

@Repository
public class PostDao {
    private static final Logger logger = LoggerFactory.getLogger(PostDao.class);
}

4) 이제 얘네를 controller 에 등록해줘야지 & 기본 crud

@RestController
@RequestMapping("post")
public class PostController {
    private static final Logger logger = LoggerFactory.getLogger(PostController.class);
    private final PostService postservice;

    public PostController(
            @Autowired PostService postservice
    ){
        this.postservice = postservice;
    }
    @PostMapping()
    public void createPost(){

    }

    @GetMapping("{id}")
    public void readPost(@PathVariable("id")int id){

    }
    @GetMapping("")
    public void readPostAll(){
    }

    @PutMapping("{id}")
    public void updatePost(@PathVariable("id")int id){

    }
    @DeleteMapping("{id}")
    public void deletePost(@PathVariable("id") int id){
        
    }
}
  • 여기까지 했는데 우리가 entity는 만들어놨는데 데이터를 주고받을 객체를 아직 생성하지 않았음 (이전에 진행했던 dto 의 존재)
  • 우리가 이전에 했던 crud랑 가장 큰 차이점이라고 할 수 있음
  • entity사용하면 안되나 라는 의문이 들 지도 모르는데 entity는 단순한 데이터의 표현만을 나타내는 존재임, 단순한 crud에서 entity를 dto로 사용하는 것은 바람직하지 않음
  • => 그래서 postdto를 하나 더 추가적으로 만들어보자

5) Postdto (getter,setter,toString은 생략..)

public class PostDto {
    private int id;
    private String title;
    private String content;
    private String writer;
    private int boardId;

=> dao 까지 이렇게 정의한 dto 오브젝트가 들어가게 될 것이다.

  • dao에서 엔티티를 조정하고 이를 돌려주게 할 예정~
  • 그럼 이제 PostCotroller가 다룰 데이터가 바로 PostDto라고 지정해주러 가야한다~

6) PostController에 dto 지정 & @ResponseStatus(HttpStatus.알맞은 요청)추가

    @PostMapping()
    @ResponseStatus(HttpStatus.CREATED)
    public void createPost(
            @RequestBody PostDto postdto
    ){

    }

    @GetMapping("{id}")
    public PostDto readPost(
            @PathVariable("id")int id
    ){
    }

    @GetMapping("")
    public List<PostDto > readPostAll(){
    }

    @PutMapping("{id}")
    @ResponseStatus(HttpStatus.ACCEPTED)
    public PostDto updatePost(
            @PathVariable("id")int id,
            @RequestBody PostDto postdto
    ){

    }

    @DeleteMapping("{id}")
    @ResponseStatus(HttpStatus.ACCEPTED)
    public PostDto deletePost(
            @PathVariable("id") int id
    ){

    }

7) postservice 추가

public class PostService {
    private static final Logger logger = LoggerFactory.getLogger(PostService.class);

    public void createPost(PostDto postdto){

    }

    public PostDto readPost(int id){

    }

    public List<PostDto> readPostAll(){

    }

    public void updatePost(int id, PostDto postdto){

    }

8) postdao 추가 작성

@Repository
public class PostDao {
    private static final Logger logger = LoggerFactory.getLogger(PostDao.class);
    private final PostRepository postrepository;
    //postrepository 지정해주기
    public PostDao(
            @Autowired PostRepository postrepository
    ){
        this.postrepository=postrepository;
    }
    public void createPost(PostDto postdto){
        PostEntity postentity = new PostEntity();
        postentity.setTitle(postdto.getTitle());
        postentity.setContent(postdto.getContent());
        postentity.setWriter(postdto.getWriter());
        postentity.setBoardentity(null);
        this.postrepository.save(postentity);
    }

    public PostEntity readPost(int id){
        Optional<PostEntity> postentity = this.postrepository.findById((long) id);
        if(postentity.isEmpty()){
            throw new ResponseStatusException(HttpStatus.NOT_FOUND);
        }
        return postentity.get();

    }

    public Iterator<PostEntity> readPostAll(){
        return this.postrepository.findAll().iterator();
    }


    public void updatePost(int id, PostDto postdto){
        PostEntity postentity = new PostEntity();
        postentity.setTitle(postdto.getTitle()==null?postentity.getTitle() : postdto.getTitle());
        postentity.setContent(postdto.getContent()==null?postentity.getContent() : postdto.getContent());
        postentity.setWriter(postdto.getWriter()==null?postentity.getWriter() : postdto.getWriter());
        postentity.setBoardentity(null);
        this.postrepository.save(postentity);
    }
    public void deletePost(int id){
        Optional<PostEntity> targetentity = this.postrepository.findById((long) id);
        if(targetentity.isEmpty()){
            throw new ResponseStatusException(HttpStatus.NOT_FOUND);
        }
        this.postrepository.delete(targetentity.get());
    }

}

9) postdao 추가 작성

@Service
public class PostService {
    private static final Logger logger = LoggerFactory.getLogger(PostService.class);
    private final PostDao postdao; //postdao 추가 선언 (활용 위해)

    public PostService(@Autowired PostDao postdao, PostDao postdao1){
        this.postdao = postdao; //postdao 초기화
    }

    public void createPost(PostDto postdto){
    this.postdao.createPost(postdto);
    }

    public PostDto readPost(int id){
        PostEntity postentity = this.postdao.readPost(id);
    }

    public List<PostDto> readPostAll(){
        Iterator<PostEntity> iterator=this.postdao.readPostAll();
    }

    public void updatePost(int id, PostDto postdto){
        this.postdao.updatePost(id,postdto);
    }

    public void deletePost(int id){
        this.postdao.deletePost(id);
    }
}
  • 이제 내부의 entity를 postdto 로 변환해주는 과정이 필요
@Service
public class PostService {
    private static final Logger logger = LoggerFactory.getLogger(PostService.class);
    private final PostDao postdao; //postdao 추가 선언 (활용 위해)

    public PostService(@Autowired PostDao postdao, PostDao postdao1){
        this.postdao = postdao; //postdao 초기화
    }

    public void createPost(PostDto postdto){
    this.postdao.createPost(postdto);
    }

    public PostDto readPost(int id){
        PostEntity postentity = this.postdao.readPost(id);
        return new PostDto(
                Math.toIntExact(postentity.getId()),
                postentity.getTitle(),
                postentity.getContent(),
                postentity.getWriter(),
                postentity.getBoardentity()==null
                        ?0:Math.toIntExact(postentity.getBoardentity().getId())
        );
    }

    public List<PostDto> readPostAll(){
        Iterator<PostEntity> iterator=this.postdao.readPostAll();
        List<PostDto> postDtoList = new ArrayList<>();

        while(iterator.hasNext()){
            PostEntity postentity = iterator.next();
            postDtoList.add(new PostDto(
                    Math.toIntExact(postentity.getId()),
                    postentity.getTitle(),
                    postentity.getContent(),
                    postentity.getWriter(),
                    postentity.getBoardentity()==null
                            ?0:Math.toIntExact(postentity.getBoardentity().getId())

            ));
        }
        return postDtoList;
    }

    public void updatePost(int id, PostDto postdto){
        this.postdao.updatePost(id,postdto);
    }

    public void deletePost(int id){
        this.postdao.deletePost(id);
    }
}

10 ) PostController

package jsbdy.jpa;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import java.util.List;

@RestController
@RequestMapping("post")
public class PostController {
    private static final Logger logger = LoggerFactory.getLogger(PostController.class);
    private final PostService postservice;

    public PostController(
            @Autowired PostService postservice
    ){
        this.postservice = postservice;
    }
    @PostMapping()
    @ResponseStatus(HttpStatus.CREATED)
    public void createPost(
            @RequestBody PostDto postdto
    ){
        this.postservice.createPost(postdto);
    }

    @GetMapping("{id}")
    public PostDto readPost(
            @PathVariable("id")int id
    ){
       return this.postservice.readPost(id);
    }

    @GetMapping("")
    public List<PostDto > readPostAll(){
        return this.postservice.readPostAll();
    }

    @PutMapping("{id}")
    @ResponseStatus(HttpStatus.ACCEPTED)
    public void updatePost(
            @PathVariable("id")int id,
            @RequestBody PostDto postdto
    ){
        this.postservice.updatePost(id, postdto);
    }

    @DeleteMapping("{id}")
    @ResponseStatus(HttpStatus.ACCEPTED)
    public void deletePost(
            @PathVariable("id") int id
    ){
        this.postservice.deletePost(id);
    }
}

=>
잘 된당 ㅎㅎ

  • 아냐 근데 put에서 에러 생김;;
  • 일케해서 날리면 id2가 수정이 되는게 아니라 저 update된 애로 새로운 id3가 더 생성이 돼버림;;허거덩

-> 코드 수정

 public void updatePost(int id, PostDto postdto){
        PostEntity postentity = new PostEntity();
  • postdao의 updatePost부분에서 PostEntity postentity = new PostEntity();로 계속 새로운 엔티티 생성하고 있었삼;;ㅋㅋ
   public void updatePost(int id, PostDto postdto){
        Optional<PostEntity> targetentity = this.postrepository.findById(Long.valueOf(id);
        if (targetentity.isEmpty()){
            throw new ResponseStatusException(HttpStatus.NOT_FOUND);
        }
        PostEntity postentity=targetentity.get();

        postentity.setTitle(postdto.getTitle()==null?postentity.getTitle() : postdto.getTitle());
        postentity.setContent(postdto.getContent()==null?postentity.getContent() : postdto.getContent());
        postentity.setWriter(postdto.getWriter()==null?postentity.getWriter() : postdto.getWriter());
        postentity.setBoardentity(null);
        this.postrepository.save(postentity);
    }

추가

  1. RequestParam과 비교
    5.1. RequestParam
    http://192.168.0.1:8080?aaa=bbb&ccc=ddd
    5.2. PathVariable
    http://192.168.0.1:8080/bbb/ddd

Type 1 => http://127.0.0.1?index=1&page=2

  • 파라메터의 값과 이름을 함께 전달하는 방식으로 게시판 등에서 페이지 및 검색 정보를 함께 전달하는 방식을 사용할 때 많이 사용합니다.

Type 2 => http://127.0.0.1/index/1

  • Rest api에서 값을 호출할 때 주로 많이 사용합니다.
  • @RequestParam 사용하기
    Type 1의 URL을 처리할 때 @RequestParam을 사용하게 됩니다.
    아래의 예제와 같이 Controller 단에서 사용합니다.
@GetMapping("read")
public ModelAndView getFactoryRead( int factroyId, SearchCriteria criteria) 
{ }

위의 경우 /read?no=1와 같이 url이 전달될 때 no 파라메터를 받아오게 됩니다.
@RequestParam 어노테이션의 괄호 안의 경우 전달인자 이름(실제 값을 표시)입니다.
이렇게 @RequestParam의 경우 url 뒤에 붙는 파라메터의 값을 가져올 때 사용을 합니다.

    1. @ PathVariable의 경우
      url에서 각 구분자에 들어오는 값을 처리해야 할 때 사용합니다.
@PostMapping("delete/{idx}")
@ResponseBody
public JsonResultVo postDeleteFactory(@PathVariable("idx") int factoryIdx) {
	return factoryService.deleteFacotryData(factoryIdx);
}

0개의 댓글