2023.06.13.화.TIL

heeh·2023년 6월 13일

TIL

목록 보기
20/82
post-thumbnail

Spring 입문 강의 듣기

  • Serclet Code
    • Spring MVC에서 Serclet을 처리하기 위해서 @WebServlet을 하고 urlPatterns주기
      → 따로 XML 설정 하지 않아도 경로로 Servlet이라는 Class가 요청을 받음

      @WebServlet(urlPatterns = "/user/login")
      public class UserLoginServlet extends HttpServlet
  • Json 형식
    "timestamp": "2023-06-12T15:21:03.884+00:00",
        "status": 405,
        "error": "Method Not Allowed",
        "path": "/api/get"
  • api 경로 중복될 수 있음 / 메서드(get, post 등)는 달라야 함
  • @RequestMapping에 ("/api/")를 붙여주면 다른곳에 안 붙어도 됨
    • 중복 지양
    • 패스가 아래에 전부 적용됨
      @RequestMapping("/api/")
      .
      .
      .
      @GetMapping("/get") //원래는 ("/api/get")
      .
      .
      .
      @PostMapping("/post") //원래는 ("/api/post")
      .
      .
      .
  • 정적 웹 페이지 : 이미 완성되었고 변할게 없기 때문에 Controller로 반환할 필요 없이 바로 호출하면 됨
    @GetMapping("/static-hello")
        public String hello() {
        return "hello.html";
    }
    
    -> http://localhost:8080/hello.html
    • Controller로 반환하여 호출할 수는 있지만 의미는 없음
      → 이미 내부적으로 경로 설정 되어 있는데, static 폴더를 찾을 수 있게끔 경로(thymeleaf) 주석처리 필요
      http://localhost:8080/hello-html
    • Controller를 거쳐서 정적 HTML 파일 반환 해야할 경우
      → 재호출(redirect), 한 번 돌아서 호출, 주석처리 없이
       @GetMapping("/html/readirect")
          public String htmlStatic() {
          return "redirect:hello.html";
      }
      
      -> http://localhost:8080/html/readirect
      -> 302 : readirect과 관련
    • 정적 페이지도 templates 폴더에 들어갈 수 있긴 함
    • templates에 있는 html을 반환할 때, 규칙이 정해져 있음
      @GetMapping("/html/templates")
          public String htmlTemplates() {
          return "hello";
      }
      • html 빼고 앞에 이름만 문자열로 내보내도 자동으로 html가 붙고 templates 폴더 안에 있는 html을 찾아서 반환
      • Controller라는 Annotation이 달린 Class에서 html의 이름 문자열을 반환
        → templates에 있는 html 파일 반환 가능
  • alt+1 : 프로젝트창 없애기
  • 동적 웹 페이지
    private static long visitCount = 0;
    
    @GetMapping("/html/dynamic")
        public String htmlDynamic(Model model) {
            visitCount++;
            model.addAttribute("visits", visitCount);
            return "hello-visit";
    }
    • private static long visitCount = 0; : 0인 초기값

    • visitCount++; : 증감 연산자에 의해서 증가

    • (Model model) : 값이 여기에 담김

    • "visits” : 의 이름으로

    • return "hello-visit"; 으로 반환함

      html의 
      
      (방문자 수: <span th:text="${visits}"></span>)
    • ViewResolver에 의해서 Model에 들어 있던 visits가 "${visits}" 로 Mapping 됨

    • 새로고침 할 수록 방문자 수가 늘어남

    • 외부적으로는 방문자 숫자가 올라감, 내부적으로는 많은 코드 필요와 동작을 하고 있음

  • ctrl+e : 히스토리 확인
  • Spring은 내부적으로 JAVA의 객체를 JSON 타입으로 자동 변환함
  • @RequestMapping ("/response/rest") /response/rest 가 모두 포함됨
    • @GetMapping ("/json/string") 가 밑에 있다면 /response/rest/json/string
  • @ResponseBody + @Controller = @RestControlle
    • @RestController 는 다른곳에 @ResponseBody를 달아주지 않아도 됨
  • ObjectMapper를 사용할 때는 필요한 요구 조건이 있다
    • serialize : 직렬화, 객체(Object)를 JOSN 형태의 String(문자열)으로 변환하는 과정
      • Object To JSON : get Method 필요
    • deserialize : 역직렬화, JOSN 형태의 String(문자열)을 객체(Object)로 변환하는 과정
      • JSON To Object : 기본 생성자 & (get OR set) Method 필요
    • key 값을 잘 맞춰주어야 함
  • Path Variable 방식
    • @PathVariable 를 사용해서 받아가지고 String으로 만들어서 브라우저에 반환
    • {} 중괄호 사용
  • API 전송 방식은 프론트엔드와 상의/협업
  • Request Param 방식(Query String 방식)
    • @RequestParam 를 사용해서 받아가지고 String으로 만들어서 브라우저에 반환
    • body 부분이 들어와 있음
    • key, value
    • @RequestParam(required = false) 값이 없으면 null
  • form 태그 POST / Post방식 사용하여 @RequestParam으로 받기
    • @RequestParam 앞에 쓰면 생략 가능
    • @RequestParam(required = false) 값이 없으면 null
  • form 태그 POST / @ModelAttribute 으로 인해 객체형태로 처리
    • (@ModelAttribute Star star)
      → Star star : 객체
      - Body 부분에 들어온 Query String 방식의 데이터를 객체에 Mapping해서 가지고 올 수 있음
  • Jackson라이브러리 처럼 field의 이름을 꼭 클라이언트에서 보내주는 데이터와 일치해야 함
    → 일치하지 않으면 null으로 표시
    - ex) 데이터 전송은 name, 서버에서는 nam → 변환과정에서 일치하지 않음
  • Request Param 방식(Query String 방식)으로 넘어온 데이터도 @ModelAttribute 으로 받을 수 있음
    • @RequestParam으로 여러개를 많이 받아 오는 것은 유지보수에도 좋지 않기 때문에 객체를 한 번에 받아 올 수 있음
    • 오버로딩된 생성자, Setter 필요 / 없으면 null = 데이터를 받아올 수 없음
  • ctrl+alt+o : 사용하지 않는 import 자동 삭제
    • Class 우측 클릭 → Optimize import 클릭
  • 모든 @ModelAttribute @RequestParam 생략 가능
    • 생략하면 안보여서 어떻게 구분?
      • Spring은 해당 파라미터가 SimpleValueType이면 @RequestParam
        • SimpleValueType : int, Integer, Wrapper, Date 등 원시타입
      • 아니라면@ModelAttribute
        • Class, Object 등
  • Body부분에 JSON형식으로 들어옴
    • JSON To Object
    • Body부분에 JSON형식으로 데이터가 넘어왔을 때 처리를 위해 Class를 만들어서 파라미터에 넣어주고 @ResponseBody 들 이용하여 정보 받아옴
  • new project
    • Spring Web
    • Thymeleaf
    • Lombok
  • DTO
    • 순수 JAVA Class, 데이터를 이동할 때 사용
  • Memo 조회하기 (Post)
    @GetMapping("/memos")
        public List<MemoResponseDto> getMemos() {
            // Map To List
            List<MemoResponseDto> responseList = memoList.values().stream()
                    .map(MemoResponseDto::new).toList();
    
            return responseList;
        }
    }
    • memoList.values().stream()

      • .values()가 여러개면 .stream()이 for문 처럼 하나씩 돌림
    • .map 하나씩 돌리면 memo가 하나씩 나오고 변환할 수 있음

    • .stream()에 의해서 memo가 하나씩 나옴

      • ::new : 생성자를 찾을 수 있음
    • 생성자가 수행 되면서 .toList(); memoResponseDto 타입의 List 만들어 줌

profile
공부하자개발하자으쌰으쌰

0개의 댓글