http 메서드

 

http api 설계 방법

회원 정보 관리 API를 만들어라.

 

리소스 기반으로 설계해야 한다.

회원이라는 개념이 리소스이다.

/members <-회원 개념 리소스

 

회원 목록 조회 /members

회원 조회 /members/{id}

회원 등록 /members/{id}

회원 수정 /members/{id}

회원 삭제 /members/{id}

 

리소스와 행위를 분리한다.

행위란? 조회, 등록, 삭제, 변경

 

조회, 등록, 수정, 삭제가 다 /members/{id} 이렇게 사용할 때

여러 http메서드를 사용한다.

즉, 행위는 http 메서드로 구분한다.

 

http 메서드 종류

GET : 리소스 조회

POST : 요청 데이터 처리, 주로 등록에 사용

PUT : 리소스를 대체, 해당 리소스가 없으면 생성

PATCH : 리소스 부분 변경

DELETE : 리소스 삭제

HEAD : GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환

OPTIONS : 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명(주로 CORS에서 사용)

CONNECT : 대상 자원으로 식별되는 서버에 대한 터널을 설정

TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행


자주 쓰는 메서드

GET

1. 리소스 조회

2. 서버에 전달하고 싶은 데이터는 query를 통해서 전달

3. 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장하지 않는다.

 

POST

1. 요청 데이터 처리

2. 메시지 바디를 통해 서버로 요청 데이터 전달

3. 서버는 요청 데이터를 처리

- 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행한다.

4. 주로 전달된 데이터로 신규 시로스 등록, 프로세서 처리에 사용

 

**메시지 바디를 통해 들어온 데이터를 처리한다.

**신규 데이터 등록 등에 사용한다.

POST로 보내면 저장하기로 서버와 약속한다.

 

# 서버에 요청 Request

POST /members

{

“userName”:”choi”,

“age”:20

}

 

# 서버의 응답 Response

HTTP/1.1 201 Created

Content-Type:application/json

Content-Length:34

Location:/members/100

{

“userName”:”choi”,

“age”:20

}

 

요청 데이터를 처리한다는 것은 무슨 뜻 일까?

대상 리소스가 리소스의 고유 한 의미 체계에 따라 요청에 포함된 표현을 처리하도록 요청합니다.

예제 )

1.FORM데이터 처리

2. 게시판 글쓰기 댓글 달기

3. 서버가 아직 식별하지 않은 새 리소스 생성

4. 기존 자원에 데이터 추가

 

딱 정해진 것은 아니고 정하기 나름이다.

 

1. 새 리소스 생성

2. 요청 데이터 처리(서버에서 변화가 일어남)

3. 값 하나를 바꾸는 것이 아닌 프로세스 상태 변경에서 사용됨

4. 컨트롤 URI에 사용된다.

5. 다른 메서드로 처리하기 애매하면 POST를 사용한다.

 

PUT

1. 리소스를 완전 대체

- 리소스가 있으면 대체

- 리소스가 없으면 생성

- 쉽게 이야기해서 덮어버림

2. 클라이언트가 리소스 위치를 알고 URI 지정

- 클라이언트가 리소스 위치를 알고 URI 지정

- /members/100

3. 값을 대체하기에 하나의 값만 변경할 수 없다.

 

PATCH

1. 리소스 부분 변경

- 업데이트라고 생각하면 된다.

2. 서버에서 PATCH를 사용하지 못하면 POST를 사용한다.

 

DELETE

1. 리소스 제거

- 삭제


HTTP 메서드의 속성

1. 안전(Safe Methods)

2. 멱등(Idempotent Methods)

3. 캐시 가능(Cacheable Methods)

 

1. 안전

-호출해도 리소스를 변경하지 않는다.

-데이터가 변경 없는 메서드(GET, HEAD)

 

2. 멱등

-한 번 호출하든 두 번 호출하든 100번 호출하든 결과가 똑같다.

-GET,PUT,DELETE

-POST는 벽등이 아니다. 주문 시 계속 주문된다.

-똑같은 요청을 두 번 해도 괜찮다

 

3. 캐시 가능

- 응답 결과 리소스를 캐시 해서 사용해도 되는가?

- 스펙상 GET, HEAD, POST, PATCH 캐시 가능

