본문 바로가기
생각 정리

[패스트캠퍼스] Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강_7주차 학습일지

by jaeyoungb 2022. 7. 28.

# Spring Boot

Spring의 별도의 세팅이 거의 필요하지 않고 프로덕션 제품 수준의 스프링 기반 웹 어플리케이션을 손쉽게 만들 수 있음

 

# Talend API Tester - Rest API Controller

(크롬 웹스토어)

 

# server port 번호 바꾸는 법

main - resources - application.properties 에서 server.port=???? 으로 바꾸어주면 됨 ( 물음표에 숫자 넣기 )

 

# 해당 Class 를 REST API 를 처리하는 Controller 로 등록하는 방법

Annotation 을 써주어야 하는데, @RestController 를 사용함

 

# @RequestMapping : 주소 할당 / URI 를 지정해주는 Annotation

 

@RestController // 해당 Class는 REST API를 처리하는 Controller로 등록
@RequestMapping("/api") // RequestMapping은 URI를 지정해주는 Annotation
public class ApiController {

 

HTTP Method 특성

 

## GET API

@RestController

@RequestMapping

@GetMapping

- GET 방식은 웹 브라우저에서도 볼 수 있음

@GetMapping("/hello") // http://localhost:9090/api/hello 주소로, value 값으로 지정되면서 path로 동작
public String hello() {

    return "hello spring boot!";
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

@GetMapping(path = "/hello")    // http://localhost:9090/api/get/hello로, value 값이 아닌 명시적으로 path 값 지정
public String getHello() {

    return "get Hello";
}

>> path 를 통해서 경로를 명시적으로 표현할 수도 있음

 

@PathVariable

@GetMapping("/path-variable/{name}")    // http://localhost:9090/api/get/path-variable/{name}
public String pathVariable(@PathVariable String name) {

    System.out.println("PathVariable : " + name);
    return name;
}

>> 일반적인 PathVarible 추가 방법

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

@GetMapping("/path-variable/{name}")    // http://localhost:9090/api/get/path-variable/{name}
public String pathVariable(@PathVariable(name = "name") String pathName) {

    System.out.println("PathVariable : " + pathName);
    return pathName;
}

>> 변수명이 겹칠 때 사용하는 PathVarible 추가 방법

 

@RequestParam

query paramter 는 검색을 할 때에 여러가지 인자를 말함, 주로 검색할 때 쓰임

URI에서 ?(key)=(value)&(key2)=(value2) 형태

// http://localhost:9090/api/get/query-param?user=bang&email=bang@gmail.com&age=20
@GetMapping(path = "/query-param")
public String queryParam(@RequestParam Map<String, String> queryParam) {

>> key & value 의 형태이기 때문에, Map 을 사용하여 query parameter 들을 넣어줄 수 있음

>> key 값에 뭐가 들어올지는 모르는 단점이 있음

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

@GetMapping("/query-param02")
public String queryParam02(
        @RequestParam String name,      // 명시적으로 key 값을 RequestParam Annotation을 통해 변수로 지정하고 시작할 수 있다.
        @RequestParam String email,
        @RequestParam int age
) {
    return name + " " + email + " " + age;
}

>> 명시적으로 key 값을 설정하고 넣어줄 수도 있음

이 경우, 나오는 return 값

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

@GetMapping("/query-param03")
public String queryParam03(UserRequest userRequest) {   // 현업에서 제일 많이 쓰는 방식, UserRequest라는 클래스를 생성해서 객체로 넣어버림

    System.out.println(userRequest.getName());
    System.out.println(userRequest.getEmail());
    System.out.println(userRequest.getAge());

    return userRequest.toString();
}

>> dto 객체 형태로 mapping 하는 방식 ( parameter 가 생길 때마다, @RequestParam 을 해줄 순 없기에 )

>> @RequestParam 을 써주지 않음

>> 현업에서 제일 많이 쓰는 방식

위의 경우와 다르게 return 값이 객체 형태로 나옴

 

## POST API

Sublime Text : Json 사용 도구

key 와 value 의 형태로 되어있고, 이걸 표현할 수 있는 형태들

- snake case : phone_number

- camel case : phoneNumber

 

@PostMapping

@PostMapping("/post")   // http://localhost:8080/api/post
public void post(@RequestBody Map<String, Object> requestData) {
    requestData.forEach((key, value) -> {
        System.out.println("key : " + key);
        System.out.println("value : " + value);
    });
}

>> key & value 형태이기 때문에, Map<> 으로 받을 수 있음

>> @RequestBody 를 붙여줘야 함

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

@PostMapping("/post02")     // http://localhost:8080/api/post02
public void post(@RequestBody PostRequestDto requestData) {

    System.out.println(requestData);
}

>> dto 객체 형태로 post mapping 해주는 방식

>> post 로 들어오는 json 데이터를 mapping 하기 위해서는 @RequestBody 를 명시적으로 적어줘야 함

 

@JsonProperty

@JsonProperty("phone_number")
private String phoneNumber; // phone_number

>> Java 에서는 camel case 로 작성을 하는데, 보내는 쪽에서 snake case 로 key 가 작성되어 있는 경우, parshing 이 안되기 때문에 이렇게 @JsonProperty 를 이용해서 특정 변수에 json 이름을 할당시켜야 함

 

 

## PUT API

 

@PutMapping

@PutMapping("/put/{userId}")
public PostRequestDto put(@RequestBody PostRequestDto requestDto, @PathVariable(name = "userId") Long id) {
    System.out.println(id);
    return requestDto;
}

>> post api 와 동일하게 받기 때문에, @RequestBody 를 적어주고 PostRequestDto 객체를 받음 

>> put api 에서 pathvariable 받는 방법이고, 중괄호로 묶어둔 userId(path variable) 는 메서드에서 선언한 변수 이름과 같아야 함, 그럴 수 없다면 위와 같이 표현하면 됨

 

@JsonNaming

@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class PostRequestDto {

>> @JsonNaming Annotation 을 사용하여 해당 class 에 일괄적으로 모든 json rule 을 적용시켜줄 수 있음

 

 

## DELETE API

@DeleteMapping("/delete/{userId}")
public void delete(@PathVariable String userId, @RequestParam String account) {

    System.out.println(userId);
    System.out.println(account);

    // delete -> 리소스 삭제, 이미 리소스가 없는 상태이더라도 error가 아닌 '200' OK를 항상 리턴한다.
}

>> delete api 는 데이터가 이미 있든 없든, 데이터가 지워지는 것이므로 멱등성을 띔

>> 객체를 받을 수도 있지만, 데이터를 지우는 것은 객체 전체를 다루기 보다는 범위가 적으므로 잘 안씀