REST API 만들기-3

스프링 기반 REST API 개발 -백기선님 인프런 강좌를 보고 작성하였습니다.

event 객체를 실제 DB에 저장 시키기

Event 클래스 수정

1
2
3
4
5
6
7
8
9
10
@Builder @AllArgsConstructor @NoArgsConstructor
@Getter @Setter @EqualsAndHashCode(of="id")
@Entity
public class Event {

@Id @GeneratedValue
private Integer id;
...
@Enumerated(EnumType.STRING) //string을 더 권장
private EventStatus eventStatus = EventStatus.DRAFT;

Event 클래스 각 위치에 @Entity @ID @GeneratedValue @Enumerated 어노테이션을 추가해준다.

@Entity

  • 이 어노테이션은 해당 클래스가 엔티티임을 알리기 위해 사용합니다.
  • 애플리케이션이 실행이 될 때 엔티티 자동검색을 통하여 이 어노테이션이 선언 된 클래스들은 엔티티 빈으로 등록합니다.

@Id

  • 엔티티빈의 기본키를 의미합니다. 이 어노테이션은 하나의 엔티티에는 반드시 하나가 존재해야 합니다.

@GeneratedValue

  • 데이터베이스에 의해 자동으로 생성된 값이라는 의미입니다.
  • 즉, 프로그램 상에서 조작된 데이터가 아닌, 실제 데이터베이스에 데이터가 영속(저장)될 때 생성되는 값입니다.
    @Enumerated(EnumType.STRING)
  • EnumType.ORDINAL을 이용하면 Enum 순서 값을 DB에 저장합니다
  • EnumType.STRING을 이용하면 Enum 필드가 테이블에 저장시 숫자형인 1,2,3이 아닌, Enum의 name이 저장됩니다.

    EventRepository 인터페이스 작성

    1
    2
    3

    public interface EventRepository extends JpaRepository<Event,Integer> {
    }

EventController 클래스 수정

1
2
3
4
5
6
7
8
9
10
11
12
@RequestMapping(value ="/api/events", produces = MediaTypes.HAL_JSON_UTF8_VALUE )
public class EventController{
public EventController(EventRepository eventRepository){
this.eventRepository = eventRepository;
}
@PostMapping
public ResponseEntity createEvent(@RequestMapping Event event){
Event newEvent = this.eventRepository.save(event); //JPA를 이용한 저장
URI createdUri = linkTo(EventController.class).slash(newEvent.getId()).toUri(); //DB에 저장되며 생성된 ID값을 이용
return ResponseEntity.created(createdUri).body(event);
}
}

EventControllerTests 클래스 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@RunWith(SpringRunner.class)
@WebMvcTest //web과 관련된 빈들이 등록 됨
public class EventControllerTests {
@MockBean
EventRepository eventRepository;

@Test
public void createEvent() throws Exception{
...

event.setId(10);
Mockito.when(eventRepository.save(event)).thenReturn(event);

mockMvc.perform(post("/api/events")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.accept(MediaTypes.HAL_JSON)
.content(objectMapper.writeValueAsString(event)))
.andDo(print())
.andExpect(status().isCreated())
.andExpect(jsonPath("id").exists())
.andExpect(header().exists(HttpHeaders.LOCATION))
.andExpect(header().string(HttpHeaders.CONTENT_TYPE,MediaTypes.HAL_JSON_UTF8_VALUE));

...
}

MockBean

  • MockBean으로 만든 eventRepository는 Mock객체이기때문에 save를 하여도 리턴 값이 null이다.
  • 그렇기 때문에 Mockito를 사용해서 Stubbing 해주었다.