- 실제로는 GET, HEAD 정도만 캐시로 사용

- POST, PATCH는는 바디 까지 캐시 키로고려해야하 하는데, 구현이 쉽지 않다.

'개발 소발 > 기초 컴퓨터,통신' 카테고리의 다른 글

HTTP 표현,협상 이란?  (0) 2021.08.13
HTTP 데이터 전송 기초  (0) 2021.08.06
비연결성,Http메시지 란?  (0) 2021.08.03
URI,URL,URN,http,Stateless이란?  (0) 2021.08.03
HTTP기초,PORT,DNS 란?  (0) 2021.08.03

프로그래머 편의를위해 생성자를 변환시켜주는 Converting construtor

동적할당 메모리할당 해제하는 delete랑은 다르다.

explicit,delete는 엄격하게 제한할때 사용한다.

생성자의 기본값을 정해주면 파라미터를 모두 넣어주지않아도 된다.
또, int로 파라미터를 설정해놓아도 char로 받을 수 있다.

위 두개의 사항을 엄격하게 제어하기위해
explicit와 delete를 사용한다.

 

#include <iostream>
#include <cassert>

using namespace std;
class Fraction {
private:
	int m_num;
	int m_den;

public:
	Fraction(char) = delete;
	Fraction(char,char) = delete;

	explicit Fraction(int num = 0, int den = 1)
		:m_num(num), m_den(den)
	{
		assert(den != 0);
	}

	Fraction(const Fraction &frc)
		:m_num(frc.m_num), m_den(frc.m_den) {
		cout << "copy constructor called" << endl;
	}

	friend std::ostream & operator << (std::ostream & out, const Fraction & f) {
		out << f.m_num << " / " << f.m_den << endl;
		return out;
	}
};

void doSomething(Fraction frac) {
	cout << frac << endl;
}

int main()
{
	//Fraction('a','a');
	doSomething(Fraction(2,3));
	
	return 0;
}

-정적배열을 선언할때 배열의 크기가 커지면 용량이 커진다 
-정적할당은 stack에 들어가고 동적할당은Heap에 들어간다. 

 

메모리 할당의 종류
정적메모리 할당 Static Memory Allocation
-전역변수,static변수 한번만들면 프로그램 종료시까지 유지된다.

자동메모리할당
-블록안에서 변수를 선언,정적배열 선언 블럭밖으로 나가면 메모리가 OS로 다시 할당된다.

동적메모리 할당 Dynamic Memory Allocation
동적 메모리 할당은 new로 할당받는다.
메모리를 할당받는것이기에 포인터로 받아야한다.
delete로 반납해주어야한다.
delete를 하더라도 메모리의 주소는 있기때문에 garbage값이 있다.

int *ptr = new int (8);


다른 프로그램이 메모리를 모두사용하고 메모리를 할당받지 못할때도있다.
- 프로그램이 죽어버릴게 짜는 방법
- 다른 프로그램의 메모리 반납을 기다리는 방법
(std::nothrow)을 사용한다.메모리 할당이 실패하면 nullptr이 할당된다.

int *ptr = new (std::nothrow)int (8);



메모리누수 memory leak
동적메모리 할당을 사용할때 반납을 잊으면 메모리 누수가 발생한다.

#include <iostream>

using namespace std;

//정적메모리 할당
int a = 0;

int main()
{

	//자동메모리 할당
	{
		int array[10];
	}

	int *ptr = new (std::nothrow)int (8);
	cout << *ptr << endl;
	//ptr이 delete가 되면 ptr2도 메모리가 반납된다.
	int *ptr2 = ptr;

	//de-reference
	*ptr = 7;

	cout << *ptr << endl;
	delete ptr;

	//delete로 메모리를 반납했기에 garvage값이 출력된다.
	//cout << *ptr << endl;
	//방지하는방법 0,NULL,nullptr을 사용한다.
	ptr = nullptr;
	if (ptr != nullptr) 
		cout << *ptr << endl;

	while (true) {
		//delete를 하면 메모리 누수memory leak이 발생한다.
		int *ptr = new int;
		cout << ptr << endl;
		delete ptr;
	}
	
	return 0;
}

+ Recent posts