ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 1주차 복습
    스파르타 강의 정리 2023. 11. 13. 21:08

     

    1주차를 다시 보면서 완벽히 습득하지 못한 내용들을 정리

     

     

    Headers - 브라우저에서 서버로 보낸 Request 데이터
    Request Headers  -  이것 또한 브라우저에서 서버로 보낸 리퀘스트 데이터
    Response Headers  -  서버가 웹페이지 데이터와 함께 보낸 추가 데이터

     


     

    정적 웹페이지 반환방법

    1. 컨트롤러를 거치지않고 url에 파일명을 바로 입력

    2. 타임리프를 주석처리하고 다시 빌드한 후 컨트롤러를 통해 평범하게 반환

    3. Get에서 redirect 사용

     

    3번 코드

    @GetMapping("/html/redirect")
    public String 메소드이름() {
         return "redirect:/정적페이지이름.html";
    }

     

     


     

     

    반환할 데이터는 모델에 담고 그 모델이 적용될 view 이름에 정보를 전달하면, 

    viewResolver를 통해 그 모델의 정보가 view에 적용되고, 완성된 페이지를 클라이언트에 반환한다.

     

    private static long visitCount = 0;
    
    @GetMapping("/html/dynamuic")
    public String htmlDynamic(Model model){
          visitCount++;
          
          // 동적페이지 만들때 필요한 2가지  
          //  1. 필요한 데이터를 담은 모델
          model.addAttribute(visits, visitCount);      
          
          //  2. view name
          return "hello-visit";          
    }

     

     

     


     

    자바에서 JSON 타입으로 리턴하는법

    -> 자바 객체를 그대로 반환하면 된다.

    자바스크립트에서는 자바 객체를 이해하지 못하기 때문에 JSON형태로 반환해야한다.

    그런데 자바 객체형식으로 반환되었으므로 스프링이 자동으로 JSON형태로 반환하며,

    변환과정을 JACKSON 라이브러리가 담당한다.

     

    @GetMapping("/json/class")
    @ResponseBody
    public Star helloClassJson(){
       return new Star("캬" , 111);
    }
    
    // Content-Type : application/json
    // Response Body
    {
    "name" : "캬",
    "age" : 111
    }

     

     

     


     

     

    JACKSON의 변환과정을 좀 더 상세하게 설명

     

    1.  Object to JSON  (직렬화,  Serialize)

    @Test
    @DisplayName("Object To JSON : get Method 필요")  // 변환할때 ObjectMapper가 getter 사용
    void test1() throws JsonProcessingException {
        Star star = new Star("Robbie", 95);
    
        ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
        String json = objectMapper.writeValueAsString(star);
    
        System.out.println("json = " + json);
    }

     

     

    2. JSON to Object  (역직렬화, Deserialize)

    @Test
    @DisplayName("JSON To Object : 기본 생성자 & (get OR set) Method 필요")
    void test2() throws JsonProcessingException {
        String json = "{\"name\":\"Robbie\",\"age\":95}"; // JSON 타입의 String
    
        ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
    
        
        // 첫번째 파라미터는 JSON 타입,  두번쨰 파라미터에서는 어떤 객체로 매핑할건지 명시해줘야함.
        Star star = objectMapper.readValue(json, Star.class);  
        System.out.println("star.getName() = " + star.getName());
    }

     

     

    3. 직렬화와 역직렬화의 차이

    직렬화는 객체 인스턴스를 생성 + writeValueAsString 메소드 사용

    역직렬화는 JSON 타입의 String를 사용 + readValue 메소드 사용

     

     

    추가 질문

     

    Q1. 직렬화에서 Getter가 어디에 쓰이길래 필수로 적용해야하는가?

    A. private field에 접근하기 위해 사용한다.  (getter의 일반적인 용도와 같음)

     

    Q2. 역직렬화에서는 왜 getter 대신 setter도 쓰일 수 있는가?

    A. 직렬화된 데이터를 사용하여 객체를 생성하기 때문에 setter를 통해 객체를 올바르게 복원하기 위해 사용

     

    Q3. 역직렬화에서 기본생성자가 필요한 이유

    A.  Star star = objectMapper.readValue(json, Star.class);   

    이 코드에서 JSON데이터를 읽어와서 객체에 매핑하는데, 

    매핑할 클래스 객체를 생성하는 과정에서 기본생성자가 필요하기 때문이다.

     

     

     


     

    Path Variable 방식은 서버에 보내려고 하는 데이터를 url 경로에 추가할 수 있다.

    // [Request sample]
    // GET http://localhost:8080/hello/request/star/Robbie/age/95
    @GetMapping("/star/{name}/age/{age}")
    @ResponseBody
    public String helloRequestPath(@PathVariable String name, @PathVariable int age)
    {
        return String.format("Hello, @PathVariable.<br> name = %s, age = %d", name, age);
    }

     

     

     

    RequestParam.   QueryString 방식이라고도 부른다.

    // [Request sample]
    // GET http://localhost:8080/hello/request/form/param?name=Robbie&age=95
    @GetMapping("/form/param")
    @ResponseBody
    public String helloGetRequestParam(@RequestParam String name, @RequestParam int age) {
        return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
    }

     

     

    @RequestParam은 생략 가능
    그리고 값을 안넣을때 에러가 나지 않게 하려면
    @RequestParam(required = false) 라고 하면 된다.  
    대신 값을 저장하지않아도 에러가 나진않지만 null이 들어간다.

    이 옵션은 @PathVariable에도 있다.

     

     


     

    바디부분에 쿼리스트링방식으로 데이터를 넣을수도 있지만,  @ModelAttribute를 사용해서 객체로 처리할 수도 있다.

     @ModelAttribute을 사용하면 바디에 쿼리스트링으로 들어온 데이터를 객체에 매핑에서 가져올 수 있다.

     

    // [Request sample]
    // POST http://localhost:8080/hello/request/form/model
    // Header
    //  Content type: application/x-www-form-urlencoded
    // Body
    //  name=Robbie&age=95
    @PostMapping("/form/model")
    @ResponseBody
    public String helloRequestBodyForm(@ModelAttribute Star star) {
        return String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", star.name, star.age);
    }

     

     

    Body의 QueryString 뿐만 아니라 RequestParam 방식도 모델로 받을 수 있다.

    // [Request sample]
    // GET http://localhost:8080/hello/request/form/param/model?name=Robbie&age=95
    @GetMapping("/form/param/model")
    @ResponseBody
    public String helloRequestParam(@ModelAttribute Star star) {
        return String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", star.name, star.age);
    }

     

     

    RequestParam 방식으로 데이터가 많이 넘어온다면, 클래스 하나를 만들고

    @ModelAttribute 를 사용해서 받아온다면 효율적으로 받아올 수 있다.

     

    또한 @ModelAttribute 를 사용해서 객체로 데이터를 받아올때는 setter 또는 오버로딩된 생성자가 반드시 필요하다.

    그리고 @ModelAttribute 또한 생략이 가능하다.

     


     

     

    // [Request sample]
    // POST http://localhost:8080/hello/request/form/json
    // Header
    //  Content type: application/json
    // Body
    //  {"name":"Robbie","age":"95"}
    @PostMapping("/form/json")
    @ResponseBody
    public String helloPostRequestJson(@RequestBody Star star) {
        return String.format("Hello, @RequestBody.<br> (name = %s, age = %d) ", star.name, star.age);
    }

     

    제이슨형식으로 넘어오는 데이터를 처리 -> 잭슨 라이브러리가 해준다.

    대신 스프링에게 처리해달라고 요청을 보내야하는데 @RequestBody를 이용해서 요청한다.

     

     

     

     

    요약하자면

    파라미터에 심플타입이 들어온다면 -> @RequestParam,  @PathVariable

    파라미터에 객체가 들어온다면 -> @ModelAttribute,  @RequestBody  

    를 사용하는것으로 이해하면 된다.

     

     

     


     

     

    DTO는 데이터 전송 및 이동을 위해 생성되는 객체

    클라이언트에서 보내오는 데이터를 객체로 처리할때 사용한다.

    (RequestBody나 ModelAttribute로 데이터를 처리했는데, 그때 처리하는 객체를 DTO 객체로 사용)

    서버의 계층 간 이동에도 사용한다.

     

    그리고 엔티티를 그대로 클라이언트에 반환하는 것이 아니라 DTO로 변환하여 반환할때도 사용

     

     

    requestDto를 entity로 바꾸는 과정

    @PostMapping("/memos")
    public MemoResponseDto createMemo(@RequestBody MemoRequestDto requestDto) {
       Memo memo = new Memo(requestDto);    
    }

     

    memo에 해당 생성자를 만들고 데이터를 넣어주면서 dto의 데이터를 엔티티(memo)로 변경완료

     

     

     

    Entity를 responseDto로 바꾸는 과정

    MemoResponseDto memoResponseDto = new MemoResponseDto(memo);

    그리고 MemoResponseDto에서 해당 생성자를 만들어주면 된다.  리퀘스트dto를 엔티티에 넣는것과 똑같음

     

     

     

     


     

     

     


    DDL   Data Definition Language  
    테이블이나 관계의 구조를 생성하는데 사용
    Create alter drop truncate  등  DB의 테이블과 관련되어있음


    DCL   Data Control Language   
    데이터의 사용권한을 관리
    Grant  Revoke


    DML   Data Manipluattion Language   
    테이블에 데이터를 검색, 삽입, 수정, 삭제하는데 사용
    Select insert update delete

     

     

     

     

    '스파르타 강의 정리' 카테고리의 다른 글

    스프링 2주차 복습  (1) 2023.11.14
    Entity 연관관계, @OneToOne  (0) 2023.11.10
    회원가입 구현 및 Filter  (0) 2023.11.08
    3-5, 3-6 JWT  (0) 2023.11.07
    3-3, 3-4 인증과 인가 / 쿠키와 세션  (0) 2023.11.07
Designed by Tistory.