REST api 규격

hero를 등록하는 REST api 는 다음과 같다.

  • protocol: /api/admin/hero
  • method: POST
  • request: application/json

{
“name”: “Superman”,
“email”: “superman@hero.com”,
“sex”: “mail”,
“country”: “American”,
“address”: “LA”,
“powers”: “flying,penetration”
}

  • response: json

서버연동

먼저 <form onSubmit={this.submit}> 을 추가한다. submit 이벤트는 기본이벤트로 다른 페이지로 이동하는 기본 이벤트가 포함되어있으므로 기본이벤트를 먼저 막아야 한다. 기본 이벤트를 막지 않으면 페이지가 깜박거리면서 페이지가 다시 로딩된다.

axios post 메서드로 서버에 json 데이터를 보낸다. 주의할 점은 api 규격서에 sex 가 객체가 아니라 male or female 하나의 값을 갖고 있는 스트링으로 변환이 되어야 하고 power도 마찬가지로 객체가 아니라 체크된 값을 콤마로 연결된 하나의 스트링으로 넘어가야 한다. 서버가 NoSQL로 되었다면 객체를 바로 넣을수 있는데 여기서는 서버 규격대로 한번 변환을 해야 한다는것에 주의하자.

html5 validation

name input box에 required attribute를 추가한 후에 값을 입력하지 않고 submit 버튼을 누르게 되면 html5 validation 이 적용되어 에러문구가 표시된다. 그러나 이 에러 문구를 어떻게 보여주느냐는 표준이 아니기 때문에 브라우저마다 UI, 에러 문구가 다 다르게 나타나고 보여진다. 여기서는 html validation을 적용하고 에러문구를 커스터마이징하는 부분은 뒤에서 살펴본다. 아래와 같이 적용한다.

  • name: required, 3자보다 크고 10자보다 작다
  • email: email, required
  • sex: required
  • country: required

이름을 입력하지 않고 등록버튼을 누르면 아래와 같은 브라우저에서 보여주는 에러메시지가 보여지게 된다.

Bootstrap Validation

bootstrap에서 html5 validation을 지원하는 몇가지 태그가 있다.

먼저 submit 버튼을 클릭후 form 이 유효하지않으면 form 노드에 was-validated 클래스를 추가하면 된다.

valid 하지 않는 입력폼들에 대해서는 invalid-feedback 클래스를 넣어주면 에러문구를 표시하게 된다. input, textarea, select 입력폼들에 대해서 지원해준다.

먼저 form에 novalidate를 한 후에 아래와 같이 한다.

이름을 넣지 않고 등록버튼을 누르면 에러메시지는 다음과 같이 보여진다.

image upload

먼저, 이미지 업로드 하는 로직을 이해해야 한다. 이미지 화일을 선택하면 썸네일을 보여준후에 업로드 버튼을 누르면 그때 데이터와 이미지 화일을 동시에 업로드하면 전송 프로토콜을 맞추는부분이 좀 까다롭고 또 업로드하는 이미지가 여러장일 경우에 시간이 오래걸리거나 전송중에 에러가 생길경우 대처가 어려운 점 등이 발생한다. 그러므로 여기서의 이미지 업로드 로직은 이미지를 선택하면 바로 서버에 업로드하고 업로된 이미지 url을 이미지 태그로 보여주고 바인딩하는 로직을 사용한다.

  • protocol: /api/admin/photo
  • method: POST
  • content-type: multipart/form-data

등록버튼 위에 파일 업로드 UI를 부트스트랩 형태로 추가한다. 이미지만 필터링 하기위해서 accept 속성을 추가한다. 만일 다중 선택이 가능하게 할려면 multiple 속성도 추가하지만 여기서는 하나만 선택하므로 선택한다.

사진 파일을 선택하면 서버로 전송하는 로직을 추가한다. 서버로 전송후 성공하면 img 태그에 바인딩한다. img 태그에 src는 없다가 생기는 시간에 따라 변경이 되는 데이터이므로 state로 관리한다.

서버는 이미 구현이 되어있고 서버에서 AWS S3에 이미지를 업로드후 등록된 URL이 리턴되므로 리턴된 값을 파싱하면 등록된 이미지 썸네일을 표시할 수 있다.

이미지를 선택하면 선택된 이미지를 AWS에 등록하고 등록된 이미지가 나타난다.

image 포함한 hero 등록

이미지를 선택시 이미 이미지가 서버에 등록이 되고 등록된 url 주소가 state의 photo 에 바인딩 되었기 때문에 추가할 로직은 없다. 업로드 된 후에 form 초기화시에 photo 부분만 비워주는 로직만 추가하면 된다.

그렇지만, 만일 이미지 업로드 후에 등록 버튼을 누르지 않는 경우가 생길것이므로 이런 로직은 서버에서 보완해주어야 한다. 맨 처음에 이미지를 업로드 하면 temp 폴더에 넣었다가 이미지 등록을 누르면 실제 업로드 폴더에 올리고 배치잡으로 오래된 temp 폴더의 오래된 화일들은 지워주는 로직 같은것이 필요할 것이다.

– note