ABOUT ME

-

오늘
-
어제
-
-
  • JPA - Common DomainClassConverter
    Back-end/JPA 2020. 6. 30. 17:18

    DomainClassConverter

    하나의 타입을 다른 타입으로 변환하는 인터페이스로서 엔티티 혹은 ID를 각각의 타입으로 자동으로 변환해줍니다. 컨버팅에는 2가지 종류가 있습니다.

    • ToEntityConverter: 어떠한 Entity의 Id를 받아서 그 Entity 타입으로 변환하는 Converter입니다.
    • ToIdConverter: Entity를 그 Entity의 Id 타입으로 변환하는 Converter입니다.

    침고자료 : 레퍼런스

    Entity, Repository, Controller 생성

    @RestController
    public class PostController {
    
        @Autowired
        private PostRepository postRepository;
    
        @GetMapping("/posts/{id}")
        public String getPosts(@PathVariable Long id) {
            Optional<Post> byId = postRepository.findById(id);
            Post post = byId.get();
            return post.getTitle();
        }
    
    }

     

    converter

    Post, PostRepository, Controller를 생성합니다.
    Controller는 @Pathvariable을 통해 Long 타입의 id를 받아 id를 Post에 담고 제목을 return 하는 코드입니다.

    테스트 코드

    Long 타입

    package me.junjang.domainconverterdemo.post;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.test.web.servlet.MockMvc;
    
    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
    import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    @AutoConfigureMockMvc
    public class PostControllerTest {
    
        @Autowired
        MockMvc mockMvc;
    
        @Autowired
        PostRepository postRepository;
    
        @Test
        public void getPosts() throws Exception {
            Post post = new Post();
            post.setTitle("jpa");
            postRepository.save(post);
    
            mockMvc.perform(get("/posts/" + post.getId()))
                    .andDo(print())
                    .andExpect(status().isOk())
                    .andExpect(content().string("jpa"));
        }
    
    }

     

    converter

    Post 객체를 생성하고 jpa라는 제목을 set 해준 후 save합니다. 그 후 @PathVariable로 선언한 id를 보내주고 상태코드와 jpa라는 제목을 가졌는지 확인하고, 이상이 없다면 테스트가 통과하게 됩니다.

    Entity 타입

    id로 받아올 경우 컨버팅을 할 때 id를 찾고 담는 부분을 제외하고 찾아올 수가 있습니다.
    더이상 post 매개변수 이름이 @PathVariable 이름과 같지 않기 때문에 바인딩 받을 때 사용할 @PathVariable 이름을 반드시 @PathVariable("id") 라고 명시해주어야 합니다.
    이 때 id에 해당하는것을 post로 받게 되면 그 때 DomainClassConverter가 동작합니다.

    @GetMapping("/posts/{id}")
    public String getPost(@PathVariable("id") Post post) {
        return post.getTitle();
    }

     

    converter

    위 코드처럼 Post로 받게 된다면 id를 꼭 명시 해주어야 합니다. 테스트를 실행하면 동일한 결과가 나올 것입니다.

    'Back-end > JPA' 카테고리의 다른 글

    JPA - JpaRepository  (0) 2020.06.30
    JPA - Common Pageable, Sort  (0) 2020.06.30
    JPA - Common QueryDSL  (0) 2020.06.30
    JPA - Common BasicRepository  (0) 2020.06.30
    JPA - Common CustomRepository  (0) 2020.06.30

    댓글