Spring Controller, Annotation, Request 파라미터

선뀰·2024년 1월 15일
0

Spring

목록 보기
3/9

SW아키텍처

= sw 구조를 정의한 것이다. sw를 구성하는 요소들과 요소들의 관계를 정의한 것이다.

계층형 아키텍처 패턴

웹 서비스 개발에 주로 사용

  • SW를 서로 다른 역할을 하는 3~4개 계층으로 구분
    Presentation Layer
    Application Layer
    Business Layer
    Data Access Layer

계층 간에 호출을 하고 데이터를 주고 받으며 협력 -> 웹 서비스 구성

Spring Controller 이해

계층형 아키텍처의 Presentation Layer에 해당한다.

  • Client에 최종 응답
    view : Client가 요청에 대한 응답의 결과로 보게 되는 웹페이지
    data : Client가 요청에 대한 응답으로 받는 데이터

Annotation

Java 소스코드에 추가적인 정보를 제공하는 방법
@으로 시작하여 클래스, 메소드, 멤버변수, 파라미터 등에 부착 가능하다.

1) 자바 컴파일러에 정보 제공
2) 추가 작업 진행
3) run-time시 특정 동작을 실행

Framework 활용 = 규칙을 지키는 것

  • 기본 Annotation
    @Controller, @RestController, @RequestMapping이 기본이다.

Controller 코드

  • @Controller vs @RestController
    클래스 상단에 명시

  • @Controller : view를 응답 (html 파일) 따로 생성한다.
    templates 파일에 htm파일을 만든다.

  • @RestController : data를 응답 (문자열, JSON, XML 등)

@RequestMapping

특정 Request를 처리하는 메소드를 지정, 명시
Client의 요청이 왔을 때 Spring Framework에 의해 호출이 된다.
Spring Controller의 메소드는 URI에 따라 호출이 결정된다.

@RequestMapping(value = "/user") -> 메소드 정보를 명시한다.
RequestMapping Annotation에 URI Path 정보를 명시한다.

  • URI (Uniform Resouce Identifier)
    URL과 유사한 개념

요청하는 자원의 종류에 따라 이름을 정하고, 중복은 불가능하다.
특정한 자원에 접근하기 위한 이름 또는 주소이다.
https://www.google.com

웹 상의 모든 자원들은 URI를 갖고 있다.
ex. 웹 페이지, 이미지, 영상

Spring Contorller의 메소드들은 URI에 따라 호출이 결정된다.

  • 기본 도메인에 이어지는 '/path'에 의해 결정된다
    요청하는 자원의 종류에 따라 이름을 정한다.
    http://localhost:8080/user
    http://localhost:8080/posts
    http://localhost:8080/post/1

  • URI는 계층 관계로 표현이 가능하다. '/'로 계층을 구분
    중복이 불가능하다.
    www.codepresso-blog.com/user/paid
    /user/paid
    /user/enterprise

  • 네이밍 규약
    소문자 사용, 명사 형태로 작성, 두 단어 이상 연결 될 경우 '-'를 사용
    의미 있는 이름으로 일관성 있게 작성한다.

  • URL (Uniform Resource Locator)
    도메인 주소이다.

cf. Controller클래스 내부에 모든 메소드에 Path를 적용할 수 있다.

HTTP API의 개념

API(Application Programming Interface)

Interface란 두 개체 간의 정보를 공유하기 위한 방법이다.

  • API는 컴퓨터 간의 정보를 공유하기 위한 방법
    함수나 메소드를 호출하는 API
    HTTP등의 기술로 네트워크를 통한 원격 자원을 호출하는 API이다.

HTTP API vs REST API

  • HTTP API
    HTTP(S)를 활용하여 원격 데이터를 공유하기 위한 API

  • REST API
    웹에서 효율적으로 데이터를 공유하기 위한 아키텍처 스타일
    실무에서 모든 조건을 만족하여 구현하기 어렵다.

= 실무에서는 혼용하면서 사용하고, REST API명칭이 사용된다.

  • 호출 방법 : localhost:8080/user/enterprise
    localhost:8080/user/paid이런 식으로 검색이 가능하다.
    나중에 여러가지 로직을 활용할 수 있다.
@RestController
@RequestMapping(value="/user") // 공통적으로 사용되는 부분을 적는다. (중복되는 부분) 이렇게 되면 value="/user/paid"로 작성하지 않아도 된다.
public class UserController {
    @RequestMapping(value = "/paid")
    public String getPaidUser() {
        return "I'm a Paid User.";
    }

    @RequestMapping(value = "/enterprise")
    public String getEnterpriseUser() {
        return "I'm a enterprise User.";
    }

}

@RequestMapping(value = "/user") 공통적으로 사용하는 user부분을 클래스 상단에 붙인다.

Request 파라미터의 이해

Server에 요청 시에 추가적인 Data가 필요하다.

  • 은행에서 계좌 거래 내역 조회
    조건에 따라 내역 조회 후 드린다. server에 요청시 추가적인 Data가 필요하다. 로그인 되어 있는 사용자 정보 및 페이지 데이터를 요청과 함께 전송한다.

  • 블로그의 글 작성하려면
    사용자 정보, 제목 및 글 데이터를 요청과 함께 전송

