스프링 부트 프로젝트에서 JPA를 연동하여 DB를 다루는 방법에 대하여 포스팅하겠다.
JPA에 대한 설명은 아래 포스팅을 참고하면 된다.
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형태로 보여지는 것을 확인할 수 있다.
'프로그래밍 > Spring Boot FW' 카테고리의 다른 글
[SpringBoot] 게시판 만들기(4) - 게시글 수정, 삭제 VIEW/API만들기 - REST API (0) | 2021.01.17 |
---|---|
[SpringBoot] 게시판 만들기(3) - 게시글 등록,조회 VIEW/API만들기 (0) | 2021.01.17 |
[SpringBoot] 게시판 만들기(2) - 템플릿 엔진을 이용하여 화면 구성하기 (0) | 2021.01.13 |
[SpringBoot] @어노테이션 정리 (0) | 2021.01.05 |
[SpringBoot] 스프링부트 테스트 코드 작성 (0) | 2021.01.05 |