ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SPRINGBOOT] 기본 CRUD API 만들기②(수정, 조회)
    SPRINGBOOT 2022. 4. 24. 22:01

    참조 : 스프링부트와 AWS오 혼자 구현하는 웹 서비스(이동욱 저

    )

    1. api만들기(수정)

     

    ① 수정 기능을 위한 Dto를 먼저 생성한다.

    package com.study.crystal.test.web.dto;
    
    import lombok.Builder;
    import lombok.Getter;
    import lombok.NoArgsConstructor;
    
    @Getter
    @NoArgsConstructor
    public class PostsUpdateRequestDto {
        private String title;
        private String content;
        
        @Builder
        public PostsUpdateRequestDto(String title, String content){
            this.title = title;
            this.content = content;
        }
    }

     

    ② Entity 클래스인 Posts에 수정을 위한 코드를 추가해준다.

    public void update(String title, String content){
            this.title = title;
            this.content = content;
        }

     

    ③ 서비스에 수정을 위한 비지니스 로직을 작성해준다.

    @Transactional
        public Long update(Long id, PostsUpdateRequestDto requestDto) {
        	//findById로 데이터를 들고 오면서 해당 데이터는 영속성을 지니게 됨
            Posts posts = postsRepository.findById(id).orElseThrow(
                    () -> new IllegalArgumentException("해당 게시글이 없습니다. id=" + id)
            );
            //데이터 값 변경
            posts.update(requestDto.getTitle(), requestDto.getContent());
            
            return id;
        }//트랜잭션이 끝나면서 변경된 데이터가 테이블에 적용

    update 기능에서는 데이터베이스에 쿼리를 날리는 부분이 없다.

    바로 JPA의 영속성 때문이다.

    영속성이란 엔티티가 영속성 컨텍스트에 포함되어있냐 아니냐로 갈린다.

     

    JPA의 엔티티 매니저가 활성화된 상태로 트랜잭션 안에서 데이터베이스에서 데이터를 가져오면 이 데이터는 영속성 컨텍스트가 유지된 상태이다.

    이러한 상태에서 해당 데이터의 값을 변경하면 트랜잭션이 끝나는 시점에 해당 테이블에 변경분을 반영한다.

    Entity의 값만 변경하면 별도로 Update 쿼리가 필요없는 것이다.

    이것을 더티 체킹(Dirty Checking) 이라고 한다.

     

    ④ 컨트롤러에 수정을 위한 코드를 추가한다.

    @PutMapping("/api/v1/posts/{id}")
        public Long update(@PathVariable Long id, @RequestBody PostsUpdateRequestDto requestDto) {
            return postsService.update(id, requestDto);
        }

     

     

    2. api만들기(조회)

     

    ① 조회를 위한 Dto를 생성해준다.

    package com.study.crystal.test.web.dto;
    
    import com.study.crystal.test.domain.posts.Posts;
    import lombok.Getter;
    
    @Getter
    public class PostsResponseDto {
        private Long id;
        private String title;
        private String content;
        private String author;
    
        public PostsResponseDto(Posts entity) {
            this.id = entity.getId();
            this.title = entity.getTitle();
            this.content = entity.getContent();
            this.author = entity.getAuthor();
        }
    }

     

    ② 서비스에 조회를 위한 비지니스 로직을 추가해준다.

    public PostsResponseDto findById(Long id) {
            Posts entity = postsRepository.findById(id).orElseThrow(
                    () -> new IllegalArgumentException("해당 게시글이 없습니다. id" + id)
            );
            
            return new PostsResponseDto(entity);
        }

     

    ③ 컨트롤러에 조회를 위한 코드를 추가한다.

    @GetMapping("api/v1/posts/{id}")
        public PostsResponseDto findById (@PathVariable Long id){
            return postsService.findById(id);
        }

     

     

    3. 웹 콘솔 활성화

     

    로컬환경에서 데이터베이스로 H2를 활용한다.

    직접 접근을 위해서는 웹 콘솔을 사용한다.

     

    ① application.properties에 다음과 같은 옵션을 추가한다.

    spring.h2.console.enabled=true

    ② Application을 실행시킨다.

     

    ③ http://localhost:8080/h2-console로 접속한다.

     

    ④ 웹 콘솔화면이 나타나면 JDBC URL을 다음과 같이 연결시킨다.

    ⑤ 다음과 같이 POSTS 테이블이 나타나야 정상이다.

     

    테스트를 위해 posts 테이블에 데이터를 등록해준다.

    id 1로 조회를 하면 다음과 같이 JSON형태로 데이터를 조회할 수 있다.

     

    'SPRINGBOOT' 카테고리의 다른 글

    [SPRINGBOOT] JPA Auditing  (0) 2022.04.24
    [SPRINGBOOT] 기본 CRUD API 만들기①(등록)  (0) 2022.04.17
    [SPRINGBOOT] JPA 기본 기능과 설정  (0) 2022.04.07
    [SPRINGBOOT] 롬복  (0) 2022.04.05
    [SPRINGBOOT]테스트코드 작성  (0) 2022.04.04
Designed by Tistory.