작성
·
376
5
강의내용 8:30 내용질문입니다.
< API를 만들때는 엔티티를 외부에 반환하면 안된다 >
1. 필드가 그대로 노출됨 (ex.userpassword)
2. API 스펙이 변한다. (엔티티에 로직을 추가했는데 api스펙이 변한다)
솔직히 말씀드리면 전부 이해가 안됩니다..ㅠ
이전 강의에서 FORM에 입력되는 데이터를 Member 엔티티를 쓰는게 아니라 따로 만들어준 MemberForm을 쓰는이유는 이해했습니다.
(Member객체 코드가 지저분해질수 있고, Valid 기능같은것을 사용하지못해서)
그것과 유사한 이유인것 같은데... 정확히 이해가 안되네요
사실 api라는 개념도 정확하게 잡히지 않습니다.
정리해서 질문 하겠습니다.
1. 저희가 강의에서 만들어준 api가 있나요???
(혹시 MemberController의 메서드들이 모두 api에 속하는건가요?)
2. 필드가 노출된다는게 무슨말인지 모르겠습니다. 예를들어 폼에 password입력칸이 있는데, 이게 어떻게 노출이 가능하다는 것인가요?
3. api의 스펙이 바뀐다는 부분이 이해가안됩니다.
api스펙이 무엇을 뜻하며, 그게 바뀌면 무슨 문제가 생기나요?
답변 1
0
안녕하세요, 김진영 님. 공식 서포터즈 codesweaver 입니다.
.
1. 웹 API란 웹(HTTP) 요청으로 특정 URL에 규정된 양식으로 데이터를 요청(request)하면 규정된 양식으로 응답(response) 하겠다는 약속입니다. 웹이 시작되려면 일단 URL을 입력하는 단계부터 시작해야하는데 그렇다면 컨트롤러의 메서드들과 매핑하는 단계부터 시작이라는 것을 알 수 있습니다. 질문하신 것처럼 컨트롤러의 메서드들이 API 스펙 중 한개가 되는 셈입니다.
2. 데이터베이스에 고객정보를 만약 name, pass, auth 등으로 보관하고 있다고 가정하겠습니다. 이 때 API의 응답값으로 엔티티를 그대로 전달하게 되면 데이터베이스에 어떤 형태로 데이터가 들어가 있는지 상대에게 모두 노출하게 됩니다. 상대에게 불필요한 정보를 노출하는 것은 위험합니다. 또, 엔티티를 그대로 반환하게 된다면 API 응답에 필요없는 항목들도 모두 포함해서 반환하는 문제도 생깁니다. 그래서 엔티티를 직접 반환하지 않고 DTO를 이용하는것이 좋습니다.
.
3. api의 스펙이 바뀐다는 것은 요청하는 URL의 변경, 요청시 필수 파라미터, 응답시 파라미터의 갯수나 타입 등등이 바뀐것을 말합니다. 즉, 요청하고 응답하는 약속이 변경된것을 API 스펙이 바뀌었다고 합니다.
감사합니다.
안녕하세요 김진영님!
질문하신것처럼 현재의 예제코드에서는 Member와 MemberForm이 거의 일치합니다.
다만 실무에서는 Member가 더 다양한 프로퍼티를 갖게 됩니다.
그래서 Member와 MemberForm의 불일치가 점점 커지게 됩니다.
.
예제를 단순하고 쉽게 만들다 보니 지금은 불필요한 중복처럼 보이게 된 것입니다. :)
감사합니다.
상세한 설명 감사합니다.
이해에 큰 도움이 되었습니다.
추가로 궁금한점 댓글로 남깁니다.
2번으로 답변주신 내용에 대한 질문입니다.
name,pass,auth 등을 보관하고 있다고 가정하고, 엔티티를 그대로 보내면 디비의 어떤 형태로 데이터가 들어가 있는지 노출된다고 하셨는데,
강의 내용을 보면 MemberForm과 Member엔티티가 비교대상이 였습니다. id를 제외한 데이터는 거의 동일한데. 이것을 멤버폼으로 보내나 엔티티로 보내나 무슨차이인지 모르겠습니다.
(다만 vaild 기능을 비롯하여 멤버엔티티 코드가 지저분해질수 있다는 부분과 api응답에 필요한 데이터만 포함시키기위해 멤버폼을 만든다는것은 이해했습니다.)