Loading the catalog…
Loading the catalog…
🗺️ 전체 학습 지도 단계 챕터 핵심 주제 확인할 결과 서버 간 통신 2-1 ~ 2-4 RestTemplate, GET·POST·exchange URL·헤더·본문을 구성해 다른 서버 호출 외부 서비스 연동 2-5 네이버 쇼핑 검색 API 검색 결과를 우리 서비스 DTO로 변환 관계 매핑 2-6 ~ 2-10 방향·주인, 1:1·N:1·1:N·N:M 객체 관계를 외래 키와 중간 테이블에 연결 조회·생명주기 2-11 ~ 2-13 LAZY·EAGER, Cascade, orphanRemoval 조회 시점과 저장·삭제 전파 구분 관심상품 구현 2-14 ~ 2-16 프로젝트 설계, 상품 API, Scheduler 검색·등록·희망 가격·가격 갱신 연결 회원별 데이터 2-17 ~ 2-18 JWT 회원 기능, 상품 소유자 인증된 회원의 관심상품만 조회 조회 확장 2-19 페이징·정렬·역할별 조회 필요한 페이지와 정렬 결과 반환 분류 구조 설계 2-20 Folder·ProductFolder 상품과 폴더의 다대다 관계를 중간 Entity로 표현 폴더 기능 구현 2-21 ~ 2-23 생성·선택·연결·폴더별 페이징 회원 소유권과 중복을 확인해 분류 기능 완성 배포 숙제 2-24 EC2·RDS 배포 접속 URL에서 서비스 기능 확인 Chapter 1에서 이어지는 변화 항목 Chapter 1 Chapter 2 서버의 역할 사용자 요청을 받아 인증·처리 외부 서버에도 요청해 데이터를 활용 데이터 모델 회원 중심 회원·상품·폴더와 연결 정보 JPA 사용 기본 저장·조회 연관관계·로딩 전략·영속성 전이 사용자 정보 인증 객체 구성 인증 정보를 상품 소유자와 연결 JWT 전달 쿠키에서 추출하는 실습 응답·요청 Authorization 헤더로 전달 목록 조회 전체 List 반환 회원 조건·페이지·정렬을 적용 먼저 기억할 서비스 흐름 사용자가 검색어를 보냅니다. 우리 서버가 네이버 쇼핑 검색 API를 호출합니다. 외부 응답을 ItemDto로 변환합니다. 사용자가 선택한 검색 결과를 관심상품으로 저장합니다. 관심상품을 인증된 회원과 연결합니다. 회원별 목록을 페이징·정렬해 보여줍니다. 스케줄러가 저장된 상품의 최저가 정보를 갱신합니다. 폴더와 중간 Entity로 관심상품을 분류하고 폴더별로 조회합니다. 완성한 서비스를 배포하고 접속 URL을 확인합니다. 💡 핵심 구분 : 외부 검색 결과인 ItemDto , DB에 저장된 관심상품인 Product , 화면에 반환할 ProductResponseDto 는 역할이 다릅니다. 01 · RestTemplate이란 무엇일까? 💡 한 줄 요약 : RestTemplate은 우리 서버가 다른 서버로 HTTP 요청을 보내고 응답을 받도록 돕는 HTTP 클라이언트입니다. Server To Server 지금까지는 브라우저의 요청을 받는 서버를 만들었습니다. 외부 검색·주소·결제 등의 서비스를 사용하려면 우리 서버도 다른 서버에 요청해야 합니다. 통신 구간 요청하는 쪽 응답하는 쪽 사용자 → 우리 서비스 브라우저 우리 서버 우리 서비스 → 외부 서비스 우리 서버 외부 서버 Client와 Server는 프로그램의 고정된 이름이 아니라 통신에서의 역할입니다. 우리 서버는 브라우저에는 서버이고, 외부 API에는 클라이언트가 됩니다. 실습 환경 애플리케이션 역할 구분 spring-resttemplate-client 다른 서버에 요청 클라이언트 역할의 Spring 서버 spring-resttemplate-server 요청을 받아 결과 반환 서버 역할의 Spring 서버 두 애플리케이션은 동시에 실행할 때 서로 다른 포트를 사용합니다. 요청 대상 예제는 localhost:7070 입니다. RestTemplate 준비 @Service public class RestTemplateService { private final RestTemplate restTemplate; public RestTemplateService(RestTemplateBuilder builder) { this.restTemplate = builder.build(); } } 주입받은 것은 RestTemplateBuilder 이고, RestTemplate은 그 Builder로 생성합니다. 생성된 RestTemplate을 서비스의 여러 요청에 활용합니다. 주요 메서드 메서드 중심 기능 getForEntity() GET 요청 후 상태·헤더·본문을 포함한 응답 반환 postForEntity() POST 요청과 요청 본문 전달 exchange() 요청 메서드·헤더·본문 등을 직접 구성 RestTemplate은 일반적으로 응답이 올 때까지 기다리는 동기 방식입니다. 외부 응답이 느리면 우리 요청 처리도 영향을 받으므로 연결·응답 대기 시간과 오류 처리를 구분해 이해합니다. 복습 체크 우리 서버가 외부 API에 요청할 때 클라이언트 역할이 되는 이유를 설명할 수 있습니다. Controller의 요청 수신과 RestTemplate의 요청 전송을 구분할 수 있습니다. 실습 서버 두 개를 서로 다른 포트로 실행할 수 있습니다. 02 · RestTemplate의 GET 요청 💡 한 줄 요약 : GET 요청의 URL과 쿼리 파라미터를 만들고 응답을 DTO 또는 문자열로 받습니다. 요청 URL 만들기 URI uri = UriComponentsBuilder .fromUriString("http://localhost:7070") .path("/api/server/get-call-obj") .queryParam("query", query) .build() .encode() .toUri(); 구성 역할 기본 주소 대상 서버 path 요청할 API 경로 queryParam ?query=... 형식의 검색 조건 encode URI에 맞게 값의 문자 표현 처리 검색어에 공백·한글 등이 있을 수 있으므로 주소 문자열을 무작정 이어 붙이는 대신 URI 구성 기능을 활용합니다. 객체 응답 받기 ResponseEntity<ItemDto> response = restTemplate.getForEntity(uri, ItemDto.class); HttpStatusCode status = response.getStatusCode(); ItemDto body = response.getBody(); ItemDto.class 는 응답 본문을 변환할 타입입니다. JSON 필드와 DTO가 맞으면 메시지 변환기를 통해 객체로 변환됩니다. ResponseEntity 는 본문뿐 아니라 상태 코드와 헤더도 담습니다. 응답에 본문이 없다면 getBody() 는 null일 수 있습니다. 여러 상품이 담긴 JSON 응답 { "items": [ {"title": "Mac", "price": 3888000}, {"title": "iPad", "price": 1230000} ] } 이 응답의 최상위 값은 배열이 아니라 items 배열을 가진 객체입니다. 배열이 들어 있다는 이유만으로 객체 변환을 사용할 수 없는 것은 아닙니다. 처리 방법 설명 String → JSON 파싱 본문을 문자열로 받고 items 배열을 직접 순회 응답용 DTO items 필드를 가진 DTO에 바로 매핑 @Getter @Setter public class ItemListResponseDto { private List<ItemDto> items; } // ItemDto에도 응답 변환에 필요한 생성자·접근자를 준비합니다. ResponseEntity<ItemListResponseDto> response = restTemplate.getForEntity(uri, ItemListResponseDto.class); 요청을 받는 서버 @GetMapping("/api/server/get-call-obj") public Item getCallObject(@RequestParam("query") String query) { return itemService.getCallObject(query); } 보내는 쪽의 queryParam("query", ...) 와 받는 쪽의 @RequestParam("query") 가 연결됩니다. 복습 체크 GET URL에 검색어를 쿼리 파라미터로 넣을 수 있습니다. ResponseEntity와 응답 Body를 구분할 수 있습니다. 단일 객체·배열·배열을 감싼 객체의 JSON 구조를 구분할 수 있습니다. 응답 구조에 맞는 DTO를 선택할 수 있습니다. 03 · RestTemplate의 POST 요청 💡 한 줄 요약 : POST 요청에서는 경로 변수와 요청 본문을 함께 전달할 수 있습니다. GET 예제와 달라지는 부분 항목 이번 POST 예제 메서드 POST 검색어 위치 경로의 {query} 사용자 데이터 위치 요청 Body 받는 서버의 처리 @PathVariable · @RequestBody 경로 변수와 Body 전달 URI uri = UriComponentsBuilder .fromUriString("http://localhost:7070") .path("/api/server/post-call/{query}") .encode() .buildAndExpand(query) .toUri(); UserRequestDto requestDto = new UserRequestDto("sample-user", "sample-value"); ResponseEntity<ItemDto> response = restTemplate.postForEntity(uri, requestDto, ItemDto.class); @PostMapping("/api/server/post-call/{query}") public Item postCall(@PathVariable("query") String query, @RequestBody UserRequestDto requestDto) { return itemService.postCall(query, requestDto); } postForEntity의 인자 인자 의미 URI 요청 대상 requestDto 요청 본문으로 보낼 객체 ItemDto.class 응답 본문을 변환할 타입 객체는 사용 가능한 메시지 변환기와 설정에 따라 JSON 등의 본문으로 변환됩니다. 서버가 기대하는 Content-Type과 필드 구조를 맞춥니다. 📝 구분 : POST라서 모든 값이 본문에만 들어가는 것은 아닙니다. 경로·쿼리·헤더·본문 중 어디에 어떤 값을 보낼지는 API 규약으로 정합니다. 이 예제의 검색어는 쿼리가 아니라 경로 변수입니다. 복습 체크 {query} 에 실제 값을 넣어 URI를 만들 수 있습니다. POST의 요청 DTO와 응답 DTO를 구분할 수 있습니다. 경로 데이터와 본문 데이터를 각각 올바르게 받을 수 있습니다. 04 · RestTemplate의 exchange 💡 한 줄 요약 : exchange는 HTTP 메서드·헤더·본문을 명시적으로 구성한 요청을 전송합니다. 헤더가 필요한 상황 외부 API를 호출할 때 인증 키·토큰·데이터 형식 등을 헤더에 넣어야 할 수 있습니다. 요청 정보를 하나의 객체로 구성하면 각 값의 위치를 명확하게 표현할 수 있습니다. RequestEntity 구성 URI uri = URI.create("http://localhost:7070/api/server/exchange-call"); UserRequestDto body = new UserRequestDto("sample-user", "sample-value"); RequestEntity<UserRequestDto> request = RequestEntity .post(uri) .header("X-Authorization", token) .contentType(MediaType.APPLICATION_JSON) .body(body); ResponseEntity<String> response = restTemplate.exchange(request, String.class); 객체 담는 정보 RequestEntity 요청 메서드·URI·헤더·본문 ResponseEntity 응답 상태·헤더·본문 받는 서버의 처리 @PostMapping("/api/server/exchange-call") public ItemResponseDto exchangeCall( @RequestHeader("X-Authorization") String token, @RequestBody UserRequestDto dto) { return itemService.exchangeCall(token, dto); } 보내는 헤더 이름과 받는 헤더 이름이 같아야 합니다. 커스텀 헤더를 추가하는 것만으로 토큰 검증이 자동 실행되는 것은 아닙니다. 받는 서버가 해당 값을 어떻게 검증할지도 구성합니다. 메서드 선택 비교 선택 활용 getForEntity GET을 간단하게 호출 postForEntity POST 본문을 간단하게 전달 exchange 헤더·메서드·요청 객체를 세밀하게 구성 복습 체크 헤더와 본문을 구분해 요청을 구성할 수 있습니다. RequestEntity와 ResponseEntity의 방향을 설명할 수 있습니다. 외부 API의 인증 헤더를 추가할 수 있습니다.
What RADAR observed and classified to build this opportunity. It is what the source published, not a verification that the offer is still active.
Spring 숙련 Chapter 2 (1) - 서버 간 통신. 🗺️ 전체 학습 지도 단계 챕터 핵심 주제 확인할 결과 서버 간 통신 2-1 ~ 2-4 RestTemplate, GET·POST·exchange URL·헤더·본문을 구성해 다른 서버 호출 외부 서비스 연동 2-5 네이버 쇼핑 검색 API 검색 결과를 우리 서비스 DTO로 변환 관계 매핑 2-6 ~ 2-10 방향·주인, 1:1·N:1·1:N·N:M 객체 관계를 외래 키와 중간 테이블에 연결 조회·생명주기 2-11 ~ 2-13 LAZY·EAGER, Cascade, orphanRemoval 조회 시점과 저장·삭제 전파 구분 관심상품 구현 2-14 ~ 2-16 프로젝트 설계, 상품 API, Scheduler 검색·등록·희망 가격·가격 갱신 연결…
Open source