기록과 정리

스프링 부트와 AWS로 혼자 구현하는 웹 서비스 03 본문

IT/스프링 부트와 AWS로 혼자 구현하는 웹 서비스

스프링 부트와 AWS로 혼자 구현하는 웹 서비스 03

zepetto 2021. 3. 9. 23:01

이 글은 이동욱(jojoldu)님의 스프링 부트와 AWS로 혼자 구현하는 웹 서비스를 참고하였습니다.

m.yes24.com/Goods/Detail/83849117

 

스프링 부트와 AWS로 혼자 구현하는 웹 서비스

가장 빠르고 쉽게 웹 서비스의 모든 과정을 경험한다. 경험이 실력이 되는 순간!이 책은 제목 그대로 스프링 부트와 AWS로 웹 서비스를 구현한다. JPA와 JUnit 테스트, 그레이들, 

m.yes24.com

 

스프링 부트에서 JPA로 데이터베이스 다뤄보자

JPA는 자바 표준 ORM 기술입니다. 블로그에 JPA 관련한 글을 정리한 카테고리가 있으니 JPA 관련하여서는 해당 블로그글을 참고부탁드립니다. 

 

이번 글에서는 JPA 기능을 이용하여 조회, 쓰기, 수정 기능을 완성하고 그에 관련하여 JPA 포함한 단위테스트를 작성해보겠습니다.

 

Posts.java를 생성합니다.

@Entity : JPA 어노테이션, 엔티티객체임을 선언합니다.

@Getter, NoArgsContsructor : 롬복 어노테이션, getter 및 기본생성자를 선언해줍니다.
*@Builder : 해당 클래스에 빌더 패턴 클래스를 생성합니다. 

 

@Setter는 무작정 생성을 조심해야합니다. 코드상 명확하게 기능 변화를 구분하기 힘든 상황을 대비해 생성하지 않습니다.

 

그렇다면 update의 경우 수정을 어떻게 해야할까요? JPA의 영속성 컨텍스트는 기존의 데이터의 변경을 감지하는 더티체킹이라는 기능이 있습니다. 변경이 감지되는 순간 , update쿼리를 쓰기지연SQL영역에 보내게 되고 DB에 수정쿼리가 전달이 됩니다. 

즉, 비지니스 로직에서는 영속 상태의 객체 값만 수정하면 수정쿼리가 DB로 전달되게 됩니다. 

 

posts/PostsRepository.java

Entity 객체와 Repository는 함께 위치할 것을 권장합니다. ( 책에서 ) 둘은 아주 밀접한 관계이기 때문입니다.

PostsRepositoryTest

@After : 테스트 수행이 끝난 후 작업하는 어노테이션

@SpringBootTest : 스프링 통합테스트용 어노테이션이며 지금의 경우 H2 database를 사용할 수 있게 해줍니다.

 

application.properties 

위 옵션값을 통해 테스트시 쿼리를 콘솔에서 확인할 수 있다.

MySQL 방언(?)으로 콘솔 로그를 확인 가능하게 해준다.

등록 REST API

등록을 위한 REST Controller

( @Autowired 가 아닌 final + @RequiredArgsConstructor 를 이용하여 빈 주입을 받았다. )



Entity는 DB에 가까운 객체이며 변경이 될시 데이터에 영향을 줄 수 있다. 따라서 데이터만 담을 수 있는 DTO를 따로 생성하여 관리하도록 하자.

JPA 기능 테스트에 관련하여 @SpringBootTest 와 TestRestTemplated 을 사용하면 된다. 

 

수정 REST API

Posts.java 에 update용 메서드를 만들어주자

posts라는 값을 update에 넣어주는 순간 , 더티체킹이 일어나면서 update가 이루어진다. (setter를 안써도 된다.)

 

update api 에 대한 테스트 코드

JPA Auditing

작성시간이나 수정시간에 대한 공통된 필드에 관하여 관리하는 기법으로 JPA Auditing이 있습니다.

 

BaseTimeEntity 생성
java8의 LocalDateTime
BaseTimeEntity를 상속받는 Posts
마지막으로 JPA Auditing을 활성화해주자.

해당 설정으로 필요할 때마다 작성시간이나 수정시간을 가져와서 상속받기만하면 사용할 수 있을것 같다.