▶ 3계층 숙달, API handling
→ 3계층(Controller, Service, Repository) 숙달과 API handling은 무엇보다 중요한 기본기이다.
▶ 리마인드
→ Controller는 제일 바깥 쪽에서 요청을 받고, 응답을 되돌려주는 역할을 한다.
→ Service는 중간에서 구체적인 작업 순서를 결정한다. + update
→ Repository는 DB와 직접 소통함으로써 자료를 생성하고, 조회하고, 변경하고, 삭제한다.
→ 각 레이어 간에는 절대 Entitiy를 직접 사용하지 않고, DTO라는 택배 상자를 만들어 사용한다.
▶ 네이버 API란?
→ 네이버 서비스를 코드롤 이용할 수 있는 서비스
→ 네이버 API 목록 살펴보기: https://developers.naver.com/products/intro/plan/
Products API 이용 안내 API 소개 운영 정책 FAQ BI 가이드 이용약관 상표사용 가이드 CLOVA 네이버 로그인 파파고 서비스 API API 공통 가이드 CLOVA 네이버 로그인 파파고 서비스 API Products Products API 이용 안내 API 소개 운영 정책 FAQ BI 가이드 이용약관 상표사용 가이드 네이버 오픈 API 목록 네이버 오픈API 목록 및 안내입니다. 네이버 오픈 API 목록 API명 설명 호출제한 검색 네이버 블로그, 이미지, 웹, 뉴스, 백과사전, 책, 카페, 지식iN 등 검색 25,0...
developers.naver.com
▶ 사용할 API : 검색 API 쇼핑 검색 개발가이드 - NAVER Developers
→ 오픈 API 이용 신청 과정은 생략!
→ <API 기본 정보> 에서 출력포맷이 JSON인 것의 요청 URL을 복사해서 ARC의 URL에 복사
→ GET 요청에 필요한 정보를 같이 보내는 방법: ?과 &를 사용한다.
→ send를 누르면 아래와 같이 검색 결과를 받아볼 수 있다.
→ 여기서 특히 중요한 정보는 title, link, image, lprice이다.
→ code -> java -> spring의 코드 복사
▶ 검색 실행하고 결과 확인하기
→ src > main > java > com.sparta.week04 에 utils 패키지 생성 -> 검색과 관련된 것들
→ NavershopSearch.java 파일 생성
→ NavershopSearch 클래스
→ search 메소드 안에는 ARC에서 복사해온 내용 복붙! (spring)
@Component
public class NaverShopSearch {
public String search(String query) {
RestTemplate rest = new RestTemplate(); //spring에서 기본적으로 사용
HttpHeaders headers = new HttpHeaders();
headers.add("X-Naver-Client-Id", "pxzfIwGsw2RVsbHyMBKG"); //내가 발급받은 Client ID
headers.add("X-Naver-Client-Secret", "_2o6in32bv"); //내가 발급받은 Client Secret
String body = "";
HttpEntity<String> requestEntity = new HttpEntity<String>(body, headers); //body안에 우리가 응답받은 결과물들이 들어감
ResponseEntity<String> responseEntity = rest.exchange("https://openapi.naver.com/v1/search/shop.json?query=" + query, HttpMethod.GET, requestEntity, String.class);
HttpStatus httpStatus = responseEntity.getStatusCode();
int status = httpStatus.value(); //200,300,403 등
String response = responseEntity.getBody(); //결과가 문자열 하나로 쏙 들어감
System.out.println("Response status: " + status);
System.out.println(response);
return response;
}
//아래의 메소드는 추후 설명할 예정, 뒤의 것을 미리 작성해놓은 것
public List<ItemDto> fromJSONtoItems(String result){
JSONObject rjson = new JSONObject(result);
JSONArray items = rjson.getJSONArray("items");
List<ItemDto> itemDtoList = new ArrayList<>();
for (int i=0; i<items.length(); i++) {
JSONObject itemJson = (JSONObject) items.get(i);
ItemDto itemDto = new ItemDto(itemJson);
itemDtoList.add(itemDto);
}
return itemDtoList;
}
▶ 필요한 기능 확인하기
1. 키워드로 상품 검색하고 그 결과를 목록으로 보여주기
2. 관심 상품 등록하기
3. 관심 상품 조회하기
4. 관심 상품에 원하는 가격 등록하고, 그 가격보다 낮은 경우 표시하기
▶ API 설계하기
▶ 3계층 설계하기
1. Controller
· ProductRestController: 관심 상품 관련 컨트롤러
· SearchRequestController: 검색 관련 컨트롤러
2. Service
· ProductService: 관심 상품 가격 변경
3. Repository
· Product: 관심 상품 테이블 -> DB에 저장되는 것은 Product 뿐!
· ProductRepository: 관심 상품 등록하기
· ProductMypriceRequestDto: 관심 가격 변경하기
· ItemDto: 검색 결과 주고받기
[관심 상품 조회하기]
▶ Timestamped 클래스 만들기
→ Timestamped.java
@Getter // get 함수를 자동 생성합니다.
@MappedSuperclass // 멤버 변수가 컬럼이 되도록 합니다.
@EntityListeners(AuditingEntityListener.class) // 변경되었을 때 자동으로 기록합니다.
public abstract class Timestamped {
@CreatedDate // 최초 생성 시점
private LocalDateTime createdAt;
@LastModifiedDate // 마지막 변경 시점
private LocalDateTime modifiedAt;
}
→ Week04Application.java
@EnableJpaAuditing // 시간 자동 변경이 가능하도록 합니다.
@SpringBootApplication // 스프링 부트임을 선언합니다.
public class Week04Application {
public static void main(String[] args) {
SpringApplication.run(Week04Application.class, args);
}
}
▶ Product 클래스 만들기
→ 요구조건 살펴보기
→ title,image, link, lprice, myprice(관심가격) 정보가 필요함을 알 수 있다.
→ Product 클래스, Product.java
@Getter // get 함수를 일괄적으로 만들어줍니다.
@NoArgsConstructor // 기본 생성자를 만들어줍니다.
@Entity // DB 테이블 역할을 합니다.
public class Product extends Timestamped{
// ID가 자동으로 생성 및 증가합니다.
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
private Long id;
// 반드시 값을 가지도록 합니다.
@Column(nullable = false)
private String title;
@Column(nullable = false)
private String image;
@Column(nullable = false)
private String link;
@Column(nullable = false)
private int lprice;
@Column(nullable = false)
private int myprice;
}
▶ ProductRestController 만들기
@RequiredArgsConstructor // final로 선언된 멤버 변수를 자동으로 생성합니다.
@RestController // JSON으로 데이터를 주고받음을 선언합니다.
public class ProductRestController {
private final ProductRepository productRepository;
// 등록된 전체 상품 목록 조회
@GetMapping("/api/products")
public List<Product> getProducts() {
return productRepository.findAll();
}
}
[관심상품등록하기]부터 다음 글 참고