240809 내일배움캠프 백엔드 Java 6기 TIL : Spring 입문강의 1일차

박대현·2024년 8월 9일
0

난해하다 난해해 영어든, 학습지로 잠깐했던 일본어든, 컴퓨터언어인 Java든, 오늘 새로배운 Spring이든..
새로운 언어를 배우는 처음은 너무 힘들다.. 익숙해질거라 믿고 하는거지뭐..😇🤧 오늘 배운걸 정리하자

Spring 준비

1. 그레이들(Gradle)이란 무엇일까?

Gradle이란?

: 빌드 자동화 시스템

  • 빌드란, 소스코드를 실행가능한 것으로 만드는 일련의 과정

build.gradle

: 빌드 스크립트

  • dependencies {}에 필요로하는 외부라이브러리를 적어놓기만 해도 알아서 관리해줌
  • plugins {}에서 버전 변경 가능

2. 서버란 무엇일까?

네트워크란?

: 여러대의 컴퓨터 또는 장비가 정보를 주고받게 하는 기술

Client와 Server

:클라이언트가 request -> IP & 포트 -> 서버에 도착 & 서버가 response

웹 서버란?

:http를 이용하여 클라이언트 요청을 응답해주는 컴퓨터

API란?

:다른 시스템과 통신하기 위한 규칙

RESTful API란?

:http를 준수& 설계가 잘되있다 = RESTful

Apache Tomcat이란?

:Apache(정적인 컨텐츠를 다룸) + Tomcat(동적인 컨텐츠를 다룸(WAS))

  • Spring boot는 이를 내장 -> 우린 프로그래밍만 신경쓰면 됨

3. HTTP란 무엇일까?

HTTP란?

:통신규약(데이터를 주고받을 때 정해둔 약속

우리는 어떻게 HTTP로 데이터를 주고 받을까?

:Request & Response

브라우저에서 HTTP가 동작하는 것을 직접 확인해보기

:F12(dev tools) - Network탭 - Name탭 - Headers, Response

추가 데이터? 데이터? 뭐가 다른걸까?

  • Header(추가데이터, 메타데이터)
    • 브라우저가 어떤 페이지를 원하는지
    • 어떤 형식으로 데이터를 보낼지
  • Payload(데이터, 실제데이터)
    • Response는 항상 Payload 보낼 수 있음
    • Request는 'Get Method 제외'하고 Payload 보낼 수 있음

4. 테스트 코드

테스트의 필요성

:일어나.. 버그잡아야지..

JUnit 사용 설정

:이미 gradle.build의 dependencies에 있음

테스트 파일 생성

:Alt + Insert - Test

테스트 코드 작성해보기!

: 자체 테스트 실행환경을 가지고있어 각각 메서드별로 실행 가능

5. Lombok과 application.properties

Lombok이란?

:코드절약해주는 라이브러리, @Getter,@Setter 등등 라고 써놓으면 컴파일할때 자동으로 생성해줌

application.properties

:자동설정값 변경가능(ex 포트번호)

Spring MVC

1.Spring MVC란 무엇일까?

🔴MVC 디자인 패턴이란?🔴

  • Model : 데이터와 비즈니스로직 담당
  • View : 사용자 인터페이스 담당
  • Controller : 사용자의 입력을 받아 M에 전달, 그 결과를 바탕으로 V를 업데이트

Spring MVC란?

2.Controller 이해하기

Controller의 장점, @Controller

-유사한 성격의 API를 묶어 관리하게 해줌

@GET, @POST, @PUT, @DELETE, @RequestMapping

package com.sparta.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping("/api") //중복되는 URL 단축시켜줌
public class HelloController {
    @GetMapping("/hello")
    @ResponseBody
    public String hello() {
        return "Hello World";
    }

    @GetMapping("/get")
    @ResponseBody
    public String get() {
        return "GET Method 요청";
    }

    @PostMapping("/post")
    @ResponseBody
    public String post() {
        return "POST Method 요청";
    }

    @PutMapping("/put")
    @ResponseBody
    public String put() {
        return "PUT Method 요청";
    }

    @DeleteMapping("/delete")
    @ResponseBody
    public String delete() {
        return "DELETE Method 요청";
    }
}

위에 뒤이어 추가코드를 짤때, 경로는 중복될수 있어도 메소드(@ㅇㅇㅇMapping)는 중복불가능하다.

3.정적 페이지와 동적 페이지

정적 페이지 처리하기

  1. static 폴더 : 직접 접근
// http://localhost:8080/hello.html
@GetMapping("/static-hello")
public String hello() {
    return "hello.html";
}
  1. Redirect
  • 써야하는 이유 : Controller를 거쳐 html 반환이 가능하지만, thymeleaf라는 템플릿 엔진을 사용중 - 이 엔진은 동적페이지 처리를 위한 엔진이며, 자동적으로 Controller에서 html파일을 찾는 경로를 /resources/templates로 설정함
@GetMapping("/html/redirect")
public String htmlStatic() {
    return "redirect:/hello.html";
}
  1. Template engine에 view전달
@GetMapping("/html/templates")
public String htmlTemplates() {
    return "hello";
}

동적 페이지 처리하기

private static long visitCount = 0;

...

@GetMapping("/html/dynamic")
public String htmlDynamic(Model model) {
    visitCount++;
    model.addAttribute("visits", visitCount);
    return "hello-visit";
}
  • Client요청을 Controller에서 Model로 처리 - Template engine(thymeleaf)에게 View, Model 전달 - Template engine(thymeleaf)이 View에 Model을 적용 - Client에게 View전달

4.데이터를 Client에 반환하는 방법

Response 트렌드의 변화

: 느슨하게

JSON 데이터 반환하는 방법

  • @Controller 애너테이션을 달고 그 아래 메서드에서 반환타입을 String으로 하고 return을하면 String이름에 부합하는 '페이지파일(html)'를 찾아서 반환
  • 그래서 페이지파일(html)이 아닌 JSON데이터자체를 반환하고싶다@ResponseBody 애너테이션을 추가해야함
  1. JSON 데이터 반환값 : String
@GetMapping("/response/json/string")
@ResponseBody
public String helloStringJson() { 
    return "{\"name\":\"Robbie\",\"age\":95}";
}

JSON형태의 String타입으로 변환해서 사용

  1. JSON 데이터 반환값 : 자바클래스
@GetMapping("/response/json/class")
@ResponseBody
public Star helloClassJson() {
    return new Star("Robbie", 95);
}

객체를 자동으로 변환해줌

@RestController

= Controller + ResponseBody

5.Jackson이란 무엇일까?

Jackson 라이브러리

  • 4-2처럼 스프링 내부에서 자동으로 객체를 JSON타입으로 바꿔줌
    : 근데 수동으로 Object와 JSON 왔다갔다해야할 때가 있음 -> Jackson

Object To JSON : Serialize(직렬화)

@Test
@DisplayName("Object To JSON : get Method 필요")
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);
}
  • objectMapper의 writeValueAsString메서드 사용
  • 해당 object에 getter 필요

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

    Star star = objectMapper.readValue(json, Star.class);
    System.out.println("star.getName() = " + star.getName());
}
  • objectMapper의 readValue 메서드 사용
  • 해당 object에 기본생성자 + Getter or Setter 필요

