2017-09-14 14 views
0

Spring-mvc로 간단한 사전 RESTful API를 개발 중이다. 관련 엔티티 위의 코드를 기반으로외래 키를 사용하여 개체를 저장하는 전문적/표준 방법은 무엇입니까?

public class Word { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 

    private String word; 

    @ManyToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name="LANGUAGE_ID", insertable=false, updatable=false) 
    private Language language; 

}

Language입니다 : 두 개의 관련 기관이 있습니다.

문제 : POST 요청으로 Word 엔터티에 CREATE 작업을 구현하고 싶습니다. 구현은 어렵지 않지만 POST 요청 URL 및 JSON 요청 본문과 관련하여 최소한 두 가지 솔루션 후보가있었습니다. 즉, JSON 본문 요청을 직접 삽입합니다. : 직접 삽입합니다. json으로 몸은 중첩 된 JSON 개체를 포함 - 언어,

{id:1, word:"hello", Language: {id:1, language:"English"}}

는 참조 같은 : Spring: Save object with foreign keys with a POST request

해결책 후보 II : POST 요청의 URL을 통해 참조 된 언어 ID를 얻을 말을

같은 이와 같이

POST http://localhost:8080/rest/language/1/words

을 더 Language 기준 A를 없다 모든 JSON POST 요청 본문.

참조 : https://www.youtube.com/watch?v=_Jnu_jHfQbM

나는이 두 질문 :

질문 1 :이 두 솔루션 후보 중에서, 더 나은 하나, 또는 말 전문 표준 솔루션입니다? 아니면 다른 해결책이 있습니까?

질문 2는 : 주어진 솔루션 후보 모두로, 어떤 경우에 우리는 해당 controller 클래스에 적어도 참조 Language POJO를 검색 할 필요가있다. 그러나 OO 설계 원칙의 관점에서 보았을 때,이 방법은 컨트롤러와 밀접하게 결합 된 것으로 보이므로 컨트롤러에서보다는이 검색 동작을 분리해야한다고 생각하고 있습니까? 예를 들어 service 계층에 있습니다. 그러나 이것은 전문적인 방법입니까? 우리는 해당 DTO가 있어야합니까?

답변

0

내 생각에 저장해야하는 데이터는 본문에 중첩되어야합니다. Spring은 json 데이터를 객체에 직접 매핑 할 수 있으므로 매개 변수에서 다른 모델 클래스로 설정할 필요가 없습니다.

그리고 엔티티에 대한 별도의 모델 클래스를 만들 것입니다. 따라서 컨트롤러는 모델 클래스에 데이터를 채우고 서비스에 제공합니다. 그런 다음 서비스는 모델 클래스를 엔티티에 매핑합니다. 그 후에 그들은 저장소를 통해 저장 될 수 있습니다.

예 :

@Controller 
public class RestController { 

    @Autowired 
    RestService restService; 

    @PostMapping(value="/") 
    public void saveVariable(@RequestBody TestModel testModel) { 
    testService.saveTest(testModel); 
    } 
} 

@Service 
public class RestService { 

    @Autowired 
    TestRespository testRepository; 

    public void saveTest(TestModel testModel) { 
    TestEntity testEntity = new TestEntity(); 
    //some mapping from testModel to testEntity 
    testRepository.save(testEntity); 
    } 
} 
+0

먼저 조언 해 주셔서 감사합니다. : "엔티티에 대한 별도의 모델 클래스 생성"이란 무엇을 의미합니까? 나는 언어와 단어라는 두 개의 분리 된 실체를 가지고있었습니다. 아마 DTO가 있어야할까요? 당신이 준 TestModel이 DTO 일까? – Rui

+0

예, 컨트롤러에서 엔티티를 사용하는 것을 좋아하지 않습니다. 그래서 필요한 엔티티의 값을 보유하는 별도의 클래스를 만듭니다. –

0

언어에 속하는즉, 나는 다음과 같이 설계한다고 가정하면

POST /api/languages/en/words HTTP/1.1 
Host: localhost:8080 
Content-Type: application/json 

{ 
    "word": "hello" 
} 

경우 단어의 (a JSON 문서의 표현, 예를 들어) 요청 페이로드에서 계층 구조를 나타내는 URL로 전송됩니다 (언어).

숫자 값보다 더 명확하므로 언어를 식별하는 데 two-letter codes을 사용할 수도 있습니다. 위의 예에서 en영어을 의미합니다.


나는 당신이 당신의 REST API를 대신 use DTOs 지속성 개체 노출되지 않도록하는 것이 좋습니다. REST 자원 표현은 지속성 오브젝트와 동일한 속성을 가질 필요가 없습니다.


REST 컨트롤러를 최대한 가볍게 유지하고 비즈니스 규칙에 초점을 맞춘 서비스 계층을 유지하십시오.

+0

귀하의 조언을 많이 주셔서 감사합니다 :) 대단한! – Rui

+0

당신의 응답도 괜찮습니다. 하지만 벤자민의 대답은 제게는 대부분의 경우 솔루션을 선택 하겠지만 제 관점에서 볼 때 더 받아 들일 수 있습니다. 더욱이 Benjamin의 응답은 일찍 이루어졌습니다. 이렇게 돼서 미안하다 :) – Rui