베이직반 6일차
개발의 자세
개발은 암기하지 말자
그냥 많이해서 습득하자
스프링은 많이 쳐보고 나중에 이해하자
외우지 말고 보면서 하자
인터넷에 연결되어 있는 모든 장치들을 식벽할 수 있도록 각각의 장비에게 부여되는 고유 주소(IP ADDress)이다
IPv4 (주로 이거를 씀)
IPv6(v4가 모자랄 때 사용함 ex. 일론머스크 스타링크)
우리가 흔히 사용하는 것이다
연결 지향성
- 헨드쉐이크 과정을 통해 안정적인 연결을 설정(조금 느림)
신뢰성
- TCP는 데이터가 올바르게, 순서대로, 무손실로 도착했는지 확인
장점: 데이터의 정확성과 신뢰성이 보장. 순차적이고 안정적인 데이터 전송을 제공.
단점: Handshake 같은 오버헤드로 인해 UDP보다 느릴 수 있음. (실시간 통신에 부적합)
주로 스트리밍 서비스에 이용함
비연결 지향적 : UDP는 연결 설정 없이 데이터를 전송
신뢰성 없음 : 데이터의 도착을 보장하지 않고, 패킷 손실이나 순서 변경에 대해 처리하지 않음
장점: 빠른 데이터 전송 속도를 제공.
단점: 신뢰성이 낮고, 데이터 손실이 발생할 수 있음.
URI가 더 큰 범위인데, 그냥 같은 것이라고 생각해도 무방하다
그냥 똑같은 것이구나라고 이해하면 된다 (무서워하지 말자)
도메인 네임 서버
IP주소를 모르는 경우
IP주소를 아는 경우
주소를 모르는 경우 먼저 들렀다 온다
그럼 우리가 DNS주소를 어떻게 알까?
우리 컴퓨터에 이미 나와있다...
명령어는 그냥 필요할때 검색해보자...
GET
조회
POST
등록
PUT
수정
PATCH
전체가 아니라 일부분만 수정
put을 써도 무방 (자유)
DELETE
삭제
HEAD (알면 좋은 메서드)
OPTIONS(알면 좋은 메서드)
preflight(pre,선)
보안 관련 메서드
무언가를 요청할 때 먼저 Options가 먼저 날라가서 내가 들어가도 되는지 물어보는 역할
꼭 지켜야 할 필요는 없지만, 지키는 것이 좋다
-> 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)
/boards/{id} 는 당연히 /boards/{boardId}이다
PathVariable과 RequestParam(QueryString)의 차이?
Query String 은 조건이다 -> 있어도 되고 없어도 된다.
동작은 하지만 이것이 규칙인지 아닌지를 먼저 확인해보자
?q=
바뀔 수 있다(자유)
PathVariable(필수값)
절대 생략되어서는 안되는 값 -> 빠지는 순간 다른 API로 변한다
주의! 검색어를 필수값(PathVariable)으로 만들어서 API를 만들지 말자
RequestBody?
QueryString과 Body의 차이점?
-> 보안성의 차이
엔티티는 데이터베이스의 테이블이다
@Transactional이 걸린 Context(문맥)를 말한다
영속성 컨텍스트 내에서 DB를 한 번이라도 갔다온 Entity의 변경사항은 실제로 DB에 반영된다(Transactional이 끝난 시점에)
일종의 캐시
이다
이걸 더티체킹
이라고 한다.
SQL언어를 다루어야 한다 (공부 필요)
백엔드 개발자라면 SQL은 알아야한다.
N+1이라는 문제가 있다 -> 해결할려면 쿼리문을 사용해야 한다
자주 쓰는 쿼리문
자세히보기List<Board> findByTitle(String title);
List<Board> findByTitleStartingWith(String prefix);
List<Board> findByTitleContaining(String keyword);
List<Board> findByTitleEndingWith(String suffix);
List<Board> findByContentIsNull();
List<Board> findByTitleAndContent(String title, String content);
List<Board> findByCreatedAtAfter(LocalDateTime date);
List<Board> findByCreatedAtBefore(LocalDateTime date);
List<Board> findByCreatedAtBetween(LocalDateTime startDate, LocalDateTime endDate);
List<Board> findByIdGreaterThan(Long id);
List<Board> findByIdLessThan(Long id);
List<Board> findByIdGreaterThanEqual(Long id);
List<Board> findByIdLessThanEqual(Long id);
List<Board> findByOrderByTitleAsc();
List<Board> findByOrderByIdDesc();
Page<Board> findAll(Pageable pageable);
Page<Board> findByTitleStartingWith(String title, Pageable pageable);
List<Board> findByTitleContaining(String titleKeyword);
List<Board> findByTitleContainingOrContentContaining(String titleKeyword, String contentKeyword);
List<Board> findByTitleContainingAndContentContaining(String titleKeyword, String contentKeyword);
List<Comment> findByBoard(Board board);
List<Comment> findByBoardId(Long boardId);
List<Comment> findByBoardAndContentContaining(Board board, String keyword);
List<Comment> findByContentStartingWith(String keyword);
List<Comment> findByContentEndingWith(String keyword);
List<Comment> findByIdGreaterThan(Long id);
List<Comment> findByIdLessThan(Long id);
List<Comment> findByIdGreaterThanEqual(Long id);
List<Comment> findByIdLessThanEqual(Long id);
List<Comment> findByCreatedAtAfter(LocalDateTime date);
List<Comment> findByCreatedAtBefore(LocalDateTime date);
List<Comment> findByCreatedAtBetween(LocalDateTime startDate, LocalDateTime endDate);
List<Board> findByComments_SizeGreaterThanEqual(int count);
List<Board> findByTitleLengthGreaterThan(int length);
정리