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

  • 먼저 application.properties파일을 가독성이 좋은 yml형식으로 변경

    • application.properties 는 키-값 쌍 형식으로 구성된 환경파일
      • 데이터베이스 연결, 포트번호 설정 등 Spring Boot 애플리케이션의 동작 및 환경 설정을 정의
      • 예를 들어 server.port = 8081
    • 일반적으로 yml 또는 yaml 확장자로 변경하여 더 많이 사용
      • 이 경우, 설정 항목은 들여쓰기로 계층 구조를 나타내며, 키와 값은 콜론(:)으로 구분
      • 예를 들어 port를 변경시 application.yml에서 아래와 같이 사용
        • server: port: 8081
  • 어노테이션이란

    Untitled

    • 어노테이션은 자바 코드에 추가되는 특별한 형태의 메타데이터로, 클래스, 메서드, 변수 등에 대한 추가적인 정보를 제공
    • 어노테이션이 가능한 기술적 근거는 java의 리플렉션, 프록시 등의 기술
      • 리플렉션은 런타임에 클래스의 메타데이터를 조회하거나 수정할 수 있게 해주는 Java API
  • Controller

    • 컨트롤러는 사용자가 url을 통해 http요청을 했을경우, 요청과 응답을 쉽게 처리해주는 역할
    • Class위에 @Controller 어노테이션을 붙임으로서, 해당 클래스가 컨트롤러임을 명시
    • @Getmapping, @RequestMapping 등
      • 일반적으로 메서드에 위에 붙는 키워드로서, 사용자의 구체적인 요청을 처리
      • 예를 들어)localhost:8080/hello 라는 url로 사용자가 요청을 하였을때 @GetMapping(“/hello") 어노테이션이 붙어있는 메서드가 해당 요청을 처리
      • Controller에도 특정 경로를 지정하고 싶다면, 아래와 같이 설정 @Controller @RequestMapping("/hello") public class HelloController {}
        • 위와 같이 controller가 설정되면, 모든 메서드 호출시 localhost:8080/hello/ 요청해야 원하는 메서드까지 요청이 도달하게 됨.
  • Get요청의 패턴

    • 사용자가 데이터를 등록, 삭제, 수정하는 것이 아닌 일반적인 조회 요청의 경우를 get요청이라 하고, 스프링에서는 GetMapping을 통해 사용자의 get요청을 처리
    • GetMapping 패턴1 : @GetMapping 어노테이션만 있는 경우
      • 특정 문자열을 return할 경우 해당 문자열명에 해당하는 templates 화면을 찾아 렌더링
        • resources/templates 폴더가 기본위치
        • 만약 템플릿엔진(jsp, 타임리프 등)을 사용하여 화면에 특정 변수값을 사용하고 싶다면, Model을 사용하여 변수값(또는객체)를 주입
    • GetMapping 패턴2 : @GetMapping과 @ResponseBody 같이 있는경우
      • @ResponseBody의 경우 화면(view)를 반환하는 것이 아닌 HTTP 응답 본문에 직접 데이터를 쓰는 것을 의미
      • String타입리턴시 문자열이 리턴
      • 객체타입을 리턴시 json형태의 문자열이 리턴
  • 사용자로부터 데이터 recieve 패턴

    • get요청일 경우
      • 사용자로부터 url을 통해 데이터를 수신 받게 된다.
      • @RequestParam사용
        • http://localhost:8080/hello-param?id=10형태
          • ?를 사용하여 변수명=변수값의 형태로 값을 가져오는 parameter방식
          • Param이 많을경우 객체로 대체가능
            • 요청 데이터를 객체로 바인딩하기 위해 @ModelAttribute를 사용(생략가능)
            • 기본생성자와 setter를 활용하여 spring에서 객체 생성
      • @PathVariable사용
        • http://localhost:8080/hello-path/10형태
          • @GetMapping(“/hello/{id}”)를 사용하여 id값을 받아오는 방식
        • URL이 자원의 구조를 명확하게 표현한다는 점에서 RESTful API 디자인
    • post요청일 경우
      • url이 아닌 body부의 request 데이터를 받아 오는 post요청 방식
      • 일반적인 form태그를 사용한 방식
        • @RequestParam 사용하여 데이터 수신
        • 데이터가 내부적으로 name=John&age=30과 같은 키, 밸류 형식
        • Content-Type 헤더가 application/x-www-form-urlencoded
          • 파일과 함께라면 Multipart/form-data
        • javascript를 통해 form 요청도 동일
      • javascript를 통한 json데이터 post 방식
        • @RequestBody사용하여 데이터 수신
        • @RequestBody 어노테이션은 HTTP 요청 본문에 담긴 데이터 중 주로 JSON을 Java 객체로 변환하는 데 사용
          • 이에 반해 @RequestBody가 없는 데이터 바인딩은 Form 데이터나 URL 쿼리 파라미터를 객체에 매핑하는 데 주로 사용
        • 데이터가 내부적으로 json 형식
        • Content-Type 헤더는 application/json
        • 파일과 함께일 경우
          • 요청파트
            • 프론트엔드에서 Multipart/form-data 안에 json과 파일 요소를 각각 append
            • 포스트맨에서는 Multipart/form-data 형식에 각각 json문자열과 파일을 multipart/form-data형식을 전송
          • Spring파트
            • @RequestPart 사용하여 json과 파일요소 각기 처리
  • intellij 설정 팁

    • reload 자동화
      • 소스수정 때마다 서버 재시작 불편한 경우 설정
      • 자동 reload를 위한 build.gradle에 라이브러리 추가
        • implementation ‘org.springframework.boot:spring-boot-devtools’
      • application.properties 설정 추가
        • livereload.enabled=true
        • freemarker.cache=false
      • 인텔리제이 Settings
        • compiler -> Build project automatically
        • Advanced Settings -> Allow auto-make to start even if developed application is currently running
    • 디버깅 툴사용
      • 디버깅 툴을 사용하여 브레이크 포인트 지점까지 사용자의 요청정보 쉽게 파악

      • 브레이크 포인트에서 실행이 멈춤에 유의

        Untitled