= sw 구조를 정의한 것이다. sw를 구성하는 요소들과 요소들의 관계를 정의한 것이다.
웹 서비스 개발에 주로 사용
계층 간에 호출을 하고 데이터를 주고 받으며 협력 -> 웹 서비스 구성
계층형 아키텍처의 Presentation Layer에 해당한다.
Java 소스코드에 추가적인 정보를 제공하는 방법
@으로 시작하여 클래스, 메소드, 멤버변수, 파라미터 등에 부착 가능하다.
1) 자바 컴파일러에 정보 제공
2) 추가 작업 진행
3) run-time시 특정 동작을 실행
Framework 활용 = 규칙을 지키는 것
@Controller vs @RestController
클래스 상단에 명시
@Controller : view를 응답 (html 파일) 따로 생성한다.
templates 파일에 htm파일을 만든다.
@RestController : data를 응답 (문자열, JSON, XML 등)
특정 Request를 처리하는 메소드를 지정, 명시
Client의 요청이 왔을 때 Spring Framework에 의해 호출이 된다.
Spring Controller의 메소드는 URI에 따라 호출이 결정된다.
@RequestMapping(value = "/user") -> 메소드 정보를 명시한다.
RequestMapping Annotation에 URI Path 정보를 명시한다.
요청하는 자원의 종류에 따라 이름을 정하고, 중복은 불가능하다.
특정한 자원에 접근하기 위한 이름 또는 주소이다.
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를 적용할 수 있다.
Interface란 두 개체 간의 정보를 공유하기 위한 방법이다.
HTTP API
HTTP(S)를 활용하여 원격 데이터를 공유하기 위한 API
REST API
웹에서 효율적으로 데이터를 공유하기 위한 아키텍처 스타일
실무에서 모든 조건을 만족하여 구현하기 어렵다.
= 실무에서는 혼용하면서 사용하고, REST API명칭이 사용된다.
@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부분을 클래스 상단에 붙인다.
Server에 요청 시에 추가적인 Data가 필요하다.
은행에서 계좌 거래 내역 조회
조건에 따라 내역 조회 후 드린다. server에 요청시 추가적인 Data가 필요하다. 로그인 되어 있는 사용자 정보 및 페이지 데이터를 요청과 함께 전송한다.
블로그의 글 작성하려면
사용자 정보, 제목 및 글 데이터를 요청과 함께 전송
ex. Facebook의 Feed를 조회 하려면?
로그인 되어 있는 사용자의 정보 및 페이지 데이터를 요청과 함께 전송해야 한다.
Client가 Server에 요청을 할 때 추가적으로 전송하는 데이터이다.
1) Query String
2) Path Parameter -> 메소드의 파라미터에 저장
Spring Framework는 Request 파라미터를 메소드의 파라미터에 저장한다.
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이라고 생각한다.
name : query string의 key, key와 변수명이 같을 경우 생략 가능하다. = 추가적인 정보
required : 필수 여부
defaultValue : 데이터가 없을 경우 기본 값이다.
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 : 정렬이나 추가 필터링을 위한 데이터 -> 편하게 확장이 가능하다. -> 선택적 데이터
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
category는 선택적이기 때문에 optional parameter이다.
@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} 중괄호 값을 나타낸다.