ex. Facebook의 Feed를 조회 하려면?
로그인 되어 있는 사용자의 정보 및 페이지 데이터를 요청과 함께 전송해야 한다.

Request 파라미터

Client가 Server에 요청을 할 때 추가적으로 전송하는 데이터이다.
1) Query String
2) Path Parameter -> 메소드의 파라미터에 저장

Spring Framework는 Request 파라미터를 메소드의 파라미터에 저장한다.

Query String

URI와 파라미터 영역을 구분하여 사용한다.
? 뒤에 key1=value1&key2=value2 형태로 작성한다.

key : 파라미터 이름, value : 파라미터 값이다.
ex. https://www.google.com/search?q=codepresso&sourceid=chrome&ie=UTF-8

- 메소드 파라미터에 @RequestParam 을 사용한다.
name 요소는 Query String에 key에 매핑 왼다.

@RequestMapping(value = "/post")
    public String getPost(@RequestParam(name = "category") String category,
                          @RequestParam(name = "id") Integer id) {
        return "You requested " + category + "-" + id + " post";
    }

category라는 query string의 key id에 저장을 하면 id를 갖는다.
http://localhost:8080/post?category=it&id=10

return값으로 You requested it-10 post가 출력이 된다.

@RequestParam(name = "category") String category,
= String category를 선언하여 value를 저장한다.

http://localhost:8080/post?category=it&id=10이라고 생각한다.

  • @RequestParam의 요소들
    @RequestParam(name = "category", required = false, defaultValue = "it") String category,

name : query string의 key, key와 변수명이 같을 경우 생략 가능하다. = 추가적인 정보
required : 필수 여부
defaultValue : 데이터가 없을 경우 기본 값이다.

  • Path Parameter
    URI의 일부로 파라미터 값을 사용한다.

domain/user/1
domain/user/3/post/27 숫자(파라미터 값)이 들어가 있다.

https://brunch.co.kr/@thinkaboutlove/199
https://www.codepresso.kr/course/9 (값)을 가진 id를 요청을 한다.

- @PathVariable

@RequestMapping(value = "/user/{type}/id/{id}") // request의 path파라미터이다.
public String getUser(@PathVariable(name = "type") String type,
					  @PathVariable(name = "id") Integer id) // 메소드 파라미터이다.

@RequestMapping value URI에 {}로 Path Param임을 표시한다.
@PathVariable 어노테이션을 사용한다.
하지만 선택적인 데이터의 경우에는 사용하지 않는다. (들어올 수도 있고, 안 들어올 수도 있다.)

http://localhost:8080/user/admin/id/100
return You requested admin - 100 user가 출력된다.

Query String(선택적 데이터) vs Path Parameter(필수 데이터)

Query String : 정렬이나 추가 필터링을 위한 데이터 -> 편하게 확장이 가능하다. -> 선택적 데이터
Path Parameter : 특정 자원을 요청 하는 경우 -> Client가 영향을 받기 때문에 변경 비용이 높다. ex. git, 필수데이터

https://codepresso.kr/courses/spring?order=latest

= 조직마다 표준이 다르다. 표준에 따라 개발한다.

@RestController
public class RequestParamController {

    @RequestMapping(value = "/post") 
    public String getPost(@RequestParam(name = "category") String category,
                          @RequestParam(name = "id") Integer id) {
        return "You requested " + category + " - " + id + "post";
    }
}

query String을 사용하기 위해 RequestParam을 두개 생성해 준것을 볼 수 있다.
http://localhost:8080/post?category=it&id=10

  • 키 값과 네임이 다를 경우 (name = "key값")을 명시를 해주어야 한다.
    query String을 지정하고 값을 보내지 않을 경우 에러가 발생한다.

category는 선택적이기 때문에 optional parameter이다.

  • required = false로 지정하면
    null이 출력이 된다.
    @RequestMapping(value = "/post")
       public String getPost(@RequestParam(required = false) String category,
                             @RequestParam Integer id) {
           return "You requested " + category + " - " + id + "post";
       }
required = false가 붙은 값을 전송을 해줘도 null로 전송이 된다.
http://localhost:8080/post?id=10

- defaultValue = "it"를 설정해 주었을 때
@RequestMapping(value = "/post")
    public String getPost(@RequestParam(required = false, defaultValue = "it") String category,
                          @RequestParam Integer id) {
        return "You requested " + category + " - " + id + "post";
    }
http://localhost:8080/post?id=10&category=spring


- PathVariable 사용 (Pathparameter)

@RequestMapping(value = "/user/{type}/id/{id}") // path에 중괄호가 되어있으면 전달이 된다 명시
public String getUser(@PathVariable(name = "type")String type,
@PathVariable(name = "id")Integer id){
return "You requestd : " + type + " = " + id + " user";
}

http://localhost:8080/user/admin/id/10 
admin은 {type} 중괄호 값을 나타낸다.

profile
공부 기록

0개의 댓글