6.Path Variable과 Request Param

Path Variable

// [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);
}
  • 데이터를 받고자 하는 위치의 경로에 {data} 중괄호 사용
  • 해당 요청 파라미터에 @PathVariable 애너테이션과 함께 중괄호 선언 변수명과 변수타입을 선언하면, 해당경로 데이터 받아올 수 있음

Request Param

  1. Request Param 방식
// [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);
}
  • 경로 마지막에 ?와 &를 사용하여 추가가능
    • ?key=value&key=value...
  • 해당 요청 파라미터에 @RequestParam 애너테이션과 함께 key 부분에 선언한 변수명과 변수타입을 선언하면, 해당경로 데이터 받아올 수 있음
  1. form태그 POST
// [Request sample]
// POST http://localhost:8080/hello/request/form/param
// Header
//  Content type: application/x-www-form-urlencoded
// Body
//  name=Robbie&age=95
@PostMapping("/form/param")
@ResponseBody
public String helloPostRequestParam(@RequestParam String name, @RequestParam int age) {
    return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}
  • 해당 데이터가 body에 key=value&key=value...형식으로 담겨짐
  • @RequestParam 애너테이션을 사용하여 받아올수있음
    • 생략가능
    • @RequestParam(required = false)로 설정하면 값이 없어도 오류발생안함. 대신 null로 초기화

7.HTTP 데이터를 객체로 처리하는 방법

  • 주의점 : 해당 객체의 필드에 데이터를 넣어주기 위해 set or get 메서드 또는 오버로딩된 생성자가 필요

@ModelAttribute

  1. form태그 POST
// [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);
}
  • 해당 데이터를 Java 객체형태로 받는 법 : @ModelAttribute 애너테이션을 사용한 후 Body 데이터를 받아올 객체를 선언(Star Star)
  1. Query String 방식
// [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 애너테이션을 사용하면 객체로 받아올 수 있음

@RequestBody

// [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);
}
  • http body부분에 JSON형식으로 데이터가 넘어왔을 때, 처리하기 위한 클래스를 만들고 파라미터에 넣어주고 그앞에 @RequestBody 꼭달기

0개의 댓글