[SpringBoot] 게시판 만들기(1) - 스프링 부트와 JPA 연동으로 DB 다루기 :: 매운코딩
728x90
300x250

스프링 부트 프로젝트에서 JPA를 연동하여 DB를 다루는 방법에 대하여 포스팅하겠다.

 

JPA에 대한 설명은 아래 포스팅을 참고하면 된다.

cceeun.tistory.com/160

 

[JAVA] ORM, JPA, Hibernate, Mybatis, SQL Mapper 용어 정리

DB를 다루기 위한 기술인 ORM, JPA, Hibernate, Mybatis등에 대하여 용어를 정리하겠다. 간단하게 얘기하자면 ORM은 객체를 매핑하는 역할이며 대표기술은 JPA가 있고, Hibernate가 ORM 프레임워크 중 하나이

cceeun.tistory.com

 

 

1.  build.gradle에 의존성 추가하기

    compile('org.springframework.boot:spring-boot=starter-data-jpa')
    compile('com.h2database:h2')

h2는 메모리 관계형 데이터베이스이다. 메모리에서 실행되기 때문에 어플리케이션 재시작할때마다 초기화 된다.

 

 

2. 패키지 생성

패키지 구조는 크게 모든 기능을 담을 도메인 패키지를 만들고 그 하위에 실제 기능들의 패키지를 담을 것이다.

 

3. 게시판 객체 만들기

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Getter
@NoArgsConstructor
@Entity
public class Posts {

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Long id;

    @Column(length = 500, nullable = false)
    private String title;

    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;

    private String author;

    @Builder
    public Posts(String title, String content, String author){
        this.title= title;
        this.content= content;
        this.author = author;
    }



}

@Entitiy JPA어노테이션으로 해당 클래스가 객체임을 명시한다.

 

4. Repository 인터페이스 생성

Posts 객체를 통해 DB로 접근하기 위한 Interface인 PostsRepository를 생성한다.

Mybatis라면 DAO(Mapper.java)정도의 역할이 된다.

public interface PostRepository extends JpaRepository<Entity 클래스, 기본키의 타입> {

5. JPA 정상동작 유무 확인 테스트 코드 작성

    @Test
    public void 게시글저장_불러오기() {
        //given
        String title = "제목";
        String content = "내용내용내용";

        postsRepository.save(Posts.builder().title(title).content(content).build());

        //when
        List<Posts> postsList = postsRepository.findAll();

        //then
        Posts posts = postsList.get(0);
        assertThat(posts.getTitle()).isEqualTo(title);
        assertThat(posts.getContent()).isEqualTo(content);
    }

assertThat() - 테스트 검증 라이브러리의 검증 메소드. 검증하고 싶은 대상을 메소드로 받음

 

6. 콘솔에 SQL 로그 출력하기

main/resources 폴더 하위에 application.properties 파일 생성 후 

spring.jpa.show_sql=true 작성

 

재실행하면 콘솔에 아래와 같은 로그가 찍힌다.

2021-01-10 19:56:33.216  INFO 10364 --- [    Test worker] o.h.h.i.QueryTranslatorFactoryInitiator  : HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select posts0_.id as id1_0_, posts0_.author as author2_0_, posts0_.content as content3_0_, posts0_.title as title4_0_ from posts posts0_
Hibernate: select posts0_.id as id1_0_, posts0_.author as author2_0_, posts0_.content as content3_0_, posts0_.title as title4_0_ from posts posts0_

 

7. Controller, Service, DTO 생성하기

//Controller
@RequiredArgsConstructor
@RestController
public class PostsApiController {
    
    private final PostsService postsService;
    
    @PostMapping("/api/v1/posts")
    public Long save(@RequestBody PostsSaveRequestDto requestDto){
        return postsService.save(requestDto);
    }
    
    @PutMapping("/api/v1/posts/{id}")
    public Long update(@PathVariable Long id, @RequestBody PostsUpdateRequestDto requestDto) {
        return postsService.update(id, requestDto);
    }

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


//Service
@RequiredArgsConstructor
@Service
public class PostsService {
    private final PostsRepository postsRepository;
    
    @Transactional
    public Long save(PostsSaveRequestDto requestDto) {
        return postsRepository.save(requestDto.toEntitiy().getId());
    }
    
    @Transactional
    public Long update(Long id, PostsUpdateRequestDto requestDto) {
        Posts posts = postsRepository.findById(id)
                .orElseThrow(() -> new IllegalArgumentException("해당 사용자가 없습니다. id="+id));

        posts.update(requestDto.getTitle(),requestDto.getContent());

        return id;

    }

    @Transactional
    public PostsResponseDto findById(Long id){
        Posts entity = postsRepository.findById(id)
                .orElseThrow(() -> new IllegalArgumentException("해당 사용자가 없습니다. id="+id));

        return new PostsResponseDto(entity);
    }
}

//DTO
@Getter
@NoArgsConstructor
public class PostsSaveRequestDto {
    private String title;
    private String content;
    private String author;

    @Builder
    public PostsSaveRequestDto(String title, String content, String author) {

        this.title = title;
        this.content = content;
        this.author = author;
    }

    public Posts toEntity() {
        return Posts.builder().title(title).content(content).author(author).build();
    }
}

@Getter
@NoArgsConstructor
public class PostsUpdateRequestDto {

    private String title;
    private String content;

    @Builder
    public PostsUpdateRequestDto(String title, String content) {
        this.title = title;
        this.content = content;
    }
}

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();
    }

}

 

8. H2를 직접 접근하기 위한 웹 콘솔 옵션 활성화

H2 DB는 메모리에서 실행한다.

application.propertise에 아래와 같은 코드 추가

spring.h2.console.enabled = true

 

9. Application 실행 후 웹 콘솔 접속

- 경로 : http://localhost:8080/h2-console

 

 

JDBC URL을 jdbc:h2:mem:testdb 로 변경한다.

testdb 스키마에 mem 인 메모리 데이터베이스로 동작하라는 설정이다.

 

[Connect]를 통해 H2 관리 페이지로 이동한다.

테이블과 쿼리를 날릴 수 있는 웹 DBMS가 등장~~

현재는 데이터 1개를 insert 해두었다.

 

10. 조회API를 통해 홈페이지에서 결과 값 확인하기.

- 링크 : http://localhost:8080/api/v1/posts/1

를 통해 접속한다. (1은 첫 아이디니깐)

 이런 JSON형태로 보여지는 것을 확인할 수 있다.

 

 

 

 

 

코드 참고 출처 - github.com/jojoldu/freelec-springboot2-webservice/tree/master/src/main/java/com/jojoldu/book/springboot/domain

728x90

+ Recent posts