HTTP의 개념과 필요할 때 사용할 수 있는 쿼리문 예시

이상민·2024년 8월 27일
0

베이직반 6일차

개발의 자세

개발은 암기하지 말자
그냥 많이해서 습득하자

스프링은 많이 쳐보고 나중에 이해하자

외우지 말고 보면서 하자

HTTP

IP

인터넷에 연결되어 있는 모든 장치들을 식벽할 수 있도록 각각의 장비에게 부여되는 고유 주소(IP ADDress)이다

IPv4 (주로 이거를 씀)

IPv6(v4가 모자랄 때 사용함 ex. 일론머스크 스타링크)

TCP

우리가 흔히 사용하는 것이다

  • 연결 지향성
    - 헨드쉐이크 과정을 통해 안정적인 연결을 설정(조금 느림)

  • 신뢰성
    - TCP는 데이터가 올바르게, 순서대로, 무손실로 도착했는지 확인

  • 장점: 데이터의 정확성과 신뢰성이 보장. 순차적이고 안정적인 데이터 전송을 제공.

  • 단점: Handshake 같은 오버헤드로 인해 UDP보다 느릴 수 있음. (실시간 통신에 부적합)

UDP

주로 스트리밍 서비스에 이용함

  • 비연결 지향적 : UDP는 연결 설정 없이 데이터를 전송

  • 신뢰성 없음 : 데이터의 도착을 보장하지 않고, 패킷 손실이나 순서 변경에 대해 처리하지 않음

  • 장점: 빠른 데이터 전송 속도를 제공.

  • 단점: 신뢰성이 낮고, 데이터 손실이 발생할 수 있음.

URI/URL

URI가 더 큰 범위인데, 그냥 같은 것이라고 생각해도 무방하다

그냥 똑같은 것이구나라고 이해하면 된다 (무서워하지 말자)

DNS

도메인 네임 서버

IP주소를 모르는 경우

IP주소를 아는 경우

주소를 모르는 경우 먼저 들렀다 온다

그럼 우리가 DNS주소를 어떻게 알까?

우리 컴퓨터에 이미 나와있다...

명령어는 그냥 필요할때 검색해보자...

HTTP Methods (중요)

  • GET
    조회

  • POST
    등록

  • PUT
    수정

  • PATCH
    전체가 아니라 일부분만 수정
    put을 써도 무방 (자유)

  • DELETE
    삭제

  • HEAD (알면 좋은 메서드)

    • body가 없는 GET
      하지만 GET을 써도 무방
  • OPTIONS(알면 좋은 메서드)

preflight(pre,선)

보안 관련 메서드
무언가를 요청할 때 먼저 Options가 먼저 날라가서 내가 들어가도 되는지 물어보는 역할

REST API (중요)

  • 표준은 없다.(사바사, 융통성)
  • 소통에 드는 리소스를 줄이기 위해

꼭 지켜야 할 필요는 없지만, 지키는 것이 좋다
-> HTTP와 같은 프로토콜은 반드시 지켜야한다

1. 동사보단 명사를, 단수보단 복수를

/member/get/item/hello (x)

/members/items (o)

동사에 s를 붙이면 명사
명사에 s를 붙이면 복수
따라서 그냥 고민하지 말고 s를 붙이자

2. 마지막에/ 넣지 않기

/members/ (x)

/members (o)

3 . _대신-사용+대문자 사용하지 않기

/restful_services (x)

/restful-services (o)

4. 확장자 포함하지 않기(svg,png,exe 등)

/image.svg (x)

/images (o)

5. 계층화 (중요)

/items/{memberId}/members/{itemId} (x)

/members/{memberId}/items/{itemId} (o)
  • 큰 범위가 먼저온다
  • 뒤에 오는 id는 앞에오는 id이다
/boards/{id} 는 당연히 /boards/{boardId}이다

PathVariable과 RequestParam(QueryString)의 차이?

Query String 은 조건이다 -> 있어도 되고 없어도 된다.
동작은 하지만 이것이 규칙인지 아닌지를 먼저 확인해보자

?q= 바뀔 수 있다(자유)

PathVariable(필수값)

절대 생략되어서는 안되는 값 -> 빠지는 순간 다른 API로 변한다

주의! 검색어를 필수값(PathVariable)으로 만들어서 API를 만들지 말자

RequestBody?

QueryString과 Body의 차이점?
-> 보안성의 차이

JPA

1. Entity

엔티티는 데이터베이스의 테이블이다

2. 영속성 컨텍스트

@Transactional이 걸린 Context(문맥)를 말한다

영속성 컨텍스트 내에서 DB를 한 번이라도 갔다온 Entity의 변경사항은 실제로 DB에 반영된다(Transactional이 끝난 시점에)
일종의 캐시이다
이걸 더티체킹이라고 한다.

3. 쿼리 메소드

SQL언어를 다루어야 한다 (공부 필요)
백엔드 개발자라면 SQL은 알아야한다.
N+1이라는 문제가 있다 -> 해결할려면 쿼리문을 사용해야 한다

자주 쓰는 쿼리문

자세히보기
1. 제목 기반 쿼리
  • 특정 제목을 가진 게시물 찾기
