Chris940915 / geo_benchmark

0 stars 0 forks source link

1/8 #13

Open Chris940915 opened 3 years ago

Chris940915 commented 3 years ago

ViewSet

axios.create (GET, PATCH, DELTE)

Paginator

게시판과 같은 목록이 주어져있을 때, 페이지 당 몇 개의 글을 보여줄지 지정할 수 있도록 도와주는 모듈.


from django.core.paginator import Paginator

def board_list(request):
    boards_all = Board.objects.all().order_by('-id')
    page = int(request.GET.get('p', 1))     # 없으면 1로 지정. 
    paginator = Paginator(boards_all, 5)  # 한 페이지 당 몇개씩 보여줄 지 결정
    boards = paginator.get_page(page)

ResponseEntity

반환 값을 어떻게 맞출까?

REST API를 사용하기 위하여 conteller 에 RestController 반환 값은 모두 Object 타입. 하지만, 일반적인 API는 반환하는 리소스에 Value 뿐만 아니라 상태코드, 응답 메시지 등이 포함되어있다. 그래서 Object 타입을 REST APi의 반환 값으로 맞추기 위해 사용하는 것이 ResponseEntity class.

HttpEntity라는 클래스는 Http 요청(request) 또는 응답(response)에 해당하는 HttpHeaderHttpBody를 포함하는 클래스. 그리고 이 클래스를 상속받아 구현한 클래스가 ResponseEntity, ReqeustEntity 클래스이다.

따라서, ResponseEntity는 HttpStatus, HttpHeaders, HttpBody를 포함.

public class ResponseEntity<T> extends HttpEntity<T> {

    public ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, HttpStatus status) {
        super(body, headers);
        Assert.notNull(status, "HttpStatus must not be null");
        this.status = status;
    }
}

생성자에 3개가 존재하는 것을 확인할 수 있다.

    @GetMapping(value = "/user/{id}")
    public ResponseEntity<Message> findById(@PathVariable int id) {
        User user = userDaoService.findOne(id);
        Message message = new Message();
        HttpHeaders headers= new HttpHeaders();
        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));

        message.setStatus(StatusEnum.OK);
        message.setMessage("성공 코드");
        message.setData(user);

        return new ResponseEntity<>(message, headers, HttpStatus.OK);
    }

image

다음과 같이 생성되는 것을 확인할 수 있당.

DTO

https://velog.io/@aidenshin/DTO%EC%97%90-%EA%B4%80%ED%95%9C-%EA%B3%A0%EC%B0%B0

Chris940915 commented 3 years ago

RequestParam, RequestBody

컨트롤러에서 데이터를 인자에 할당하는 대표적인 방법 2가지.

결론부터 말하자면, @RequesBody로 받을때는 변수명이 상관이 없지만, @RequestParam으로 받을때는 데이터를 저장하는 이름으로 변수명을 설정해야한다.

@Controller
public class UserController {
    @PostMapping("/receivew")
    public String age (@RequestParam String name) {
        return name;
    }
}
  localhost:8000/name=hansub 
에 대해서
hansub
를 리턴한다. 하지만,
 localhost:8000/name=hansub&age=27
에 대해서 **RequestBody**는 name=hansub&age=27을 리턴하지만 **RequestParam**은
hansub
만을 리턴한다. #### JSON 형식으로 데이터 전달. JavaScript의 fetch APi로 데이터를 전송하고 받아보자. ```javaScript const postData = event => { fetch("/receive", { method: 'post' headers: { 'content-type' : 'application/json' }, body : JSON.stringfy( name : "hansub" age : "27" ) } } ``` 위와 같은 event로 데이터를 전송하면, { name : "hansub", age : "27"} 이라는 데이터가 JSON의 형태로 전송된다. 먼저, RequestParam으로는 데이터를 받을 수가 없다. **MissingServletRequestParameterException: Required String parameter 'name' is not present** name이라는 파라미터가 없다는 오류로 RequestParam은 기본적으로 **url 상에서 데이터를 찾기 때문**이다. 위와 같이 데이터를 전달하는 것은 url이 http://localhost:8000/receive 로 변함이 없고 body에 데이터를 포함하여 전송하기 때문에 @RequestParam으로 데이터를 받을 수 없다. ```java @Controller public class UserController{ @PostMapping("/receive") public String age(@RequestBody String req){ return req; } } // >> {"name" : "hansub", "age": "27"} ``` **여기서 더 중요한 점!** 만약에 name 과 age를 필요로 하는 Person 클래스가 있고 getter가 구현되어 있다면 ```java public class Person{ private String name; private int age; public Person () { } public String getName() { return name; } public String getAge() { return age; } } @Controller public class UserController { @PostMapping("/receive") public String age(@RequestBody Person person){ return person; } } // Person{name='hansub', age = 27} ``` 이렇게 받아온 Person 객체로부터 get()을 통해 특정 데이터를 받을 수 있어서 프로젝트의 Axios.create(HttpClient) 로 데이터를 쏠때 어떻게 받는지 알 수 있다.
Chris940915 commented 3 years ago

Spring boot image field

Chris940915 commented 3 years ago

JpaRepository

JpaRepository는 인터페이스로 기존에 JPQL 쿼리문을 사용하는 것이 아니라 더 간편하게 기능들을 사용하기 위하여 인터페이스 미리 메소드를 정의해둔것이다.

public interface 이름 extends JpaRepository <엔티티, ID 유형>

인터페이스이기 때문에 사용할 repository에 상속하여 만든다.

Paging

이란, DB에 저장된 Entity들을 페이지로 나누는 것.

repository의 findAll 메서드 parameter로 Pageable 또는 Pageable의 구현체를 넘겨주면 된다.

// controller

@GetMapping("/paging")
    public List<Book> findBooksByPage(@RequestParam Integer page, Integer size) {
        return bookService.findBooksByPage(page,size);
    }
// service

public List<Book> findBooksByPage(Integer page, Integer size) {
        Pageable pageRequest = PageRequest.of(page, size);  // page : 몇 번째 페이지인지 (index), size : 한 페이지의 사이즈. 
        return bookRepository.findAll(pageRequest).getContent();
}

다음과 같이 사용하며, hasNext(), hasPrevious(), getTotalPages() 등등 page 관련 기능들을 제공.