<제네릭 -Generic> : 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다.
Ex) JPARosiotry<Type,U> => 추상 메서드->반환타입T(Entity클래스 타입) -> 테이블 , 매개변수(Entity클레스의 @Id-기본값) - Wrapper 타입
-처음에는 비워놓고 나중에 채워넣는다
제네릭 장점
- 제네릭을 사용하면 타입이 들어올수 있는것을 컴파일 단계 에서 방지 할 수있다
- 클래스 외부에서 타입을 지정 해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다.
- 비슷한 기능을 지원하는경우 코드의 재사용성이 높아진다.
제네릭의 와이드카드 ? : 변수 타입을 제한하고 싶을때+ 기봊적으로 클래스 타입을 가진다
1,2=필수 , 3,4,5=선택
response entity 응답에 대한 전체 구조 ==> 상태 코드 ,바디,헤더 (header)로 구성 되어 있다.
바디(Body) -boolean -result ,String - message , <D> -Data
http요청 => (method/URI)=>controller
POST: 전송하다 데이터 DB에 생성하다 즉 저장하다 -201CREATED
@PathVariable: (PK) 값 전달 =DB에 대한 조회 - '테이블 지정' - - 레코드를 가지고 오는것
-ex1) api/v1/테이블명/{PK} , posts/{게시글Id}/comments/{댓글 id}
@RequestParam:키- 값 전달 - 반환값이 대부분 LIST로 반환
where 조건문은 둘다 가능 ( PathVariable , RequestParam )
@Requestbody:POST -body = DB에 온전이 넣어야하기 때문에 (DB에 insert해야 하는 것들), PUT도 똑같음
람다표현식Lamba :
스트림 API -컬랙션 프레임워크
List타입을 사용하는이유 배열보다 더 기능 이 더 많아서
-List 배열 -중복 가능 , 순서 있음
-set : 중복 불가능
-Map: 키-값을 넣어줘야한다
public List<BookResponseDTO> getAllBooks(){
return bookRepository.findAll()
.stream()
.map(this::convertToResponseDto)
.collect(Collectors.toList());
}
응답 =List<BookResponseDTO>으로 반환
repository-entity, Id
:: => -> 를 ::걸로 교체 (매개변수 가 같으면 )
- this = 인스턴스의 자기자신을 가리킨다. ,인스턴스화 되었을떄 자기 자신의 메모리 주소를 담고있는 키워드
- map(this::convertToResponseDto) : this::convertToResponseDto는 메서드 레퍼런스를 사용하여 각 요소를 변환하는 작업을 지정
- collect(Collectors.toList): 변환된 요소들을 새로운 리스트로 수집
public ResponseDto<List<MenuResponseDto>> getAllMenus() {
List<MenuResponseDto> data = null;
try {
List<Menu> menus = menuRepository.findAll();
data = menus.stream()
//(매개변수 ) -> new 생성자(매개변수)
.map(MenuResponseDto:: new)
//이러게 변경가능 -매개변수 가 같은 매개변수 이기떄문이다
//클래스 타입::new~~~~~~(매개변수 )
.collect(Collectors.toList());
} catch (Exception e) {
e.printStackTrace();
return ResponseDto.setFailed(ResponseMessage.DATABASE_ERROR);
}
return ResponseDto.setSuccess(ResponseMessage.SUCCESS, data);
}