• 해당 컨트롤러에서는 기본적인 GET요청 POST요청시 사용자와 데이터를 주고 받는 방식에 대한 패턴에 대한 학습을 진행

  • 어노테이션이란

    Untitled

    • 어노테이션은 자바 코드에 추가되는 특별한 형태의 메타데이터로, 클래스, 메서드, 변수 등에 대한 추가적인 정보와 기능을 제공
  • @Controller 어노테이션

    • Class위에 @Controller 어노테이션을 붙임으로서, 해당 클래스가 컨트롤러임을 명시
      • 컨트롤러 클래스는 http request와 http response를 쉽게 처리해주는 기능수행
      • @Controller가 붙어있는 모든 클래스는 개발자의 별도의 객체 생성 없이도, 스프링에 의해 객체로 만들어져 메모리에 등록
    • @RequestMapping
      • 일반적으로 클래스 위에 붙는 키워드
      • 예를 들어)localhost:8080/member라는 url로 사용자의 HTTP요청이 들어왔을때, @RequestMapping (“/member") 어노테이션이 붙어있는 클래스가 해당 요청을 처리하도록 분기처리
    • @Getmapping 또는 @PostMapping
      • 일반적으로 메서드에 위에 붙는 키워드
      • 예를 들어)localhost:8080/member라는 url로 사용자의 HTTP요청이 들어왔을때, @GetMapping(“/member") 어노테이션이 붙어있는 메서드가 해당 요청을 처리하도록 분기처리
  • HTTP요청 처리 시작

    image.png

    • 클라이언트에서 HTTP 요청이 서버로 들어오면 스레드(자원) 할당
    • 스프링의 DispatcherServlet 객체에 의해 요청 URL과 HTTP 메서드(GET, POST 등)을 분석
    • 등록된 Controller를 분석하여 경로에 맞는 메서드에 사용자의 http요청을 전달
  • Get요청의 처리 패턴

    • 사용자가 데이터를 조회요청 하는 경우를 get요청이라 하고, 스프링에서는 GetMapping어노테이션을 통해 사용자의 get요청을 처리
    • GetMapping과 ResponseBody에 따른 패턴
      • 패턴1)메서드 위에 @GetMapping과 @ResponseBody 같이 있는경우
        • HTTP 응답 본문에 리턴타입의 데이터를 넣어 반환
        • 반환형식
          • 메서드의 리턴타입이 String일 경우, 일반 Text형태로 리턴
          • 메서드의 리턴타입이 객체타입일 경우, json형로 리턴
        • @RestController를 사용하면 모든 메서드에 @ResponseBody가 자동 적용
        • 서버에서 데이터만을 반환하는 아키텍처를 rest api 방식 또는 restful한 방식이라 칭함
      • 패턴2)메서드 위에 @GetMapping 어노테이션만 있는 경우(리턴타입으로 String 지정)
        • 해당 문자열명에 해당하는 html화면을 찾아 화면을 리턴
        • resources/templates 폴더가 return할 html화면의 위치
        • spring서버에서 화면을 반환하는 아키텍처를 mvc 패턴 이라고 칭함
    • Get요청에서의 데이터 추출 패턴
      • 사용자로부터 GET요청을 받을 경우, url을 통해 원하는 데이터를 받아 추출

      • 패턴1)@RequestParam사용

        • http://localhost:8080/member-param?id=10형태의 url에서 id값 추출
        @RequestParam(value = "id")Long id
        
        • 일반적으로 id값을 통한 조회보다는 name, email 등 데이터에 대한 검색시에 많이 사용
        • 키값이 많을경우 @ModelAttribute를 사용하여 객체로 데이터 수신
        @ModelAttribute Member member
        
        • 이를 데이터바인딩이라 부르고, @ModelAttribute 어노테이션은 생략 가능
      • 패턴2)@PathVariable사용

        • http://localhost:8080/member-path/10형태
        @GetMapping("/path/{inputId}")
        @ResponseBody
        public String path(@PathVariable Long inputId){
        
        • URL자체에서 자원의 구조를 명확하게 표현한다는 점에서 장점
  • Post요청의 데이터 추출 패턴

    • 사용자가 데이터를 등록, 수정하는 하는 경우에 Post요청이 사용되고, 스프링에서는 PostMapping어노테이션을 통해 사용자의 get요청을 처리

    • 일반적으로 request 정보가 body부에 담겨오고 이를 처리 하는 방식

    • PostMapping 패턴1

      • Content-Type 헤더 application/x-www-form-urlencoded 또는 Multipart/form-data로 들어오는 경우

      • 데이터가 내부적으로 name=John&[email protected]과 같은 형식

      • 1-1)@RequestParam 사용

        • @RequestParam 사용하여 name, email등 개별 데이터 수신
        @RequestParam(value = "name")String inputName,
        @RequestParam(value = "email")String inputEmail
        
      • 1-2)@ModelAttribute사용

        • 키값이 많을경우 @ModelAttribute를 사용하여 객체로 데이터 수신
        @ModelAttribute Member member
        
        • 이를 데이터바인딩이라 부르고, @ModelAttribute 어노테이션은 생략 가능
        • @RequestParam과 함께 병행하여 사용하는것도 가능
        @ModelAttribute Member member,
        @RequestParam(value = "photo")MultipartFile photo
        
    • PostMapping 패턴2

      @RequestBody Member member
      
      • @RequestBody와 객체를 사용하여 JSON 데이터 수신
      • @RequestBody 어노테이션은 HTTP 요청 본문에 담긴 데이터 중 JSON 형식의 문자열을 Java 객체로 변환하는 데 사용
    • PostMapping 패턴3

      • @RequestPart을 사용하여 json과 파일을 함께 수신 처리

      • 프론트엔드

        • js코드의 FormData객체 안에 json과 파일 요소를 각각 append

        • 포스트맨으로 테스트할경우 form-data 형식에 각각 json문자열과 파일을 넣어전송

          image.png

      • 백엔드

        • @RequestPart 사용하여 json과 파일요소 각기 처리
  • 그외 설정

    • application.properties파일 설정
      • application.properties 는 키-값 쌍 형식으로 구성된 환경파일
        • 데이터베이스 연결, 포트번호 설정 등 Spring Boot 애플리케이션의 동작 및 환경 설정을 정의
        • 예를 들어 server.port = 8081
      • 일반적으로 가독성이 좋은 yml 또는 yaml 확장자로 변경하여 사용
        • 이 경우, 설정 항목은 들여쓰기로 계층 구조를 나타내며, 키와 값은 콜론(:)으로 구분
        • 예를 들어 port를 변경시 application.yml에서 아래와 같이 사용
          • server: port: 8081
    • cors설정
      • CORS(Cross-Origin Resource Sharing)는 웹 브라우저가 동일 출처 정책(Same-Origin Policy)만을 허용하고, 다른 출처의 리소스에는 접근할 수 없도록 허용하는 메커니즘
      • 이는 웹 애플리케이션이 다른 도메인에서 실행 중인 서버와 안전하게 상호작용할 수 있도록 하기 위해 사용
    • reload 자동화
      • 소스수정 때마다 서버 재시작 불편한 경우 설정
      • 자동 reload를 위한 build.gradle에 라이브러리 추가
      • application.properties 설정 추가
      • 인텔리제이 Settings
    • 디버깅 툴사용