List<Board> findByTitle(String title);

  • 제목이 특정 단어로 시작하는 게시물 찾기
List<Board> findByTitleStartingWith(String prefix);

  • 제목에 특정 단어가 포함된 게시물 찾기
List<Board> findByTitleContaining(String keyword);

  • 제목이 특정 단어로 끝나는 게시물 찾기
List<Board> findByTitleEndingWith(String suffix);
  1. 내용 기반 쿼리
  • 내용이 비어 있는 게시물 찾기
List<Board> findByContentIsNull();

  • 제목과 내용이 모두 일치하는 게시물 찾기
List<Board> findByTitleAndContent(String title, String content);
  1. 날짜 기반 쿼리
  • 게시물 생성일이 특정 날짜 이후인 게시물 찾기
List<Board> findByCreatedAtAfter(LocalDateTime date);

  • 게시물 생성일이 특정 날짜 이전인 게시물 찾기
List<Board> findByCreatedAtBefore(LocalDateTime date);

  • 게시물 생성일이 특정 날짜 사이에 있는 게시물 찾기
List<Board> findByCreatedAtBetween(LocalDateTime startDate, LocalDateTime endDate);
  1. 크기 비교를 활용한 쿼리
  • ID가 특정 값보다 큰 게시물 찾기
List<Board> findByIdGreaterThan(Long id);

  • ID가 특정 값보다 작은 게시물 찾기
List<Board> findByIdLessThan(Long id);

  • ID가 특정 값 이상인 게시물 찾기
List<Board> findByIdGreaterThanEqual(Long id);

  • ID가 특정 값 이하인 게시물 찾기
List<Board> findByIdLessThanEqual(Long id);    
  1. 페이징 및 정렬
  • 제목으로 오름차순 정렬된 게시물 찾기
List<Board> findByOrderByTitleAsc();

  • ID로 내림차순 정렬된 게시물 찾기
List<Board> findByOrderByIdDesc();

  • 페이징 처리된 게시물 찾기
Page<Board> findAll(Pageable pageable);

  • 제목이 특정 단어로 시작하는 게시물의 페이징 처리
Page<Board> findByTitleStartingWith(String title, Pageable pageable);   
  1. 논리 연산자를 활용한 쿼리
  • 제목에 특정 단어가 포함된 게시물 찾기
List<Board> findByTitleContaining(String titleKeyword);

  • 제목 또는 내용에 특정 단어가 포함된 게시물 찾기
List<Board> findByTitleContainingOrContentContaining(String titleKeyword, String contentKeyword);

  • 제목과 내용이 둘 다 특정 단어를 포함하는 게시물 찾기
List<Board> findByTitleContainingAndContentContaining(String titleKeyword, String contentKeyword);    
  1. 댓글 관련 쿼리 메소드
  • 특정 게시물에 달린 댓글 찾기
List<Comment> findByBoard(Board board);

  • 특정 게시물 ID로 댓글 찾기
List<Comment> findByBoardId(Long boardId);

  • 특정 게시물의 댓글 중 특정 단어가 포함된 댓글 찾기
List<Comment> findByBoardAndContentContaining(Board board, String keyword);

  • 댓글 내용이 특정 단어로 시작하는 댓글 찾기
List<Comment> findByContentStartingWith(String keyword);
  • 댓글 내용이 특정 단어로 끝나는 댓글 찾기
List<Comment> findByContentEndingWith(String keyword);    
    
  1. 크기 비교를 활용한 댓글 쿼리
  • 댓글 ID가 특정 값보다 큰 댓글 찾기
List<Comment> findByIdGreaterThan(Long id);

  • 댓글 ID가 특정 값보다 작은 댓글 찾기
List<Comment> findByIdLessThan(Long id);

  • 댓글 ID가 특정 값 이상인 댓글 찾기
List<Comment> findByIdGreaterThanEqual(Long id);

  • 댓글 ID가 특정 값 이하인 댓글 찾기
List<Comment> findByIdLessThanEqual(Long id); 
  1. 날짜 기반 댓글 쿼리
  • 댓글 생성일이 특정 날짜 이후인 댓글 찾기
List<Comment> findByCreatedAtAfter(LocalDateTime date);

  • 댓글 생성일이 특정 날짜 이전인 댓글 찾기
List<Comment> findByCreatedAtBefore(LocalDateTime date);

  • 댓글 생성일이 특정 날짜 사이에 있는 댓글 찾기
List<Comment> findByCreatedAtBetween(LocalDateTime startDate, LocalDateTime endDate);    
  1. 특정 개수 이상의 댓글을 가진 게시물 찾기
List<Board> findByComments_SizeGreaterThanEqual(int count); 
  1. 특정 길이 이상의 제목을 가진 게시물 찾기
List<Board> findByTitleLengthGreaterThan(int length);   

정리

  1. REST API를 API작성 할 때 한번씩 보자
  2. 영속성 컨텍스트 내에서 DB를 한 번이라도 갔다온 Entity의 변경사항은 실제로 DB에 반영된다(Transactional이 끝난 시점에)
    -> 한번이라도 갔다오면!!
profile
안녕하세요

0개의 댓글